联盛德W801系列2-WIFI一键配网,信息保存
1.使用例程测试一键配网
- 在《wm_demo.h》中,打开宏定义:
- 编译下载后,可以用串口命令 “t-oneshot” 进入一键配网:
- 使用 公众号 联盛德微电子的airkiss配网程序,搜索进入联盛德微电子公众号,
- 在服务界面点击“AirKiss配网”:
- 进入airkiss界面:
- airkiss显示手机所连接的wifi AP 名字,输入密码:
- 开始连接,串口会打印一下连接过程的信息,获取IP地址后,说明配网成功:
stop airkiss oneshot config...
start airkiss oneshot config...
isfromds:0, MAC:c4:06:83:49:a5:da,frm_len:078
isfromds:1, MAC:c4:06:83:49:a5:da,frm_len:078
isfromds:0, MAC:c4:06:83:49:a5:da,frm_len:079
isfromds:1, MAC:c4:06:83:49:a5:da,frm_len:079
isfromds:0, MAC:c4:06:83:49:a5:da,frm_len:080
isfromds:1, MAC:c4:06:83:49:a5:da,frm_len:080
isfromds:0, MAC:c4:06:83:49:a5:da,frm_len:077
Src:c4:06:83:49:a5:da, tick:48803
isfromds:1, MAC:c4:06:83:49:a5:da,frm_len:077
Src:c4:06:83:49:a5:da, tick:48806
isfromds:0, MAC:c4:06:83:49:a5:da,frm_len:078
isfromds:1, MAC:c4:06:83:49:a5:da,frm_len:078
isfromds:0, MAC:c4:06:83:49:a5:da,frm_len:079
isfromds:1, MAC:c4:06:83:49:a5:da,frm_len:079
isfromds:0, MAC:c4:06:83:49:a5:da,frm_len:080
fixed chan
isfromds:1, MAC:c4:06:83:49:a5:da,frm_len:080
fixed chan
airkiss: sync chan, base len:76, tick:48822
ds:0, total_len:17, ssid_crc:84, tick:49816
ds:0, pwd_len:9, pwd_crc:9c
ds:1, pwd_len:9, pwd_crc:9c
airkiss_ssid:hycwifi
airkiss_total_len:17, 9, 7
crc:63,ds:0, index:0, 5
crc:2f,ds:0, index:1, 5
crc:16,ds:0, index:2, 5
airkisss total data len:17, pwd len:9, ssid len:7
airkiss: pwd:********, random:194,ssid:hycwifi, tick:50321
tls_wl_mem_reinit:c000000
airkiss join successful,storage id pwd.
stop airkiss oneshot config...
NETIF_WIFI_JOIN_SUCCESS
ip: 192.168.110.134
sta ip: 192.168.110.134
oneshot net up, time:40684
配网成功后,手机小程序有相应的提示:
2.实用配网过程
2.1 上电检查是否配过网
上面的例子只是测试用的,在产品中,开机时需要判断上一次是否有配过网:1.有,利用上次的id和密码直接联网;2。无,进入一键配网。
flash操作的更多信息参考 《联盛德W801系列1-flash保存数据例程》。
void UserMain(void)
{
#if DEMO_CONSOLE
//CreateDemoTask(); //产品化的程序不要这行
#endif
......
tls_get_mac_addr(g_macBuf);
// 读取配置,看看有没有配过网
ReadWifiParam();
printf("wificfg:%02X \n",wifiCfgByte);
if(wifiCfgByte == wifi_configed){
demo_connect_net(airkiss_ssid,airkiss_pwd); //有,利用上次的id和密码直接联网
}else{
demo_oneshot(); //无,进入一键配网
}
}
2.2 一键配网成功后,保存配网信息
一开始我是在《wm_connect_net_demo.c》的con_net_status_changed_event 函数里面保存配网信息,如下图。后来发现,直接联网也会进入这个函数,必须在一键配网刚完成时保存。
选择在《wm_oneshot_airkiss.c》的oneshot_airkiss_finish_new 函数里面保存配网信息。
2.3 重新配网,必须清除配网信息
这里再贴出flash操作的代码:
typedef enum {
wifi_unconfiged = 0,
wifi_configed = 0xAA,
}wifi_info_storage_t;
extern u8 airkiss_pwd[65];
#define wifiCfgByte airkiss_pwd[64] // 使用密码数组最后一个字节作为配网标记
extern u8 airkiss_ssid[33];
#define PARAM_FLASH_ADDR_BASE 0x1fb000 // 0x08200000 - 0x1000 最后4k,一个扇区
#define PARAM_FLASH_DATA_LEN 8
///============ 开启配网需要相应的保存函数
#if TLS_CONFIG_AIRKISS_MODE_ONESHOT
#define PARAM_FLASH_ADDR_WIFI_ID_LEN 33
#define PARAM_FLASH_ADDR_WIFI_PWD_LEN 65
#define PARAM_FLASH_ADDR_WIFI_ID_OFFSET (PARAM_FLASH_DATA_LEN)
#define PARAM_FLASH_ADDR_WIFI_PWD_OFFSET (PARAM_FLASH_ADDR_WIFI_ID_OFFSET+PARAM_FLASH_ADDR_WIFI_ID_LEN)
#define PARAM_FLASH_ADDR_WIFI_CFG_OFFSET (PARAM_FLASH_ADDR_WIFI_PWD_OFFSET+PARAM_FLASH_ADDR_WIFI_PWD_LEN-1)
///==========传入参数为 wifi_info_storage_t ================
void WriteWifiParam(unsigned char configByte)
{
unsigned char write_buf[PARAM_FLASH_ADDR_WIFI_ID_LEN+PARAM_FLASH_ADDR_WIFI_PWD_LEN];
wifiCfgByte = configByte;
memcpy(write_buf,airkiss_ssid,sizeof(airkiss_ssid));
memcpy(write_buf+PARAM_FLASH_ADDR_WIFI_ID_LEN,airkiss_pwd,sizeof(airkiss_pwd));
tls_fls_write(PARAM_FLASH_ADDR_BASE+PARAM_FLASH_ADDR_WIFI_ID_OFFSET, write_buf, sizeof(write_buf));
}
//
unsigned char ReadWifiParam(void)
{
tls_fls_read(PARAM_FLASH_ADDR_BASE+PARAM_FLASH_ADDR_WIFI_ID_OFFSET, airkiss_ssid, sizeof(airkiss_ssid));
tls_fls_read(PARAM_FLASH_ADDR_BASE+PARAM_FLASH_ADDR_WIFI_PWD_OFFSET, airkiss_pwd, sizeof(airkiss_pwd));
return wifiCfgByte;
}
#endif // TLS_CONFIG_AIRKISS_MODE_ONESHOT
需要清除配网信息时,只要调用函数 WriteWifiParam,传入wifi_unconfiged 参数就可以。
WriteWifiParam(wifi_unconfiged );
在我的项目中,有遥控器,使用复合键产生一个擦除的指令,主板接受到指令后调用上面的函数。
2.4 设置断网自动重连
有时候路由器莫名其妙的断网,或者被人为断电导致断网,这些都需要断网重连。联盛德的SDK已经有断网重连的机制,不过默认是关闭的,需要下面的代码打开配置:
u8 auto_reconnect = WIFI_AUTO_CNT_ON;
tls_wifi_auto_connect_flag(WIFI_AUTO_CNT_FLAG_SET, &auto_reconnect);
这2行代码分别放在直接连网和一键配网的最后面。
3. 一键配网原理参考文章
物联网之 WIFI 一键配网 SMARTCONFIG 浅析(ESP32)
此处摘录部分内容:
smartConfig 模式:
这种快速连接方式,相对于 AP 模式连接简化操作,更加贴近于市场
1、手机连上 WiFi,打开智能硬件指定 APP 软件,进入配置界面,输入手机所在 WiFi 密码,请求配网 TOKEN
2、智能硬件开启混杂模式监听所有网络数据包
3、手机通过广播、组播循环发送 ssid/password/token
4、硬件设备通过 UDP 包(长度)获取配置信息捕捉到 ssid/password/token,连接路由器(广播根据 UDP 包长度,组播根据 IP 地址信息)