赞
踩
下载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
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。