借鉴华为HiLink实现微信小程序智能配网功能

微信小程序介绍

小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。

微信公众号智能配网

在微信小程序没有出现,微信公众号的年代,很多做WIFI的工程师就认识了一种叫airkiss的配网模式,这种配网模式在大多数的IoT WIFI芯片中已经实现,由于airkiss解析协议部分的代码官方未开源(其实现在也已经有高手实现了airkiss的功能代码),所以绝大多数的芯片都有airkiss的lib,这种好处在于用户不需要了解airkiss具体的实现方式,就能在自己的WIFI设备中集成智能配网功能:

Smartconfig实现原理

我们知道目前绝大部分的IoT WIFI芯片,是工作在2.4GHz频段。市场上的IOT WIFI芯片的Smartconfig配网方式,几乎都是利用WIFI发送UDP组播或者广播包在空间传递数据的方式。虽然我们的手机在连接上路由器后由于加密的因素,在空间中发布的数据内容无法获取,但是发送的数据长度还是有特定的规律的,它等于基准长度加上实际发送数据。利用这种方式,我们可以用手机将路由器的SSID和密码通过特定的组合方式利用组播或者广播包在空中传播,这时WIFI芯片就可以收到UDP组播或者广播包,利用长度的计算重新编码后识别出手机发送的SSID和密码。识别成功后,IoT WIFI芯片连接到路由器,然后将自己的信息通过路由器发送给手机,这样就实现一次配网的过程;这里有燕十三写的一篇 《ESP-TOUCH编码规则及解码》,很好的说明了ESP8266的ESPTOUCH的Smartconfig实现过程,当然airkiss实际的原理也是与它相同的,只是发送数据长度编码上的不同罢了。

Smartconfig技术的弊端

很多工程师在使用airkiss这种smartconfig技术的时候,总会出现这样那样配网无法成功的问题,首先我们不谈实际设计中WIFI设备的接收灵敏度问题,因为这个是导致WIFI接收信号数据远近的一个重要因素,如果接收灵敏度差,那么路由器远了就会收不到smartconfig发过来的UDP数据包,最后导致配网失败。但是这个是硬件问题,我们这里不细谈。

我们知道,2.4G的WIFI使用了13个频道,而相邻两个频道都会有信号的重叠。而路由器的2.4G的AP一定在同一时间工作在同一个频道(说这句话的意义在于现在很多路由器有优化的功能,会自动切换功能或者通过配套的APP将AP切换到一个路由器工作最少的频道以减小干扰)。而IoT WIFI设备在进入配网的时候,是不知道要连接哪个路由器,那就更不知道要连接的路由器在哪个频道了。所以WIFI设备只能不停的在13个频道中不断切换来寻找手机连接路由器发送smartconfig的数据信号。这里我们可以通过上而我推荐的燕十三的文件了解到ESPTOUCH的引导码,并通过引导码来计算出基准长度以及确定路由器当前的所在的频道。这一切都很顺利。但是这一切的顺利都是基于环境干净的情况下。

1.现在我们以一个比方来解答为什么有的环境下,airkiss这种smartconfig方式实现配网有时会很糟糕。如果Iot WFI设备在一个频道上呆的的时候越长,那收集到的数据就会更多,而收集到的数据越多,那你定位路由器的频道成功率就越高。但是这个时候边上有很多的无关路由器也在发送数据,连接在他们上面的用户有的在看视频,有的在听音乐,各种的应用在使用,导致你所在的路由器的频道总是被干扰而解析的数据无法最终串联起来完成定位频道。设备再一次的错过了这个频道,进入了其它频道进行尝试。我前面已经说了,如果呆在一个频道的时候足够长,接收到数据量足够大,那最终定位在频道的成功概率就越高。但是换来的是,却是在无用的频道呆的时间过长。比如你要连接路由器的频道是在13号,你从1号频道开始扫描,在每个频道停留1秒,最后就需要12秒以后才能切换到13号频道。如果你把频道切换的时间减少,那就会出现定位频道错过的概率变大,所以两个字矛盾!

