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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

arduino對接esp8266的mqtt協(xié)議實現(xiàn)代碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:336367 發(fā)表于 2019-7-27 10:23 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
感謝眾大網(wǎng)友的無私奉獻(xiàn),在mqtt協(xié)議的編碼本分采集了網(wǎng)友們的mqtt協(xié)議解碼分享。程序主要實現(xiàn)在arduino上的整合部分,寫程序的時候水平有限,請大家多多原諒!

單片機(jī)源程序如下:
  1. /*************************************************
  2. *程序描述:esp8285透傳串口處理系統(tǒng)
  3. **************************************************/

  4. #include "esp.h"
  5. #include "mqtt.h"
  6. //#include <SoftwareSerial.h>
  7. //信息緩沖區(qū)大小
  8. #define read_num 64
  9. #define send_num 50

  10. //信息緩沖區(qū)
  11. unsigned char buff[send_num];
  12. unsigned char read_buff[read_num];
  13. unsigned char msgas[50];
  14. int lenstr=0;
  15. //定時器0的時間定義
  16. unsigned long time_ding=0;
  17. unsigned long time_ms=0;
  18. int ding=0;      

  19. //定時器1的時間定義
  20. unsigned long time_ding1=0;
  21. unsigned long time_ms1=0;
  22. int ding1=0;

  23. //定時器2的時間定義
  24. unsigned long time_ding2=0;
  25. unsigned long time_ms2=0;
  26. int ding2=0;

  27. //mqtt服務(wù)器的定時器時間定義
  28. unsigned long timeoutt=0;
  29. unsigned long timeoutr=0;

  30. //設(shè)備標(biāo)志定義
  31. bool wf=0;                  //wifi連接標(biāo)志位
  32. bool tcps=0;                //tcp發(fā)送標(biāo)志位
  33. bool tcpc=0;                //tcp連接標(biāo)志位
  34. int led=0;
  35. int error=0;                //異常代碼

  36. //mqtt服務(wù)器定義
  37. bool mqttc=0;       //mqtt服務(wù)器連接標(biāo)志
  38. //SoftwareSerial woshi(2, 3);

  39. void setup()
  40. {
  41.   Serial.begin(115200);
  42. //  woshi.begin(9600);
  43.   pinMode(13,OUTPUT);
  44.   pinMode(2,OUTPUT);
  45. //  digitalWrite(2,HIGH);
  46. }


  47. void loop()
  48. {
  49.   while(1)
  50.   {
  51.     net();
  52.     bendi_loop();
  53.   }
  54. }

  55. /*
  56. * 函數(shù):void bendi_loop()
  57. * 功能:管理本地事物
  58. */
  59. void bendi_loop()                           //處理本地事務(wù)
  60. {
  61.   if(ding1>0)
  62.   {
  63.     if((millis()-time_ding1)>time_ms1)                //如果定時器到時間了就執(zhí)行,否則就跳出
  64.     {
  65.       switch(ding1)                        //選自跳轉(zhuǎn)的位置
  66.       {
  67.         case 1:
  68.           ding1=0;

  69.          
  70.           break;  
  71.         default:
  72.           break;  
  73.       }
  74.     }
  75.     else                              //定時器沒有到時間就跳出
  76.       return ;
  77.   }



  78.   
  79. }


  80. void net()
  81. {
  82.   int msgnum;
  83.   if(error>0)                       //錯誤代碼處理
  84.   {
  85.     error_chuli(error);
  86.   }
  87.   if(ding>0)
  88.   {
  89.     if((millis()-time_ding)>time_ms)                //如果定時器到時間了就執(zhí)行,否則就跳出
  90.     {
  91.       switch(ding)                        //選自跳轉(zhuǎn)的位置
  92.       {
  93.         case 1:
  94.           ding=0;
  95.           goto one;
  96.           break;
  97.         case 2:
  98.           ding=0;
  99.           goto two;
  100.           break;
  101.         case 3:
  102.           ding=0;
  103.           goto three;
  104.           break;
  105.         default:
  106.           break;  
  107.       }
  108.     }
  109.     else                              //定時器沒有到時間就跳出
  110.       return ;
  111.   }
  112.   
  113.   if(wf)                                //判斷wifi是否連接
  114.   {
  115.     if(tcpc)                            //判斷tcp是否連接
  116.     {
  117.       if(tcps)                          //判斷是否在透傳中
  118.       {
  119.           mqtt_loop();
  120.       }
  121.       else                        //進(jìn)入透傳模式
  122.       {
  123.         three:if(tcp_begin_send())
  124.         {
  125.           tcps=1;
  126.         }
  127.         else
  128.         {
  129.           delay_ms(500,3);
  130.           error=3;
  131.         }
  132.       }
  133.       
  134.     }
  135.     else                        //tcp連接
  136.     {
  137.       two:if(tcp_client())
  138.       {
  139.         tcpc=1;
  140.       }
  141.       else
  142.       {
  143.         delay_ms(1000,2);
  144.       }
  145.     }
  146.    
  147.   }
  148.   else                            //wifi檢測
  149.   {
  150.     one:if(ap_can())
  151.     {
  152.       wf=1;
  153.     }
  154.     else
  155.     {
  156.       delay_ms(3000,1);
  157.     }
  158.   }
  159. }










  160. bool mqtt_subscribe(const char *da,unsigned int Nu,unsigned char RequestedQo)
  161. {
  162.   int num;
  163.   qing_buff();
  164.   num=GetDataSUBSCRIBE(buff,da,Nu,RequestedQo);
  165.   Serial.write(buff,num);
  166.   qing_buff();
  167.   delay(500);
  168.   if(serial_can()==2)
  169.   {
  170.     qing_read();
  171.     return 1;
  172.   }
  173.   else
  174.   {
  175.     qing_read();
  176.     return 0;
  177.   }
  178. }


  179. void mqtt_publish(unsigned char du, unsigned char qo,unsigned char retai,const char *topi ,const char *ms)
  180. {
  181.   int num;
  182.   qing_buff();
  183.   num=GetDataPUBLISH(buff,du,qo,retai,topi,ms);
  184.   Serial.write(buff,num);
  185.   qing_buff();
  186. }

  187. void msg_chuli()
  188. {
  189.   int len=0,i;

  190.   if((msgas[23]=='o')&&(msgas[24]=='n'))
  191.   {
  192.     digitalWrite(2,HIGH);
  193.     mqtt_publish(0,0,0,MQTT_Topic,"on");

  194.    
  195.   }
  196.   if((msgas[23]=='o')&&(msgas[24]=='f'))
  197.   {
  198.     digitalWrite(2,LOW);
  199.     mqtt_publish(0,0,0,MQTT_Topic,"off");
  200.   }
  201.   for(i=0;i<50;i++)msgas[i]='\0';
  202.   
  203. //  mqtt_publish(0,0,0,MQTT_Topic,msg);
  204. //  len=strlen(msg);
  205. //  if((msg[0]=='o')&&(msg[1]=='n'))
  206. //  {
  207. //    digitalWrite(13,HIGH);
  208. //    mqtt_publish(0,0,0,MQTT_Topic,"on");
  209. //   
  210. //  }
  211. //  else if((msg[0]=='o')&&(msg[1]=='f'))
  212. //  {
  213. //    digitalWrite(13,LOW);
  214. //    mqtt_publish(0,0,0,MQTT_Topic,"off");
  215. //  }
  216. }


  217. void mqtt_loop()
  218. {
  219.   char *msgg=NULL;
  220.   int num;
  221.   if(ding2>0)
  222.   {
  223.     if((millis()-time_ding2)>time_ms2)                //如果定時器到時間了就執(zhí)行,否則就跳出
  224.     {
  225.       switch(ding2)                        //選自跳轉(zhuǎn)的位置
  226.       {
  227.         case 1:
  228.           ding2=0;
  229.           goto one;
  230.           break;
  231.         default:
  232.           break;  
  233.       }
  234.     }
  235.     else                              //定時器沒有到時間就跳出
  236.       return ;
  237.   }
  238.                                                
  239.   if(mqttc==0)              //判斷服務(wù)器是否連接上
  240.   {
  241.     one:if(mqtt_client())
  242.     {
  243.       mqttc=1;
  244.       timeoutr=millis();
  245.       timeoutt=millis();
  246.       mqtt_subscribe(mqtt_Stopic,0,0);
  247.       delay(1000);
  248.       mqtt_publish(0,0,0,MQTT_Topic,"wo");
  249.     }
  250.     else
  251.     {
  252.     delay_ms2(5000,1);  
  253.     }  
  254.   }
  255.   else
  256.   {
  257.     if((millis()-timeoutt)>5000)
  258.     {
  259.       mqtt_ping();
  260.       timeoutt=millis();
  261.     }
  262.     if((millis()-timeoutr)>30000)
  263.     {
  264.        mqttc=0;
  265.     }
  266.   }
  267.   if(Serial.available())
  268.   {
  269.     delay(300);
  270.     num=serial_can();
  271.     switch(num)
  272.     {
  273.       case 3:
  274.         timeoutr=millis();
  275.         timeoutt=millis();
  276.         break;
  277.       case 4:
  278.         msg_chuli();
  279.         break;
  280.       default:
  281.         esp_cpu(num);
  282.         break;
  283.     }
  284.   }
  285. }


  286. void mqtt_ping()
  287. {
  288.   int len;
  289.   len=GetDataPINGREQ(buff);
  290.   Serial.write(buff,len);
  291.   qing_buff();
  292. }


  293. bool mqtt_client()                //服務(wù)器連接
  294. {
  295.   int num;
  296.   int i;
  297.   qing_buff();
  298.   num=GetDataConnet(buff);
  299.   Serial.write(buff,num);
  300.   qing_buff();
  301.   delay(1000);
  302.   if(Serial.available())
  303.   {
  304.     if(serial_can()==1)
  305.     {
  306.       qing_read();
  307.       return 1;  
  308.     }
  309.     else
  310.     {
  311.       return 0;  
  312.     }  
  313.   }
  314.   else
  315.   {
  316.     return 0;
  317.   }
  318. }

  319. /**********************************************************
  320. 函數(shù)名稱:serial_can()
  321. 函數(shù)功能:判斷串口數(shù)據(jù)類型
  322. 返回值:
  323. 0   沒有匹配到任何值
  324. 1       mqtt連接成功
  325. 2       mqtt訂閱回應(yīng)包
  326. 3       mqtt心跳包
  327. 4       mqtt消息包
  328. 6   wifi斷開連接

  329. **********************************************************/
  330. int serial_can()                  //判斷返回值
  331. {
  332.   int i;
  333.   int num;
  334.   qing_read();
  335.   num=Serial.available();
  336.   for(i=0;Serial.available()>0;i++)read_buff[i]=Serial.read();
  337.   if((read_buff[0]==0x20)&&(read_buff[1]==0x02))
  338.   {
  339.     return 1;
  340.   }
  341.   if(read_buff[0]==0x90)
  342.   {
  343.     return 2;
  344.   }
  345.   if((read_buff[0]==0xd0)&&(read_buff[1]==0x00))
  346.   {
  347.     return 3;
  348.   }
  349. //  if(strstr(read_buff,mqtt_Stopic)!=NULL)
  350.    if(read_buff[0]==0x30)
  351.   {
  352.     lenstr=num;
  353.     for(i=0;i<num;i++)msgas[i]=read_buff[i];
  354.     return 4;
  355.   }
  356.   if(strstr(read_buff,"disconnect from ssid")!=NULL)
  357.   {
  358.   return 6;
  359.   }
  360.   qing_read();
  361.   return 0;
  362. }


  363. void esp_cpu(int num)                       //設(shè)備處理
  364. {
  365.   switch(num)
  366.   {
  367.     case 6:                       //wifi斷開連接處理
  368.       error_chuli(1);
  369.       break;
  370.     default:
  371.       break;
  372.   }
  373. }


  374. /*************************************************
  375. 函數(shù)名稱:void error_chuli(int k)  
  376. 函數(shù)功能:錯誤處理
  377. 輸入?yún)?shù):
  378. 1       //錯誤代碼1   WiFi斷開連接
  379. 3       //錯誤代碼3   透傳模式失敗


  380. *************************************************/
  381. void error_chuli(int k)
  382. {
  383.   switch(k)
  384.   {
  385.     case 1:                     //錯誤代碼1     wifi斷開連接
  386.       esp_res();
  387.       break;
  388.     case 3:                     //錯誤代碼3     透傳模式開啟失敗
  389.       error=0;
  390.       break;  
  391.     default:
  392.       break;
  393.   }
  394.   
  395. }




  396. void esp_res()
  397. {
  398.   wf=0;
  399.   tcpc=0;
  400.   mqttc=0;
  401.   tcps=0;
  402.   tcp_stop_send();
  403.   Serial.println(at_esp_ret);
  404.   delay(3000);
  405.   qing_buff();
  406.   qing_read();
  407.   while(Serial.read() >= 0);
  408. }

  409. bool tcp_begin_send()             //開始透傳
  410. {
  411.   int i;
  412.   while(Serial.read() >= 0);
  413.   Serial.println(at_tcp_mode);
  414.   delay(300);
  415.   while(Serial.read() >= 0);
  416.   Serial.println(at_tcp_send);
  417.   delay(300);
  418.   if(Serial.available())
  419.   {
  420.     for(i=0;Serial.available()>0;i++)read_buff[i]=Serial.read();
  421.     if(strstr(read_buff,"OK")!=NULL)
  422.     {
  423.       qing_read();
  424.       tcps=1;
  425.       return 1;
  426.     }
  427.     else
  428.     {
  429.       qing_read();
  430.       return 0;
  431.     }
  432.   }
  433.   else
  434.   {
  435.     return 0;  
  436.   }
  437. }

  438. void tcp_stop_send()              //退出透傳模式
  439. {
  440.   if(tcps==1)
  441.   {
  442.     Serial.print(at_tcp_ssend);
  443.     tcps=0;
  444.   }
  445. }


  446. bool tcp_client()
  447. {
  448.   int i;
  449.   while(Serial.read() >= 0);
  450.   Serial.println(at_tcp_client);
  451.   delay(4000);
  452.   if(Serial.available())
  453.   {
  454.     qing_read();
  455.     for(i=0;Serial.available()>0;i++)read_buff[i]=Serial.read();
  456.     if(strstr(read_buff,"CONNECT")!=NULL)
  457.     {
  458.       qing_read();
  459.       return 1;
  460.     }
  461.     else if(strstr(read_buff,"ALREADY CONNECTED")!=NULL)
  462.     {
  463.       qing_read();
  464.       return 1;
  465.     }
  466.     else
  467.     {
  468.       qing_read();
  469.       return 0;
  470.     }
  471.    
  472.    
  473.   }
  474.   else
  475.   {
  476.     qing_read();
  477.     return 0;
  478.   }
  479.   
  480.   
  481. }

  482. bool ap_can()
  483. {
  484.   int i;
  485. ……………………

  486. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
arduino對接esp8266版本4.0.zip (8.99 KB, 下載次數(shù): 77)



評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:419584 發(fā)表于 2019-10-5 19:20 | 只看該作者
謝謝分享謝謝分享
回復(fù)

使用道具 舉報

板凳
ID:375092 發(fā)表于 2019-12-14 17:01 | 只看該作者
樓主你好,我下載了打不開,報錯誤了。看見了希望回復(fù)我一下,需要你的幫助
回復(fù)

使用道具 舉報

地板
ID:58730 發(fā)表于 2020-3-30 19:25 | 只看該作者

謝謝分享謝謝分享
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 美女国产| 亚洲精品视频导航 | 国产成人av在线 | 欧美一级二级在线观看 | 久久成人免费视频 | 亚洲欧洲在线视频 | 韩日精品视频 | 国产91久久精品一区二区 | 欧美日韩亚洲系列 | 亚洲精品国产a久久久久久 午夜影院网站 | 欧美激情免费在线 | 一区二区福利视频 | 亚洲国产精品一区二区第一页 | 精品久久久久久久久久久久久久久久久 | 亚洲欧洲激情 | 日韩一级 | 精品一区二区三区免费视频 | 国产精品美女在线观看 | 欧美中文字幕一区二区 | a国产一区二区免费入口 | 亚洲精品中文字幕中文字幕 | 一级片在线视频 | 国产精品视频一 | 欧美久久一级特黄毛片 | 亚洲风情在线观看 | 99热精品在线观看 | 日韩精品一区二区三区中文在线 | 色在线免费视频 | 国产在线一区二区 | 伊人春色在线 | 久久亚洲91 | 黄色欧美视频 | 久久成人精品 | 欧美成人一区二区三区 | 伊人91在线 | 一级做a爰片性色毛片16美国 | 婷婷精品| 精品在线一区 | 三级在线观看 | 亚洲免费一区二区 | 国产精品一区二区不卡 |