微信开发者社区在18年就有人提出这个问题,当时说是不行.然而提问者说为什么另外一家小温智能可以?
经过自行测试,发现通过微信接口是可以以AP模式进行设置的. 因为微信小程序WIFI有两个能力:获取周围SSID,以及连接SSID.
SDK文档

获取SSID方式

在app.json中获取地理位置能力

  "permission": {
    "scope.userLocation": {
      "desc": "你的位置信息将用于小程序连接WIFI"
    }

在页面js中onGetWifiList->startWifi->getWifiList. 微信小程序比较神奇的地方是,get信息的函数居然不是直接返回信息,而是只返回成功失败, 然后发出一个事件,你得再用另一个专门监听这个事件的函数来得到信息. 感觉脱裤子放屁一样.

  onReady: function () { //启动后先监听获取到WIFILIST的事件
    wx.onGetWifiList(function (res){
      console.log(res)
    })
  },
  startwifi:function(){ //启动WIFI接口,事实上不是开启设备的WIFI,只是开启小程序的WIFI能力
    wx.startWifi({
      success(res) {
        console.log(res.errMsg)
      }
    })
  },
  getwifilist: function () { //获取WIFILIST, 成功后发出事件会被前面的监听捕获
    console.log('getwifilist')
    wx.getWifiList({
      complete(res) {
        console.log(res)
      }
    })
  },

WIFILIST的形式:

{wifiList: []}

Android举例(从console输出COPY来的)

wifiList: Array(24)
0: {SSID: "KK5G", BSSID: "xx:xx:xx:xx:xx:xx", secure: true, signalStrength: 77}
1: {SSID: "DIRECT-5BDESKTOP-0M7QR80msVL", BSSID: "xx:xx:xx:xx:xx:xx", secure: true, signalStrength: 99}
2: {SSID: "ChinaNet-UFsN", BSSID: "xx:xx:xx:xx:xx:xx", secure: true, signalStrength: 44}
3: {SSID: "KK", BSSID: "xx:xx:xx:xx:xx:xx", secure: true, signalStrength: 46}

IOS举例, 居然元素结构和Android不同. signalStrength的定义也不一样,一个是整数一个是纯小数.幸好SSID和BSSID两个字段是一样的.
IOS还有个问题,wx.onGetWifiList在ios中不进入回调,幸好官方有回答,是getWifiList以后会调起微信权限页面,上退一级到设置主页面,再点击WIFI,刷出来列表后才能收到onGetWifiList的回调.

wifiList: Array(18)
0: {SSID: "ROADSUN2", autoJoined: false, signalStrength: 0.26170599460601807, justJoined: false, BSSID: "xx:xx:xx:xx:xx:xx", …}
1: {SSID: "TP-LINK_090C", autoJoined: false, signalStrength: 0.3535159230232239, justJoined: false, BSSID: "xx:xx:xx:xx:xx:xx", …}
2: {SSID: "office1_2.4GHz", autoJoined: false, signalStrength: 0.39624282717704773, justJoined: false, BSSID: "xx:xx:xx:xx:xx:xx", …}
3: {SSID: "408a", autoJoined: false, signalStrength: 0.5117818117141724, justJoined: false, BSSID: "xx:xx:xx:xx:xx:xx", …}
4: {SSID: "ChinaNet-ePMi", autoJoined: false, signalStrength: 0.5352672934532166, justJoined: false, BSSID: "xx:xx:xx:xx:xx:xx", …}

//展开一个元素:
{
BSSID: "xx:xx:xx:xx:xx:xx"
SSID: "ROADSUN2"
autoJoined: false
justJoined: false
secure: true
signalStrength: 0.26170599460601807
}

可以看到返回值里居然没有WIFI类型是2.4G还是5G...

可能的设置方式

设置过程如下:

  1. 智能设备进入Station模式, 扫描周围WIFI SSID,先存下来
  2. 智能设备进入AP模式, 等待小程序连接
  3. 小程序获取周围WIFI SSID, 这儿要区分下IOS和Android,两者体验不同.(此步骤也可省略,以智能设备获取的为准)
  4. 小程序连接智能设备AP
  5. 小程序通过API获取智能设备的SSID
  6. 小程序的SSID和智能设备的SSID取交集, 供用户选择(筛选出2.4G WIFI)
  7. 用户选择并输入密码
  8. 小程序自己先试试能不能连接上,尝试的过程中会断开与智能设备的链接,如果密码错误让用户重新输入
  9. 小程序链接成功后,再次链接智能设备的AP, 正式通知智能设备链接WIFI.
  10. 完成后,小程序自行重新连接WIFI. 结束.

兼容性问题和系统差异

  • 对版本要求: 小程序1.6.0,现在99.99%已经支持.
  • getWifiList这个接口iOS 将跳转到系统的 Wi-Fi 界面,Android 不会跳转。 iOS 11.0 及 iOS 11.1 两个版本因系统问题,该方法失效。但在 iOS 11.2 中已修复。
  • iOS11.0是2017.9.17发布,2017年10月31日发布11.2的首个beta版. 同期2017年9月13日发布的手机是,第十一代iPhone 8,iPhone 8 Plus,iPhone X
  • connectWifi仅 Android 与 iOS 11 以上版本支持. 现在的版本已经是13.3.

标签: none 阅读量: 1752

添加新评论