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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2908|回復: 3
收起左側

MQTT協議Onenet上云+stm32f103最小系統控制DH11溫濕度傳感器 源程序

  [復制鏈接]
ID:896677 發表于 2021-12-3 15:48 | 顯示全部樓層 |閱讀模式
用最小系統也行,用正點原子的F103系列板子也行,經過測試,沒有什么問題,采用的是ESP8266-1s上云。

部分程序截圖

部分程序截圖


單片機源程序如下:
  1. /*-----------------------------------------------------*/
  2. /*                                                     */
  3. /*            程序main函數,入口函數源文件              */
  4. /*                                                     */
  5. /*-----------------------------------------------------*/

  6. #include "stm32f10x.h"   //包含需要的頭文件
  7. #include "control.h"     //包含需要的頭文件
  8. #include "delay.h"       //包含需要的頭文件
  9. #include "usart1.h"      //包含需要的頭文件
  10. #include "usart2.h"      //包含需要的頭文件
  11. #include "timer2.h"      //包含需要的頭文件
  12. #include "timer3.h"      //包含需要的頭文件
  13. #include "timer4.h"      //包含需要的頭文件
  14. #include "wifi.h"             //包含需要的頭文件
  15. #include "led.h"             //包含需要的頭文件 LED                                                  
  16. #include "mqtt.h"        //包含需要的頭文件
  17. #include "dht11.h"       //包含需要的頭文件 空氣溫濕度


  18. char *cmdLED_On = "LEDON";      //LED打開
  19. char *cmdLED_Off = "LEDOFF";    //LED關閉

  20. char *cmdDHT11_On = "DHTON";    //溫濕度數據傳輸打開
  21. char *cmdDHT11_Off = "DHTOFF";  //溫濕度數據傳輸關閉

  22. char *ledFlag = "LEDOFF";       //LED狀態
  23. int   dhtFlag = 0;                        //溫濕度數據傳輸狀態

  24. int main(void)
  25. {        
  26.         delay_init();          //延時功能初始化              
  27.         Usart1_Init(9600);     //串口1功能初始化,波特率9600
  28.         Usart2_Init(115200);   //串口2功能初始化,波特率115200        
  29.         TIM4_Init(500,7200);   //TIM4初始化,定時時間 500*7200*1000/72000000 = 50ms
  30.         LED_Init();                           //LED初始化
  31.         DHT11_Init();          //初始化DHT11        
  32.         
  33.         WiFi_ResetIO_Init();   //初始化WiFi的復位IO
  34.         IoT_Parameter_Init();  //初始化云IoT平臺MQTT服務器的參數        

  35.         while(1)
  36.         {               
  37.                 // connectFlag=1同服務器建立了連接
  38.                 if(connectFlag == 1)
  39.                 {     
  40.                         /*-------------------------------------------------------------*/
  41.                         /*                     處理發送緩沖區數據                                                 */
  42.                         /*-------------------------------------------------------------*/
  43.                         if(MQTT_TxDataOutPtr != MQTT_TxDataInPtr) //if成立的話,說明發送緩沖區有數據了
  44.                         {               
  45.                                 //3種情況可進入if
  46.                                 //第1種:0x10 連接報文
  47.                                 //第2種:0x82 訂閱報文,且connectPackFlag置位,表示連接報文成功
  48.                                 //第3種:subcribePackFlag置位,說明連接和訂閱均成功,其他報文可發
  49.                                 if((MQTT_TxDataOutPtr[2] == 0x10)||((MQTT_TxDataOutPtr[2] == 0x82)&&(connectPackFlag == 1))||(subcribePackFlag == 1))
  50.                                 {   
  51.                                         if (MQTT_TxDataOutPtr[2] == 0x30)
  52.                                         {        
  53.                                                 u1_printf("發送數據:0x%x,單片機數據推送至服務器\r\n", MQTT_TxDataOutPtr[2]);        
  54.                                                 u1_printf("\r\n");
  55.                                         }
  56.                                         else
  57.                                         {
  58.                                                 u1_printf("發送數據:0x%x\r\n", MQTT_TxDataOutPtr[2]);//串口提示信息
  59.                                         }
  60.                                        
  61.                                         MQTT_TxData(MQTT_TxDataOutPtr);                                                        //發送數據
  62.                                         MQTT_TxDataOutPtr += TBUFF_UNIT;                                                //指針下移
  63.                                         if(MQTT_TxDataOutPtr == MQTT_TxDataEndPtr)                                //如果指針到緩沖區尾部了
  64.                                         {
  65.                                                 MQTT_TxDataOutPtr = MQTT_TxDataBuf[0];                                //指針歸位到緩沖區開頭
  66.                                         }        
  67.                                 }                                 
  68.                         }
  69.                         /*-------------------------------------------------------------*/
  70.                         /*                     處理接收緩沖區數據                      */
  71.                         /*-------------------------------------------------------------*/
  72.                         if(MQTT_RxDataOutPtr != MQTT_RxDataInPtr) //if成立的話,說明接收緩沖區有數據了        
  73.                         {                                                                                                
  74.                                 u1_printf("接收到數據:");
  75.                                 /*-----------------------------------------------------*/
  76.                                 /*                    處理CONNACK報文                  */
  77.                                 /*-----------------------------------------------------*/                                
  78.                                 //if判斷,如果第一個字節是0x20,表示收到的是CONNACK報文
  79.                                 //接著我們要判斷第4個字節,看看CONNECT報文是否成功
  80.                                 if(MQTT_RxDataOutPtr[2] == 0x20)
  81.                                 {                                    
  82.                                         switch(MQTT_RxDataOutPtr[5])
  83.                                         {                                          
  84.                                                 case 0x00 : u1_printf("CONNECT報文成功\r\n");                                                        //串口輸出信息        
  85.                                                                                 connectPackFlag = 1;                                                                        //CONNECT報文成功,訂閱報文可發
  86.                                                                         break;                                                                                                                //跳出分支case 0x00                                             
  87.                                                 case 0x01 : u1_printf("連接已拒絕,不支持的協議版本,準備重啟\r\n");    //串口輸出信息
  88.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接
  89.                                                                         break;                                                                                                                //跳出分支case 0x01   
  90.                                                 case 0x02 : u1_printf("連接已拒絕,不合格的客戶端標識符,準備重啟\r\n");//串口輸出信息
  91.                                                                         connectFlag = 0;                                            //connectFlag置零,重啟連接
  92.                                                                         break;                                                                                                                 //跳出分支case 0x02
  93.                                                 case 0x03 : u1_printf("連接已拒絕,服務端不可用,準備重啟\r\n");            //串口輸出信息
  94.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接
  95.                                                                         break;                                                                                                                //跳出分支case 0x03
  96.                                                 case 0x04 : u1_printf("連接已拒絕,無效的用戶名或密碼,準備重啟\r\n");        //串口輸出信息
  97.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接                                                
  98.                                                                         break;                                                                                                                //跳出分支case 0x04
  99.                                                 case 0x05 : u1_printf("連接已拒絕,未授權,準備重啟\r\n");                                //串口輸出信息
  100.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接                                                
  101.                                                                         break;                                                                                                                //跳出分支case 0x05                 
  102.                                                 default   : u1_printf("連接已拒絕,未知狀態,準備重啟\r\n");                    //串口輸出信息
  103.                                                                         connectFlag = 0;                                                                                        //connectFlag置零,重啟連接                                       
  104.                                                                         break;                                                                                                                //跳出分支case default                                                                 
  105.                                         }                                
  106.                             }                        
  107.                                 //if判斷,第一個字節是0x90,表示收到的是SUBACK報文
  108.                                 //接著我們要判斷訂閱回復,看看是不是成功
  109.                                 else if(MQTT_RxDataOutPtr[2] == 0x90)
  110.                                 {
  111.                                         switch(MQTT_RxDataOutPtr[6])
  112.                                         {                                       
  113.                                                 case 0x00 :
  114.                                                 case 0x01 :
  115.                                                                         u1_printf("訂閱成功\r\n");                        //串口輸出信息
  116.                                                                         subcribePackFlag = 1;                                //subcribePackFlag置1,表示訂閱報文成功,其他報文可發送
  117.                                                                         pingFlag = 0;                                                //pingFlag清零
  118.                                                                         TIM3_ENABLE_30S();                                        //啟動30s的PING定時器        
  119.                                                                         Send_Data();
  120.                                                                         TIM2_ENABLE_10S();
  121.                                                                         break;                                                                //跳出分支                                             
  122.                                                 default:
  123.                                                                         u1_printf("訂閱失敗,準備重啟\r\n");//串口輸出信息
  124.                                                                         connectFlag = 0;                                        //connectFlag置零,重啟連接
  125.                                                                         break;                                                                //跳出分支                                                                 
  126.                                                 }                                       
  127.                             }
  128.                                 //if判斷,第一個字節是0xD0,表示收到的是PINGRESP報文
  129.                                 else if(MQTT_RxDataOutPtr[2] == 0xD0)
  130.                                 {
  131.                                         u1_printf("PING報文回復\r\n");                      //串口輸出信息
  132.                                         if(pingFlag == 1)
  133.                                         {                                                                           //如果pingFlag=1,表示第一次發送
  134.                                                  pingFlag = 0;                                                                   //要清除pingFlag標志
  135.                                         }
  136.                                         else if(pingFlag > 1)        
  137.                                         {                                                                                                          //如果pingFlag>1,表示是多次發送了,而且是2s間隔的快速發送
  138.                                                 pingFlag = 0;                                                                   //要清除pingFlag標志
  139.                                                 TIM3_ENABLE_30S();                                                               //PING定時器重回30s的時間
  140.                                         }                                
  141.                                 }        
  142.                                 //if判斷,如果第一個字節是0x30,表示收到的是服務器發來的推送數據
  143.                                 //我們要提取控制命令
  144.                                 else if((MQTT_RxDataOutPtr[2] == 0x30))
  145.                             {
  146.                                         u1_printf("服務器等級0推送\r\n");                            //串口輸出信息
  147.                                         MQTT_DealPushdata_Qs0(MQTT_RxDataOutPtr);   //處理等級0推送數據
  148.                                 }                                                                        
  149.                                 MQTT_RxDataOutPtr += RBUFF_UNIT;                //指針下移
  150.                                 if(MQTT_RxDataOutPtr == MQTT_RxDataEndPtr)      //如果指針到緩沖區尾部了
  151.                                 {
  152.                                         MQTT_RxDataOutPtr = MQTT_RxDataBuf[0];      //指針歸位到緩沖區開頭              
  153.                                 }                          
  154.                         }//處理接收緩沖區數據的else if分支結尾
  155.                                                 
  156.                         /*---------------------------------------------------------------------------------------------------------------------*/
  157.                         /*                                                                             處理命令緩沖區數據                                                                              */
  158.                         /*---------------------------------------------------------------------------------------------------------------------*/
  159.                         if(MQTT_CMDOutPtr != MQTT_CMDInPtr)                                                          //if成立的話,說明命令緩沖區有數據了        
  160.                         {                                                   
  161.                                 u1_printf("命令:%s\r\n",&MQTT_CMDOutPtr[2]);              //串口輸出信息
  162.                                 
  163.                                 if(!memcmp(&MQTT_CMDOutPtr[2],cmdLED_On,strlen(cmdLED_On)))//判斷指令,如果是CMD1
  164.                                 {                                            
  165.                                         ledFlag = "LEDON";                                                                              
  166.                                         LED_On();                                                                                             //LED開啟
  167.                                 }
  168.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdLED_Off,strlen(cmdLED_Off))) //判斷指令,如果是CMD11
  169.                                 {
  170.                                         ledFlag = "LEDOFF";                                             
  171.                                         LED_Off();                                                                                 //LED關閉
  172.                                 }
  173.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdDHT11_On,strlen(cmdDHT11_On)))//判斷指令,如果是CMD3
  174.                                 {      
  175.                                         dhtFlag = 1;                 //dataFlag置1,表示處于采集狀態了
  176.                                         TIM2_ENABLE_10S();           //定時器2,,10s間隔采集溫濕度   
  177.                                 }
  178.                                 else if(!memcmp(&MQTT_CMDOutPtr[2],cmdDHT11_Off,strlen(cmdDHT11_Off)))//判斷指令,如果是CMD3
  179.                                 {     
  180.                                         dhtFlag = 0;                 //dataFlag置0,表示處于停止狀態了
  181.                                         TIM_Cmd(TIM2,DISABLE);                 //判斷2路開關狀態和采集狀態,并發布給服務器
  182.                                 }                                                               
  183.                                 //不做處理,后面會發送狀態
  184.                                 else u1_printf("未知指令\r\n");                                //串口輸出信息        
  185.                         
  186.                                 MQTT_CMDOutPtr += CBUFF_UNIT;                                //指針下移
  187.                                 if(MQTT_CMDOutPtr == MQTT_CMDEndPtr)            //如果指針到緩沖區尾部了
  188.                                 MQTT_CMDOutPtr = MQTT_CMDBuf[0];                        //指針歸位到緩沖區開頭        
  189.                                 
  190.                                 Send_Data();//發送控制數據
  191.                                 //處理命令緩沖區數據的else if分支結尾                                       
  192.                         }        //connectFlag=1的if分支的結尾
  193.                 }
  194.         /*--------------------------------------------------------------------*/
  195.         /*      connectFlag=0同服務器斷開了連接,我們要重啟連接服務器            */
  196.         /*--------------------------------------------------------------------*/
  197.                 else
  198.                 {
  199.                         u1_printf("需要連接服務器\r\n");               //串口輸出信息
  200.                         TIM_Cmd(TIM4, DISABLE);                        //關閉TIM4
  201.                         TIM_Cmd(TIM3, DISABLE);                        //關閉TIM3  
  202.                         WiFi_RxCounter = 0;                            //WiFi接收數據量變量清零                        
  203.                         memset(WiFi_RX_BUF, 0, WiFi_RXBUFF_SIZE);      //清空WiFi接收緩沖區
  204.                         if(WiFi_Connect_IoTServer() == 0)                           //如果WiFi連接云服務器函數返回0,表示正確,進入if
  205.                         {                                
  206.                                 u1_printf("建立TCP連接成功\r\n");          //串口輸出信息
  207.                                 connectFlag = 1;                           //connectFlag置1,表示連接成功        
  208.                                 WiFi_RxCounter = 0;                        //WiFi接收數據量變量清零                        
  209.                                 memset(WiFi_RX_BUF, 0, WiFi_RXBUFF_SIZE);  //清空WiFi接收緩沖區
  210.                                 MQTT_Buff_Init();                          //初始化發送緩沖區                    
  211.                         }                                
  212.                 }
  213.         }
  214. }
