找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MQTT协议Onenet上云+stm32f103最小系统控制DH11温湿度传感器 源程序

  [复制链接]
跳转到指定楼层
楼主
用最小系统也行,用正点原子的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, 下载次数: 85)

评分

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

查看全部评分

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

使用道具 举报

沙发
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 单片机教程网

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