找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2101|回复: 1
收起左侧

stm32+ESP8266+OneNET移动云平台+湿度的自动浇花系统源程序

[复制链接]
ID:430589 发表于 2022-5-12 17:15 | 显示全部楼层 |阅读模式
基础stm32+ESP8266+OneNET移动云平台+湿度的自动浇花系统,在大学里面做的,突然逛下论坛发一发!
制作出来的实物图如下:
6ED50C41CCCFD81A17FB9FED4567A35F.png P1T(RR6]YH[07SDOUH64@9G.png

单片机源程序如下:
  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, 下载次数: 107)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1039898 发表于 2022-7-19 15:45 | 显示全部楼层
写的很好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表