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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2652|回復: 1
打印 上一主題 下一主題
收起左側

阿里云平臺ESP8266+stm32 mqtt協議源碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:874677 發表于 2022-4-28 11:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
溫濕度數據通過ESP8266上傳阿里云,可以通過阿里云提供的手機APP查看WiFi名和密碼需修改成自己的。連接阿里云的相關參數要修改成自己的。

STM32單片機源程序如下:
/*-----------------------------------------------------*/
/*                                                     */
/*           程序main函數,入口函數源文件              */
/*                                                     */
/*-----------------------------------------------------*/

#include "stm32f10x.h"  //包含需要的頭文件
#include "main.h"       //包含需要的頭文件
#include "delay.h"      //包含需要的頭文件
#include "usart1.h"     //包含需要的頭文件
#include "usart2.h"     //包含需要的頭文件
#include "timer1.h"     //包含需要的頭文件
#include "timer2.h"     //包含需要的頭文件
#include "timer3.h"     //包含需要的頭文件
#include "timer4.h"     //包含需要的頭文件
#include "wifi.h"            //包含需要的頭文件
#include "led.h"        //包含需要的頭文件
#include "mqtt.h"       //包含需要的頭文件
#include "key.h"        //包含需要的頭文件
#include "dht11.h"
#include "iic.h"        //包含需要的頭文件

