1.WIFI智能配網簡介
Wi-Fi 配網,指由外部向 Wi-Fi 設備提供 SSID 和密碼(PSW),讓 Wi-Fi 設備可以連接指定的熱點或路由器,并加入后者所建立的 Wi-Fi 網絡。
對于具備豐富人機界面包括屏幕/鍵盤的設備,例如電腦或手機,可以直接輸入 SSID/PSW 進行連接。
對于不具備豐富人機交互界面的物聯網 Wi-Fi 設備,例如智能燈、掃地機器人等,則可以借助手機等智能設備,以某種配網方式將 SSID/PSW 傳遞該設備。
配網有多種方式,包括 SmartConfig、softAP、Airkiss 等,各自的特點比較如下:
配網方式 | 特點 |
---|---|
WPS | 存在安全性問題 |
SmartConfig | 較便捷,但一般為各廠商采用私有協議,兼容性和互操作性較差 |
softAP | 適配性兼容性較好,但手機端需要做兩次 Wi-Fi 連接設置的切換,步驟較復雜 |
Airkiss | 操作便捷無需熱點配置,但為微信客戶端私有協議,需設備端適配兼容 |
ble combo | 操作便捷,但需要設備端支持 Wi-Fi+BLE 的 Combo 芯片方案 |
下面我們將以SmartConfig配網模式為例實戰應用。相關操作步驟可參考騰訊云平臺SmartConfig 配網開發文檔
SmartConfig 配網開發文檔:https://cloud.tencent.com/document/product/1081/48405
SmartConfig智能配網主要便于物聯網設備接入云平臺,只需相應app或者相關微信小程序(例騰訊連連)即可讓設備快速入圍,接入服務器。下面以微信小程序騰訊連連、云平臺為騰訊云服務器,接入協議為MQTT3.1為例說明。
2.配網流程
1.在騰訊云平臺選擇智能配網模式。
2.通過騰訊連連小程序進入配網模式,則可以在物聯網開發平臺服務獲取到當次配網的 Token值;
3.配網調試信息
4.微信小程序騰訊連連查看設備信息
3.軟件設計
3.1 設置WIFI工作模式為:STA+TCPClinet,獲取wifi連接狀態,連接失敗則進入配網模式,最終實現騰訊云平臺連接
/****************STA+TCPclinet初始化*************/
u8 Esp8266_STA_TCPclinet_Init(u8 *wifi_name,u8 *wifi_key,u8 *server_ip,u16 server_port)
{
char buff[100];
/*退出透傳模式*/
u16 i=0;
u8 stat=0;
for(i=0;i<5;i++)
{
Usartx_SendString(USART3,(u8 *)"+++");//退出透傳模式
Delay_Ms(500);
if(Esp8266_SendCmdCheckStat("ATrn","OKrn")==0)
{
i=0;
break;
}
}
if(i!=0)
{
printf("1.退出透傳模式失敗rn");
return 0x7f;
}
printf("2.模塊復位rn");
if(Esp8266_SendCmdCheckStat("AT+RSTrn","OKrn"))return 1;
Delay_Ms(1000);
Delay_Ms(1000);
printf("3.關回顯rn");
if(Esp8266_SendCmdCheckStat("ATE0rn","OKrn"))return 2;
printf("4.設置模式STArn");
if(Esp8266_SendCmdCheckStat("AT+CWMODE=1rn","OK"))return 4;
if(ESP8266_GetWifi_Stat())//查詢WIFI連接狀態,未連接成功則進入配網模式
{
BEEP=1;
Delay_Ms(100);
BEEP=0;
Delay_Ms(100);
BEEP=1;
Delay_Ms(100);
BEEP=0;
stat=1;//進入配網模式標志位
if(ESP8266_SetSmartMode())return 4;//配網失敗
}
printf("5.設置單連接rn");
if(Esp8266_SendCmdCheckStat("AT+CIPMUX=0rn","OK"))return 5;
snprintf(buff,sizeof(buff),"AT+CIPSTART="TCP","%s",%drn",server_ip,server_port);
// printf("buff:%srn",buff);
printf("6.連接服務器rn");
if(Esp8266_SendCmdCheckStat(buff,"OK"))return 6;
printf("7.配置透傳模式rn");
if(Esp8266_SendCmdCheckStat("AT+CIPMODE=1rn","OKrn"))return 7;
printf("8.開始發送數據rn");
if(Esp8266_SendCmdCheckStat("AT+CIPSENDrn",">"))return 8;
if(stat)return 0x80;//進入配網模式并且正常退出
else return 0;//未進入配網模式,正常退出
}
3.2 smartconfig配網函數
本函數主要共能為配置WIFI 模式為Smart配網模式,連接WIFI熱點,獲取token信息上報到服務器。
/*開啟Smart模式*/
u8 ESP8266_SetSmartMode(void)
{
char buff[200];
printf("1.進入smart配網模式rn");
u32 time1=0,time2=0;
if(Esp8266_SendCmdCheckStat("AT+CWSTARTSMARTrn","OK"))return 0x81;//開啟Smart失敗
usart3_cnt=0;
usart3_flag=0;
while(1)
{
if(usart3_flag)
{
usart3_rx_buff[usart3_cnt]='?';
printf("rx:%srn",usart3_rx_buff);
if(strstr((char *)usart3_rx_buff,"smartconfig connected wifi"))//連接熱點成功
{
usart3_cnt=0;
usart3_flag=0;
printf("2.關Smart模式rn");
if(Esp8266_SendCmdCheckStat("AT+CWSTOPSMARTrn","OK"))return 0x82;
break;
}
else
{
usart3_cnt=0;
usart3_flag=0;
memset(usart3_rx_buff,0,sizeof(usart3_rx_buff));
}
}
Delay_Ms(1);
time1++;
time2++;
if(time2>=100)//配網模式100ms閃爍一次
{
time2=0;
LED1=!LED1;
}
if(time1>=1000*300)return 0x83;//超時退出
}
printf("3.顯示端口rn");
if(Esp8266_SendCmdCheckStat("AT+CIPDINFO=1rn","OK"))return 0x84;
printf("4.查詢IPrn");
if(ESP8266_GetIP())return 0x85;
printf("5.設置要連接的UDPrn");
snprintf(buff,sizeof(buff),"AT+CIPSTART="UDP","%s",8266,8266,0rn",esp8266_info.esp8266_ip);
if(Esp8266_SendCmdCheckStat(buff,"OKrn"))return 0x86;
printf("6.網絡數據解析rn");
if(ESP8266_NetworkConfig())return 7;
printf("7.模塊復位rn");
if(Esp8266_SendCmdCheckStat("AT+RSTrn","OKrn"))return 0x87;
Delay_Ms(1000);
Delay_Ms(1000);
return 0;
}
3.3.微信小程序配網數據訂閱與發布
通過訂閱微信小程序信息,獲取token值,將獲取到的信息上報到微信小程序,從而實現設備配網。
//微信小程序配網數據訂閱與發布
#define SET_WEIXIN_TOPIC "$thing/down/service/LA54WTHWL3/Smart_123"http://訂閱
#define POST_WEIXIN_TOPIC "$thing/up/service/LA54WTHWL36/Smart_123"http://發布
3.4 主函數
int main()
{
int i=0,key;
u8 stat=0;
u32 time=0;
u16 cnt=0;
float temp;
Beep_Init();//蜂鳴器初始化
Led_Init();//LED初始化
Key_Init();//按鍵初始化
Usartx_Init(USART1,115200,72);
Usartx_Init(USART3,115200,36);
TIMx_Init(TIM2,72,20000);//通過定時器2輔助串口接收數據,20ms
TIMx_Init(TIM4,72,20000);//通過定時器2輔助串口接收數據,20ms
DS18B20_Init();
// RTC_Init();//RTC初始化
printf("初始化完成rn");
while(1)
{
stat=Esp8266_STA_TCPclinet_Init((u8 *)WIFI_NAME,(u8 *)WIFI_PASSWORD,(u8 *)SERVER_IP,SERVER_PORT);
if(stat==0 || stat==0x80)break;
printf("stat=%drn",stat);
}
printf("服務器連接成功rn");
while(1)
{
MQTT_Init();
if(MQTT_Connect(ClientID,Username,Password)==0)break;
Delay_Ms(500);
printf("正在連接....rn");
}
printf("連接成功rn");
if(stat==0x80)//進入配網模式需要給微信小程序返回token值
{
//訂閱微信topic
if(MQTT_SubscribeTopic(SET_WEIXIN_TOPIC,0,1))printf("訂閱失敗rn");
//返回平臺數據,告知微信連連連接服務器成功
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"} 配網成功后微信小程序返回數據
}
//訂閱物聯網平臺數據
stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
if(stat)printf("訂閱失敗rn");
while(1)
{
if(usart3_flag)
{
for(i=0;i=5000)
{
time=0;
MQTT_SentHeart();//發送心跳包
}
if(cnt>=2000)
{
cnt=0;
temp=DS18B20_GetTemp()*0.0625;
sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"LED1":1,"temp":%.2f,"L":356}}",temp);//溫度
MQTT_PublishData(POST_TOPIC,mqtt_message,0);
}
}
}
;i++)>
審核編輯:湯梓紅
-
服務器
+關注
關注
12文章
9123瀏覽量
85324 -
wi-fi
+關注
關注
14文章
2132瀏覽量
124422 -
智能配電
+關注
關注
0文章
97瀏覽量
9943
發布評論請先 登錄
相關推薦
評論