MQTT的移植
下载MQTT 嵌入式C/C++库:
本次项目是是MQTT在STM32f103设备上的移植,因此使用paho的嵌入式C库,源码地址GitHub - eclipse/paho.mqtt.embedded-c: Paho MQTT C client library for embedded systems. Paho is an Eclipse IoT project (https://iot.eclipse.org/)
移植:
将以上文件全部移植到工程文件的协议层中去,然后参考../paho.mqtt.embedded-c/MQTTPacket/samples/中的例程编写代码。
修改接口函数
由于移植的FreeRTOS_Manual中没有”FreeRTOS_IP.h”和”FreeRTOS_Sockets.h”这两个头文件,因此需要修改MQTTFreeRTOS.c/.h中删除”FreeRTOS_IP.h”和”FreeRTOS_Sockets.h”,并修改Network结构体以及相关接口函数。
struct Network
{
ptNetDev netdev;
int (*mqttread) (Network*, unsigned char*, int, int);
int (*mqttwrite) (Network*, unsigned char*, int, int);
void (*disconnect) (Network*);
};
接下来是FreeRTOS_read和FreeRTOS_write函数:
int FreeRTOS_read(Network* n, unsigned char* buffer, int len, int timeout_ms)
{
TickType_t xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */
TimeOut_t xTimeOut;
int recvLen = 0;
vTaskSetTimeOutState(&xTimeOut); /* Record the time at which this function was entered. */
do
{
recvLen = n->netdev->Read(n->netdev, (char*)buffer, len, timeout_ms);
// if(n->netdev->Read(n->netdev, (char*)buffer, len, timeout_ms) == 0) recvLen = len;
} while (recvLen < len && xTaskCheckForTimeOut(&xTimeOut, &xTicksToWait) == pdFALSE);
return recvLen;
}
int FreeRTOS_write(Network* n, unsigned char* buffer, int len, int timeout_ms)
{
// TickType_t xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */
// TimeOut_t xTimeOut;
int sentLen = 0;
// vTaskSetTimeOutState(&xTimeOut); /* Record the time at which this function was entered. */
// do
// {
if(n->netdev->Write(n->netdev, (char*)buffer, len, timeout_ms) == 0) sentLen = len;
// } while (sentLen < len && xTaskCheckForTimeOut(&xTimeOut, &xTicksToWait) == pdFALSE);
return sentLen;
}
最后是断开连接,建立连接与初始化函数:
void FreeRTOS_disconnect(Network* n)
{
TCP_UDP_Info tcp = {TCP_ID};
n->netdev->Disconnect(n->netdev, (char*)&tcp, 100);
}
void NetworkInit(Network* n)
{
const static WiFiInfo wifi = {WiFi_ID, "ChinaNet-PVwx", "3nwspwfc"};
n->netdev = NetDev_GetDev(ESP8266);
if(n->netdev != NULL)
{
if(n->netdev->Init(n->netdev) == 0)
{
if(n->netdev->Connect(n->netdev, (char*)&wifi, 5000) == 0)
{
printf("Connect WiFi success.\r\n");
n->mqttread = FreeRTOS_read;
n->mqttwrite = FreeRTOS_write;
n->disconnect = FreeRTOS_disconnect;
}
else
{
printf("Connect WiFi failed.\r\n");
}
}
else
{
printf("Net Device Init failed.\r\n");
}
}
else
{
printf("Net Device not found.\r\n");
}
}
int NetworkConnect(Network* n, char* addr, int port)
{
TCP_UDP_Info tcp = {TCP_ID, addr, 0, port};
return n->netdev->Connect(n->netdev, (char*)&tcp, 500);
}
至此MQTT协议已经移植完成。
最后是关于MQTT数据连接对象的一些注意事项:
训练营导航:www.100ask.net