天天看點

基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)

一、環境介紹

程式設計軟體: keil5

主要MCU: STM32F103C8T6

WIFI: ESP8266

協定:  MQTT

完整項目源碼下載下傳位址:

https://download.csdn.net/download/xiaolong1126626497/19137788

二、前言

這裡的 WIFI型号不重要、主要MCU不重要,連接配接的物聯網平台也不重要。

要完成本章節的内容,隻要會熟悉某款單片機的程式設計、了解基本的網絡程式設計,明白MQTT協定、能讀懂每個物聯網雲平台的幫助文檔都可以完成最終的效果。

基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)

三、功能介紹

前面有幾篇内容都介紹了如何使用在騰訊物聯網平台建立裝置,完成微信小程式與裝置進行互動;這些裝置代碼裡的連接配接的WIFI名稱和密碼都是固定,隻能通過每次修改程式、編譯、下載下傳才能更改。一個正常的物聯網智能裝置,這樣操作肯定是不合理的,是以這篇内容就完成如何使用微信小程式一鍵配網,完成裝置的WIFI切換、連接配接。

現在我們購買的智能裝置都有自己的配網方式,比如: 小米的很多裝置,小愛音箱,攝像頭,掃地機器人等。這些裝置買回來之後,使用者可以參考說明書,完成對裝置的配置,讓裝置連接配接上家裡的WIFI,完成網絡連接配接。

本次我以智能鎖為産品模型,在騰訊物聯網平台建立一個裝置,使用STM32F103系統闆+ESP8266+LED燈完成智能鎖産品的模拟開發;使用者裝置端可以按下指定的按鍵進入配網模式,打開騰訊官方的微信小程式,掃描産品二維碼,根據步驟完成對裝置的配網操作。

騰訊物聯網支援了好幾種配網模式,我這裡選擇的是“softAP”模式來完成配網操作。

softAP 模式配網的原理介紹:  正常情況下我們買回來的新裝置内部是沒有我們自己家WIFI的資訊的,也就是說這個裝置上電之後自己不知道該連接配接哪一個WIFI;這時我們就需要想辦法把我們自己家裡的WIFI名稱、WIFI密碼告訴這個裝置,這個裝置就可以去連接配接了。  那問題是怎麼去告訴裝置這些資訊?  裝置一般都有進入配網模式的按鈕,進入配網模式之後,會将裝置内部的WIFI設定成“softAP”模式,也就是裝置自己會建立一個WIFI熱點出來并建立UDP伺服器監聽連接配接,這時我們打開騰訊官方的微信小程式,按照指引去連接配接這個WIFI,連上之後,微信小程式會通過UDP協定将WIFI的配置資訊傳輸給裝置WIFI,裝置WIFI收到之後,再切換模式為STA模式,去連接配接目标WIFI,連接配接成功之後,登入雲平台,綁定裝置,完成配網。  這其中的互動協定,後面再細說。

四、在騰訊雲平台上建立智能鎖

本章節隻會展示幾個關鍵步驟,如果之前沒有使用過騰訊物聯網雲平台可以參考這裡學習一遍:

https://blog.csdn.net/xiaolong1126626497/article/details/116902653
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
這裡可以配置微信小程式的詳細參數,配網的設定也這個頁面上:
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
下面進行配網設定:
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
選擇配網模式:
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
這個頁面比較重要,需要将裝置進入配網的方法告訴使用者,引導使用者去操作,完成進入配網模式:
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)

儲存之後,打開微信小程式“騰訊連連”,掃描右下角的這個二維碼,進行配網,完成裝置添加。(一般正常産品,會将這個二維碼列印出來,貼在裝置上,友善使用者掃描)

(提示: 做這一步,要先設計好裝置端的程式,裝置上電能正常的運作,才能做)