2.顺利过掉第一关,我们总算定位了频道,但是在接收到到数据时候总是夹渣了其它的无关数据内容,就像ESPTOUCH协议中,每三包连续的数据长度代表一个byte的,假设要连接的路由器SSID是test001,密码是1234567890,这里需要17个字节,所以要至少收到17*3=51包连续的数据,才能把这些位解开,想像一下,SSID是支持32个字节,密码是支持64个字节,所以最坏的打算就是要接收(32+64)*3=288包连续的数据,才能在一次中解出要连接路由器的SSID和密码。如果中间有一个包出现没有收到,就需要进行第二轮的接收。

3.所以我们在复杂的环境中,这种干扰会变的越来越利害,就好像你在1秒里听同一个人说3句话,结果这个时间又来了几个人在你边上叽叽喳喳问东问西,你就很容易漏掉第一个人说的话而需要他重复一次所说的话。所以我们在银行等柜台前需要排队,一个个来处理业务,因为同时两个人一起办业务就会导致银行职员的失误概率变大,反而变的效率差了。但是这种在WIFI的世界里是不会存在排队的情况,因为每个路由器无法同步,谁也不会让谁。而一个160Mhz的处理器的Iot WIFI芯片处理能力是有限的,环境越复杂漏包的可能性越大。

4.MIMO技术的出现,导致以上的情况又变的困难和复杂了,所谓的MIMO技术这里大家可以百度,但是做成最终的结果就是模块原本接收一包的数据就是一包数据,结果变成接收到一包的数据却包含了2包或者3包以上的数据,就是我们以前所谓的粘包。这种粘包可以提升路由器收发数据量的效率,当然也带来了smartconfig的难度。

5.自从2.4G和5G路由器的出现,在早期的时候是通过在5G AP后加上_5G的方式来发送两个信号来给用户来选择连接2.4G还是5G的信号。但是由于现在新的路由器将2.4G和5G的AP信号融合了,导致用户在连接路由器的时候无法再选择2.4G或者5G的频道了,所以这个时候如果手机连接的是5G的信号就无法让正在smartconfig的2.4G IoT WIFI设备接收到信号包,所以这种情况下就是配网失败的概率就几乎为100%。

终上所诉,smratconfig这种配网方式存在各种各样出现失败的机率,所以我们在排除设备本身的接收灵敏度问题,排除工程师自己写代码的能力问题,基本上就是以上几个原因造成smartconfig成功机率低功能配网时间过长。

AP配网技术的出现

smartconfig配网的出现,是有他的无奈,无奈是在于早期的IoT WIFI应用中,自己编写应用中安卓和ios的底层包可能因为安全的问题是无法控制手机去连接哪个AP的。所以他只能以smartconfig这种方式来实现,而早期的路由器由于协议的问题也没有现在的这么复杂,什么MIMO什么2.4G和5G融合方式,都没有的。所以那个时间smartconfig是很稳定的。

我们可以发现,我们买回来的华为HiLink设备在刚买会来没有配置的时候,会出现一个以HI开头编码的AP,这个AP里应该包含了设备的类型和一些其它的信息,而HiLink的配网就是使用了这个AP的AP配网方式实现的。AP配网的技术基本原理是很简单的,从实现方式上来说这种技术其实是比smartconfig还更早出现。我们以前有一种做法就是将IoT WIFI模块设置成AP模块,然后内置一个web服务器,然后用户手动去连接这个AP,用浏览器打开IP地址进入网页,将要连接的路由器的SSID和密码输入网页,点击保存然后模块就去连接路由器了。而AP配网其实就是将上面几个动作变自动化了:用户先用手机打开APP,这个时候如果手机连接了路由器,就可以通过相应的API函数读出出连接的路由器SSID,然后用户填写连接的路由器的密码(小米手机配米家的设备或者华为手机配HiLink的设备不需要输入密码,那是因为他们的应用软件可以直接调取当前手机连接路由器的密码,这很简单),连接IoT WIFI的AP,发送路由器的SSID和密码给AP内的接收协议,比如TCP比如UDP都可以,都没有问题。然后IoT WIFI 断开连接的手机,自己切换到STA模式连接路由器,这个时候手机由于被IoT WIFI模块断掉而再也找不到出发的AP,则会再次连接到之前的路由器上。好了,这个时候手机和IoT WIFI又都连接到同一个路由器了,配网成功!

