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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2785|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ESP8266和MQTT協(xié)議修改版 源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:718503 發(fā)表于 2020-5-5 23:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
ESP8266+MQTT
  1. #include "onenet.h"


  2. extern unsigned char esp8266_buf[256];


  3. //==========================================================
  4. //        函數(shù)名稱:        OneNET_DevLink
  5. //        函數(shù)功能:        與onenet創(chuàng)建連接
  6. //        入口參數(shù):        無
  7. //        返回參數(shù):        1-成功        0-失敗
  8. //        說明:                與onenet平臺建立連接
  9. //==========================================================
  10. _Bool OneNET_DevLink(void)
  11. {
  12.        
  13.         MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};                                        //協(xié)議包

  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);                                                                        //等待平臺響應(yīng)
  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:        連接失敗:協(xié)議錯誤\r\n");
  36.                                                 break;
  37.                                         case 2:printf("WARN:        連接失敗:非法的clientid\r\n");
  38.                                                 break;
  39.                                         case 3:printf("WARN:        連接失敗:服務(wù)器失敗\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格式打包函數(shù),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協(xié)議采用type=2方式封裝數(shù)據(jù)函數(shù)(二進制發(fā)送數(shù)據(jù))
  100. //payload:存儲打包的數(shù)據(jù)
  101. //bin是發(fā)送的數(shù)組的首地址
  102. //size是數(shù)組的長度
  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,數(shù)據(jù)點類型指示:type=2,二進制數(shù)據(jù)
  113.     payload[0] = '\x02';

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

  117.         //把json復(fù)制到t_payload數(shù)組中
  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. //        函數(shù)名稱:        OneNET_SendData
  135. //        函數(shù)功能:        上傳數(shù)據(jù)到平臺
  136. //        入口參數(shù):        buf: 存儲打包數(shù)據(jù)的數(shù)組
  137. //              type: 發(fā)送數(shù)據(jù)的格式
  138. //              bin: 要發(fā)送的二進制數(shù)組的首地址
  139. //              size: 要發(fā)送的二進制數(shù)組大長度
  140. //        返回參數(shù):        無
  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};                        //協(xié)議包
  147.        
  148.         short body_len = 0;   
  149.        
  150.         switch(type)
  151.         {
  152.                 case 5:body_len = OneNET_FillBuf((char *)buf); //獲取當前需要發(fā)送的json數(shù)據(jù)流的總長度
  153.                         break;
  154.                 case 2:body_len = MqttSample_PackDataByBinary2(buf,bin, size); //獲取當前需要發(fā)送的二進制打包數(shù)組的長度
  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);        //上傳數(shù)據(jù)到平臺
  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. //        函數(shù)名稱:        OneNET_RevPro
  179. //        函數(shù)功能:        平臺返回數(shù)據(jù)檢測
  180. //        入口參數(shù):        dataPtr:平臺返回的數(shù)據(jù)
  181. //        返回參數(shù):        無
  182. //        說明:               
  183. //==========================================================
  184. void OneNET_RevPro(unsigned char *cmd)
  185. {
  186.        
  187.         MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};                                //協(xié)議包
  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:                                                                                        //命令下發(fā)
  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)        //命令回復(fù)組包
  209.                                 {
  210.                                         printf("Tips:        Send CmdResp\r\n");
  211.                                        
  212.                                         ESP8266_SendData(mqttPacket._data, mqttPacket._len);        //回復(fù)命令
  213.                                         MQTT_DeleteBuffer(&mqttPacket);                                                        //刪包
  214.                                 }
  215.                         }
  216.                
  217.                 break;
  218.                        
  219.                 case MQTT_PKT_PUBACK:                                                                           //發(fā)送Publish消息,平臺回復(fù)的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')                //判斷是否是下發(fā)的命令控制數(shù)據(jù)
  242.                 {
  243.                         numBuf[num++] = *dataPtr++;
  244.                 }
  245.                
  246.                 num = atoi((const char *)numBuf);                                //轉(zhuǎn)為數(shù)值形式
  247.                
  248.                 if(strstr((char *)req_payload, "redled"))                //搜索"redled"
  249.                 {
  250.                         if(num == 1)                                                                //控制數(shù)據(jù)如果為1,代表開
  251.                         {
  252.                                 LED0 = 0;
  253.                         }
  254.                         else if(num == 0)                                                        //控制數(shù)據(jù)如果為0,代表關(guān)
  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. }
復(fù)制代碼
  1. #include "main.h"


  2. int main()
  3. {
  4.        
  5.         u16 timeCount = 0;        //發(fā)送間隔變量
  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);        //系統(tǒng)時鐘設(shè)置
  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)                                                                        //發(fā)送間隔5s
  24.                 {
  25.                         printf( "OneNET_SendData\r\n");
  26.                         OneNET_SendData(buf,2,data,8);                                                                        //發(fā)送數(shù)據(jù)
  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. }
復(fù)制代碼


ESP8266和MQTT協(xié)議.7z

103.88 KB, 下載次數(shù): 29, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久久久久丝袜 | 色毛片 | 欧美成人免费 | 欧美一区二区在线 | 亚洲成人久久久 | 一区二区免费 | 成人不卡一区二区 | 日韩免费网| 精品视频一区二区三区在线观看 | 中文字幕免费在线观看 | 国产精品久久久久久久免费大片 | 黄片毛片免费观看 | 中文字幕1区2区 | 久久国产亚洲 | 午夜视频免费在线观看 | 午夜在线视频一区二区三区 | 青青久久 | 成人精品视频在线观看 | 国产欧美精品区一区二区三区 | 老司机67194精品线观看 | 中文字幕国产第一页 | 日韩国产在线 | 91精品国产99久久 | 国产日韩精品视频 | 久久精品小视频 | 欧美一区二区三区四区五区无卡码 | 久久国产激情视频 | 综合久久色 | 国产欧美视频一区 | 日日夜夜草 | 日韩精品一区二区三区在线观看 | 中文字幕在线免费观看 | 国产精品久久久久久一级毛片 | 欧美久久一区二区三区 | 成人午夜在线 | 精品久久久久久亚洲精品 | 五月天婷婷丁香 | 国产高清在线精品一区二区三区 | 精品久 | 99视频在线免费观看 | 国产精品国产三级国产aⅴ无密码 |