找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2071|回复: 0
打印 上一主题 下一主题
收起左侧

ESP8266和MQTT协议修改版 源程序

[复制链接]
跳转到指定楼层
楼主
ID:718503 发表于 2020-5-5 23:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ESP8266+MQTT
  1. #include "onenet.h"


  2. extern unsigned char esp8266_buf[256];


  3. //==========================================================
  4. //        函数名称:        OneNET_DevLink
  5. //        函数功能:        与onenet创建连接
  6. //        入口参数:        无
  7. //        返回参数:        1-成功        0-失败
  8. //        说明:                与onenet平台建立连接
  9. //==========================================================
  10. _Bool OneNET_DevLink(void)
  11. {
  12.        
  13.         MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};                                        //协议包

  14.         unsigned char *dataPtr;
  15.        
  16.         _Bool status = 1;
  17.        
  18.         printf("OneNET_DevLink\r\n");
  19.         printf("PROID: %s,        AUIF: %s,        DEVID:%s\r\n", PROID, AUTH_INFO, DEVID);
  20.        
  21.         if(MQTT_PacketConnect(PROID, AUTH_INFO, DEVID, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0)
  22.         {
  23.                 ESP8266_SendData(mqttPacket._data, mqttPacket._len);                        //上传平台
  24.                
  25.                 dataPtr = ESP8266_GetIPD(250);                                                                        //等待平台响应
  26.                 if(dataPtr != NULL)
  27.                 {
  28.                         if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
  29.                         {
  30.                                 switch(MQTT_UnPacketConnectAck(dataPtr))
  31.                                 {
  32.                                         case 0:printf("Tips:        连接成功\r\n");status = 0;
  33.                                                 break;
  34.                                        
  35.                                         case 1:printf("WARN:        连接失败:协议错误\r\n");
  36.                                                 break;
  37.                                         case 2:printf("WARN:        连接失败:非法的clientid\r\n");
  38.                                                 break;
  39.                                         case 3:printf("WARN:        连接失败:服务器失败\r\n");
  40.                                                 break;
  41.                                         case 4:printf("WARN:        连接失败:用户名或密码错误\r\n");
  42.                                                 break;
  43.                                         case 5:printf("WARN:        连接失败:非法链接(比如token非法)\r\n");
  44.                                                 break;
  45.                                        
  46.                                         default:printf("ERR:        连接失败:未知错误\r\n");
  47.                                                 break;
  48.                                 }
  49.                         }
  50.                 }
  51.                
  52.                 MQTT_DeleteBuffer(&mqttPacket);                                                                //删包
  53.         }
  54.         else
  55.                 printf( "WARN:        MQTT_PacketConnect Failed\r\n");
  56.        
  57.         return status;
  58.        
  59. }


  60. unsigned char OneNET_FillBuf(char *buf)
  61. {
  62.        
  63.         char text[32];
  64.        
  65.         memset(text, 0, sizeof(text));
  66.        
  67.         strcpy(buf, ",;");
  68.        
  69.         memset(text, 0, sizeof(text));
  70.         sprintf(text, "Tempreture,%2.1f;", 23.4);
  71.         strcat(buf, text);
  72.        
  73.         memset(text, 0, sizeof(text));
  74.         sprintf(text, "Humidity,%2.1f;", 66.8);
  75.         strcat(buf, text);
  76.        
  77.         return strlen(buf);

  78. }


  79. //json格式打包函数,type=5的方式
  80. int MqttSample_PackDataByJson5(char *buf)
  81. {
  82.        
  83.         char text[32];
  84.        
  85.         memset(text, 0, sizeof(text));
  86.        
  87.         strcpy(buf, ",;");
  88.        
  89.         memset(text, 0, sizeof(text));
  90.         sprintf(text, "Tempreture,%2.1f;", 23.4);
  91.         strcat(buf, text);
  92.        
  93.         memset(text, 0, sizeof(text));
  94.         sprintf(text, "Humidity,%2.1f;", 66.8);
  95.         strcat(buf, text);
  96.        
  97.         return strlen(buf);

  98. }


  99. //MQTT协议采用type=2方式封装数据函数(二进制发送数据)
  100. //payload:存储打包的数据
  101. //bin是发送的数组的首地址
  102. //size是数组的长度
  103. int MqttSample_PackDataByBinary2(u8 *payload,u8 *bin, uint32_t size)
  104. {
  105.         int payload_len;
  106.     char json[]="{\"ds_id\":\"binary\"}";
  107.     unsigned short json_len;
  108.    
  109.     payload_len = 1 + 2 + strlen(json)/sizeof(char);
  110.     json_len = strlen(json)/sizeof(char);
  111.    

  112.     //Byte1,数据点类型指示:type=2,二进制数据
  113.     payload[0] = '\x02';

  114.     //Byte2、Byte3指示后面json字符串长度
  115.     payload[1] = (json_len & 0xFF00) >> 8;
  116.     payload[2] = json_len & 0xFF;

  117.         //把json复制到t_payload数组中
  118.         memcpy(payload+3, json, json_len);
  119.        
  120.        
  121.         payload[payload_len] = (size & 0xFF000000)>>24;
  122.         payload[payload_len+1]=(size & 0x00FF0000)>>16;
  123.         payload[payload_len+2]=(size & 0x0000FF00)>>8;
  124.         payload[payload_len+3]=(size & 0x000000FF);
  125.        
  126.         for(u32 i=0; i<size+4; i++)
  127.         {
  128.                 payload[payload_len+4+i]=bin[i];
  129.         }
  130.        
  131.         return payload_len+size+4;
  132. }


  133. //==========================================================
  134. //        函数名称:        OneNET_SendData
  135. //        函数功能:        上传数据到平台
  136. //        入口参数:        buf: 存储打包数据的数组
  137. //              type: 发送数据的格式
  138. //              bin: 要发送的二进制数组的首地址
  139. //              size: 要发送的二进制数组大长度
  140. //        返回参数:        无
  141. //        说明:               
  142. //==========================================================
  143. void OneNET_SendData(u8 *buf,u8 type,u8 *bin,u16 size)
  144. {
  145.        
  146.         MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};                        //协议包
  147.        
  148.         short body_len = 0;   
  149.        
  150.         switch(type)
  151.         {
  152.                 case 5:body_len = OneNET_FillBuf((char *)buf); //获取当前需要发送的json数据流的总长度
  153.                         break;
  154.                 case 2:body_len = MqttSample_PackDataByBinary2(buf,bin, size); //获取当前需要发送的二进制打包数组的长度
  155.                         break;
  156.                
  157.                 default:
  158.                         break;       
  159.         }

  160.        
  161.         if(body_len)
  162.         {
  163.                         if(MQTT_PacketSaveData(DEVID,body_len, NULL, type, &mqttPacket) == 0)                //封包
  164.                         {
  165.                                 for(int i=0; i < body_len; i++)
  166.                                         mqttPacket._data[mqttPacket._len++] = buf[i];
  167.                                
  168.                                 ESP8266_SendData(mqttPacket._data, mqttPacket._len);        //上传数据到平台
  169.                                 printf("Send %d Bytes\r\n", mqttPacket._len);
  170.                                
  171.                                 MQTT_DeleteBuffer(&mqttPacket);                                                        //删包
  172.                         }
  173.                         else
  174.                                 printf("WARN:        EDP_NewBuffer Failed\r\n");
  175.         }       
  176. }


  177. //==========================================================
  178. //        函数名称:        OneNET_RevPro
  179. //        函数功能:        平台返回数据检测
  180. //        入口参数:        dataPtr:平台返回的数据
  181. //        返回参数:        无
  182. //        说明:               
  183. //==========================================================
  184. void OneNET_RevPro(unsigned char *cmd)
  185. {
  186.        
  187.         MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};                                //协议包
  188.        
  189.         char *req_payload = NULL;
  190.         char *cmdid_topic = NULL;
  191.         unsigned char type = 0;
  192.        
  193.         short result = 0;

  194.         char *dataPtr = NULL;
  195.         char numBuf[10];
  196.         int num = 0;
  197.        
  198.         type = MQTT_UnPacketRecv(cmd);
  199.         switch(type)
  200.         {
  201.                 case MQTT_PKT_CMD:                                                                                        //命令下发
  202.                        
  203.                         result = MQTT_UnPacketCmd(cmd, &cmdid_topic, &req_payload);        //解出topic和消息体
  204.                         if(result == 0)
  205.                         {
  206.                                 printf("cmdid: %s, req: %s\r\n", cmdid_topic, req_payload);
  207.                                
  208.                                 if(MQTT_PacketCmdResp(cmdid_topic, req_payload, &mqttPacket) == 0)        //命令回复组包
  209.                                 {
  210.                                         printf("Tips:        Send CmdResp\r\n");
  211.                                        
  212.                                         ESP8266_SendData(mqttPacket._data, mqttPacket._len);        //回复命令
  213.                                         MQTT_DeleteBuffer(&mqttPacket);                                                        //删包
  214.                                 }
  215.                         }
  216.                
  217.                 break;
  218.                        
  219.                 case MQTT_PKT_PUBACK:                                                                           //发送Publish消息,平台回复的Ack
  220.                
  221.                         if(MQTT_UnPacketPublishAck(cmd) == 0)
  222.                                 printf("Tips:        MQTT Publish Send OK\r\n");
  223.                        
  224.                 break;
  225.                
  226.                 default:
  227.                         result = -1;
  228.                 break;
  229.         }
  230.        
  231.         ESP8266_ClearBuff();                                                                        //清空缓存
  232.        
  233.         if(result == -1)
  234.                 return;
  235.        
  236.         dataPtr = strchr(req_payload, '{');                                        //搜索'}'

  237.         if(dataPtr != NULL && result != -1)                                        //如果找到了
  238.         {
  239.                 dataPtr++;
  240.                
  241.                 while(*dataPtr >= '0' && *dataPtr <= '9')                //判断是否是下发的命令控制数据
  242.                 {
  243.                         numBuf[num++] = *dataPtr++;
  244.                 }
  245.                
  246.                 num = atoi((const char *)numBuf);                                //转为数值形式
  247.                
  248.                 if(strstr((char *)req_payload, "redled"))                //搜索"redled"
  249.                 {
  250.                         if(num == 1)                                                                //控制数据如果为1,代表开
  251.                         {
  252.                                 LED0 = 0;
  253.                         }
  254.                         else if(num == 0)                                                        //控制数据如果为0,代表关
  255.                         {
  256.                                 LED0 = 1;
  257.                         }
  258.                 }
  259.                                                                                                                 //下同
  260.                 else if(strstr((char *)req_payload, "greenled"))
  261.                 {
  262.                         if(num == 1)
  263.                         {
  264.                                 LED1 = 0;
  265.                         }
  266.                         else if(num == 0)
  267.                         {
  268.                                 LED1 = 1;
  269.                         }
  270.                 }
  271.                 else if(strstr((char *)req_payload, "allled"))
  272.                 {
  273.                         if(num == 1)
  274.                         {
  275.                                 LED0 = 0;
  276.                                 LED1 = 0;
  277.                         }
  278.                         else if(num == 0)
  279.                         {
  280.                                 LED0 = 1;
  281.                                 LED1 = 1;
  282.                         }
  283.                 }       
  284.         }

  285.         if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
  286.         {
  287.                 MQTT_FreeBuffer(cmdid_topic);
  288.                 MQTT_FreeBuffer(req_payload);
  289.         }
  290. }