基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
下面是手機上的截圖: (根據頁面上的提示操作裝置)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
按下開發闆子上的S2進入配網模式:
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
在序列槽上也可以看到提示資訊。
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
這時繼續操作微信小程式上的步驟,選擇裝置的WIFI進行連接配接: 之後在下一個頁面會自動等待配網成功(沒有截圖),裝置配網成功之後會出現提示,這時裝置就已經線上了
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
打開控制台已經看到裝置上線了:
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
這時進入小程式頁面,就可以對智能鎖進行操作了:
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
到此,配網已經完成,接下來就介紹裝置端的代碼。

五、STM32裝置端代碼--這才是核心

關于配網的流程,在騰訊官網有詳細介紹,看這裡:

https://cloud.tencent.com/document/product/1081/48404
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
由于關聯代碼較多,這裡隻提供主要的邏輯代碼,其他的代碼可以自己下載下傳完整源碼檢視:
基于STM32+ESP8266設計物聯網産品(重點:支援微信小程式一鍵配網連接配接騰訊雲平台)
main.c 代碼:

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "bluetooth.h"
#include "esp8266.h"
#include "mqtt.h"
 
/*
智能鎖(自己的裝置)
MQTT伺服器位址: 106.55.124.154
MQTT伺服器端口: 1883
MQTT用戶端ID: 3XM7FNOG4Llock
MQTT使用者名: 3XM7FNOG4Llock;12010126;F8Q4P;1624710719
MQTT登入密碼: 5d87e9a5bf8ae6295493c263b91aaebc4311f3e95763efe7f31be76c8578f9ec;hmacsha256
訂閱主題: $thing/down/property/3XM7FNOG4L/lock
釋出主題: $thing/up/property/3XM7FNOG4L/lock
釋出消息: {"method":"report","clientToken":"123","params":{"lock":1}}
*/
 
#define SERVER_IP "106.55.124.154"//伺服器IP
#define SERVER_PORT 1883 //端口号
 
#define CONNECT_WIFI  "_CMCC-Cqvn"   //将要連接配接的路由器名稱 --不要出現中文、空格等特殊字元
#define CONNECT_PASS "_99pu58cb"     //将要連接配接的路由器密碼
 
//騰訊物聯網伺服器的裝置資訊
#define MQTT_ClientID "3XM7FNOG4Llock"
#define MQTT_UserName "3XM7FNOG4Llock;12010126;F8Q4P;1624710719"
#define MQTT_PassWord "5d87e9a5bf8ae6295493c263b91aaebc4311f3e95763efe7f31be76c8578f9ec;hmacsha256"
 
//訂閱與釋出的主題
#define SET_TOPIC  "$thing/down/property/3XM7FNOG4L/lock"  //訂閱
#define POST_TOPIC "$thing/up/property/3XM7FNOG4L/lock"  //釋出
 
//微信小程式配網資料訂閱與釋出
#define SET_WEIXIN_TOPIC  "$thing/down/service/3XM7FNOG4L/lock"//訂閱
#define POST_WEIXIN_TOPIC "$thing/up/service/3XM7FNOG4L/lock"//釋出
 
char mqtt_message[200];//上報資料緩存區
 
