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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2696|回復(fù): 1
收起左側(cè)

阿里云平臺(tái)ESP8266+stm32 mqtt協(xié)議源碼

  [復(fù)制鏈接]
ID:874677 發(fā)表于 2022-4-28 11:42 | 顯示全部樓層 |閱讀模式
溫濕度數(shù)據(jù)通過ESP8266上傳阿里云,可以通過阿里云提供的手機(jī)APP查看WiFi名和密碼需修改成自己的。連接阿里云的相關(guān)參數(shù)要修改成自己的。

STM32單片機(jī)源程序如下:
/*-----------------------------------------------------*/
/*                                                     */
/*           程序main函數(shù),入口函數(shù)源文件              */
/*                                                     */
/*-----------------------------------------------------*/

#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();                   //延時(shí)功能初始化              
        Usart1_Init(9600);              //串口1功能初始化,波特率9600
        //Usart2_Init(115200);            //串口2功能初始化,波特率115200        
        Usart2_Init(9600);
        TIM4_Init(300,7200);            //TIM4初始化,定時(shí)時(shí)間 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的復(fù)位IO
    MQTT_Buff_Init();               //初始化接收,發(fā)送,命令數(shù)據(jù)的 緩沖區(qū) 以及各狀態(tài)參數(shù)
        AliIoT_Parameter_Init();            //初始化連接阿里云IoT平臺(tái)MQTT服務(wù)器的參數(shù)               
        while(1)                        //主循環(huán)
        {               
                /*--------------------------------------------------------------------*/
                /*   Connect_flag=1同服務(wù)器建立了連接,我們可以發(fā)布數(shù)據(jù)和接收推送了    */
                /*--------------------------------------------------------------------*/
                if(Connect_flag==1){     
                        /*-------------------------------------------------------------*/
                        /*                     處理發(fā)送緩沖區(qū)數(shù)據(jù)                      */
                        /*-------------------------------------------------------------*/
                                if(MQTT_TxDataOutPtr != MQTT_TxDataInPtr){                //if成立的話,說明發(fā)送緩沖區(qū)有數(shù)據(jù)了
                                //3種情況可進(jìn)入if
                                //第1種:0x10 連接報(bào)文
                                //第2種:0x82 訂閱報(bào)文,且ConnectPack_flag置位,表示連接報(bào)文成功
                                //第3種:SubcribePack_flag置位,說明連接和訂閱均成功,其他報(bào)文可發(fā)
                                if((MQTT_TxDataOutPtr[2]==0x10)||((MQTT_TxDataOutPtr[2]==0x82)&&(ConnectPack_flag==1))||(SubcribePack_flag==1)){   
                                        u1_printf("發(fā)送數(shù)據(jù):0x%x\r\n",MQTT_TxDataOutPtr[2]);  //串口提示信息
                                        MQTT_TxData(MQTT_TxDataOutPtr);                       //發(fā)送數(shù)據(jù)
                                        MQTT_TxDataOutPtr += BUFF_UNIT;                       //指針下移
                                        if(MQTT_TxDataOutPtr==MQTT_TxDataEndPtr)              //如果指針到緩沖區(qū)尾部了
                                                MQTT_TxDataOutPtr = MQTT_TxDataBuf[0];            //指針歸位到緩沖區(qū)開頭
                                }                                 
                        }//處理發(fā)送緩沖區(qū)數(shù)據(jù)的else if分支結(jié)尾
                        
                        /*-------------------------------------------------------------*/
                        /*                     處理接收緩沖區(qū)數(shù)據(jù)                      */
                        /*-------------------------------------------------------------*/
                        if(MQTT_RxDataOutPtr != MQTT_RxDataInPtr){  //if成立的話,說明接收緩沖區(qū)有數(shù)據(jù)了                                                                                                               
                                u1_printf("接收到數(shù)據(jù):");
                                /*-----------------------------------------------------*/
                                /*                    處理CONNACK報(bào)文                  */
                                /*-----------------------------------------------------*/                                
                                //if判斷,如果第一個(gè)字節(jié)是0x20,表示收到的是CONNACK報(bào)文
                                //接著我們要判斷第4個(gè)字節(jié),看看CONNECT報(bào)文是否成功
                                if(MQTT_RxDataOutPtr[2]==0x20){                                    
                                    switch(MQTT_RxDataOutPtr[5]){                                       
                                                case 0x00 : u1_printf("CONNECT報(bào)文成功\r\n");                            //串口輸出信息        
                                                                    ConnectPack_flag = 1;                                        //CONNECT報(bào)文成功,訂閱報(bào)文可發(fā)
                                                                        break;                                                       //跳出分支case 0x00                                             
                                                case 0x01 : u1_printf("連接已拒絕,不支持的協(xié)議版本,準(zhǔn)備重啟\r\n");     //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接
                                                                        break;                                                       //跳出分支case 0x01   
                                                case 0x02 : u1_printf("連接已拒絕,不合格的客戶端標(biāo)識(shí)符,準(zhǔn)備重啟\r\n"); //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接
                                                                        break;                                                       //跳出分支case 0x02
                                                case 0x03 : u1_printf("連接已拒絕,服務(wù)端不可用,準(zhǔn)備重啟\r\n");         //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接
                                                                        break;                                                       //跳出分支case 0x03
                                                case 0x04 : u1_printf("連接已拒絕,無效的用戶名或密碼,準(zhǔn)備重啟\r\n");   //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接                                                
                                                                        break;                                                       //跳出分支case 0x04
                                                case 0x05 : u1_printf("連接已拒絕,未授權(quán),準(zhǔn)備重啟\r\n");               //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接                                                
                                                                        break;                                                       //跳出分支case 0x05                 
                                                default   : u1_printf("連接已拒絕,未知狀態(tài),準(zhǔn)備重啟\r\n");             //串口輸出信息
                                                                        Connect_flag = 0;                                            //Connect_flag置零,重啟連接                                       
                                                                        break;                                                       //跳出分支case default                                                                 
                                        }                                
                                }                        
                                //if判斷,第一個(gè)字節(jié)是0x90,表示收到的是SUBACK報(bào)文
                                //接著我們要判斷訂閱回復(fù),看看是不是成功
                                else if(MQTT_RxDataOutPtr[2]==0x90){
                                                switch(MQTT_RxDataOutPtr[6]){                                       
                                                case 0x00 :
                                                case 0x01 : u1_printf("訂閱成功\r\n");            //串口輸出信息
                                                                SubcribePack_flag = 1;                //SubcribePack_flag置1,表示訂閱報(bào)文成功,其他報(bào)文可發(fā)送
                                                                        Ping_flag = 0;                        //Ping_flag清零
                                                                       TIM3_ENABLE_30S();                    //啟動(dòng)30s的PING定時(shí)器
                                                                        TIM2_ENABLE_30S();                    //啟動(dòng)30s的上傳數(shù)據(jù)的定時(shí)器
                                                            TempHumi_State();                     //先發(fā)一次數(shù)據(jù)
                                                                        break;                                //跳出分支                                             
                                                default   : u1_printf("訂閱失敗,準(zhǔn)備重啟\r\n");  //串口輸出信息
                                                                        Connect_flag = 0;                     //Connect_flag置零,重啟連接
                                                                        break;                                //跳出分支                                                                 
                                        }                                       
                                }
                                //if判斷,第一個(gè)字節(jié)是0xD0,表示收到的是PINGRESP報(bào)文
                                else if(MQTT_RxDataOutPtr[2]==0xD0){
                                        u1_printf("PING報(bào)文回復(fù)\r\n");                   //串口輸出信息
                                        if(Ping_flag==1){                     //如果Ping_flag=1,表示第一次發(fā)送
                                                 Ping_flag = 0;                                      //要清除Ping_flag標(biāo)志
                                        }else if(Ping_flag>1){                                   //如果Ping_flag>1,表示是多次發(fā)送了,而且是2s間隔的快速發(fā)送
                                                Ping_flag = 0;                                       //要清除Ping_flag標(biāo)志
                                                TIM3_ENABLE_30S();                                   //PING定時(shí)器重回30s的時(shí)間
                                        }                                
                                }        
                                //if判斷,如果第一個(gè)字節(jié)是0x30,表示收到的是服務(wù)器發(fā)來的推送數(shù)據(jù)
                                //我們要提取控制命令
                                else if((MQTT_RxDataOutPtr[2]==0x30)){
                                        u1_printf("服務(wù)器等級(jí)0推送\r\n");                    //串口輸出信息
                                        MQTT_DealPushdata_Qs0(MQTT_RxDataOutPtr);  //處理等級(jí)0推送數(shù)據(jù)
                                }                                
                                                               
                                MQTT_RxDataOutPtr += BUFF_UNIT;                     //指針下移
                                if(MQTT_RxDataOutPtr==MQTT_RxDataEndPtr)            //如果指針到緩沖區(qū)尾部了
                                        MQTT_RxDataOutPtr = MQTT_RxDataBuf[0];          //指針歸位到緩沖區(qū)開頭                        
                        }//處理接收緩沖區(qū)數(shù)據(jù)的else if分支結(jié)尾
                        
                        /*-------------------------------------------------------------*/
                        /*                     處理命令緩沖區(qū)數(shù)據(jù)                      */
                        /*-------------------------------------------------------------*/
                        if(MQTT_CMDOutPtr != MQTT_CMDInPtr){                             //if成立的話,說明命令緩沖區(qū)有數(shù)據(jù)了                              
                                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)                                //如果指針到緩沖區(qū)尾部了
                                        MQTT_CMDOutPtr = MQTT_CMDBuf[0];                               //指針歸位到緩沖區(qū)開頭                                
                        }//處理命令緩沖區(qū)數(shù)據(jù)的else if分支結(jié)尾        
                }//Connect_flag=1的if分支的結(jié)尾
               
                /*--------------------------------------------------------------------*/
                /*      Connect_flag=0同服務(wù)器斷開了連接,我們要重啟連接服務(wù)器         */
                /*--------------------------------------------------------------------*/
                else{
                        u1_printf("需要連接服務(wù)器\r\n");                 //串口輸出信息
                        TIM_Cmd(TIM4,DISABLE);                           //關(guān)閉TIM4
                        TIM_Cmd(TIM3,DISABLE);                           //關(guān)閉TIM3  
                        WiFi_RxCounter=0;                                //WiFi接收數(shù)據(jù)量變量清零                        
                        memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);          //清空WiFi接收緩沖區(qū)
                        if(WiFi_Connect_IoTServer()==0){                                //如果WiFi連接云服務(wù)器函數(shù)返回0,表示正確,進(jìn)入if
                                u1_printf("建立TCP連接成功\r\n");            //串口輸出信息
                                Connect_flag = 1;                            //Connect_flag置1,表示連接成功        
                                WiFi_RxCounter=0;                            //WiFi接收數(shù)據(jù)量變量清零                        
                                memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);      //清空WiFi接收緩沖區(qū)
                                MQTT_Buff_ReInit();                          //重新初始化發(fā)送緩沖區(qū)                    
                        }                                
                }
        }
}

