当前位置:   article > 正文

【百问网】7天物联网智能家居实战 Day6_7天物联网智能家居 git

7天物联网智能家居 git

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结构体以及相关接口函数。

  1. struct Network
  2. {
  3.   ptNetDev netdev;
  4. int (*mqttread) (Network*, unsigned char*, int, int);
  5. int (*mqttwrite) (Network*, unsigned char*, int, int);
  6. void (*disconnect) (Network*);
  7. };

接下来是FreeRTOS_read和FreeRTOS_write函数:

  1. int FreeRTOS_read(Network* n, unsigned char* buffer, int len, int timeout_ms)
  2. {
  3. TickType_t xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */
  4. TimeOut_t xTimeOut;
  5. int recvLen = 0;
  6. vTaskSetTimeOutState(&xTimeOut); /* Record the time at which this function was entered. */
  7. do
  8. {
  9.         recvLen = n->netdev->Read(n->netdev, (char*)buffer, len, timeout_ms);
  10. //        if(n->netdev->Read(n->netdev, (char*)buffer, len, timeout_ms) == 0) recvLen = len;
  11. } while (recvLen < len && xTaskCheckForTimeOut(&xTimeOut, &xTicksToWait) == pdFALSE);
  12. return recvLen;
  13. }
  14. int FreeRTOS_write(Network* n, unsigned char* buffer, int len, int timeout_ms)
  15. {
  16. // TickType_t xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */
  17. // TimeOut_t xTimeOut;
  18. int sentLen = 0;
  19. // vTaskSetTimeOutState(&xTimeOut); /* Record the time at which this function was entered. */
  20. // do
  21. // {
  22.         if(n->netdev->Write(n->netdev, (char*)buffer, len, timeout_ms) == 0) sentLen = len;
  23. // } while (sentLen < len && xTaskCheckForTimeOut(&xTimeOut, &xTicksToWait) == pdFALSE);
  24. return sentLen;
  25. }

最后是断开连接,建立连接与初始化函数:

  1. void FreeRTOS_disconnect(Network* n)
  2. {
  3.     TCP_UDP_Info tcp = {TCP_ID};
  4. n->netdev->Disconnect(n->netdev, (char*)&tcp, 100);
  5. }
  6. void NetworkInit(Network* n)
  7. {
  8.     const static WiFiInfo wifi = {WiFi_ID, "ChinaNet-PVwx", "3nwspwfc"};
  9.     n->netdev = NetDev_GetDev(ESP8266);
  10.     if(n->netdev != NULL)
  11.     {
  12.         if(n->netdev->Init(n->netdev) == 0)
  13.         {
  14.             if(n->netdev->Connect(n->netdev, (char*)&wifi, 5000) == 0)
  15.             {
  16.                 printf("Connect WiFi success.\r\n");
  17.                 n->mqttread = FreeRTOS_read;
  18.                 n->mqttwrite = FreeRTOS_write;
  19.                 n->disconnect = FreeRTOS_disconnect;
  20.             }
  21.             else
  22.             {
  23.                 printf("Connect WiFi failed.\r\n");
  24.             }
  25.         }
  26.         else
  27.         {
  28.             printf("Net Device Init failed.\r\n");
  29.         }
  30.     }
  31.     else
  32.     {
  33.         printf("Net Device not found.\r\n");
  34.     }
  35. }
  36. int NetworkConnect(Network* n, char* addr, int port)
  37. {
  38.     TCP_UDP_Info tcp = {TCP_ID, addr, 0, port};
  39.     return n->netdev->Connect(n->netdev, (char*)&tcp, 500);
  40. }

至此MQTT协议已经移植完成。

最后是关于MQTT数据连接对象的一些注意事项:

  训练营导航:www.100ask.net

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号