int main()
{
   u32 time_cnt=0;
   u32 i;
   u8 key;
   u8 stat=0;
    
   //1.初始化需要使用的硬體
   LED_Init();
   BEEP_Init();
   KEY_Init();
    
   //2. 初始化序列槽1(列印調試資訊)與序列槽3(與WIFI通信)
   USART1_Init(115200);
   TIMER1_Init(72,20000); //逾時時間20ms
   USART3_Init(115200);//序列槽-WIFI
   TIMER3_Init(72,20000); //逾時時間20ms
   USART1_Printf("正在初始化WIFI請稍等.\n");
  
   //3. 檢測WIFI硬體 
   while(1)
   {
        //如果硬體有問題. 蜂鳴器以300ms的頻率報警
        if(ESP8266_Init())
        {
          delay_ms(300);
          BEEP=!BEEP;
          USART1_Printf("ESP8266硬體檢測錯誤.\n");  
        }
        else
        {
            BEEP=0; //關閉蜂鳴器
            break;  //硬體沒有問題. 退出檢測
        }
   }       
  
   //4. 上電如果檢測到S2按鍵按下就表示需要進入配網狀态
    if(KEY_S2)
    {
        delay_ms(100);
        if(KEY_S2)
        {
            while(1)//連接配接伺服器
            {
                printf("進入配網模式.....\n");
                BEEP=1;
                delay_ms(100);
                BEEP=0;
                
                //清除之前的WIFI連接配接資訊(連接配接個無效的WIFI),防止預設連接配接上 上次的WIFI,導緻配網錯誤
                ESP8266_SendCmd("AT+CWJAP=\"666\",\"12345678\"\r\n");
                delay_ms(200);
                
                stat=Esp8266_STA_TCPclinet_Init((u8 *)SERVER_IP,SERVER_PORT);
                if(stat==0 || stat==0x80)break;
                delay_ms(500);
                printf("stat=%d\r\n",stat);
            }
        }
        else
        {
            stat=0xFF;
        }
    }
    else
    {
        stat=0xFF;
    }
    
    //連接配接預設WIFI
    if(stat==0xFF)
    {
        printf("連接配接預設的WIFI.\n");
         //非加密端口
        USART1_Printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,SERVER_IP,SERVER_PORT,1));
    }
    
    //2. MQTT協定初始化  
    MQTT_Init(); 
    //3. 連接配接OneNet伺服器        
    while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))
    {
        USART1_Printf("伺服器連接配接失敗,正在重試...\n");
        delay_ms(500);
    }
    USART1_Printf("伺服器連接配接成功.\n");
    
    //3. 訂閱主題
    if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
    {
        USART1_Printf("主題訂閱失敗.\n");
    }
    else
    {
        USART1_Printf("主題訂閱成功.\n");
    }        
   
    
    if(stat==0x80)//進入配網模式需要給微信小程式傳回token值
    {
          //訂閱微信topic
         if(MQTT_SubscribeTopic(SET_WEIXIN_TOPIC,0,1))printf("訂閱失敗\r\n"); 
        //傳回平台資料,告知微信連連連接配接伺服器成功
        snprintf(mqtt_message,sizeof(mqtt_message),"{\"method\":\"app_bind_token\",\"clientToken\":\"client-1234\",\"params\": {\"token\":\"%s\"}}",esp8266_info.token);
        MQTT_PublishData(POST_WEIXIN_TOPIC,mqtt_message,0);
        //Smart_home{"method":"app_bind_token_reply","clientToken":"client-1234","code":0,"status":"success"} 配網成功後微信小程式傳回資料
    }
    
    while(1)
    {    
        key=KEY_Scan(0);
        if(key==2)
        {
            time_cnt=0;
            sprintf(mqtt_message,"{\"method\":\"report\",\"clientToken\":\"123\",\"params\":{\"lock\":1}}");
            MQTT_PublishData(POST_TOPIC,mqtt_message,0);
            USART1_Printf("開鎖.\r\n");
        }
        else if(key==3)
        {
            time_cnt=0;
            sprintf(mqtt_message,"{\"method\":\"report\",\"clientToken\":\"123\",\"params\":{\"lock\":0}}");
            MQTT_PublishData(POST_TOPIC,mqtt_message,0);
            USART1_Printf("關鎖\r\n");
        }  
 
        if(USART3_RX_FLAG)
        {
            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
            for(i=0;i<USART3_RX_CNT;i++)
            {
                USART1_Printf("%c",USART3_RX_BUFFER[i]);
            }
            
            //關鎖
            if(strstr((char*)USART3_RX_BUFFER,"\"lock\":0"))
            {
                LED4=1;
            }
            //開鎖
            else if(strstr((char*)USART3_RX_BUFFER,"\"lock\":1"))
            {
                LED4=0;
            }
            
            USART3_RX_CNT=0;
            USART3_RX_FLAG=0;
        }
 
        //定時發送心跳包,保持連接配接
        delay_ms(10);
        time_cnt++;
        if(time_cnt==500)
        {
            LED1=!LED1;
            MQTT_SentHeart();//發送心跳包
            time_cnt=0;
        }
    }
}
       