//void LED1_State(void)
//{
//        char temp[256];
//        if(LED1_IN_STA)
//        sprintf(temp,"{\"method\":\"thing.event.property.post\",\"id\":\"203302322\",\"params\":{\"PowerSwitch\":0},\"version\":\"1.0.0\"}");  
//        else
//        sprintf(temp,"{\"method\":\"thing.event.property.post\",\"id\":\"203302322\",\"params\":{\"PowerSwitch\":1},\"version\":\"1.0.0\"}");  
//}
int main(void)
{        
        Delay_Init();                   //延時功能初始化              
        Usart1_Init(9600);              //串口1功能初始化,波特率9600
        //Usart2_Init(115200);            //串口2功能初始化,波特率115200        
        Usart2_Init(9600);
        TIM4_Init(300,7200);            //TIM4初始化,定時時間 300*7200*1000/72000000 = 30ms
        LED_Init();                            //LED初始化
        KEY_Init();                     //按鍵初始化
//        IIC_Init();                     //初始化IIC接口
//        AHT10_Init();                   //初始化AHT10
//         while(DHT11_Init())        //DHT11初始化        
//        {
//        u1_printf("DHT11_INIT error \r\n");
//        }               
//                u1_printf("DHT11_INIT success \r\n");
        
        WiFi_ResetIO_Init();            //初始化WiFi的復位IO
    MQTT_Buff_Init();               //初始化接收,發送,命令數據的 緩沖區 以及各狀態參數
        AliIoT_Parameter_Init();            //初始化連接阿里云IoT平臺MQTT服務器的參數               
        while(1)                        //主循環
        {               
                /*--------------------------------------------------------------------*/
                /*   Connect_flag=1同服務器建立了連接,我們可以發布數據和接收推送了    */
                /*--------------------------------------------------------------------*/
                if(Connect_flag==1){     
                        /*-------------------------------------------------------------*/
                        /*                     處理發送緩沖區數據                      */
                        /*-------------------------------------------------------------*/
                                if(MQTT_TxDataOutPtr != MQTT_TxDataInPtr){                //if成立的話,說明發送緩沖區有數據了
                                //3種情況可進入if
                                //第1種:0x10 連接報文
                                //第2種:0x82 訂閱報文,且ConnectPack_flag置位,表示連接報文成功
                                //第3種:SubcribePack_flag置位,說明連接和訂閱均成功,其他報文可發
                                if((MQTT_TxDataOutPtr[2]==0x10)||((MQTT_TxDataOutPtr[2]==0x82)&&(ConnectPack_flag==1))||(SubcribePack_flag==1)){   
                                        u1_printf("發送數據:0x%x\r\n",MQTT_TxDataOutPtr[2]);  //串口提示信息
                                        MQTT_TxData(MQTT_TxDataOutPtr);                       //發送數據
                                        MQTT_TxDataOutPtr += BUFF_UNIT;                       //指針下移
                                        if(MQTT_TxDataOutPtr==MQTT_TxDataEndPtr)              //如果指針到緩沖區尾部了
                                                MQTT_TxDataOutPtr = MQTT_TxDataBuf[0];            //指針歸位到緩沖區開頭
                                }                                 
                        }//處理發送緩沖區數據的else if分支結尾
                        
                        /*-------------------------------------------------------------*/
                        /*                     處理接收緩沖區數據                      */
                        /*-------------------------------------------------------------*/
                        if(MQTT_RxDataOutPtr != MQTT_RxDataInPtr){  //if成立的話,說明接收緩沖區有數據了                                                                                                               
                                u1_printf("接收到數據:");
                                /*-----------------------------------------------------*/
                                /*                    處理CONNACK報文                  */
                                /*-----------------------------------------------------*/                                
                                //if判斷,如果第一個字節是0x20,表示收到的是CONNACK報文
                                //接著我們要判斷第4個字節,看看CONNECT報文是否成功
                                if(MQTT_RxDataOutPtr[2]==0x20){                                    
                                    switch(MQTT_RxDataOutPtr[5]){                                       
                                                case 0x00 : u1_printf("CONNECT報文成功\r\n");                            //串口輸出信息        
                                                                    ConnectPack_flag = 1;                                        //CONNECT報文成功,訂閱報文可發
                                                                        break;                                                       //跳出分支case 0x00                                             
                                                case 0x01 : u1_printf("連接已拒絕,不支持的協議版本,準備重啟\r\n");     //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接
                                                                        break;                                                       //跳出分支case 0x01   
                                                case 0x02 : u1_printf("連接已拒絕,不合格的客戶端標識符,準備重啟\r\n"); //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接
                                                                        break;                                                       //跳出分支case 0x02
                                                case 0x03 : u1_printf("連接已拒絕,服務端不可用,準備重啟\r\n");         //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接
                                                                        break;                                                       //跳出分支case 0x03
                                                case 0x04 : u1_printf("連接已拒絕,無效的用戶名或密碼,準備重啟\r\n");   //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接                                                
                                                                        break;                                                       //跳出分支case 0x04
                                                case 0x05 : u1_printf("連接已拒絕,未授權,準備重啟\r\n");               //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接                                                
                                                                        break;                                                       //跳出分支case 0x05                 
                                                default   : u1_printf("連接已拒絕,未知狀態,準備重啟\r\n");             //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接                                       
                                                                        break;                                                       //跳出分支case default                                                                 
                                        }                                
                                }                        
                                //if判斷,第一個字節是0x90,表示收到的是SUBACK報文
                                //接著我們要判斷訂閱回復,看看是不是成功
                                else if(MQTT_RxDataOutPtr[2]==0x90){
                                                switch(MQTT_RxDataOutPtr[6]){                                       
                                                case 0x00 :
                                                case 0x01 : u1_printf("訂閱成功\r\n");            //串口輸出信息
                                                                SubcribePack_flag = 1;                //SubcribePack_flag置1,表示訂閱報文成功,其他報文可發送
                                                                        Ping_flag = 0;                        //Ping_flag清零
                                                                       TIM3_ENABLE_30S();                    //啟動30s的PING定時器
                                                                        TIM2_ENABLE_30S();                    //啟動30s的上傳數據的定時器
                                                            TempHumi_State();                     //先發一次數據
                                                                        break;                                //跳出分支                                             
                                                default   : u1_printf("訂閱失敗,準備重啟\r\n");  //串口輸出信息
                                                                        Connect_flag = 0;                     //Connect_flag置零,重啟連接
                                                                        break;                                //跳出分支                                                                 
                                        }                                       
                                }
                                //if判斷,第一個字節是0xD0,表示收到的是PINGRESP報文
                                else if(MQTT_RxDataOutPtr[2]==0xD0){
                                        u1_printf("PING報文回復\r\n");                   //串口輸出信息
                                        if(Ping_flag==1){                     //如果Ping_flag=1,表示第一次發送
                                                 Ping_flag = 0;                                      //要清除Ping_flag標志
                                        }else if(Ping_flag>1){                                   //如果Ping_flag>1,表示是多次發送了,而且是2s間隔的快速發送
                                                Ping_flag = 0;                                       //要清除Ping_flag標志
                                                TIM3_ENABLE_30S();                                   //PING定時器重回30s的時間
                                        }                                
                                }        
                                //if判斷,如果第一個字節是0x30,表示收到的是服務器發來的推送數據
                                //我們要提取控制命令
                                else if((MQTT_RxDataOutPtr[2]==0x30)){
                                        u1_printf("服務器等級0推送\r\n");                    //串口輸出信息
                                        MQTT_DealPushdata_Qs0(MQTT_RxDataOutPtr);  //處理等級0推送數據
                                }                                
                                                               
                                MQTT_RxDataOutPtr += BUFF_UNIT;                     //指針下移
                                if(MQTT_RxDataOutPtr==MQTT_RxDataEndPtr)            //如果指針到緩沖區尾部了
                                        MQTT_RxDataOutPtr = MQTT_RxDataBuf[0];          //指針歸位到緩沖區開頭                        
                        }//處理接收緩沖區數據的else if分支結尾
                        
                        /*-------------------------------------------------------------*/
                        /*                     處理命令緩沖區數據                      */
                        /*-------------------------------------------------------------*/
                        if(MQTT_CMDOutPtr != MQTT_CMDInPtr){                             //if成立的話,說明命令緩沖區有數據了                              
                                u1_printf("命令:%s\r\n",&MQTT_CMDOutPtr[2]);                 //串口輸出信息
//                                if(strstr((char *)MQTT_CMDOutPtr+2,"\params\":{\"PowerSwitch\":1}")){
//        LED1_ON;
//        LED1_State();
//        }else if(strstr((char *)MQTT_CMDOutPtr+2,"\params\":{\"PowerSwitch\":0}")){
//        LED1_OFF;
//        LED1_State();
//        }
                                 MQTT_CMDOutPtr += BUFF_UNIT;                                      //指針下移
                                  if(MQTT_CMDOutPtr==MQTT_CMDEndPtr)                                //如果指針到緩沖區尾部了
                                        MQTT_CMDOutPtr = MQTT_CMDBuf[0];                               //指針歸位到緩沖區開頭                                
                        }//處理命令緩沖區數據的else if分支結尾        
                }//Connect_flag=1的if分支的結尾
               
                /*--------------------------------------------------------------------*/
                /*      Connect_flag=0同服務器斷開了連接,我們要重啟連接服務器         */
                /*--------------------------------------------------------------------*/
                else{
                        u1_printf("需要連接服務器\r\n");                 //串口輸出信息
                        TIM_Cmd(TIM4,DISABLE);                           //關閉TIM4
                        TIM_Cmd(TIM3,DISABLE);                           //關閉TIM3  
                        WiFi_RxCounter=0;                                //WiFi接收數據量變量清零                        
                        memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);          //清空WiFi接收緩沖區
                        if(WiFi_Connect_IoTServer()==0){                                //如果WiFi連接云服務器函數返回0,表示正確,進入if
                                u1_printf("建立TCP連接成功\r\n");            //串口輸出信息
                                Connect_flag = 1;                            //Connect_flag置1,表示連接成功        
                                WiFi_RxCounter=0;                            //WiFi接收數據量變量清零                        
                                memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);      //清空WiFi接收緩沖區
                                MQTT_Buff_ReInit();                          //重新初始化發送緩沖區                    
                        }                                
                }
        }
}