復制代碼

所有資料51hei附件下載:
OneNet.7z (199.24 KB, 下載次數: 88)

評分

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

查看全部評分

回復

使用道具 舉報

ID:277550 發表于 2021-12-3 17:31 | 顯示全部樓層
移動那,不免費,不玩了, , 自己開個mqtt服務器
回復

使用道具 舉報

ID:808814 發表于 2021-12-8 19:38 | 顯示全部樓層
devcang 發表于 2021-12-3 17:31
移動那,不免費,不玩了, , 自己開個mqtt服務器

自己有服務器的話,要怎么讓esp通過mqtt訂閱發送呀
回復

使用道具 舉報

ID:708205 發表于 2021-12-15 21:43 | 顯示全部樓層
MQTT協議細致的封裝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 爱爱免费视频 | 成人黄色在线观看 | 久草网视频 | 亚洲欧美国产毛片在线 | 精品国产一级片 | 亚洲免费在线播放 | 国产黄色大片网站 | 手机在线一区二区三区 | 黄色免费av| 色网站在线| 欧美日韩国产一区二区 | 国产美女精品视频 | 国产精品久久久久久久久久久久冷 | 亚洲国产欧美日韩 | 在线观看三级av | 日韩福利 | 亚洲一区亚洲二区 | 亚洲精品二三区 | 毛片一级片| 久久免费观看一级毛片 | 99精品欧美一区二区三区 | 国产成人免费视频网站高清观看视频 | 中文字幕二区 | 国产不卡在线观看 | 欧美综合一区二区三区 | 中文字幕一区二区三区精彩视频 | 在线观看国产wwwa级羞羞视频 | 一区二区三区四区在线 | 激情 婷婷 | 亚洲欧美在线视频 | 国产精品一区二区av | 国产成人精品综合 | 国产成人jvid在线播放 | 色综合久久天天综合网 | 91国在线高清视频 | 日本在线视频一区二区 | 国产线视频精品免费观看视频 | 97超碰人人草 | 日韩精品免费 | 久久久久久久国产精品影院 | 国产精品久久 |