esp8266 wifi模组手机一键配网,配置一次,下次重启设备后不需再进行配网
編寫時間:2018年9月2日
#define ?ATCMDLEN ? 20
extern uint8_t usart3RecvEndFlag;
extern UART_HandleTypeDef huart3;
extern uint16_t dmaUsart3RxLen;
extern uint8_t dmaUsart3RxBuf[DATA_BUFFER_SIZE];
uint8_t wifi_config = 0;
typedef enum dataType
{
? ? ?WIFI_AT, ? ? ? ? ? ? ?//檢測wifi模組是否在線
?? ? WIFI_CWMODE_DEF, ? ? ?//配置WIFI模組為Station模式并保存到flash
?? ? WIFI_RST, ? ? ? ? ? ? //重啟WIFI模塊
?? ? WIFI_CWAUTOCONN, ? ? ?//使能上電自動連接AP(路由)
?? ? WIFI_CWSTARTSMART, ? ?//CWSTARTSMART
?? ? WIFI_CWSTOPSMART, ? ? //釋放內(nèi)存
?? ? WIFI_CIPSTATUS_TWO, ? //查詢網(wǎng)絡(luò)連接狀態(tài),STATUS:2,獲得 IP
?? ? WIFI_CIPSTATUS_THREE, //查詢網(wǎng)絡(luò)連接狀態(tài),已連接
?? ? WIFI_CIPSTATUS_FOUR, ?//查詢網(wǎng)絡(luò)連接狀態(tài),斷開連接
?? ? WIFI_CIPSTATUS_FIVE, ?//查詢網(wǎng)絡(luò)連接狀態(tài),未連接到 WiFi
?? ? WIFI_CWJAP_DEF, ? ? ? //查看wifi信號強度
?? ? WIFI_CIPMUX, ? ? ? ? ?//開啟多連接
?? ? WIFI_CIPSTART_ZERO, ? //創(chuàng)建0號路由器AP
?? ? WIFI_CIPSTART_ONE, ? ?//連接1號路由器AP
?? ? WIFI_CIPSTART_TWO, ? ?//連接2號路由器AP
?? ? WIFI_CIPSTART_THREE, ?//連接3號路由器AP
?? ? WIFI_CIPCLOSE_ZERO, ? //關(guān)閉esp8266模組與0號服務(wù)器的連接
?? ? WIFI_CIPCLOSE_ONE, ? ?//關(guān)閉esp8266模組與1號服務(wù)器的連接
?? ? WIFI_CIPCLOSE_TWO, ? ?//關(guān)閉esp8266模組與2號服務(wù)器的連接
?? ? WIFI_CIPCLOSE_THREE ? //關(guān)閉esp8266模組與3號服務(wù)器的連接
?? ?
}dataCmd; //此處的dataCmd為枚舉型enum dataType的別名
typedef ?struct WIFICONFIGCMD
{
? ? ?uint8_t* wifiCmd; ? ?//wifi模組AT指令
?? ? uint8_t cmdLen; ? ? ?//wifi模組AT指令數(shù)據(jù)長度
?? ? uint8_t* wifiAsk; ? ?//wifi模組應(yīng)答
}wifiCmdType;
?
wifiCmdType ?wificmd[ATCMDLEN]={
{(uint8_t*)"AT\r\n",DATALEN("AT\r\n")-1,(uint8_t*)"OK"},? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //0
{(uint8_t*)"AT+CWMODE_DEF=1\r\n",DATALEN("AT+CWMODE_DEF=1\r\n")-1,(uint8_t*)"OK"},? //1
{(uint8_t*)"AT+RST\r\n",DATALEN("AT+RST\r\n")-1,(uint8_t*)"OK"},? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //2
{(uint8_t*)"AT+CWAUTOCONN=1\r\n",DATALEN("AT+CWAUTOCONN=1\r\n")-1,(uint8_t*)"OK"}, //3
{(uint8_t*)"AT+CWSTARTSMART\r\n",DATALEN("AT+CWSTARTSMART\r\n")-1,(uint8_t*)"OK"},? //4
{(uint8_t*)"AT+CWSTOPSMART\r\n",DATALEN("AT+CWSTOPSMART\r\n")-1,(uint8_t*)"OK"},? ? ? //5
{(uint8_t*)"AT+CIPSTATUS\r\n",DATALEN("AT+CIPSTATUS\r\n")-1,(uint8_t*)"STATUS:2"},? //6
{(uint8_t*)"AT+CIPSTATUS\r\n",DATALEN("AT+CIPSTATUS\r\n")-1,(uint8_t*)"STATUS:3"},? //7
{(uint8_t*)"AT+CIPSTATUS\r\n",DATALEN("AT+CIPSTATUS\r\n")-1,(uint8_t*)"STATUS:4"},? //8
{(uint8_t*)"AT+CIPSTATUS\r\n",DATALEN("AT+CIPSTATUS\r\n")-1,(uint8_t*)"STATUS:5"},? //9
{(uint8_t*)"AT+CWJAP_DEF?\r\n",DATALEN("AT+CWJAP_DEF?\r\n")-1,(uint8_t*)"OK"}, ? //10
{(uint8_t*)"AT+CIPMUX=1\r\n",DATALEN("AT+CIPMUX=1\r\n")-1,(uint8_t*)"OK"},? ? ? ? ? ? ? ?//11
?? {(uint8_t*)"AT+CIPSTART=0,\"UDP\",\"192.168.1.117\",8000\r\n",DATALEN("AT+CIPSTART=0,\"UDP\",\"192.168.1.117\",8000\r\n")-1,(uint8_t*)"0,CONNECT"},//12
?? {(uint8_t*)"AT+CIPSTART=1,\"UDP\",\"192.168.1.117\",8888\r\n",DATALEN("AT+CIPSTART=1,\"UDP\",\"192.168.1.117\",8888\r\n")-1,(uint8_t*)"1,CONNECT"},//13
?? {(uint8_t*)"AT+CIPSTART=2,\"UDP\",\"192.168.1.117\",9000\r\n",DATALEN("AT+CIPSTART=2,\"UDP\",\"192.168.1.117\",9000\r\n")-1,(uint8_t*)"2,CONNECT"},//14
?? {(uint8_t*)"AT+CIPSTART=3,\"UDP\",\"192.168.1.117\",9999\r\n",DATALEN("AT+CIPSTART=3,\"UDP\",\"192.168.1.117\",9999\r\n")-1,(uint8_t*)"3,CONNECT"},//15
{(uint8_t*)"AT+CIPCLOSE=0\r\n",DATALEN("AT+CIPCLOSE=0\r\n")-1,(uint8_t*)"OK"},//16
{(uint8_t*)"AT+CIPCLOSE=1\r\n",DATALEN("AT+CIPCLOSE=1\r\n")-1,(uint8_t*)"OK"},//17
{(uint8_t*)"AT+CIPCLOSE=2\r\n",DATALEN("AT+CIPCLOSE=2\r\n")-1,(uint8_t*)"OK"},//18
{(uint8_t*)"AT+CIPCLOSE=3\r\n",DATALEN("AT+CIPCLOSE=3\r\n")-1,(uint8_t*)"OK"} //19
};
?
/*
*********************************************************************************************************
*?? ?函 數(shù) 名: wifi_ack_check
*?? ?功能說明: wifi模組應(yīng)答檢測函數(shù)
*?? ?形 ? ?參: ack
*?? ?返 回 值: TRUE\FALSE
*********************************************************************************************************
*/
uint8_t wifiAtAckCmp(uint8_t* ack)
{ ?
?? ? ? ?uint8_t usart3RxBuf[200];
?? ? ? ?uint16_t len;
? ? ? ? len = dma_Usart3_Receiv(usart3RxBuf,DATALEN(usart3RxBuf));
? ? ? ? if(strstr((const char *)usart3RxBuf,(const char*)ack)){
?? ??? ??? ??? ??? ?rs485Send(usart3RxBuf,len);
?? ??? ??? ??? ??? ?memset(usart3RxBuf,0,DATALEN(usart3RxBuf));
? ? ? ? ? ? ? ? ? ? return TRUE; ? ?//返回TRUE說明wifi模組已有應(yīng)答
?? ??? ??? ?} ?
? ?
?? ? ? ?return FALSE; ? ? ? //返回FALSE說明wifi模組沒有應(yīng)答
}
?
/*
*********************************************************************************************************
*?? ?函 數(shù) 名: sendWifiCmd
*?? ?功能說明: wifi模組發(fā)送函數(shù)
*?? ?形 ? ?參: cmd,ack,waittime
*?? ?返 回 值: TRUE\FALSE
*********************************************************************************************************
*/
uint8_t sendWifiCmd(uint8_t *cmd,uint8_t len,uint8_t *ack,uint16_t waittime) ? //單片機給wifi模組發(fā)送AT指令
{
? ? ?DMA_usart3_send(cmd,len);
?? ? delay_ms(waittime);
?? ? if(wifiAtAckCmp(ack)){
? ? ? ? ? return TRUE; ? ? ?//返回TRUE說明wifi模組已有應(yīng)答
?? ? }
? ? ? ? ? return FALSE; ? ? ? ?//返回FALSE說明wifi模組沒有應(yīng)答
?}
?
/*
*********************************************************************************************************
*?? ?函 數(shù) 名: wifiCheakAsk
*?? ?功能說明: 檢測esp8266 wifi是否在線函數(shù)
*?? ?形 ? ?參: 無
*?? ?返 回 值: 無
*********************************************************************************************************
*/?
void wifiCheakAsk(void) ? ? ? ? ??
{
?? ? uint8_t i = 3; ?//檢測3次esp8266是否在線應(yīng)答
?? ? delay_ms(200);
?? ? do{
? ? ? ? ? ?//檢測ESP8266模組是否在線
? ? ? ? ? if(sendWifiCmd(wificmd[WIFI_AT].wifiCmd,wificmd[WIFI_AT].cmdLen,wificmd[WIFI_AT].wifiAsk,80))
?? ??? ? ?{
?? ??? ??? ? ? printf("檢測ESP8266模組成功,,在進行啟動配置,請稍等......\r\n\r\n");
?? ??? ??? ? ? break;
?? ??? ? ? }else{
? ? ? ? ? ? ? ?if(i == 1){
? ? ? ? ? ? ? ? ? ? printf("檢測ESP8266模組失敗!\r\n\r\n");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?continue;
?? ??? ? ?}?? ??? ??
?? ? }while(--i);
}?
?
/*
*********************************************************************************************************
*?? ?函 數(shù) 名: ipConnectConfig
*?? ?功能說明: esp8266綁定IP地址函數(shù)
*?? ?形 ? ?參: 無
*?? ?返 回 值: 無
*********************************************************************************************************
*/?
?void ?ipConnectConfig(void) ? ?//連接路由器綁定IP地址函數(shù)
{?? ?
?? ? ?uint8_t i = 3,j = 5;
?? ? ?printf("ESP8266模組重啟中,請稍等......\r\n");
?? ? ?delay_ms(200); ? ? ? ? ? ? ?//延時等待wifi模組啟動成功
?? ? ?
? ? do{
? ? ? ? ? ?//第一次重啟不成功,進行第二次重啟
?? ??? ? ? if(sendWifiCmd(wificmd[WIFI_RST].wifiCmd,wificmd[WIFI_RST].cmdLen,wificmd[WIFI_RST].wifiAsk,80))
?? ??? ? ? {?
?? ??? ??? ? ? ?printf("ESP8266模組重啟成功!\r\n\r\n");
?? ??? ??? ? ? ?wifiCheakAsk(); ? ? ? //檢測ESP8266模組是否在線
?? ??? ??? ??? ?break;
?? ??? ? ? }else{
?? ??? ??? ? ? ?if(i == 1){
? ? ? ? ? ? ? ? ? ? ? ? ?printf("ESP8266模組重啟未成功,請再次重啟設(shè)備!\r\n\r\n");
?? ??? ??? ??? ??? ?}
? ? ? ? ? ? ? ? continue;
?? ??? ??? ? }
?? ??? ?
?? ??? ?}while(i--);?? ??? ??? ?
?? ??? ?delay_xs(6); ? ? ? ?//延時6秒,確保重啟成功!
?? ??? ?
/* ?2:獲得 IP ? ? 3:已連接
? ? 4:斷開連接 ? ?5:未連接到 WiFi
?? ??? ?需要注意的是:wifi信號不好的時候,也檢測不出網(wǎng)絡(luò)狀態(tài),如網(wǎng)絡(luò)不好時,檢測到的STATUS狀態(tài)為5,而不是2*/?? ? ?
?? ??? ?do{
?? ??? ? ? if(sendWifiCmd(wificmd[WIFI_CIPSTATUS_TWO].wifiCmd,wificmd[WIFI_CIPSTATUS_TWO].cmdLen,wificmd[WIFI_CIPSTATUS_TWO].wifiAsk,80))//第一次發(fā)送確認(rèn)是否連接已連接IP,如果沒有確認(rèn)(沒有收到已連接到路由狀態(tài)),可能是wifi模組正忙于其它操作
?? ??? ? ? {
?? ??? ??? ??? ??? ?wifi_config = 1; ? ? ? ? ? ? ? ? //智能配置標(biāo)志,1為已經(jīng)配置過,下次設(shè)備重啟不需要進行再進行配置
?? ??? ??? ??? ??? ?printf("ESP8266模組已獲得路由器IP!\r\n\r\n");?? ?
? ? ? ? ? ? ? ? ? ? break;
?? ??? ??? ? }else{
? ? ? ? ? ? ? ? ? ?if(j == 1){?? ??? ??? ??? ??? ?//最后一次檢測都連不上網(wǎng)絡(luò),則打印連不上網(wǎng)絡(luò)的情況和網(wǎng)絡(luò)所處的狀態(tài)
?? ??? ??? ??? ??? ??? ?delay_ms(200);
?? ??? ??? ??? ??? ??? ?/*獲取esp8266 wifi模組的連接狀態(tài)*/
?? ??? ??? ??? ??? ? ?if(sendWifiCmd(wificmd[WIFI_CIPSTATUS_THREE].wifiCmd,wificmd[WIFI_CIPSTATUS_THREE].cmdLen,wificmd[WIFI_CIPSTATUS_THREE].wifiAsk,80)){
?? ??? ??? ??? ? ? ? ? ?printf("ESP8266模組已與路由器連接!\r\n");
? ? ? ? ? ? ? ? ? ? ? ? printf("重啟ESP8266模組:\r\n");
? ? ? ? ? ? ? ? ? ? ? ? if(sendWifiCmd(wificmd[WIFI_RST].wifiCmd,wificmd[WIFI_RST].cmdLen,wificmd[WIFI_RST].wifiAsk,50))
? ? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?printf("ESP8266模組重啟成功!\r\n\r\n");
? ? ? ? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?printf("ESP8266模組重啟未成功!\r\n\r\n");
? ? ? ? ? ? ? ? ? ? ? ? ? }
?? ??? ??? ??? ? ? ? ? ?delay_ms(500);?? ?
?}else if(sendWifiCmd(wificmd[WIFI_CIPSTATUS_FOUR].wifiCmd,wificmd[WIFI_CIPSTATUS_FOUR].cmdLen,wificmd[WIFI_CIPSTATUS_FOUR].wifiAsk,60)){
? ? ? ? ? ? ? ? ? ? ? ? printf("ESP8266模組已與路由器斷開連接!\r\n");
? ? ? ? ? ? ? ? ? ? ? ? printf("重啟ESP8266模組:\r\n");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(sendWifiCmd(wificmd[WIFI_RST].wifiCmd,wificmd[WIFI_RST].cmdLen,wificmd[WIFI_RST].wifiAsk,50))
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("ESP8266模組重啟成功!\r\n\r\n");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("ESP8266模組重啟未成功!\r\n\r\n");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?delay_xs(4);?? ?//延時4秒
?? ??? ??? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("WIFI信號不好,請檢查WIFI信號強弱,或ESP8266模組第一次連接網(wǎng)絡(luò),需要進行配網(wǎng)!\r\n");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("重啟ESP8266模組:\r\n");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?if(sendWifiCmd(wificmd[WIFI_RST].wifiCmd,wificmd[WIFI_RST].cmdLen,wificmd[WIFI_RST].wifiAsk,50))
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("ESP8266模組重啟成功!\r\n\r\n");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("ESP8266模組重啟未成功!\r\n\r\n");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?delay_ms(500);?? ?
?? ??? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??
?? ??? ??? ??? ??? ?}
? ? ? ? ? continue;?? ??? ??? ??? ??? ?
?? ??? ??? ? }?? ??? ?
?? ??? ?}while(j--);?? ??? ??? ?
?
?? ??? ?if(wifi_config == 0){ ?//wifi_config = 0,說明是第一次配網(wǎng),下次重啟wifi模組不需要進行配網(wǎng)
?? ??? ??? ??? ?printf("配置ESP8266模組為Station模式并保存到flash:\r\n");
?? ??? ??? ??? ?if(sendWifiCmd(wificmd[WIFI_CWMODE_DEF].wifiCmd,wificmd[WIFI_CWMODE_DEF].cmdLen,wificmd[WIFI_CWMODE_DEF].wifiAsk,80))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?printf("配置ESP8266模組為Station模式成功!\r\n\r\n");
?? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ?printf("配置ESP8266模組為Station模式未成功!\r\n\r\n");
?? ??? ??? ??? ?}
?? ??? ??? ??? ?delay_ms(200);
?? ??? ??? ??? ?printf("重啟ESP8266模組:\r\n");
?? ??? ??? ??? ?if(sendWifiCmd(wificmd[WIFI_RST].wifiCmd,wificmd[WIFI_RST].cmdLen,wificmd[WIFI_RST].wifiAsk,80))//重啟wifi模組,使設(shè)置生效
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?printf("ESP8266模組重啟成功!\r\n\r\n");
?? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ?printf("ESP8266模組重啟未成功!\r\n\r\n");
?? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ?delay_ms(800);?? ??? ??? ??? ?
?? ??? ??? ??? ?if(sendWifiCmd(wificmd[WIFI_CWAUTOCONN].wifiCmd,wificmd[WIFI_CWAUTOCONN].cmdLen,wificmd[WIFI_CWAUTOCONN].wifiAsk,80))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?printf("使能ESP8266模組上電自動連接路由器!\r\n\r\n");
?? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ?printf("未成功使能ESP8266模組上電自動連接路由器!\r\n\r\n");
?? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ?delay_ms(500);?? ?
?? ??? ??? ??? ?if(sendWifiCmd(wificmd[WIFI_CWSTARTSMART].wifiCmd,wificmd[WIFI_CWSTARTSMART].cmdLen,wificmd[WIFI_CWSTARTSMART].wifiAsk,80))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?printf("成功配置ESP8266模組智能配網(wǎng)命令!\r\n\r\n");
?? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ?printf("未能成功配置ESP8266模組智能配網(wǎng)命令!\r\n\r\n");
?? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ?printf("請打開您的手機進行網(wǎng)絡(luò)配置連接......\r\n\r\n\r\n\r\n\r\n\r\n");
?? ??? ??? ??? ?do{?? ??? ??? ??? ? ? ?
?? ??? ??? ??? ??? ?if(usart3RecvEndFlag == 1){
?? ??? ??? ??? ??? ??? ??? ?usart3RecvEndFlag = 0;
?? ??? ??? ??? ??? ??? ??? ?dmaUsart3RxLen = 0;
?? ??? ??? ??? ??? ??? ??? ?memset(dmaUsart3RxBuf,0,DATA_BUFFER_SIZE);
?? ??? ??? ??? ??? ??? ??? ?delay_xs(10); ? ?//延時10秒
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(sendWifiCmd(wificmd[WIFI_CWSTOPSMART].wifiCmd,wificmd[WIFI_CWSTOPSMART].cmdLen,wificmd[WIFI_CWSTOPSMART].wifiAsk,80))
?? ??? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("ESP8266模組釋放內(nèi)存!\r\n\r\n");?? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delay_xs(3);//延時3秒
?? ??? ??? ??? ??? ??? ??? ??? ??? ?if(sendWifiCmd(wificmd[WIFI_CIPSTATUS_TWO].wifiCmd,wificmd[WIFI_CIPSTATUS_TWO].cmdLen,wificmd[WIFI_CIPSTATUS_TWO].wifiAsk,60)){
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("一鍵配網(wǎng)成功!\r\n\r\n");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?wifi_config = 1;//wifi_config = 1,說明第一次配網(wǎng)成功,下次重啟wifi模組不需要進行配網(wǎng)
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?printf("一鍵配網(wǎng)失敗!\r\n\r\n");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ??? ??? ?}?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ? }?? ??? ?
?? ??? ??? ??? ??? ??? ? }
?? ??? ??? ??? ??? ?}while(1);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ?
?? ??? ??? ??? ??? ?delay_ms(200);
?? ??? ??? ??? ??? ?printf("檢測ESP8266模組的信號強度!\r\n");
?? ??? ??? ??? ??? ?DMA_usart3_send(wificmd[WIFI_CWJAP_DEF].wifiCmd,wificmd[WIFI_CWJAP_DEF].cmdLen);
?? ??? ??? ??? ??? ?delay_ms(200);
?? ??? ??? ??? ??? ?if(usart3RecvEndFlag == 1){
?? ??? ??? ??? ??? ??? ??? ?usart3RecvEndFlag = 0;
?? ??? ??? ??? ??? ??? ??? ?rs485Send(dmaUsart3RxBuf,dmaUsart3RxLen);
?? ??? ??? ??? ??? ??? ??? ?dmaUsart3RxLen = 0;
?? ??? ??? ??? ??? ??? ??? ?memset(dmaUsart3RxBuf,0,DATA_BUFFER_SIZE);
?? ??? ??? ??? ??? ? }?? ??? ??? ??
?? ??? ??? ?}
}?? ??? ?
/*
*********************************************************************************************************
*?? ?函 數(shù) 名: serversConnectConfig
*?? ?功能說明: esp8266 wifi連接服務(wù)器函數(shù)
*?? ?形 ? ?參: 無
*?? ?返 回 值: 無
*********************************************************************************************************
*/?
void serversConnectConfig(void) ? ?//綁定IP地址成功后,進行連接服務(wù)器
{?? ??? ??? ?
?? ??? ? ?if(sendWifiCmd(wificmd[WIFI_CIPSTATUS_TWO].wifiCmd,wificmd[WIFI_CIPSTATUS_TWO].cmdLen,wificmd[WIFI_CIPSTATUS_TWO].wifiAsk,60))
?? ??? ??? ?{ ??
? ? ? ? ? ? ? ? ? ? printf("ESP8266模組已綁定IP地址,請進行往下配置!\r\n\r\n");
?? ??? ??? ??? ??? ?delay_ms(200);
?? ??? ??? ??? ??? ?printf("ESP8266模組開啟多連接模式:\r\n");
?? ??? ??? ??? ??? ?if(sendWifiCmd(wificmd[WIFI_CIPMUX].wifiCmd,wificmd[WIFI_CIPMUX].cmdLen,wificmd[WIFI_CIPMUX].wifiAsk,80))
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ?printf("ESP8266模組成功開啟多連接模式!\r\n\r\n");?
?? ??? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ??? ?printf("ESP8266模組開啟多連接模式失敗!\r\n\r\n");?
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?delay_ms(200);
?? ??? ??? ??? ??? ?printf("連接IP地址為:192.168.1.117,端口號為8000的服務(wù)器:\r\n");
?? ??? ??? ??? ??? ?if(sendWifiCmd(wificmd[WIFI_CIPSTART_ZERO].wifiCmd,wificmd[WIFI_CIPSTART_ZERO].cmdLen,wificmd[WIFI_CIPSTART_ZERO].wifiAsk,80))
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ?printf("成功連接IP地址為:192.168.1.117,端口號為8000的服務(wù)器!\r\n\r\n");
?? ??? ??? ??? ??? ?}else{
?? ??? ??? ??? ??? ??? ??? ?printf("連接IP地址為:192.168.1.117,端口號為8000的服務(wù)器失敗!\r\n\r\n");
?? ??? ??? ??? ??? ?}
?? ? ? ?}?? ??? ??? ??? ?
}?? ??
?
/*
*********************************************************************************************************
*?? ?函 數(shù) 名: esp8266SendData
*?? ?功能說明: esp8266 wifi注冊函數(shù)
*?? ?形 ? ?參: databuf,len
*?? ?返 回 值: 無
*********************************************************************************************************
*/?
void esp8266SendData(uint8_t *databuf,uint8_t len) ? //連接好服務(wù)器,開始往服務(wù)器發(fā)注冊包進行注冊
{ ?
?? ? ?uint8_t str[50];
?? ? ?sprintf((char *)str,"AT+CIPSEND=0,%d\r\n",len); ? ?//把數(shù)組的數(shù)據(jù)長度數(shù)字改為字符串加到AT指令里面
?? ?
?? ??? ?printf("數(shù)據(jù)發(fā)送預(yù)先配置:\r\n");
?? ??? ?if(sendWifiCmd(str,strlen((char*)str),(uint8_t*)"OK",80))
?? ??? ?{
?? ??? ??? ?printf("數(shù)據(jù)發(fā)送預(yù)先配置成功!\r\n\r\n");
?? ??? ?}else{
?? ??? ??? ?printf("數(shù)據(jù)發(fā)送預(yù)先配置失敗!\r\n\r\n");
?? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ?delay_ms(20);
?? ?//if(sendWifiCmd((uint8_t*)"我是心跳包!\r\n",DATALEN("我是心跳包!\r\n")-1,(uint8_t*)"OK",80))
?? ??? ?if(sendWifiCmd(databuf,len,(uint8_t*)"OK",80))
?? ??? ?{
?? ??? ??? ?printf("數(shù)據(jù)發(fā)送成功!\r\n\r\n");
?? ??? ? }else{
?? ??? ??? ?printf("數(shù)據(jù)發(fā)送失敗!\r\n\r\n");
?? ??? ? }?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?
//?? ??? ? if(sendWifiCmd((uint8_t*)"AT+CIPCLOSE=0\r\n",DATALEN("AT+CIPCLOSE=0\r\n")-1,(uint8_t*)"OK",80))
//?? ??? ? {
//?? ??? ??? ??? ??? ??? ?printf("ESP8266模組解綁IP地址成功!\r\n\r\n");?
//?? ??? ??? ?}else{
//?? ??? ??? ??? ??? ??? ?printf("ESP8266模組解綁IP地址失敗!\r\n\r\n");?
//?? ??? ??? ?}
}
?
void wifiDataReceiv(void)
{
?? ??? ?printf("數(shù)據(jù)發(fā)送預(yù)先配置:\r\n");
?? ??? ?if(sendWifiCmd((uint8_t*)"AT+CIPSEND=0,24\r\n",DATALEN("AT+CIPSEND=0,24\r\n")-1,(uint8_t*)"OK",80))
?? ??? ?{
?? ??? ??? ??? ?printf("數(shù)據(jù)發(fā)送預(yù)先配置成功!\r\n\r\n");
?? ??? ?}else{
?? ??? ??? ??? ?printf("數(shù)據(jù)發(fā)送預(yù)先配置失敗!\r\n\r\n");
?? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ?delay_ms(20);
?? ??? ?
?? ??? ?if(sendWifiCmd((uint8_t*)"我是心跳包,請求注冊!\r\n",DATALEN("我是心跳包,請求注冊!\r\n")-1,(uint8_t*)"OK",80))
?? ??? ?{
?? ??? ??? ??? ?printf("心跳包發(fā)送成功!\r\n\r\n");
?? ??? ? }else{
?? ??? ??? ??? ?printf("心跳包發(fā)送失敗!\r\n\r\n");
?? ??? ? }
?? ??
?? ? ?while(1){
?? ??? ? ?if(usart3RecvEndFlag == 1){
?? ??? ??? ??? ??? ?usart3RecvEndFlag = 0;
?? ??? ??? ??? ??? ?rs485Send(dmaUsart3RxBuf,dmaUsart3RxLen);?? ??? ??? ??? ? ?
?? ??? ??? ??? ??? ?dmaUsart3RxLen = 0;
?? ??? ??? ??? ??? ?memset(dmaUsart3RxBuf,0,DATA_BUFFER_SIZE);?? ??? ??? ?
?? ??? ??? ?}?? ?
?? ??? ?}?? ??? ??
}
?
實現(xiàn)功能
esp8266 wifi模組手機一鍵配網(wǎng)(接收到wifi模組的AT指令應(yīng)答后,單片機進行做出判斷,并在串口調(diào)試助手上把wifi的AT指令應(yīng)答和單片機執(zhí)行的動作打印出來),配網(wǎng)成功,單片機通過esp8266 wifi模組透傳發(fā)數(shù)據(jù)到網(wǎng)絡(luò)調(diào)試助手上的模擬服務(wù)器。配置一次,下次重啟設(shè)備后不需再進行配網(wǎng),除非設(shè)備換了地方,或者換了路由器才需要再進行手機配網(wǎng)。
第一次ESP8266進行手機配網(wǎng)
由于在調(diào)程序過程中,讓esp8266自動連接到了網(wǎng)絡(luò)?,F(xiàn)在只能連接到一個路由器(還是蹭別人的,嘻嘻),為了能實現(xiàn)上面的功能,現(xiàn)在先讓esp8266恢復(fù)出廠設(shè)置,然后進行手機配網(wǎng)。
esp8266恢復(fù)出廠設(shè)置
esp8266波特率設(shè)置
esp8266恢復(fù)出廠設(shè)置后波特率為默認(rèn)的115200,此處的波特率為9600,故設(shè)置波特率為9600。
?
初始化成功后,等待手機智能配網(wǎng)
?
esp8266配置(連接路由器的路由器,esp8266和路由器是綁定不同的IP地址,但在同一個網(wǎng)段)成功后,再連接到服務(wù)器。
?
連接到服務(wù)器后,往服務(wù)器發(fā)送數(shù)據(jù),連續(xù)發(fā)送三次數(shù)據(jù),服務(wù)器也接收到三次esp8266發(fā)來的數(shù)據(jù)。
?
?
第二次重啟,不需要手機配網(wǎng)
esp8266重啟后進行初始化,自動綁定IP地址,直接連接到服務(wù)器,然后往服務(wù)器發(fā)送數(shù)據(jù)。
服務(wù)器接收到esp8266透傳上發(fā)的數(shù)據(jù)
?
總結(jié)
以上是生活随笔為你收集整理的esp8266 wifi模组手机一键配网,配置一次,下次重启设备后不需再进行配网的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: esp8266烧写机智云固件方法
- 下一篇: STM32HAL库---串口中断接收时间