ESP8266 SmartConfig一键配网

  Wi-Fi 配网,指由外部向 Wi-Fi 设备提供 SSID 和密码(PSW),让 Wi-Fi 设备可以连接指定的热点或路由器,并加入后者所建立的 Wi-Fi 网络。
  对于具备丰富人机界面包括屏幕/键盘的设备,例如电脑或手机,可以直接输入 SSID/PSW 进行连接。
  对于不具备丰富人机交互界面的物联网 Wi-Fi 设备,例如智能灯、扫地机器人等,则可以借助手机等智能设备,以某种配网方式将 SSID/PSW 传递该设备。

  1.基本原理

  1.设备进入 Wi-Fi 混杂模式(promiscuous mode)以监听捕获周围的 Wi-Fi 报文。由于设备暂未联网,且 Wi-Fi 网络的数据帧已通过加密,设备无法获取 payload 的内容,但可以获取报文的某些特征数据,例如每个报文的长度。同时对于某些数据帧,例如 UDP 的广播包或多播包,其报文的帧头结构比较固定,较容易识别。
  2.此时在手机 App 或者小程序侧,即可通过发送 UDP 的广播包或多播包,并利用报文的特征,例如长度变化进行编码。
  3.将目标 Wi-Fi 路由器的 SSID/PSW 字符以约定的编码方式发送出去,设备端在捕获到 UDP 报文后,按约定的方式进行解码,即可得到目标 Wi-Fi 路由器的相关信息并进行联网。

  2.配网流程

   SmartConfig 方式配网,每个厂商的编码方式和报文选择上有自己的协议,对于 ESP8266,采用的协议是乐鑫 ESP-TOUCH协议。
  基于该协议,设备端在连接 Wi-Fi 路由器成功后,将会告知手机端自己的 IP 地址。
此时手机端可以通过数据通道,例如 TCP/UDP 通讯将后台提供的配网 Token 发送给设备,并由设备转发至物联网后台,依据 Token 进行设备绑定。
  目前腾讯连连小程序已支持采用 ESP-TOUCH 协议进行 SmartConfig 配网,并提供相应的 小程序 SDK。

  • SmartConfig 方式配网及设备绑定的示例流程图如下:
    在这里插入图片描述

  3.ESP8266 SmartConfig模式配置

  ESP8266指令集中就有SmartConfig模式配置,该模式仅支持在 ESP8266 单 station 模式下调用。

AT+CWSTARTSMART – 开启 SmartConfig
//⽆无论 SmartConfig 成功与否,都请调⽤用 “AT+CWSTOPSMART”释放快连占⽤的内存
AT+CWSTOPSMART – 停⽌止 SmartConfig

在这里插入图片描述
在这里插入图片描述

  3.1程序示例

/*开启Smart模式*/
u8 ESP8266_SetSmartMode(u8 *server_ip,u16 server_port)
{
    char buff[200];
    printf("进入smart配网模式\r\n");
    u16 time1=0,time2=0;;
    if(Esp8266_SendCmdCheckStat("AT+CWSTARTSMART\r\n","OK"))return 1;//开启Smart失败
    usart3_cnt=0;
    usart3_flag=0;
    while(1)
    {
        if(usart3_flag)
        {
            usart3_rx_buff[usart3_cnt]='\0';
            printf("rx:%s\r\n",usart3_rx_buff);
            if(strstr((char *)usart3_rx_buff,"smartconfig connected wifi"))//连接热点成功
            {
                usart3_cnt=0;
                usart3_flag=0;
                printf("2.关Smart模式\r\n");
                if(Esp8266_SendCmdCheckStat("AT+CWSTOPSMART\r\n","OK"))return 2;  
                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)
        {
            LED1=!LED1;
        }
        if(time1>=65530)return 3;//超时退出
    }
    /*连接服务器*/
    if(Esp8266_SendCmdCheckStat("AT+CIPMUX=0\r\n","OK"))return 4;;		
    snprintf(buff,sizeof(buff),"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",server_ip,server_port);
    //printf("buff:%s\r\n",buff);
    printf("9.连接服务器\r\n");
    if(Esp8266_SendCmdCheckStat(buff,"OK"))return 5;	  
    printf("配置透传模式\r\n");
    if(Esp8266_SendCmdCheckStat("AT+CIPMODE=1\r\n","OK\r\n"))return 6;	
    printf("开始发送数据\r\n");
    if(Esp8266_SendCmdCheckStat("AT+CIPSEND\r\n",">"))return 7;	
    return 0;
}

4.功能实现

  初始化硬件,ESP8266模式配置,连接物联网平台。

int main()
{
    int i=0;
	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("初始化完成\r\n");
	while(1)
	{
		stat=Esp8266_STA_TCPclinet_Init((u8 *)WIFI_NAME,(u8 *)WIFI_PASSWORD,(u8 *)SERVER_IP,SERVER_PORT);
		if(stat==0)break;
        if(stat==6)i++;
        if(i>=3)
        {
           stat=ESP8266_SetSmartMode((u8 *)SERVER_IP,SERVER_PORT);
           if(stat==0)break;
        }
		printf("stat=%d\r\n",stat);  
	}
	printf("服务器连接成功\r\n");
	while(1)
	{
		MQTT_Init();
		stat=MQTT_Connect(ClientID,Username,Password);
		if(stat==0)break;
		Delay_Ms(500);
		printf("正在连接....\r\n");
	}
	printf("连接成功\r\n");
	stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
	if(stat)printf("订阅失败\r\n");
	else printf("订阅成功\r\n");    
	while(1)
	{
		if(usart3_flag)
		{
            for(i=0;i<usart3_cnt;i++)
            {
                printf("%c",usart3_rx_buff[i]);
            }
            printf("\r\n");
			usart3_cnt=0;
			usart3_flag=0;
		}
		Delay_Ms(1);
		time++;
		cnt++;
		if(time>=5000)
		{
			time=0;
			MQTT_SentHeart();//发送心跳包
		}
		if(cnt>=5000)
		{
			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);
		}
	}
}
  • EspTouch工具下载: ESP-TOUCH
      ESP-TOUCH 协议采用的是 Smart Config(智能配置)技术来帮助用户将嵌入了 ESP8266EX 的设备连接至 Wi-Fi 网络。用户只需在手机上进行简单操作即可实现智能配置。
      采用由乐鑫科技提供的​ ​ESP-TOUCH​​应用APP,将WIFI热点信息通过smartConfig模式传输给ESP8266模块。最终实现设备上网,连接物联网平台。
      首先需要将自己的手机连接上目标热点,然后打开ESP-TOUCH软件,输入目标热点的密码,然后等待ESP8266响应。
    在这里插入图片描述
       串口终端调试信息: WIFI模式配置、进入smartConfig模式获取WIFI热点信息,连接物联网平台。
    在这里插入图片描述
          物联网平台连接成功,微信小程序端查看云端推送的温度数据和光照强度,可通过开关远程控制目标设备。
    在这里插入图片描述
      关于服务器连接请参考:ESP8266连接腾讯云
      工程示例:https://download.csdn.net/download/weixin_44453694/18775098
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