1. 介绍

传统的一键配网指的是smartconfig、airkiss这些通过已经连接的无线路由器发送广播给设备,在使用过程中兼容性差、不稳定,

  • 很多路由器不支持udp广播
  • 如果广播通过5G频段广播,设备无法收到
  • 路由器名称冲突会导致连接错误路由器等问题
  • 这两个协议都封装的比较多,不便于自己控制

根据微信官方提供API能力中的WiFi、UDP能力,可以用来开发Soft AP配网。加上良好的设计,可以实现一键配网的体验。同时成功率、适配率大大提升。

2. 基础描述

WiFi设备进入配网状态,实际是进入AP模式,设备开放一个Wifi热点出来。手机通过连接上设备Wifi模块的热点,将路由器名字和密码直接发送给Wifi设备,同时从Wifi设备那边拿到MAC地址,然后与云端校验。

2.1. 各端交互流程图

此图来自腾讯云

微信小程序ios端获取wifi列表 微信小程序wifi配网_字符串

3. 操作过程

  1. 用户长按按钮,触发WiFi设备进入配网模式。设备在此模式下创建wifi热点(单纯AP模式),开启UDP服务(默认 IP 为192.168.4.1,端口为8266),使指示灯闪烁
  2. 小程序按照提示依次获取 Wi-Fi 列表,输入家里目标路由器的 SSID/PSW,再选择设备 softAP 热点的 SSID/PSW。
  3. 手机连接设备 softAP 热点成功后,小程序作为 UDP 客户端会连接 Wi-Fi 设备上面的 UDP 服务。
  4. 小程序给设备 UDP 服务,发送目标 Wi-Fi 路由器的 SSID/PSW 以及配网 Token,JSON 格式为:
{
    "cmdType":1,
    "ssid":"Home-WiFi",
    "password":"abcd1234"
}

属性名

属性描述

类型

cmdType

消息类型,手机向设备发送为1

整数

ssid

Wi-Fi 的 SSID

字符串

password

Wi-Fi 的 密码

字符串

发送完成后,等待设备 UDP 回复设备信息及配网协议版本号:

{
    "cmdType":2,
    "mac":"xxxxxxxx",
    "protoVersion":"2.0"
}

属性名

属性描述

类型

cmdType

消息类型,设备手机发送正常响应为2

整数

mac

设备的mac,无分隔符

字符串

固件版本

固件的版本

字符串

如果配网过程中出错,需要退出配网操作,那么响应

{
    "cmdType":3,
    "log":"错误描述"
}

属性名

属性描述

类型

cmdType

消息类型,设备手机发送异常响应为3

整数

log

错误描述

字符串

  1. 如果2秒之内,未收到设备回复,则重复步骤4,UDP 客户端重复发送目标 Wi-Fi 路由器的 SSID/PSW 。(如果重复发送5次,都没有收到回复,则认为配网失败,Wi-Fi 设备有异常)
  2. 如果步骤4收到设备回复,则说明设备端已收到 Wi-Fi 路由器的 SSID/PSW,正在连接 Wi-Fi 路由器,并连接物联网平台。此时小程序会提示手机也将连接 Wi-Fi 路由器,并轮询物联网后台,来确认配网及设备绑定上线成功。
  3. 设备端在成功连接 Wi-Fi 路由器后,通过 MQTT 连接物联网后台。如果连接不上,那么重新进入配网模式,指示灯再次闪烁

4. 设备热点信息规范

描述

SSID

前缀"z_"加mac地址,如z_483FDA5319D0

密码

固定为z111111

设备端可以记录配网日志,如果配网或连接失败,可以在下次连接时向手机端反馈

{
    "cmdType":31,
    "log":"错误描述"
}

属性名

属性描述

类型

cmdType

消息类型,设备手机发送异常响,前一次日志类型为31

整数

log

错误描述

字符串

5. 实现过程

第一步,先分按钮验证
startWifi() {
		console.log('开始wifi接口');
		wx.startWifi({
			complete (res) {
				console.log(res)
			}
		})
	},
	connectWifi() {
		// 连接wifi
		wx.connectWifi({
		  SSID: 'TEST',
		  forceNewApi: true,
		  password: 'test1234',
		  complete (res2) {
		    console.log(res2)
		  }
		})
	},
	connectUDP() {
		// 建立udp连接
		debugger
		this.udp = wx.createUDPSocket()
		if(this.udp === null){
			 console.log('暂不支持')
			 return ;
		}
		this.udp.connect({
			address: '192.168.4.1',
			port: 8266
		})
		this.udp.bind()
		this.udp.onListening(function(res4){
		     console.log('4监听中...')
		     console.log(res4)
		})
		this.udp.onMessage(res3 => {
			console.log('3监听中...')
			console.log(res3);
		})
	},
	sendDataUDP() {
		const msgData = {
			"cmdType":1,
			"ssid":"31",
			"password":"fff316"
		}
		this.udp.send({
			address: '192.168.4.1',
			port: 8266,
			message: JSON.stringify(msgData)
		})
	},
  • 测试按钮
<u-button @click="startWifi()">1</u-button>
<u-button @click="connectWifi()">2</u-button>
<u-button @click="connectUDP()">3</u-button>
<u-button @click="sendDataUDP()">4</u-button>

5. 加入业务实现

这里设计至少三个页面

  • 设备状态确认页
  • 家庭wifi信息输入页
  • 配网过程页