AP配网的优化在于,手机发送SSID和密码协议只要一包数据就可以完成,大大缩减了发送包的次数。还有一点手机是主动去连接IoT WiFi芯片的AP,手机的处理能力强,可以快速的连接到AP,成功率为100%。但是这种技术是建立在ios和安卓应用层可以控制手机wifi去连接AP的基础上。但是到今天为至这一切都不是问题了。

微信小程序智能配网

由于小程序的发布,使得应用开发变的越来越简单,实现越来越快。而且开发都只要掌握一种设计方法就可以实现IOS和安卓的应用,大大提升了速度。但是却一直有一个问题无法解决小程序的配网,这里我无法知道为什么微信小程序不去集成airkiss这种smartconfig功能,这里我不做更多的猜想。而小程序在最初的时候,也是也是无法实现UDP和TCP的局域网通信的。但是目前已经可以,所以条件已经成功。为了说明小程序的配网功能步骤,接下来我们用M0E100P0模块,来讲解实现步骤,具体实现如下:

模块端设置

1.设置WIFI模块工作模式

设置返回
AT+WMODE=AP+ok

此时将出现一个M0E100PX_XXXXXX的AP信号,这里我们先认为是新模块,XXXXXX为此模块的后6个mac地址。

2.设置UDP服务器功能

设置返回
AT+NETP=UDP,CLIENT,5000,192.168.4.1+ok

3.保存设置并重启

设置返回
AT+Z+ok

此时我们等待小程序连接到模块的AP以及发送过来的数据。

小程序端代码编写

1.编写连接到IoT WIFI模块的AP的代码:

conncetWIFI:fuction(e){
wx.connectWifi({
          SSID: 'M0E100PX_XXXXXX',
          password: '',
          success: function (res) {
            console.log('success')
            console.log(res)
          },
          fail: function (res) {
            console.log('fail:')
            console.log(res)
          },
          complete: function (res) {
            console.log('complete')
            console.log(res)
          }
     })
 },
startWIficonfig: function () {
    var that = this
    wx.startWifi({
      success: function (res) {
      }
    })
}

2.通过UDP发送SSID和密码给IoT WiFI模块,假设我们这里连接的路由器SSID为test,密码为12345678:

sendRouterInfo: function () {
    const udp - wx.createUDPSocket()
    let ret = udp.bind()
    ret - udp.send({
    	address:‘192.168.4.1’
    	port:5000
    	message:'ssid:test,pwd:12345678'
    })
}

注意:需要连接的发送,因为连接到Iot WIFI的模块需要一个过程

模块接收到UDP数据后连接路由器

模块收到数据,ssid:test,pwd:12345678
使用AT指令连接到路由器:
1.设置WIFI模块工作模式

设置返回
AT+WMODE=STA+ok

2.设置模块连接路由器

设置返回
AT+WJAP=test,12345678+ok

3.保存设置并重启

设置返回
AT+Z+ok

至此微信小程序实现AP配网过程完成。

当然在这个过程中,设计者需要增加更多的一些校验及互动信息,这些我这里不再啰嗦,希望这篇文章能给大家一些帮助,如果有哪里写的有问题,也请指出。

如果遇到模组使用上的问题,可以进群号为519630819的QQ群进行交流。
相关产品,请关注:shop.mqlinks.com

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值