久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2951|回復: 1
打印 上一主題 下一主題
收起左側

stm32+ESP8266+OneNET移動云平臺+濕度的自動澆花系統源程序

[復制鏈接]
跳轉到指定樓層
樓主
基礎stm32+ESP8266+OneNET移動云平臺+濕度的自動澆花系統,在大學里面做的,突然逛下論壇發一發!
制作出來的實物圖如下:


單片機源程序如下:
  1. #include "main.h"
  2. #include "ds18b20.h"
  3. #include "dht11.h"
  4. #include "beep.h"

  5. int main()
  6. {
  7.         
  8.         u16 timeCount = 0;        //發送間隔變量
  9.         u8 *dataPtr = NULL;
  10. //        u8 data[10]={0x12,0x23,0x45,0x68,0x79,0xAB,0x00,0xEF};
  11.         u8 buf[256];
  12.         u8 t[4] = {12,34,56};
  13.         LED0 = 1;
  14.         LED1 = 1;
  15.         Stm32_Clock_Init(9);        //系統時鐘設置
  16.         uart_init(72,9600);                 //串口初始化為9600
  17.         delay_init(72);                            //延時初始化
  18.         LED_Init();                                  //初始化與LED連接的硬件接口        
  19.         DHT11_Init();
  20.         BEEP_Init();
  21. //        DS18B20_Init();
  22.         ESP8266_Init();                                        //初始化ESP8266
  23.         while(OneNET_DevLink())                        //接入OneNET
  24.                 delay_ms(100);
  25.         
  26.         while(1)
  27.         {
  28.                 dataPtr = ESP8266_GetIPD(0);
  29.                 if(dataPtr != NULL)
  30.                         OneNET_RevPro(dataPtr);
  31.                         
  32.                 if(++timeCount >= 1000)                                                                        //發送間隔5s
  33.                 {
  34.                         printf( "OneNET_SendData\r\n");
  35.                         OneNET_SendData(buf,5,t,4);                                                                        //發送數據
  36.                         
  37.                         timeCount = 0;
  38.                         ESP8266_ClearBuff();
  39.                 }
  40.                
  41.                

  42.                 delay_ms(10);
  43.         
  44.         }
  45. }
復制代碼

1.具體使用方法可參考:sample.c

SDK使用的三種類型:
    1.組包-發送-刪包
        只需要調用接口函數封裝一包數據,成發送即可。

    2.組包-發送-等待平臺返回-刪包
        連接平臺和心跳請求需要等待平臺的返回結果。

    3.數據點上傳
        數據點上傳分5步:1.獲取json格式數據流長度
                 2.根據長度封裝協議頭
                 3.封裝一包數據
                 4.發送數據
                 5.釋放內存

