2周刷完100道前端优质面试真题黄河远上白云间

#1

download:2周刷完100道前端优质面试真题黄河远上白云间

微信小程序实现物联网WIFI设备的AP分发
背景
这次公司新研发了一款温湿度无线设备,需要支持WIFI配电网运行;主要用户是:客户和生产人员。
功能
可以通过微信小程序分发网络,满足以下要求:

用户可以配置他们的设备连接到自己的WIFI并上传数据。
数据可以上传到公司平台或第三方服务器。
您可以指定设备连接的IP;如果没有,它将被自动分配。

开发环境和使用技术

微信小程序和微信开发者工具
Uni和hbuilder X。

实现的具体想法
通过与硬件工程师的沟通,确定配电网的主要流程为:

设备进入分配模式。
链接设备WIFI
UDP发送WIFI名称和密码等信息来连接设备。
设备网络分配成功后,退出AP模式。

配电网知识扩展(物联网)

实现进程
1.链接WiFi
/**
判断手机版本是否支持/
函数checkPhoneVersion() {
//检查手机型号。
wx.getSystemInfo({
成功:函数(res) {
var系统=“”;
if(RES . platform = = ’ Android ')system = parse int(RES . system . substr(8));
if(RES . platform = = ’ IOs ')system = parse int(RES . system . substr(4));
if(RES . platform = = ’ Android ’ & & system < 6){
wx.showToast({
标题:“手机版本不支持”,
})
返回
}
if(RES . platform = = ’ IOs ’ & & system < 11.2){
wx.showToast({
标题:“手机版本不支持”,
})
返回
}

iso pen wifi();//自定义用户是否开启了WiFi。
}
})
}
复制代码
wx.connectWifi({
SSID,
密码,
成功(res) {
Console.log('成功连接wifi res ',RES);
wx.showLoading({
标题:“设置…”
})
//链接成功,发送配置信息。
send CFG();
},
失败(错误){
//链接失败
}
})
复制代码
问题:
在网络分发的过程中,发现部分手机会自动连接不上指定的WiFi(可能会报错err.errCode 12010,系统错误),这种问题是社区无法确定的。
解决方法:
wx.connectWifi({
SSID,
密码,
毛纳尔:没错,//重要* *
成功:(res) => {
Console.log('手动链接的res ',RES);
},
失败(错误){

}
})
复制代码
出现此问题时,再次调用链接WiFi maunal: true configuration,可以直接从小程序跳转到手机的WiFi列表页面,用户可以手动连接WiFi;然后返回小程序进行后续操作;
在实际项目中,我在小程序中onShow和onHide的生命周期中做了一个判断,用户是否跳转到手机WiFi列表进行手动连接;然后检查当前连接的WiFi,再进行后续的UDP信息传输。
新发现:
在随后的使用过程中,我发现了一个有趣的。当设备WiFi设置为开放网络时(即设备分发模式下的WiFi不设密码),在华为、荣耀等个别机型上不会出现自动连接WiFi失败的情况。
我觉得这个问题可能在这部分机型上,自动连接WiFi和密码可能会有一些限制。更深层次的原因是希望有大佬能帮我解惑。
注意事项:
在后续测试中,发现部分车型存在问题。

手机要开启定位功能(否则无法获取用户当前连接的WiFi名称)。
需要关闭手机流量:
这个问题是在小米手机上发现的。如果用户流量和WiFi同时开启,连接设备WiFi时,由于设备的分发网络WiFi无法上网,真机会自动使用流量,无需切换到WiFi;不能传输后续的UDP信息。

2、UDP连接传输信息
这部分问题相对较少。它只需要创建UDP连接,按照约定的地址传输信息。
//如果需要在设备使用环境中指定ip(医院内部等。),只需在jo中添加相应的信息即可。
让jo = {
" ssid": ssid,//指定设备连接的WiFi。
“pwd”:pwd,
“URL”:URL,//设备数据上传的服务器地址
};
UDP = wx . createudpsocket();
UDP . bind();

udp.send({
地址,
港口,
message:JSON . stringify(jo);
});
如果(!sendTimer) {
sendTimer = setInterval(() => {
//定期发送UDP消息
if(connectUdpNum > maxUdp) {
initCfgSign();
wx.showToast({
标题:“UDP连接超时,请重新配置网络”,
图标:“无”,
持续时间:3000
})
返回;
}
udp.send({
地址,
港口,
消息:js
});
connectUdpNum ++
}, 1000);
}
UDP . on message(onUdpMessage);//侦听UDP连接返回的信息
复制代码
函数onUdpMessage(res) {
if (res.remoteInfo.size > 0) {
//取出ArrayBuffer类型的res.message
let unit 8 arr = new uint 8 array(RES . message)
let encoded string = string . from charcode . apply(null,unit 8 arr);
//没有这一步中文会乱码
let decoded string = decodeURIComponent(escape((encoded string)))
let jo = JSON . parse(decode dstring);
/**
*确定返回的连接信息是否与设备接收的信息一致。
*防止UDP传输期间的数据丢失
*/

}
}

复制代码
总结:

微信小程序自动连接WiFi。当设备WiFi有密码时,部分手机会自动连接不成功。需要wx.connectWifi配置maunal: true,跳转到手机Wifi列表手动连接。反正如果设备WiFi设置为开启模式,就不会出现这个问题。
用户需要打开手机定位才能获得当前连接的WiFi名称。
有些机型(比如小米)在设备配网前需要关闭手机流量,否则因为设备的WiFi无法联网,会自动使用手机流量,导致没有UDP数据传输。
至此,这个WIFI设备AP网络分发功能已经实现;让我们在这里做个记录。希望大家有更好的方法,或者明白为什么WiFi是开着的,不会出现自动连接失败的情况,可以帮我解决我的困惑。