/*-------------------------------------------------*/
/*函數名:采集溫濕度,并發布給服務器               */
/*參  數:無                                       */
/*返回值:無                                       */
/*-------------------------------------------------*/
void TempHumi_State(void)
{
        u8 tempdata,humidata;        
        char temp[256];  
        
        DHT11_Read_Data(&tempdata,&humidata);        //讀取溫濕度值        
        //AHT10_Data(&tempdata,&humidata);
        
        
        u1_printf("溫度:%d  濕度:%d\r\n",tempdata,humidata);

        sprintf(temp,"{\"method\":\"thing.event.property.post\",\"id\":\"203302322\",\"params\":{\"CuTemperature\":%2d,\"CurrentHumidity\":%2d},\"version\":\"1.0.0\"}",tempdata,humidata);  //構建回復濕度溫度數據
        MQTT_PublishQs0(P_TOPIC_NAME,temp,strlen(temp));   //添加數據,發布給服務器        
}


Keil代碼與Proteus仿真下載: 基于stm32f103的溫濕度上傳阿里云.7z (217.8 KB, 下載次數: 191)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1022021 發表于 2023-2-6 14:46 | 只看該作者
代碼不全,中斷邏輯部分丟失,謹慎下載
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91日日| 最新国产精品视频 | 女人牲交视频一级毛片 | 精品自拍视频 | 国产精品av久久久久久毛片 | 午夜影视免费片在线观看 | 日韩视频在线一区 | 国产精品日韩在线 | 久久av一区二区三区 | 精品久久久久久 | 欧美日韩综合一区 | 精品乱码一区二区三四区视频 | 操人视频在线观看 | 精品视频久久久久久 | 久久精品91久久久久久再现 | 欧美日韩专区 | 亚洲天堂中文字幕 | 秋霞在线一区二区 | 日韩成人在线播放 | 亚洲成av人影片在线观看 | 在线国产精品一区 | 中文字幕 国产 | 能免费看的av | 日韩免费一区二区 | 欧美一页 | 亚洲精品九九 | 国产精品视频专区 | 亚洲精品一区二区在线观看 | 高清视频一区二区三区 | 欧美日韩一区二区在线播放 | 欧美成人在线影院 | 伊人一区 | 91在线视频免费观看 | 亚洲精品乱码久久久久久黑人 | 日韩电影中文字幕在线观看 | 日本不卡免费新一二三区 | 国产精品毛片一区二区三区 | 国产成人精品免费视频 | 日本成人久久 | 国产偷自视频区视频 | 欧美极品少妇xxxxⅹ免费视频 |