內存方案的三種方式
    1.動態分配
        只需要聲明 EDP_PACKET_STRUCTURE edpPacket = {NULL, 0, 0, 0};
        然后調用組包函數即可。

    2.全局數
        聲明一個全局數組,如 unsigned char dataMem[128]
        然后再調用組包函數之前
        edpPacket._data = dataMem;
        edpPacket._len = sizeof(dataMem);
        即可。

    3.局部數組
        方式同2,數組為局部變量。

  1. //協議頭文件
  2. #include "mqttkit.h"




  3. //==========================================================
  4. //        函數名稱:        EDP_NewBuffer
  5. //        函數功能:        申請內存
  6. //        入口參數:        edpPacket:包結構體
  7. //                                size:大小
  8. //        返回參數:        無
  9. //        說明:                1.可使用動態分配來分配內存
  10. //                                2.可使用局部或全局數組來指定內存
  11. //==========================================================
  12. void MQTT_NewBuffer(MQTT_PACKET_STRUCTURE *mqttPacket, uint32 size)
  13. {
  14.         
  15.         uint32 i = 0;

  16.         if(mqttPacket->_data == NULL)
  17.         {
  18.                 mqttPacket->_memFlag = MEM_FLAG_ALLOC;
  19.                
  20.                 mqttPacket->_data = (uint8 *)MQTT_MallocBuffer(size);
  21.                 if(mqttPacket->_data != NULL)
  22.                 {
  23.                         mqttPacket->_len = 0;
  24.                         
  25.                         mqttPacket->_size = size;
  26.                         
  27.                         for(; i < mqttPacket->_size; i++)
  28.                                 mqttPacket->_data[i] = 0;
  29.                 }
  30.         }
  31.         else
  32.         {
  33.                 mqttPacket->_memFlag = MEM_FLAG_STATIC;
  34.                
  35.                 for(; i < mqttPacket->_size; i++)
  36.                         mqttPacket->_data[i] = 0;
  37.                
  38.                 mqttPacket->_len = 0;
  39.                
  40.                 if(mqttPacket->_size < size)
  41.                         mqttPacket->_data = NULL;
  42.         }

  43. }


  44. //==========================================================
  45. //        函數名稱:        MQTT_DeleteBuffer
  46. //        函數功能:        釋放數據內存
  47. //        入口參數:        edpPacket:包結構體
  48. //        返回參數:        無
  49. //        說明:               
  50. //==========================================================
  51. void MQTT_DeleteBuffer(MQTT_PACKET_STRUCTURE *mqttPacket)
  52. {

  53.         if(mqttPacket->_memFlag == MEM_FLAG_ALLOC)
  54.                 MQTT_FreeBuffer(mqttPacket->_data);
  55.         
  56.         mqttPacket->_data = NULL;
  57.         mqttPacket->_len = 0;
  58.         mqttPacket->_size = 0;
  59.         mqttPacket->_memFlag = MEM_FLAG_NULL;

  60. }


  61. int32 MQTT_DumpLength(size_t len, uint8 *buf)
  62. {
  63.         
  64.         int32 i = 0;
  65.         
  66.         for(i = 1; i <= 4; ++i)
  67.         {
  68.                 *buf = len % 128;
  69.                 len >>= 7;
  70.                 if(len > 0)
  71.                 {
  72.                         *buf |= 128;
  73.                         ++buf;
  74.                 }
  75.                 else
  76.                 {
  77.                         return i;
  78.                 }
  79.         }

  80.         return -1;
  81. }



  82. //==========================================================
  83. //        函數名稱:        MQTT_PacketConnect
  84. //        函數功能:        連接消息組包
  85. //        入口參數:        user:用戶名:產品ID
  86. //                                password:密碼:鑒權信息或apikey
  87. //                                devid:設備ID
  88. //                                cTime:連接保持時間
  89. //                                clean_session:離線消息清除標志
  90. //                                qos:重發標志
  91. //                                will_topic:異常離線topic
  92. //                                will_msg:異常離線消息
  93. //                                will_retain:消息推送標志
  94. //                                mqttPacket:包指針
  95. //        返回參數:        0-成功                其他-失敗
  96. //
  97. //        說明:               
  98. //==========================================================
  99. uint8 MQTT_PacketConnect(const int8 *user, const int8 *password, const int8 *devid,
  100.                                                 uint16 cTime, uint1 clean_session, uint1 qos,
  101.                                                 const int8 *will_topic, const int8 *will_msg, int32 will_retain,
  102.                                                 MQTT_PACKET_STRUCTURE *mqttPacket)
  103. {
  104.         
  105.         uint8 flags = 0;
  106.         uint8 will_topic_len = 0;
  107.         uint16 total_len = 15;
  108.         int16 len = 0, devid_len = strlen(devid);
  109.         
  110.         if(!devid)
  111.                 return 1;
  112.         
  113.         total_len += devid_len + 2;
  114.         
  115.         //斷線后,是否清理離線消息:1-清理        0-不清理--------------------------------------------
  116.         if(clean_session)
  117.         {
  118.                 flags |= MQTT_CONNECT_CLEAN_SESSION;
  119.         }
  120.         
  121.         //異常掉線情況下,服務器發布的topic------------------------------------------------------
  122.         if(will_topic)
  123.         {
  124.                 flags |= MQTT_CONNECT_WILL_FLAG;
  125.                 will_topic_len = strlen(will_topic);
  126.                 total_len += 4 + will_topic_len + strlen(will_msg);
  127.         }
  128.         
  129.         //qos級別--主要用于PUBLISH(發布態)消息的,保證消息傳遞的次數-----------------------------
  130.         switch((unsigned char)qos)
  131.         {
  132.                 case MQTT_QOS_LEVEL0:
  133.                         flags |= MQTT_CONNECT_WILL_QOS0;                                                        //最多一次
  134.                 break;
  135.                
  136.                 case MQTT_QOS_LEVEL1:
  137.                         flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_QOS1);        //最少一次
  138.                 break;
  139.                
  140.                 case MQTT_QOS_LEVEL2:
  141.                         flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_QOS2);        //只有一次
  142.                 break;
  143.                
  144.                 default:
  145.                 return 2;
  146.         }
  147.         
  148.         //主要用于PUBLISH(發布態)的消息,表示服務器要保留這次推送的信息,如果有新的訂閱者出現,就把這消息推送給它。如果不設那么推送至當前訂閱的就釋放了
  149.         if(will_retain)
  150.         {
  151.                 flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_RETAIN);
  152.         }
  153.         
  154.         //賬號為空 密碼為空---------------------------------------------------------------------
  155.         if(!user || !password)
  156.         {
  157.                 return 3;
  158.         }
  159.         flags |= MQTT_CONNECT_USER_NAME | MQTT_CONNECT_PASSORD;
  160.         
  161.         total_len += strlen(user) + strlen(password) + 4;
  162.         
  163.         //分配內存-----------------------------------------------------------------------------
  164.         MQTT_NewBuffer(mqttPacket, total_len);
  165.         if(mqttPacket->_data == NULL)
  166.                 return 4;
  167.         
  168.         memset(mqttPacket->_data, 0, total_len);
  169.         
  170. /*************************************固定頭部***********************************************/
  171.         
  172.         //固定頭部----------------------連接請求類型---------------------------------------------
  173.         mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_CONNECT << 4;
  174.         
  175.         //固定頭部----------------------剩余長度值-----------------------------------------------
  176.         len = MQTT_DumpLength(total_len - 5, mqttPacket->_data + mqttPacket->_len);
  177.         if(len < 0)
  178.         {
  179.                 MQTT_DeleteBuffer(mqttPacket);
  180.                 return 5;
  181.         }
  182.         else
  183.                 mqttPacket->_len += len;
  184.         
  185. /*************************************可變頭部***********************************************/
  186.         
  187.         //可變頭部----------------------協議名長度 和 協議名--------------------------------------
  188.         mqttPacket->_data[mqttPacket->_len++] = 0;
  189.         mqttPacket->_data[mqttPacket->_len++] = 4;
  190.         mqttPacket->_data[mqttPacket->_len++] = 'M';
  191.         mqttPacket->_data[mqttPacket->_len++] = 'Q';
  192.         mqttPacket->_data[mqttPacket->_len++] = 'T';
  193.         mqttPacket->_data[mqttPacket->_len++] = 'T';
  194.         
  195.         //可變頭部----------------------protocol level 4-----------------------------------------
  196.         mqttPacket->_data[mqttPacket->_len++] = 4;
  197.         
  198.         //可變頭部----------------------連接標志(該函數開頭處理的數據)-----------------------------
  199.     mqttPacket->_data[mqttPacket->_len++] = flags;
  200.         
  201.         //可變頭部----------------------保持連接的時間(秒)----------------------------------------
  202.         mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(cTime);
  203.         mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(cTime);
  204.          
  205. /*************************************消息體************************************************/

  206.         //消息體----------------------------devid長度、devid-------------------------------------
  207.         mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(devid_len);
  208.         mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(devid_len);
  209.         
  210.         strncat((int8 *)mqttPacket->_data + mqttPacket->_len, devid, devid_len);
  211.         mqttPacket->_len += devid_len;
  212.         
  213.         //消息體----------------------------will_flag 和 will_msg---------------------------------
  214.         if(flags & MQTT_CONNECT_WILL_FLAG)
  215.         {
  216.                 unsigned short mLen = 0;
  217.                
  218.                 if(!will_msg)
  219.                         will_msg = "";
  220.                
  221.                 mLen = strlen(will_topic);
  222.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(mLen);
  223.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(mLen);
  224.                 strncat((int8 *)mqttPacket->_data + mqttPacket->_len, will_topic, mLen);
  225.                 mqttPacket->_len += mLen;
  226.                
  227.                 mLen = strlen(will_msg);
  228.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(mLen);
  229.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(mLen);
  230.                 strncat((int8 *)mqttPacket->_data + mqttPacket->_len, will_msg, mLen);
  231.                 mqttPacket->_len += mLen;
  232.         }
  233.         
  234.         //消息體----------------------------use---------------------------------------------------
  235.         if(flags & MQTT_CONNECT_USER_NAME)
  236.         {
  237.                 unsigned short user_len = strlen(user);
  238.                
  239.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(user_len);
  240.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(user_len);
  241.                 strncat((int8 *)mqttPacket->_data + mqttPacket->_len, user, user_len);
  242.                 mqttPacket->_len += user_len;
  243.         }

  244.         //消息體----------------------------password----------------------------------------------
  245.         if(flags & MQTT_CONNECT_PASSORD)
  246.         {
  247.                 unsigned short psw_len = strlen(password);
  248.                
  249.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(psw_len);
  250.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(psw_len);
  251.                 strncat((int8 *)mqttPacket->_data + mqttPacket->_len, password, psw_len);
  252.                 mqttPacket->_len += psw_len;
  253.         }

  254.         return 0;

  255. }


  256. //==========================================================
  257. //        函數名稱:        MQTT_PacketDisConnect
  258. //        函數功能:        斷開連接消息組包
  259. //        入口參數:        mqttPacket:包指針
  260. //        返回參數:        0-成功                1-失敗
  261. //        說明:               
  262. //==========================================================
  263. uint1 MQTT_PacketDisConnect(MQTT_PACKET_STRUCTURE *mqttPacket)
  264. {

  265.         MQTT_NewBuffer(mqttPacket, 2);
  266.         if(mqttPacket->_data == NULL)
  267.                 return 1;
  268.         
  269. /*************************************固定頭部***********************************************/
  270.         
  271.         //固定頭部----------------------頭部消息-------------------------------------------------
  272.         mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_DISCONNECT << 4;
  273.         
  274.         //固定頭部----------------------剩余長度值-----------------------------------------------
  275.         mqttPacket->_data[mqttPacket->_len++] = 0;
  276.         
  277.         return 1;

  278. }


  279. //==========================================================
  280. //        函數名稱:        MQTT_UnPacketConnectAck
  281. //        函數功能:        連接消息解包
  282. //        入口參數:        rev_data:接收的數據
  283. //        返回參數:        1、255-失敗                其他-平臺的返回碼
  284. //        說明:               
  285. //==========================================================
  286. uint8 MQTT_UnPacketConnectAck(uint8 *rev_data)
  287. {

  288.         if(rev_data[1] != 2)
  289.                 return 1;
  290.         
  291.         if(rev_data[2] == 0 || rev_data[2] == 1)
  292.                 return rev_data[3];
  293.         else
  294.                 return 255;

  295. }


  296. //==========================================================
  297. //        函數名稱:        MQTT_PacketSaveData
  298. //        函數功能:        數據點上傳組包
  299. //        入口參數:        devid:設備ID(可為空)
  300. //                                send_buf:json緩存buf
  301. //                                send_len:json總長
  302. //                                type_bin_head:bin文件的消息頭
  303. //                                type:類型
  304. //        返回參數:        0-成功                1-失敗
  305. //        說明:               
  306. //==========================================================
  307. uint1 MQTT_PacketSaveData(const int8 *devid, int16 send_len, int8 *type_bin_head, uint8 type, MQTT_PACKET_STRUCTURE *mqttPacket)
  308. {
  309.         if(type==5)//type=5,json類型的打包函數
  310.         {
  311.                 if(MQTT_PacketPublish(MQTT_PUBLISH_ID, "$dp", NULL, send_len + 3, MQTT_QOS_LEVEL1, 0, 1, mqttPacket) == 0)
  312.                 {
  313.                         mqttPacket->_data[mqttPacket->_len++] = type;                                        //類型
  314.                         
  315.                         mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(send_len);
  316.                         mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(send_len);
  317.                         
  318.                         return 0;
  319.                 }
  320.                 else
  321.                         return 1;
  322.         }
  323.         if(type==2)//type=2,二進制類型的打包函數
  324.         {
  325.                 if(MQTT_PacketPublish(MQTT_PUBLISH_ID, "$dp", NULL, send_len, MQTT_QOS_LEVEL1, 0, 1, mqttPacket)==0)
  326.                         return 0;
  327.                 else
  328.                         return 1;
  329.         }

  330.         return 1;
  331. }


  332. //==========================================================
  333. //        函數名稱:        MQTT_UnPacketCmd
  334. //        函數功能:        命令下發解包
  335. //        入口參數:        rev_data:接收的數據指針
  336. //                                cmdid:cmdid-uuid
  337. //                                req:命令
  338. //        返回參數:        0-成功                其他-失敗原因
  339. //        說明:               
  340. //==========================================================
  341. uint8 MQTT_UnPacketCmd(uint8 *rev_data, int8 **cmdid, int8 **req)
  342. {

  343.         int8 *dataPtr = strchr((int8 *)rev_data + 3, '/');        //加3是跳過頭信息
  344.         
  345.         uint32 remain_len = 0;
  346.         uint16 req_len = 0;
  347.         
  348.         if(dataPtr == NULL)                                                                        //未找到'/'
  349.                 return 1;
  350.         dataPtr++;                                                                                        //跳過'/'
  351.         
  352.         MQTT_ReadLength(rev_data + 1, 4, &remain_len);                //讀取剩余字節
  353.         
  354.         *cmdid = (int8 *)MQTT_MallocBuffer(37);                                //cmdid固定36字節,多分配一個結束符的位置
  355.         if(*cmdid == NULL)
  356.                 return 2;
  357.         
  358.         memset(*cmdid, 0, 37);                                                                //全部清零
  359.         memcpy(*cmdid, (const int8 *)dataPtr, 36);                        //復制cmdid
  360.         dataPtr += 36;
  361.         
  362.         req_len = remain_len - 44;                                                        //命令長度 = 剩余長度(remain_len) - 2 - 5($creq) - 1(\) - cmdid長度
  363.         *req = (int8 *)MQTT_MallocBuffer(req_len + 1);                //分配命令長度+1
  364.         if(*req == NULL)
  365.         {
  366.                 MQTT_FreeBuffer(*cmdid);
  367.                 return 3;
  368.         }
  369.         
  370.         memset(*req, 0, req_len + 1);                                                //清零
  371.         memcpy(*req, (const int8 *)dataPtr, req_len);                //復制命令
  372.         
  373.         return 0;

  374. }




  375. //==========================================================
  376. //        函數名稱:        MQTT_PacketSubscribe
  377. //        函數功能:        Subscribe消息組包
  378. //        入口參數:        pkt_id:pkt_id
  379. //                                qos:消息重發次數
  380. //                                topics:訂閱的消息
  381. //                                topics_cnt:訂閱的消息個數
  382. //                                mqttPacket:包指針
  383. //        返回參數:        0-成功                其他-失敗
  384. //        說明:               
  385. //==========================================================
  386. uint8 MQTT_PacketSubscribe(uint16 pkt_id, enum MqttQosLevel qos, const int8 *topics[], uint8 topics_cnt, MQTT_PACKET_STRUCTURE *mqttPacket)
  387. {
  388.         
  389.         uint32 topic_len = 0, remain_len = 0;
  390.         int16 len = 0;
  391.         uint8 i = 0;
  392.         
  393.         if(pkt_id == 0)
  394.                 return 1;
  395.         
  396.         //計算topic長度-------------------------------------------------------------------------
  397.         for(; i < topics_cnt; i++)
  398.         {
  399.                 if(topics[i] == NULL)
  400.                         return 2;
  401.                
  402.                 topic_len += strlen(topics[i]);
  403.         }
  404.         
  405.         //2 bytes packet id + topic filter(2 bytes topic + topic length + 1 byte reserve)------
  406.         remain_len = 2 + 3 * topics_cnt + topic_len;
  407.         
  408.         //分配內存------------------------------------------------------------------------------
  409.         MQTT_NewBuffer(mqttPacket, remain_len + 5);
  410.         if(mqttPacket->_data == NULL)
  411.                 return 3;
  412.         
  413. /*************************************固定頭部***********************************************/
  414.         
  415.         //固定頭部----------------------頭部消息-------------------------------------------------
  416.         mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_SUBSCRIBE << 4 | 0x02;
  417.         
  418.         //固定頭部----------------------剩余長度值-----------------------------------------------
  419.         len = MQTT_DumpLength(remain_len, mqttPacket->_data + mqttPacket->_len);
  420.         if(len < 0)
  421.         {
  422.                 MQTT_DeleteBuffer(mqttPacket);
  423.                 return 4;
  424.         }
  425.         else
  426.                 mqttPacket->_len += len;
  427.         
  428. /*************************************payload***********************************************/
  429.         
  430.         //payload----------------------pkt_id---------------------------------------------------
  431.         mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(pkt_id);
  432.         mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(pkt_id);
  433.         
  434.         //payload----------------------topic_name-----------------------------------------------
  435.         for(i = 0; i < topics_cnt; i++)
  436.         {
  437.                 topic_len = strlen(topics[i]);
  438.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(topic_len);
  439.                 mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(topic_len);
  440.                
  441.                 strncat((int8 *)mqttPacket->_data + mqttPacket->_len, topics[i], topic_len);
  442.                 mqttPacket->_len += topic_len;
  443.                
  444.                 mqttPacket->_data[mqttPacket->_len++] = qos & 0xFF;
  445.         }

  446.         return 0;

  447. }


  448. //==========================================================
  449. //        函數名稱:        MQTT_UnPacketSubscrebe
  450. //        函數功能:        Subscribe的回復消息解包
  451. //        入口參數:        rev_data:接收到的信息
  452. //        返回參數:        0-成功                其他-失敗
  453. //        說明:               
  454. //==========================================================
  455. uint8 MQTT_UnPacketSubscribe(uint8 *rev_data)
  456. {
  457.         
  458.         uint8 result = 255;

  459.         if(rev_data[2] == MOSQ_MSB(MQTT_SUBSCRIBE_ID) && rev_data[3] == MOSQ_LSB(MQTT_SUBSCRIBE_ID))
  460.         {
  461.                 switch(rev_data[4])
  462.                 {
  463.                         case 0x00:
  464.                         case 0x01:
  465.                         case 0x02:
  466.                                 //MQTT Subscribe OK
  467.                                 result = 0;
  468.                         break;
  469.                         
  470.                         case 0x80:
  471.                                 //MQTT Subscribe Failed
  472.                                 result = 1;
  473.                         break;
  474.                         
  475.                         default:
  476.                                 //MQTT Subscribe UnKnown Err
  477.                                 result = 2;
  478.                         break;
  479.                 }
  480.         }
  481.         
  482.         return result;

  483. }




  484. //==========================================================
  485. //        函數名稱:        MQTT_PacketPublishAck
  486. //        函數功能:        Publish Ack消息組包
  487. //        入口參數:        pkt_id:packet id
  488. //                                mqttPacket:包指針
  489. //        返回參數:        0-成功                1-失敗原因
  490. //        說明:                當收到的Publish消息的QoS等級為1時,需要Ack回復
  491. //==========================================================
  492. uint1 MQTT_PacketPublishAck(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
  493. {

  494.         MQTT_NewBuffer(mqttPacket, 4);
  495.         if(mqttPacket->_data == NULL)
  496.                 return 1;
  497.         
  498. /*************************************固定頭部***********************************************/
  499.         
  500.         //固定頭部----------------------頭部消息-------------------------------------------------
  501.         mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBACK << 4;
  502.         
  503.         //固定頭部----------------------剩余長度-------------------------------------------------
  504.         mqttPacket->_data[mqttPacket->_len++] = 2;
  505.         
  506. /*************************************可變頭部***********************************************/
  507.         
  508.         //可變頭部----------------------pkt_id長度-----------------------------------------------
  509.         mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
  510.         mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
  511.         
  512.         return 0;

  513. }


  514. //==========================================================
  515. //        函數名稱:        MQTT_UnPacketPublishAck
  516. //        函數功能:        Publish Ack消息解包
  517. //        入口參數:        rev_data:收到的數據
  518. //        返回參數:        0-成功                1-失敗原因
  519. //        說明:               
  520. //==========================================================
  521. uint1 MQTT_UnPacketPublishAck(uint8 *rev_data)
  522. {

  523.         if(rev_data[1] != 2)
  524.                 return 1;

  525.         if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
  526.                 return 0;
  527.         else
  528.                 return 1;

  529. }


  530. //==========================================================
  531. //        函數名稱:        MQTT_PacketPublishRec
  532. //        函數功能:        Publish Rec消息組包
  533. //        入口參數:        pkt_id:packet id
  534. //                                mqttPacket:包指針
  535. //        返回參數:        0-成功                1-失敗原因
  536. //        說明:                當收到的Publish消息的QoS等級為2時,先收到rec
  537. //==========================================================
  538. uint1 MQTT_PacketPublishRec(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
  539. {

  540.         MQTT_NewBuffer(mqttPacket, 4);
  541.         if(mqttPacket->_data == NULL)
  542.                 return 1;
  543.         
  544. /*************************************固定頭部***********************************************/
  545.         
  546.         //固定頭部----------------------頭部消息-------------------------------------------------
  547.         mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBREC << 4;
  548.         
  549.         //固定頭部----------------------剩余長度-------------------------------------------------
  550.         mqttPacket->_data[mqttPacket->_len++] = 2;
  551.         
  552. /*************************************可變頭部***********************************************/
  553.         
  554.         //可變頭部----------------------pkt_id長度-----------------------------------------------
  555.         mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
  556.         mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
  557.         
  558.         return 0;

  559. }


  560. //==========================================================
  561. //        函數名稱:        MQTT_UnPacketPublishRec
  562. //        函數功能:        Publish Rec消息解包
  563. //        入口參數:        rev_data:接收到的數據
  564. //        返回參數:        0-成功                1-失敗
  565. //        說明:               
  566. //==========================================================
  567. uint1 MQTT_UnPacketPublishRec(uint8 *rev_data)
  568. {

  569.         if(rev_data[1] != 2)
  570.                 return 1;

  571.         if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
  572.                 return 0;
  573.         else
  574.                 return 1;

  575. }


  576. //==========================================================
  577. //        函數名稱:        MQTT_PacketPublishRel
  578. //        函數功能:        Publish Rel消息組包
  579. //        入口參數:        pkt_id:packet id
  580. //                                mqttPacket:包指針
  581. //        返回參數:        0-成功                1-失敗原因
  582. //        說明:                當收到的Publish消息的QoS等級為2時,先收到rec,再回復rel
  583. //==========================================================
  584. uint1 MQTT_PacketPublishRel(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
  585. {

  586.         MQTT_NewBuffer(mqttPacket, 4);
  587.         if(mqttPacket->_data == NULL)
  588.                 return 1;
  589.         
  590. /*************************************固定頭部***********************************************/
  591.         
  592.         //固定頭部----------------------頭部消息-------------------------------------------------
  593.         mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBREL << 4 | 0x02;
  594.         
  595.         //固定頭部----------------------剩余長度-------------------------------------------------
  596.         mqttPacket->_data[mqttPacket->_len++] = 2;
  597.         
  598. /*************************************可變頭部***********************************************/
  599.         
  600.         //可變頭部----------------------pkt_id長度-----------------------------------------------
  601.         mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
  602.         mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
  603.         
  604.         return 0;

  605. }


  606. //==========================================================
  607. //        函數名稱:        MQTT_UnPacketPublishRel
  608. //        函數功能:        Publish Rel消息解包
  609. //        入口參數:        rev_data:接收到的數據
  610. //        返回參數:        0-成功                1-失敗
  611. //        說明:               
  612. //==========================================================
  613. uint1 MQTT_UnPacketPublishRel(uint8 *rev_data, uint16 pkt_id)
  614. {

  615.         if(rev_data[1] != 2)
  616.                 return 1;

  617.         if(rev_data[2] == MOSQ_MSB(pkt_id) && rev_data[3] == MOSQ_LSB(pkt_id))
  618.                 return 0;
  619.         else
  620.                 return 1;

  621. }


  622. //==========================================================
  623. //        函數名稱:        MQTT_PacketPublishComp
  624. //        函數功能:        Publish Comp消息組包
  625. //        入口參數:        pkt_id:packet id
  626. //                                mqttPacket:包指針
  627. //        返回參數:        0-成功                1-失敗原因
  628. //        說明:                當收到的Publish消息的QoS等級為2時,先收到rec,再回復rel
  629. //==========================================================
  630. uint1 MQTT_PacketPublishComp(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
  631. {

  632.         MQTT_NewBuffer(mqttPacket, 4);
  633.         if(mqttPacket->_data == NULL)
  634.                 return 1;
  635.         
  636. /*************************************固定頭部***********************************************/
  637.         
  638.         //固定頭部----------------------頭部消息-------------------------------------------------
  639.         mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBCOMP << 4;
  640.         
  641.         //固定頭部----------------------剩余長度-------------------------------------------------
  642.         mqttPacket->_data[mqttPacket->_len++] = 2;
  643.         
  644. /*************************************可變頭部***********************************************/
  645.         
  646.         //可變頭部----------------------pkt_id長度-----------------------------------------------
  647.         mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
  648.         mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
  649.         
  650.         return 0;

  651. }


  652. //==========================================================
  653. //        函數名稱:        MQTT_UnPacketPublishComp
  654. //        函數功能:        Publish Comp消息解包
  655. //        入口參數:        rev_data:接收到的數據
  656. //        返回參數:        0-成功                1-失敗
  657. //        說明:               
  658. //==========================================================
  659. uint1 MQTT_UnPacketPublishComp(uint8 *rev_data)
  660. {

  661.         if(rev_data[1] != 2)
  662.                 return 1;

  663.         if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
  664.                 return 0;
  665.         else
  666.                 return 1;

  667. }


  668. //==========================================================
  669. //        函數名稱:        MQTT_PacketPing
  670. //        函數功能:        心跳請求組包
  671. //        入口參數:        mqttPacket:包指針
  672. //        返回參數:        0-成功                1-失敗
  673. //        說明:               
  674. //==========================================================
  675. uint1 MQTT_PacketPing(MQTT_PACKET_STRUCTURE *mqttPacket)
  676. {

  677.         MQTT_NewBuffer(mqttPacket, 2);
  678.         if(mqttPacket->_data == NULL)
  679.                 return 1;
  680.         
  681. /*************************************固定頭部***********************************************/
  682.         
  683.         //固定頭部----------------------頭部消息-------------------------------------------------
  684.         mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PINGREQ << 4;
  685.         
  686.         //固定頭部----------------------剩余長度-------------------------------------------------
  687.         mqttPacket->_data[mqttPacket->_len++] = 0;
  688.         
  689.         return 0;

  690. }
復制代碼

Keil代碼下載: ESP8266和MQTT協議.7z (107.22 KB, 下載次數: 112)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:1039898 發表于 2022-7-19 15:45 | 只看該作者
寫的很好
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91香蕉嫩草 | 91深夜福利视频 | 黄色在线免费观看 | 国产成人一区二区三区电影 | 欧美激情一区二区三区 | 国产精品久久久久国产a级 欧美日韩国产免费 | 午夜av成人 | 不卡的av在线 | 三级黄色片在线观看 | 人人爽日日躁夜夜躁尤物 | 日韩综合在线 | 精品视频免费在线 | 毛片一区 | 99久久婷婷国产亚洲终合精品 | 中文字幕一级毛片 | www.久久.com | 国产精品日本一区二区在线播放 | 久久精品网 | 91精品国产91久久久久久吃药 | 九七午夜剧场福利写真 | 欧美成年视频 | 91精品91久久久 | 日韩高清一区 | 亚洲精选久久 | 国产乱码精品一区二三赶尸艳谈 | 免费一区在线 | 一级看片 | 亚洲一区二区在线视频 | 97精品国产手机 | 免费黄网站在线观看 | 久久久久久成人 | 国产一级一级毛片 | 国产精品91网站 | 999久久久精品 | 中文字幕久久精品 | 国产精品久久久久av | 欧美久久久久 | 午夜手机在线视频 | 午夜精品| 欧美精品久久一区 | 欧美日韩视频一区二区 |