/*-------------------------------------------------*/
/*函數(shù)名:采集溫濕度,并發(fā)布給服務(wù)器               */
/*參  數(shù):無                                       */
/*返回值:無                                       */
/*-------------------------------------------------*/
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);  //構(gòu)建回復(fù)濕度溫度數(shù)據(jù)
        MQTT_PublishQs0(P_TOPIC_NAME,temp,strlen(temp));   //添加數(shù)據(jù),發(fā)布給服務(wù)器        
}


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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1022021 發(fā)表于 2023-2-6 14:46 | 顯示全部樓層
代碼不全,中斷邏輯部分丟失,謹(jǐn)慎下載
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产在线观看不卡一区二区三区 | 亚洲网在线 | 国产中文字幕网 | 欧美日韩在线精品 | 午夜精品久久久 | 日韩成人在线视频 | 免费一级欧美在线观看视频 | 四虎永久| 国产精品一区在线 | h视频在线播放 | 天堂久久久久久久 | 在线看片网站 | 欧美一级免费观看 | 亚洲成人激情在线观看 | 久久久久久91 | 成人国产在线观看 | 操久久| 亚洲欧美aⅴ | 成人在线免费网站 | 日韩一区av | 精品国产精品三级精品av网址 | 亚洲免费网 | 亚洲欧美日韩精品久久亚洲区 | 毛片免费在线观看 | 神马久久av | 欧美久久免费观看 | 六月色婷| 欧美天堂一区 | 国产精品无码专区在线观看 | 在线欧美视频 | 国产一区h | 99精品欧美一区二区三区综合在线 | 宅男噜噜噜66一区二区 | 欧美精品一区二区三区在线 | 人人玩人人干 | 我爱操| 国内久久 | 亚洲精品久久久一区二区三区 | 国产精品美女一区二区三区 | 日韩欧美视频在线 | 黄色大片在线 |