项目暂时告一段落,整理下大概功能及遇到的问题。
需求:给WiFi对讲机配网
大概流程:1.获取本机连接的WiFi名称 2.将WiFi名称和密码发送给设备
1. 配网
WiFi配网无非是手机端将WiFi名称和密码发送给硬件,硬件接收到后连接到指定的WiFi 上;其中SmartConfig是主要实现方式,SmartConfig又名快连,原理大概是App发送包含Wifi名称和密码的UDP广播包,硬件接收到后,根据定好的数据组织形式,解出Wifi名和密码,然后连接。
我们一共经历了3个方案,最终使用的方案3,主要是跟随硬件端的要求做修改,有一些使用心得:
ESPTouch与AirKiss相较而言,AirKiss使用更加简洁,这两种具体用哪个和硬件小伙伴商量,据硬件小伙伴说后者成功率更高一点,但是并未验证;
我们在使用AirKiss的时候,最开始是没问题的,但是后来配网成功率比较低(这个成功率是指将WiFi信息发到硬件的成功率,至于硬件能否连上是下一步),具体原因未查明,所以放弃了AirKiss,基于我们硬件的特殊性,使用了蓝牙方案,成功率100%。
1.1 方案1 SmartConfig - ESPTouch
下载demo修改使用即可:
https://github.com/EspressifApp/EsptouchForIOS
1.2 方案2 SmartConfig- AirKiss
AirKiss是微信硬件平台提供的一种WiFi设备快速入网配置技术,与ESPTouch是两种不同的协议。
下载demo修改使用即可:
https://github.com/James-oc/JMAirKiss
调试中可能会遇到的问题:
1.绑定端口报错重复绑定,把调试的app杀死后再重新运行代码即可,偶尔直接覆盖安装的时会报错
2.配网时候若成功率不高,可考虑重新发送数据,多尝试几次
1.3 方案3 蓝牙
这种方案比较特殊,只提供一种思路,因为只适用于我们这种硬件设备,同时包含蓝牙模块和WiFi模块,并且在app中已经连接设备蓝牙,并已实现通信的情况下使用:
1.在app中连接设备蓝牙
2.通过蓝牙将Wifi名称与密码发送给设备,设备自行连接
app与硬件两端简单定义下数据格式:如WiFi名长度规定为32位,不足补0;后添加WiFi密码,最后以0结尾
// 1.wifi名称
NSData *nameData = [wifiName dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *allData = [[NSMutableData alloc] initWithData:nameData];
// 2.32位补0
NSInteger nameLen = nameData.length;
NSInteger count = 32-nameLen;
Byte *zeroByte = (Byte *)malloc(count);
if (nameLen < 32) {
for (int i = 0; i < count; i++) {
zeroByte[i] = 0;
}
}
[allData appendBytes:zeroByte length:count];
// 3.wifi
NSData *psdData = [wifiPsd dataUsingEncoding:NSUTF8StringEncoding];
[allData appendData:psdData];
// 4.以0结尾
Byte *zeroByte1 = (Byte *)malloc(count);
zeroByte1[0] = 0;
[allData appendBytes:zeroByte1 length:1];