复制代码
  1. #include "main.h"


  2. int main()
  3. {
  4.        
  5.         u16 timeCount = 0;        //发送间隔变量
  6.         u8 *dataPtr = NULL;
  7.         u8 data[10]={0x12,0x23,0x45,0x68,0x79,0xAB,0x00,0xEF};
  8.         u8 buf[256];
  9.        
  10.         Stm32_Clock_Init(9);        //系统时钟设置
  11.         uart_init(72,9600);                 //串口初始化为9600
  12.         delay_init(72);                            //延时初始化
  13.         LED_Init();                                  //初始化与LED连接的硬件接口       
  14.        
  15.         ESP8266_Init();                                        //初始化ESP8266
  16.        
  17.         while(OneNET_DevLink())                        //接入OneNET
  18.                 delay_ms(500);
  19.         delay_ms(250);
  20.        
  21.         while(1)
  22.         {
  23.                 if(++timeCount >= 1000)                                                                        //发送间隔5s
  24.                 {
  25.                         printf( "OneNET_SendData\r\n");
  26.                         OneNET_SendData(buf,2,data,8);                                                                        //发送数据
  27.                        
  28.                         timeCount = 0;
  29.                         ESP8266_ClearBuff();
  30.                 }
  31.                
  32.                
  33.                 dataPtr = ESP8266_GetIPD(0);
  34.                 if(dataPtr != NULL)
  35.                         OneNET_RevPro(dataPtr);
  36.                 delay_ms(10);
  37.        
  38.         }
  39. }
复制代码


ESP8266和MQTT协议.7z

103.88 KB, 下载次数: 29, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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