ESP8266的核心代碼:

//存放ESP8266的詳細資訊
struct ESP8266 esp8266_info;
 
/*SoftAP配網*/
u8 ESP8266_SoftAP_MOde(void)
{
    u8 token[]="{\"cmdType\":2,\"productId\":\"3XM7FNOG4L\",\"deviceName\":\"lock\",\"protoVersion\":\"2.0\"}\r\n";//連接配接狀态資訊
    char *p=NULL;
    char data[256];
    char buff[100];
    u8 i=0;
    u32 time1=0,time2=0;
    USART3_RX_CNT=0;
    USART3_RX_FLAG=0;
    while(1)
    {
        if(USART3_RX_FLAG)
        {
            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
            printf("rx=%s",USART3_RX_BUFFER);
            //+IPD,97,192.168.4.2,52021:{"cmdType":1,"ssid":"wbyq_wifi","password":"12345678","token":"df4a4c90abee98c9a443ae8ffd8cc16b"
            p=strstr((char *)USART3_RX_BUFFER,"+IPD");
            if(p)
            {
                strcpy(data,p);//将接收到的資料拷貝一份儲存
                p+=strlen("+IPD");
                p+=1;
                while(*p!=',' && *p!='\0')p++;
                p++;//跳過字元',',擷取到IP位址起始位置
                i=0;
                //IP位址解析
                while(*p!=',' && *p!='\0')
                {
                   buff[i++]=*p++;
                }
                buff[i]='\0';
                strcpy((char *)esp8266_info.esp8266_ip,buff);
                //端口号解析
                p++;
                i=0;
                while(*p!=':' && *p!='\0')
                {
                   buff[i++]=*p++; 
                }
                buff[i]='\0';
                esp8266_info.esp8266_prot=atoi(buff);//字元串轉整數
                //printf("ip=%s:%d\r\n",esp8266_info.esp8266_ip,esp8266_info.esp8266_prot);
                printf("ret:%d\r\n",Esp8266_UDP_SendData((u8*)esp8266_info.esp8266_ip,esp8266_info.esp8266_prot,token));//上報連接配接狀态
            }
           ESP8266_GetData(data,(char *)esp8266_info.esp8266_name,"ssid");//WIFI名
           ESP8266_GetData(data,(char *)esp8266_info.esp8266_key,"password");//密碼
           ESP8266_GetData(data,(char *)esp8266_info.token,"token");//token資料,需要傳回給平台
           printf("wifi_name:%s\r\n",esp8266_info.esp8266_name);
           printf("wifi_key:%s\r\n",esp8266_info.esp8266_key); 
           printf("wifi_token:%s\r\n",esp8266_info.token);            
           LED1=1;
           return 0;
        }
        delay_ms(1);
        time1++;
        time2++;
        if(time2>=100)
        {
           time2=0;
           LED1=!LED1;
        }  
        if(time1>=1000*300)
        {
            LED1=1;
            break;//逾時退出
        }
    }
    return 1;
}
 
 
/*******************************************************************************************************************
**形參: wifi_name --WIFI名
**      password  --密碼
**      remote_ip  --遠端IP位址(255.255.255.255為廣播位址)
**      remote_prot  --遠端端口号
**      localhost    ---本地端口号
**傳回值:0 --成功,
**       其它值 --失敗
**示例:ESP8266_UDP_STA_Mode("360WIFI_123","12345678","172.20.7.2",10500,8080);
*********************************************************************************************************************/
u8 ESP8266_UDP_STA_Mode(u8 *wifi_name,u8 *password,u8 *remote_ip,u16 remote_prot,u16 localprot)
{
    char buff[100];
    USARTx_StringSend(USART3,"+++"); //退出透傳模式
    delay_ms(1000);
    
    printf("重新開機子產品.......\r\n");
    USARTx_StringSend(USART3,"AT+RST\r\n");
    delay_ms(1000);
    delay_ms(1000); 
    printf("關回顯.......\r\n");
    if(ESP8266_SendCmd("ATE0\r\n"))return 2; 
    printf("設定為STA模式.......\r\n");
    if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;   
    printf("連接配接WIFI.......\r\n");
    snprintf(buff,sizeof(buff),"AT+CWJAP=\"%s\",\"%s\"\r\n",wifi_name,password);
    if(ESP8266_SendCmd(buff))return 5;   
    printf("查詢IP.......\r\n");
    if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 6; 
    printf("建立UDP連接配接.....\r\n");
    snprintf(buff,sizeof(buff),"AT+CIPSTART=\"UDP\",\"%s\",%d,%d,0\r\n",remote_ip,remote_prot,localprot);
    if(ESP8266_SendCmd(buff))return 7; 
    printf("設定透傳.......\r\n");
    if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 8; 
    printf("發送資料.......\r\n");
    USARTx_StringSend(USART3,"AT+CIPSEND\r\n");
    return 0;
}
 
 
/****************STA+TCPclinet初始化*************
**
**
const char *STA_TCPCLINET[]=
{
    "AT\r\n",//測試指令
    "ATE0\r\n",//關回顯
    "AT+CWMODE=1\r\n",//設定STA模式
    "AT+RST\r\n",//子產品複位
    "ATE0\r\n",//關回顯
    "AT+CWJAP=\"HUAWEIshui\",\"asdfghjkl12\"\r\n",//連接配接wifi
    "AT+CIPMUX=0\r\n",//設定單連接配接
    "AT+CIFSR\r\n",//查詢IP
    "AT+CIPSTART=\"TCP\",\"192.168.43.204\",8080\r\n",//連接配接伺服器
    "AT+CIPMODE=1\r\n",//設定透傳模式
    "AT+CIPSEND\r\n",//開始發送資料
};
傳回值: 0x7f --退出透傳模式失敗
**      0x80 --進入配網模式正常退出
**      0    --未進入配網模式正常退出
**      其他值  --異常退出
*****************************************************/
u8 Esp8266_STA_TCPclinet_Init(u8 *server_ip,u16 server_port)
{
    char buff[100];
    /*退出透傳模式*/
    u8 i=0;
    u8 stat=0;
    u32 id;
    for(i=0;i<5;i++)
    {
        USARTx_StringSend(USART3,"+++");//退出透傳模式
        delay_ms(100);
        if(Esp8266_SendCmdCheckStat("AT\r\n","OK\r\n")==0)
        {
            i=0;
            break;
        }
    }
    if(i!=0)
    {
        printf("退出透傳模式失敗\r\n");
        return 0x7f;
    }
    printf("1.子產品複位\r\n");
    if(Esp8266_SendCmdCheckStat("AT+RST\r\n","OK\r\n"))return 1;    
    delay_ms(1000);
    delay_ms(1000);
    printf("2.關回顯\r\n");
    if(Esp8266_SendCmdCheckStat("ATE0\r\n","OK\r\n"))return 2;  
    if(ESP8266_GetWifi_Stat())//查詢WIFI連接配接狀态,未連接配接成功則進入配網模式
    {
        BEEP=1;
        delay_ms(100);
        BEEP=0;
        delay_ms(100);
        BEEP=1;
        delay_ms(100);
        BEEP=0;
        stat=1;//進入配網模式标志位 
        //查詢IP位址  
        printf("3.設定模式AP\r\n");
        if(Esp8266_SendCmdCheckStat("AT+CWMODE=2\r\n","OK\r\n"))return 3;   
        printf("4.設定IP位址\r\n");
        if(Esp8266_SendCmdCheckStat("AT+CIPAP=\"192.168.4.1\",\"192.168.4.1\",\"255.255.255.0\"\r\n","OK"))return 4;
        printf("4.設定熱點資訊\r\n");
        id=*(vu32*)(0x1FFFF7E8);//使用STM32的ID作為WIFI名
        snprintf((char *)esp8266_info.esp8266_name,sizeof(esp8266_info.esp8266_name),"wbyq_%d",id);
        snprintf(buff,sizeof(buff),"AT+CWSAP=\"%s\",\"12345678\",1,4\r\n",esp8266_info.esp8266_name);
        printf("wif_name:%s\r\n",esp8266_info.esp8266_name);
        
        if(Esp8266_SendCmdCheckStat(buff,"OK\r\n"))return 5; 
        printf("5.顯示端口.......\r\n");
        if(Esp8266_SendCmdCheckStat("AT+CIPDINFO=1\r\n","OK"))return 6;     
        printf("6.設定要連接配接的UDP\r\n"); 
        if(Esp8266_SendCmdCheckStat("AT+CIPSTART=\"UDP\",\"192.168.4.255\",8266,8266,0\r\n","OK\r\n"))return 7; 
        printf("7.擷取微信小程式傳遞過來的熱點資訊\r\n");
        if(ESP8266_SoftAP_MOde())return 8;
        printf("8.設定模式STA\r\n");
        if(Esp8266_SendCmdCheckStat("AT+CWMODE=1\r\n","OK\r\n"))return 9;   
        printf("9.子產品複位\r\n");
        if(Esp8266_SendCmdCheckStat("AT+RST\r\n","OK\r\n"))return 10;   
        delay_ms(1000);
        delay_ms(1000);
        printf("10.連接配接WIFI\r\n");
        snprintf((char *)buff,sizeof(buff),"AT+CWJAP=\"%s\",\"%s\"\r\n",esp8266_info.esp8266_name,esp8266_info.esp8266_key);//字元串拼接
        if(Esp8266_SendCmdCheckStat(buff,"WIFI GOT IP"))return 11;        
    }
    printf("11.設定單連接配接\r\n");
    if(Esp8266_SendCmdCheckStat("AT+CIPMUX=0\r\n","OK"))return 12;      
    snprintf(buff,sizeof(buff),"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",server_ip,server_port);
//  printf("buff:%s\r\n",buff);
    printf("12.連接配接伺服器\r\n");
    if(Esp8266_SendCmdCheckStat(buff,"OK"))return 13;   
    printf("13.配置透傳模式\r\n");
    if(Esp8266_SendCmdCheckStat("AT+CIPMODE=1\r\n","OK\r\n"))return 14; 
    printf("14.開始發送資料\r\n");
    if(Esp8266_SendCmdCheckStat("AT+CIPSEND\r\n",">"))return 15;    
    if(stat)return 0x80;//進入配網模式并且正常退出
    else return 0;//未進入配網模式,正常退出
}
 
