// pages/configuration/configuration.js const app = getApp() Page({ /** * 页面的初始数据 */ data: { deviceArr: [], isConnected: false, chs: [], bytes:[] }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { let type = \'\' if(options.type==\'wifi\'){ type = { name: \'WIFI\', isShow: true, isShowPswText: \'显示密码\', placeholder1: \'请输入wifi名称\', placeholder2: \'请输入wifi密码\' }; }else{ type = { name: \'手机热点\', isShow: true, isShowPswText: \'显示密码\', placeholder1: \'请输入热点名称\', placeholder2: \'请输入热点密码\' } } this.setData({ type:type }) //判断wifi是否连接 wx.getConnectedWifi({ success: function (res) { app.globalData.wifi = res.wifi }, fail: function (res) { app.globalData.wifi = \'\' } }) //蓝牙使用准备模块======================================================================================================= let that = this; if (app.getPlatform() == \'android\' && app.versionCompare(\'6.5.7\', app.getVersion())) { wx.showModal({ title: \'提示\', content: \'当前微信版本过低,请更新至最新版本\', showCancel: false }) } else if (app.getPlatform() == \'ios\' && app.versionCompare(\'6.5.6\', app.getVersion())) { wx.showModal({ title: \'提示\', content: \'当前微信版本过低,请更新至最新版本\', showCancel: false }) } wx.showLoading({ title: \'初始化蓝牙\' }) this.initBuleTooth() }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: function () { if (app.globalData.wifi){ let wifi = app.globalData.wifi; this.setData({ wifiName: wifi.SSID }) } }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, /** * 用户点击右上角分享 */ onShareAppMessage: function () { }, showPsw:function(){ let isShow = \'type.isShow\'; let ShowPswText = \'type.isShowPswText\'; let isShowPswText = this.data.type.isShow ? \'隐藏密码\' : \'显示密码\'; this.setData({ [isShow]:!this.data.type.isShow }); this.setData({ [ShowPswText]:isShowPswText }) }, connect:function(){ let that = this; let name = this.data.wifiName; let psw = this.data.psw; if(name && psw){ wx.startWifi({ success(res) { wx.connectWifi({ SSID: name, password: psw, success(res) { wx.showToast({ title: \'连接成功!\', icon: \'none\' }) wx.showLoading({ title: \'配网中\', }) //组织参数 let param1 = [-86, 1, 2, null, 0]; let param2 = that.stringToBytes(name) let param3 = that.stringToBytes(psw) let param4 = that.stringToBytes(app.globalData.wifi ? app.globalData.wifi.BSSID.replace(/:/g, \'\'):\'\'); let param5 = that.stringToBytes("5G"); let param6 = [1, 2, 1, 0, 1, 0] let param = that.data.bytes.concat(param1).concat(param2.length).concat(param2).concat(param3.length).concat(param3).concat(param4.length).concat(param4).concat(param5.length).concat(param5).concat(param6); param[3] = param.length //蓝牙配网 that.wirteData(param) }, fail: function (res) { if (res.errCode == 12002) { wx.showToast({ title: \'密码错误\', icon: \'none\' }) } else { wx.showToast({ title: \'连接失败,错误码:\' + res.errCode, icon: \'none\' }) } } }) }, fail: function () { wx.showToast({ title: \'wifi模块初始化失败!\', icon: \'none\' }) } }) }else{ wx.showToast({ title: \'请输入账号密码!\', icon:\'none\' }) } }, getVal:function(e){ let key = e.currentTarget.dataset.value; this.setData({ [key]:e.detail.value }) }, //工具类===================================================================== inArray: function (arr, key, val) { for (let i = 0; i < arr.length; i++) { if (arr[i][key] === val) { return i; } } return -1; }, // ArrayBuffer转16进度字符串示例 ab2hex: function (buffer) { var hexArr = Array.prototype.map.call( new Uint8Array(buffer), function (bit) { return (\'00\' + bit.toString(16)).slice(-2) } ) return hexArr.join(\'\'); }, stringToBytes:function(str) { let ch, st, re =[]; for(var i = 0; i<str.length; i++ ) { ch = str.charCodeAt(i); st = []; do { st.push(ch & 0xFF); // push byte to stack ch = ch >> 8; // shift value down by 1 byte } while (ch); re = re.concat(st.reverse()); } return re; }, //蓝牙函数===================================================================== //初始化蓝牙模块 initBuleTooth: function () { let that = this; if (wx.openBluetoothAdapter) { wx.openBluetoothAdapter({ success(res) { that.getBuleTooth() }, fail: function (res) { wx.hideLoading() wx.showToast({ title: \'蓝牙模块不可用!\', icon: \'none\' }) } }) } else { wx.hideLoading() // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示 wx.showModal({ title: \'提示\', content: \'当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。\' }) } }, //开始搜索附近蓝牙设备 getBuleTooth: function (uuid) { let that = this; wx.startBluetoothDevicesDiscovery({ services: (uuid && uuid.length == 0) ? \'\' : uuid, success: function (res) { that.foundBuleTooth() }, fail: function (res) { wx.showToast({ title: \'搜索失败\', icon: \'none\' }) } }) }, //发现设备 foundBuleTooth: function () { let that = this; let found = false; let timeOut; wx.onBluetoothDeviceFound(function (res) { res.devices.forEach((device) => { let str1 = that.ab2hex(device.advertisData).substr(0,2); let str2 = that.ab2hex(device.advertisData).substr(2,4); let tag = parseInt(str2+str1,16) if (tag == app.globalData.dongleTag){ found = true that.getConnect(device) that.stopBuleTooth() } }) }); timeOut = setTimeout(function () { if (!found) { wx.showToast({ title: \'未找到指定设备\', icon: \'none\' }) } timeOut = null; }, 20000) }, //停止搜索 stopBuleTooth: function () { wx.stopBluetoothDevicesDiscovery({ success(res) { console.log(\'成功停止搜索\') } }) }, //建立连接 getConnect: function (dvs) { let that = this; const ds = dvs; const deviceId = ds.deviceId; const name = ds.name; wx.createBLEConnection({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId, success(res) { that.setData({ isConnected: true, connectedDevice: name }) that.getService(deviceId) } }); //that.stopBuleTooth() }, //获取设备所有服务 getService: function (deviceId) { let that = this; wx.getBLEDeviceServices({ deviceId: deviceId, success: function (res) { for (let i = 0; i < res.services.length; i++) { if (res.services[i].isPrimary) { that.getCharacteristic(deviceId, res.services[i].uuid) } } } }) }, //获取蓝牙设备某个服务中所有特征值(characteristic) getCharacteristic: function (deviceId, serviceId) { let that = this; wx.getBLEDeviceCharacteristics({ deviceId, serviceId, success(res) { wx.hideLoading() wx.showToast({ title: \'初始化蓝牙成功!\', icon: \'none\' }); for (let i = 0; i < res.characteristics.length; i++) { let item = res.characteristics[i] if (item.properties.read) { wx.readBLECharacteristicValue({ deviceId, serviceId, characteristicId: item.uuid, }) } if (item.properties.write) { that.setData({ canWrite: true }) that._deviceId = deviceId that._serviceId = serviceId that._characteristicId = item.uuid } if (item.properties.notify || item.properties.indicate) { wx.notifyBLECharacteristicValueChange({ deviceId, serviceId, characteristicId: item.uuid, state: true, }) } } }, fail: function (res) { console.log("获取服务特征值失败,再次获取" + res) that.getCharacteristic(deviceId, serviceId) } }) }, //写数据 wirteData: function (param) { let that = this; let data = new Uint8Array(param); let dataBuffer = data.buffer; wx.writeBLECharacteristicValue({ deviceId: this._deviceId, serviceId: this._serviceId, characteristicId: this._characteristicId, value: dataBuffer, success: function (res) { console.log(\'成功\') console.log(res) }, fail: function (res) { wx.showToast({ title: \'写入失败,请重新配网\', icon:\'none\' }) } }) //写入数据之后监听 wx.onBLECharacteristicValueChange((characteristic) => { switch (that.ab2hex(characteristic.value)){ case \'42\': wx.hideLoading() wx.showToast({ title: \'配网成功\', icon:\'none\' }); that.closeBluetoothAdapter() wx.navigateTo({ url: \'../finish/finish\', }) break; case \'0b\': break; default: wx.hideLoading() wx.showToast({ title: \'配网失败\', icon:\'none\' }) } }) }, //关闭蓝牙 closeBluetoothAdapter() { wx.closeBluetoothAdapter() console.log(\'关闭蓝牙\') } })
具体见https://gitee.com/jiangdaqi/minPro/blob/master/pages/configuration/configuration.js
要注意的是组织参数时,需将字符串变为字节数组
请发表评论