小程序wifi能力解读与实践

背景

小程序wifi系列接口为系统原生能力。早在2015年,微信就推出了「微信连Wi-Fi」,微信连Wi-Fi是为商家的线下场所提供一套完整和便捷的微信连Wi-Fi的方案。如今已是一套完整的,便捷的解决方案。顾客经过扫码的方式链接wifi,同时微信还能够向用户下发消息。方案在官方文档已经阐述得很详细,本文就再也不赘述。本文重点在于讲解小程序中使用wifi能力遇到的问题和心得。html

【微信连wifi】传送门android

wifi能力解读

wifi能力简介

在小程序中,使用wifi模块都须要先调用wx.startWifi()来初始化wifi模块。如下能力的使用均须要在wx.startWifisuccess回调中使用。ios

链接wifi

wx.connectWifi({
    SSID: 'mx 的iphone', // Wi-Fi 设备 SSID
    BSSID: '', // Wi-Fi 设备 BSSID
    password: 'xxxxxxxx',
    success(){},
    fail(){},
    complete(){}
})
复制代码

connectWifi为咱们提供了直连wifi的能力, 仅 Android 与 iOS 11 以上版本支持,须要基础库1.6.0以上。这个通常是咱们使用wifi功能的核心API了。在ios中,会出现系统弹框,询问用户是否要链接wifi,只有用户点击肯定,connectWifi才会继续进行,不然就走fail回调了。在安卓(以小米note3为例,Anroid9)中则会出现微信连一连的toast。web

获取当前已经链接的wifi

wx.getConnectedWifi({
    success(WifiInfo){
        // WifiInfo
    }
})
复制代码

从社区中获取的信息得知:signalStrength表示信号强度,iOS 是系统返回的,取值 0-1,安卓通过转换,取值 0-100。数值与信号强度为正比例关系。小程序

获取wifi列表

wx.getWifiList({
    success(e) {
        wx.onGetWifiList((res) {
            // res.wifiList:wifiInfo[]
        })
    }
})
复制代码

获取周围的wifi列表,须要先使用getWifiList后使用onGetWifiList进行监听。在ios中,getWifiList会跳到ios系统界面,这是因为ios系统的限制, 目前是没法避免的(其实这么作也无可厚非,wifi信息原本就是敏感的,可是对用户体验有必定的影响)。在安卓中,getWifiList须要获取用户的位置信息,由于能够利用小程序嗅探周边Wi-Fi热点来推断用户所在的位置信息。为了确保用户的隐私不受侵犯,自微信android客户端 7.0.4 起,须要先获取用户地理位置(scope.userLocation)。详情请见wx.getWifiList接口需获取用户位置信息受权后使用安全

设置AP相关信息

wx.onGetWifiList(function(res) {
    wx.setWifiList({
      wifiList: [{
        SSID: res.wifiList[0].SSID,
        BSSID: res.wifiList[0].BSSID,
        password: '123456'
      }]
    })
})
复制代码

这个接口也挺牛逼,ios特有的。经过设置wifiList,咱们在系统页能够直接看到已设置的wifi列表,点了就直接连上了。

其余

  • wx.stopWifi 关闭wifi模块
  • wx.onWifiConnected(function callback)监听链接上 Wi-Fi 的事件
  • wx.offWifiConnected 取消监听链接上 Wi-Fi 的事件
  • wx.offGetWifiList(function callback) 取消监听获取到 Wi-Fi 列表数据事件。

安卓链接wifi

链接指定 Wi-Fi 接口调用时序:bash

Android:startWifi —> connectWifi —> onWifiConnected
复制代码

连周边 Wi-Fi 接口调用时序:微信

Android:startWifi —> getWifiList —> onGetWifiList —> connectWifi —> onWifiConnected
复制代码

IOS链接wifi

链接指定 Wi-Fi 接口调用时序:(与安卓一致)websocket

iOS(仅iOS 11及以上版本支持):startWifi —> connectWifi —> onWifiConnected
复制代码

连周边 Wi-Fi 接口调用时序:markdown

iOS(iOS 11.0及11.1版本因系统缘由暂不支持):
startWifi —> getWifiList —> onGetWifiList —> setWifiList —> onWifiConnected
复制代码

实践

笔者在项目中接触到了使用小程序提供的硬件(wifi)能力的场景。利用wifi与socket的能力,咱们能够为物联网设备链接wifi。流程以下:

恰好在开发者社区找到相似的代码片断:

wx.request/wx.connectSocket/wx.uploadFile/wx.downloadFile 的 url 参数容许为 {IP}:{PORT}/${PATH} 的格式,当且仅当 IP 与手机 IP 处在同一网段且不与本机 IP 相同(通常来讲,就是同一局域网,如链接在同一个 wifi 下)时,请求/链接才会成功。 在这种状况下,不会进行安全域的校验,不要求必须使用 https/wss,也可使用 http/ws。

局域网通讯中,不会进行安全域校验,所以,无需在mp后台添加安全域域名。

总结

借助小程序提供的硬件能力(wifi,蓝牙,NFC),小程序有了更加广阔的场景。好比【摩拜单车】小程序,有的车须要用户开一下蓝牙,小程序提供的操做原生系统的蓝牙功能便为咱们赋能。经过小程序,咱们也能够实现与物联网设备通讯,经过链接设备热点,利用http/wss/udp传输数据。固然,如今wifi能力仍是存在着问题,好比兼容问题,可能有部分安卓手机在链接时会莫名其妙的报错。此时须要对着官方提供的errcode查看具体的缘由。

踩过的坑

  1. 安卓部分机型,已经链接wifi,使用connectWifi从新链接,即便传错密码,仍是能连上。
    A:这个问题目前尚未解决的办法。
  2. ios在getWifiList会跳到系统设置页,在connectWifi会出现modal确认是否链接。
    A:没法避免。ios系统的限制
  3. 调试wifi功能时,没法在开发者工具中调试wifi能力。
    A: 目前开发者工具没法进行模拟。而且真机调试时,链接设备热点后会报错。(毕竟真机调试时须要可以访问网络,通常设备热点都不具有访问网络的能力)。目前能够经过 预览+ vconsole解决,仍是比较麻烦。
  4. 能够主动断开wifi吗?
    A: 从文档上看,没有提供这个能力。可是能够尝试链接一个不存在的wifi。
  5. 来自文档的注意事项:

Reference

相关文章
相关标签/搜索