当下各种支持WIFI模块的硬件终端越来越普遍,但要想与之进行数据交互需要先给终端连接上周边WIFI,这样才可正常通过互联网接收与发送数据,这种终端一般分为 3 类,即:可视化操作配网(窗口)
、WIFI连接配网(Socket)
和 蓝牙通讯配网(BLE)
可视化配网非常简单,终端提供触摸屏与系统手动即可完成配网(一般是基于Android系统的二次开发)。还有一种无触摸屏需要通过 WIFI 或蓝牙与终端连接,发送约定格式的十六进制数据,内含配网需要的相关数据,如:WIFI名称
、密码
、服务器地址
、端口
,等等信息,终端解析数据后连接 WIFI,本文主要讲解第 3 种方式蓝牙通讯的完整流程
整体流程分为3个步骤:搜索并选择周边 WIFI
- 搜索并连接目标设备蓝牙
- 填写选中 WIFI 密码并通过蓝牙发送
完整源码,可私聊我获取。若您有遇到其它相关问题,非常欢迎在评论中留言,我和其他读者小伙伴们将帮助解决并持续更新至此文,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!
/**
* 初始化Wifi模块
*/
onStartWifi:function(){
wx.startWifi({
success: (res) => {
if(res.errCode == 0){
// 初始化成功
that.onUserLocationScope();
}else{
// 初始化失败
that.showModal(res.errMsg);
}
},
fail: (res) => {
that.showModal(res.errMsg);
}
})
},
/**
* 获取scope.userLocation授权
*/
onUserLocationScope:function(){
// 获取当前已授权项列表
wx.getSetting({
success:(res) => {
// 如果未获取 userLocation 授权则请求授权
if (!res.authSetting['scope.userLocation']) {
wx.authorize({
scope: 'scope.userLocation',
success: (res) => { // 同意授权
that.onGetWifiList();
},
fail: (res) => { // 拒绝授权
that.showModal("您已拒绝授权,蓝牙配网无法继续进行,点击设置可重新授权")
wx.openSetting({})
}
})
}else{ // 如果已获取则直接搜索 WIFI 列表
that.onGetWifiList();
}
}
})
},
/**
* 获取Wifi列表
*/
onGetWifiList:function(){
wx.getWifiList({
success: (res) => {
// 获取 WIFI 列表成功
if(res.errCode == 0){
wx.onGetWifiList(function (CALLBACK) {
// 原始的 WIFI 列表
let wifiList = CALLBACK.wifiList;
// 处理后 WIFI 列表(去重并且只保留名称 => SSID)
let wifiSSID = [];
// 去重并且只保留名称
wifiList.forEach(wifi => {
if(wifi.SSID == ''){
wifiSSID.unshift("未能获取到此 WIFI 的命名")
return;
}
wifiSSID.indexOf(wifi.SSID) == -1 ? wifiSSID.unshift(wifi.SSID) : '';
})
// push 显示
that.setData({
mainData: wifiSSID
})
});
}else{ // 获取 WIFI 列表失败
that.showModal(res.errMsg)
}
},
fail: (res) => {
that.showModal(res.errMsg)
}
})
},
/**
* 开始搜寻附近的蓝牙设备(此操作比较耗费系统资源,请在搜索并连接到设备后调用 wx.stopBluetoothDevicesDiscovery方法停止搜索)
*/
startBluetoothDevicesDiscovery: function () {
if(_discoveryStarted) {
return;
}
_discoveryStarted = true
wx.startBluetoothDevicesDiscovery({
services: serviceUUID, //如果设置此参数,则只搜索广播包有对应 uuid 的主服务的蓝牙设备。
allowDuplicatesKey: false,
success: (res) => {
console.log('蓝牙搜索 success :', res)
},
fail(res) {
console.log('蓝牙搜索 fail :', res)
}
})
},
/**
* 监听寻找新设备事件
* 搜索匹配设备后,自动连接设备(filterDeviceName为自动连接的蓝牙名,模糊判断)
*/
onBluetoothDeviceFound: function () {
wx.onBluetoothDeviceFound((res) => {
res.devices.forEach(device => {
// 转换后, 得出相关数据
var hexStr = that.ab2hex(device.advertisData);
// 通过蓝牙名称匹配设备
let deviceName = device.name.toUpperCase();
// 判断是否为指定连接名称的蓝牙
if ((deviceName.indexOf(filterDeviceName) != -1) && isnotExist) {
// 默认匹配第一个
isnotExist = false;
deviceId = device.deviceId;
// 停止搜寻附近的蓝牙外围设备。
that.stopBluetoothDevicesDiscovery();
// 连接指定蓝牙
that.createBLEConnection(deviceName);
}
})
})
},
/**
* 蓝牙设备配网数据处理
*/
bleConfigEvent: function () {
// 蓝牙搜索的结果
if (util.isEmpty(deviceId)) {
util.toastError("请先搜索蓝牙设备");
return;
}
// 即将传输的数据
var cell = {
"time": "xxxxxxxxxxx",
"data": {
"cmd": 10,
"ssid": "WIFI 名称",
"password": "WIFI 密码",
"server": "服务器IP",
"portApi": "服务器端口",
"portMqtt": "1883",
"ip": "",
"subnet": "",
"router": ""
}
}
// 发送验证字符串(根据终端通讯协议规则决定是否需要)
var signet = "signet";
var signetBuffer = this.string2buffer(signet)
that.sendBLEData(signetBuffer,0,false);
// 发送正式配网数据
var buffer = this.string2buffer(JSON.stringify(cell))
setTimeout(function () {
that.sendBLEData(buffer, 0, true);
}, 1000)
},
/**
* 发送数据
* @param buffer 需要发送的数据体
* @param close 是否为最终数据
*/
sendBLEData: function (buffer,close) {
wx.writeBLECharacteristicValue({
deviceId: _deviceId,
serviceId: _serviceId,
characteristicId: _characteristicId,
value: buffer,
success: function (res) {
if (close){
util.toastError('配网成功');
}
},
fail: function (res) {
console.log(res);
}
})
},
完整源码,可私聊我获取。若您有遇到其它相关问题,非常欢迎在评论中留言,我和其他读者小伙伴们将帮助解决并持续更新至此文,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!