/**************************擷取WIFI連接配接狀态資訊***************************/
u8 ESP8266_GetWifi_Stat(void)
{
    u16 i=0;
    u16 time=0;
    u16 time2=0;
    USART3_RX_CNT=0;
    USART3_RX_FLAG=0;
    USARTx_StringSend(USART3,"AT+CWJAP?\r\n");//查詢WIFI連接配接狀态
    while(1)
    {
       if(USART3_RX_FLAG)
       {
           USART3_RX_BUFFER[USART3_RX_CNT]='\0';
           printf("rx=%s\r\n",USART3_RX_BUFFER);
           if(strstr((char *)USART3_RX_BUFFER,"+CWJAP") || strstr((char *)USART3_RX_BUFFER,"WIFI GOT IP"))
           {
                USART3_RX_CNT=0;
                USART3_RX_FLAG=0;
                LED1=1;
                return 0;
           }
           else
           {
              USART3_RX_CNT=0;
              USART3_RX_FLAG=0;
              memset(USART3_RX_BUFFER,0,sizeof(USART3_RX_BUFFER));
           }
       }
       delay_ms(10);
       i++;
       time++;
       time2++;
       if(time>=1000)
       {
            time=0;
            USARTx_StringSend(USART3,"AT+CWJAP?\r\n");
       }
       if(time2>=300)
       {
            LED1=!LED1;
           time2=0;
       }
       if(i>=100*60)
       {
           LED1=1;
           break;
       }
    }
    return 1;
}      

繼續閱讀