|
@@ -0,0 +1,847 @@
|
|
|
+let tempTimer = 0;
|
|
|
+let client = null;
|
|
|
+let util = null
|
|
|
+let mDeviceEvent = null
|
|
|
+let crypto = null
|
|
|
+let md5 = null
|
|
|
+let aesjs = null
|
|
|
+const timeOut = 20; //超时时间
|
|
|
+var timeId = "";
|
|
|
+let sequenceControl = 0;
|
|
|
+let sequenceNumber = -1;
|
|
|
+
|
|
|
+let _self = {
|
|
|
+ data: {
|
|
|
+ deviceId: null,
|
|
|
+ isConnected: false,
|
|
|
+ failure: false,
|
|
|
+ value: 0,
|
|
|
+ desc: "请耐心等待...",
|
|
|
+ isChecksum: true,
|
|
|
+ isEncrypt: true,
|
|
|
+ flagEnd: false,
|
|
|
+ defaultData: 1,
|
|
|
+ ssidType: 2,
|
|
|
+ passwordType: 3,
|
|
|
+ meshIdType: 3,
|
|
|
+ deviceId: "",
|
|
|
+ ssid: "",
|
|
|
+ uuid: "",
|
|
|
+ serviceId: "",
|
|
|
+ password: "",
|
|
|
+ meshId: "",
|
|
|
+ processList: [],
|
|
|
+ result: [],
|
|
|
+ service_uuid: "0000FFFF-0000-1000-8000-00805F9B34FB",
|
|
|
+ characteristic_write_uuid: "0000FF01-0000-1000-8000-00805F9B34FB",
|
|
|
+ characteristic_read_uuid: "0000FF02-0000-1000-8000-00805F9B34FB",
|
|
|
+ customData: null,
|
|
|
+ md5Key: 0,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function buf2hex(buffer) {
|
|
|
+ return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
|
|
|
+}
|
|
|
+
|
|
|
+function buf2string(buffer) {
|
|
|
+ var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x);
|
|
|
+ var str = '';
|
|
|
+ for (var i = 0; i < arr.length; i++) {
|
|
|
+ str += String.fromCharCode(arr[i]);
|
|
|
+ }
|
|
|
+ return str;
|
|
|
+}
|
|
|
+
|
|
|
+function getSsids(str) {
|
|
|
+ var list = [],
|
|
|
+ strs = str.split(":");
|
|
|
+ for (var i = 0; i < strs.length; i++) {
|
|
|
+ list.push(parseInt(strs[i], 16));
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+}
|
|
|
+
|
|
|
+function getCharCodeat(str) {
|
|
|
+ var list = [];
|
|
|
+ for (var i = 0; i < str.length; i++) {
|
|
|
+ list.push(str.charCodeAt(i));
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+}
|
|
|
+function getCharCodeatSSID(str) {
|
|
|
+ return unescape(encodeURIComponent(str)).split("").map(val => val.charCodeAt());
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//判断返回的数据是否加密
|
|
|
+function isEncrypt(fragNum, list, md5Key) {
|
|
|
+ var checksum = [],
|
|
|
+ checkData = [];
|
|
|
+ if (fragNum[7] == "1") { //返回数据加密
|
|
|
+ if (fragNum[6] == "1") {
|
|
|
+ var len = list.length - 2;
|
|
|
+ list = list.slice(0, len);
|
|
|
+ }
|
|
|
+ var iv = this.generateAESIV(parseInt(list[2], 16));
|
|
|
+ if (fragNum[3] == "0") { //未分包
|
|
|
+ list = list.slice(4);
|
|
|
+ _self.data.flagEnd = true
|
|
|
+ } else { //分包
|
|
|
+ list = list.slice(6);
|
|
|
+ }
|
|
|
+ } else { //返回数据未加密
|
|
|
+ if (fragNum[6] == "1") {
|
|
|
+ var len = list.length - 2;
|
|
|
+ list = list.slice(0, len);
|
|
|
+ }
|
|
|
+ if (fragNum[3] == "0") { //未分包
|
|
|
+ list = list.slice(4);
|
|
|
+ _self.data.flagEnd = true
|
|
|
+ } else { //分包
|
|
|
+ list = list.slice(6);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+}
|
|
|
+
|
|
|
+function getSecret(deviceId, serviceId, characteristicId, client, kBytes, pBytes, gBytes, data) {
|
|
|
+
|
|
|
+ var obj = [],
|
|
|
+ frameControl = 0;
|
|
|
+ sequenceControl = parseInt(sequenceControl) + 1;
|
|
|
+ if (!util._isEmpty(data)) {
|
|
|
+ obj = util.isSubcontractor(data, true, sequenceControl);
|
|
|
+ frameControl = util.getFrameCTRLValue(false, true, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ } else {
|
|
|
+ data = [];
|
|
|
+ data.push(util.NEG_SET_SEC_ALL_DATA);
|
|
|
+ var pLength = pBytes.length;
|
|
|
+ var pLen1 = (pLength >> 8) & 0xff;
|
|
|
+ var pLen2 = pLength & 0xff;
|
|
|
+ data.push(pLen1);
|
|
|
+ data.push(pLen2);
|
|
|
+ data = data.concat(pBytes);
|
|
|
+ var gLength = gBytes.length;
|
|
|
+ var gLen1 = (gLength >> 8) & 0xff;
|
|
|
+ var gLen2 = gLength & 0xff;
|
|
|
+ data.push(gLen1);
|
|
|
+ data.push(gLen2);
|
|
|
+ data = data.concat(gBytes);
|
|
|
+ var kLength = kBytes.length;
|
|
|
+ var kLen1 = (kLength >> 8) & 0xff;
|
|
|
+ var kLen2 = kLength & 0xff;
|
|
|
+ data.push(kLen1);
|
|
|
+ data.push(kLen2);
|
|
|
+ data = data.concat(kBytes);
|
|
|
+ obj = util.isSubcontractor(data, true, sequenceControl);
|
|
|
+ frameControl = util.getFrameCTRLValue(false, true, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ }
|
|
|
+ var value = util.writeData(util.PACKAGE_VALUE, util.SUBTYPE_NEG, frameControl, sequenceControl, obj.len, obj.lenData);
|
|
|
+ var typedArray = new Uint8Array(value);
|
|
|
+ console.log(typedArray)
|
|
|
+ wx.writeBLECharacteristicValue({
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: characteristicId,
|
|
|
+ value: typedArray.buffer,
|
|
|
+ success: function (res) {
|
|
|
+ if (obj.flag) {
|
|
|
+ getSecret(deviceId, serviceId, characteristicId, client, kBytes, pBytes, gBytes, obj.laveData);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ console.log(res)
|
|
|
+ console.log(deviceId)
|
|
|
+ console.log(serviceId)
|
|
|
+ console.log(characteristicId)
|
|
|
+ console.log(typedArray.length)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function writeDeviceRouterInfoStart(deviceId, serviceId, characteristicId, data) {
|
|
|
+ var obj = {},
|
|
|
+ frameControl = 0;
|
|
|
+ sequenceControl = parseInt(sequenceControl) + 1;
|
|
|
+ if (!util._isEmpty(data)) {
|
|
|
+ obj = util.isSubcontractor(data, _self.data.isChecksum, sequenceControl, _self.data.isEncrypt);
|
|
|
+ frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, _self.data.isChecksum, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ } else {
|
|
|
+ obj = util.isSubcontractor([_self.data.defaultData], _self.data.isChecksum, sequenceControl, true);
|
|
|
+ frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, _self.data.isChecksum, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ }
|
|
|
+ var defaultData = util.encrypt(aesjs, _self.data.md5Key, sequenceControl, obj.lenData, true);
|
|
|
+ var value = util.writeData(util.PACKAGE_CONTROL_VALUE, util.SUBTYPE_WIFI_MODEl, frameControl, sequenceControl, obj.len, defaultData);
|
|
|
+ var typedArray = new Uint8Array(value)
|
|
|
+ wx.writeBLECharacteristicValue({
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: characteristicId,
|
|
|
+ value: typedArray.buffer,
|
|
|
+ success: function (res) {
|
|
|
+ if (obj.flag) {
|
|
|
+ writeDeviceRouterInfoStart(deviceId, serviceId, characteristicId, obj.laveData);
|
|
|
+ } else {
|
|
|
+ writeRouterSsid(deviceId, serviceId, characteristicId, null);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function writeCutomsData(deviceId, serviceId, characteristicId, data) {
|
|
|
+ var obj = {},
|
|
|
+ frameControl = 0;
|
|
|
+ sequenceControl = parseInt(sequenceControl) + 1;
|
|
|
+ if (!util._isEmpty(data)) {
|
|
|
+ obj = util.isSubcontractor(data, _self.data.isChecksum, sequenceControl, _self.data.isEncrypt);
|
|
|
+ frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, _self.data.isChecksum, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ } else {
|
|
|
+ var ssidData = getCharCodeat(_self.data.customData);
|
|
|
+ obj = util.isSubcontractor(ssidData, _self.data.isChecksum, sequenceControl, _self.data.isEncrypt);
|
|
|
+ frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, _self.data.isChecksum, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ }
|
|
|
+ var defaultData = util.encrypt(aesjs, _self.data.md5Key, sequenceControl, obj.lenData, true);
|
|
|
+ var value = util.writeData(util.PACKAGE_VALUE, util.SUBTYPE_CUSTOM_DATA, frameControl, sequenceControl, obj.len, defaultData);
|
|
|
+ var typedArray = new Uint8Array(value)
|
|
|
+ wx.writeBLECharacteristicValue({
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: characteristicId,
|
|
|
+ value: typedArray.buffer,
|
|
|
+ success: function (res) {
|
|
|
+ if (obj.flag) {
|
|
|
+ writeCutomsData(deviceId, serviceId, characteristicId, obj.laveData);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ //console.log(257);
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+function writeGetNearRouterSsid(deviceId, serviceId, characteristicId, data) {
|
|
|
+ sequenceControl = parseInt(sequenceControl) + 1;
|
|
|
+ var frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, false, util.DIRECTION_OUTPUT, false, false);
|
|
|
+ var value = util.writeData(_self.data.PACKAGE_CONTROL_VALUE, util.SUBTYPE_WIFI_NEG, frameControl, sequenceControl, 0, null);
|
|
|
+ var typedArray = new Uint8Array(value)
|
|
|
+ wx.writeBLECharacteristicValue({
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: characteristicId,
|
|
|
+ value: typedArray.buffer,
|
|
|
+ success: function (res) {
|
|
|
+
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function writeRouterSsid(deviceId, serviceId, characteristicId, data) {
|
|
|
+ var obj = {},
|
|
|
+ frameControl = 0;
|
|
|
+ sequenceControl = parseInt(sequenceControl) + 1;
|
|
|
+ if (!util._isEmpty(data)) {
|
|
|
+ obj = util.isSubcontractor(data, _self.data.isChecksum, sequenceControl, _self.data.isEncrypt);
|
|
|
+ frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, _self.data.isChecksum, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ } else {
|
|
|
+ // var ssidData = getCharCodeat(_self.data.ssid);
|
|
|
+ var ssidData = getCharCodeatSSID(_self.data.ssid);
|
|
|
+ obj = util.isSubcontractor(ssidData, _self.data.isChecksum, sequenceControl, _self.data.isEncrypt);
|
|
|
+ frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, _self.data.isChecksum, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ }
|
|
|
+ var defaultData = util.encrypt(aesjs, _self.data.md5Key, sequenceControl, obj.lenData, true);
|
|
|
+ var value = util.writeData(util.PACKAGE_VALUE, util.SUBTYPE_SET_SSID, frameControl, sequenceControl, obj.len, defaultData);
|
|
|
+ var typedArray = new Uint8Array(value)
|
|
|
+ wx.writeBLECharacteristicValue({
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: characteristicId,
|
|
|
+ value: typedArray.buffer,
|
|
|
+ success: function (res) {
|
|
|
+ if (obj.flag) {
|
|
|
+ writeRouterSsid(deviceId, serviceId, characteristicId, obj.laveData);
|
|
|
+ } else {
|
|
|
+ writeDevicePwd(deviceId, serviceId, characteristicId, null);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ //console.log(257);
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function writeDevicePwd(deviceId, serviceId, characteristicId, data) {
|
|
|
+ var obj = {},
|
|
|
+ frameControl = 0;
|
|
|
+ sequenceControl = parseInt(sequenceControl) + 1;
|
|
|
+ if (!util._isEmpty(data)) {
|
|
|
+ obj = util.isSubcontractor(data, _self.data.isChecksum, sequenceControl, _self.data.isEncrypt);
|
|
|
+ frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, _self.data.isChecksum, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ } else {
|
|
|
+ var pwdData = getCharCodeat(_self.data.password);
|
|
|
+ obj = util.isSubcontractor(pwdData, _self.data.isChecksum, sequenceControl, _self.data.isEncrypt);
|
|
|
+ frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, _self.data.isChecksum, util.DIRECTION_OUTPUT, false, obj.flag);
|
|
|
+ }
|
|
|
+ var defaultData = util.encrypt(aesjs, _self.data.md5Key, sequenceControl, obj.lenData, true);
|
|
|
+ var value = util.writeData(util.PACKAGE_VALUE, util.SUBTYPE_SET_PWD, frameControl, sequenceControl, obj.len, defaultData);
|
|
|
+ var typedArray = new Uint8Array(value)
|
|
|
+
|
|
|
+ wx.writeBLECharacteristicValue({
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: characteristicId,
|
|
|
+ value: typedArray.buffer,
|
|
|
+ success: function (res) {
|
|
|
+ if (obj.flag) {
|
|
|
+ writeDevicePwd(deviceId, serviceId, characteristicId, obj.laveData);
|
|
|
+ } else {
|
|
|
+ writeDeviceEnd(deviceId, serviceId, characteristicId, null);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ fail: function (res) { }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function writeDeviceEnd(deviceId, serviceId, characteristicId) {
|
|
|
+ sequenceControl = parseInt(sequenceControl) + 1;
|
|
|
+ var frameControl = util.getFrameCTRLValue(_self.data.isEncrypt, false, util.DIRECTION_OUTPUT, false, false);
|
|
|
+ var value = util.writeData(_self.data.PACKAGE_CONTROL_VALUE, util.SUBTYPE_END, frameControl, sequenceControl, 0, null);
|
|
|
+ var typedArray = new Uint8Array(value)
|
|
|
+ wx.writeBLECharacteristicValue({
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: characteristicId,
|
|
|
+ value: typedArray.buffer,
|
|
|
+ success: function (res) {
|
|
|
+
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function init() {
|
|
|
+
|
|
|
+ let mOnFire = require("./other/onfire.js");
|
|
|
+ mDeviceEvent = require('./xBlufi.js');
|
|
|
+
|
|
|
+ util = require('@/utils/blufi/util.js');
|
|
|
+ crypto = require('@/utils/blufi/crypto/crypto-dh.js');
|
|
|
+ md5 = require('@/utils/blufi/crypto/md5.min.js');
|
|
|
+ aesjs = require('@/utils/blufi/crypto/aes.js');
|
|
|
+
|
|
|
+ wx.onBLEConnectionStateChange(function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_STATUS_CONNECTED,
|
|
|
+ 'result': res.connected,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ })
|
|
|
+
|
|
|
+ mDeviceEvent.listenStartDiscoverBle(true, function (options) {
|
|
|
+
|
|
|
+ if (options.isStart) {
|
|
|
+ //第一步检查蓝牙适配器是否可用
|
|
|
+ wx.onBluetoothAdapterStateChange(function (res) {
|
|
|
+ if (!res.available) {
|
|
|
+
|
|
|
+ }
|
|
|
+ });
|
|
|
+ //第二步关闭适配器,重新来搜索
|
|
|
+ wx.closeBluetoothAdapter({
|
|
|
+ complete: function (res) {
|
|
|
+ wx.openBluetoothAdapter({
|
|
|
+ success: function (res) {
|
|
|
+ wx.getBluetoothAdapterState({
|
|
|
+ success: function (res) {
|
|
|
+ wx.stopBluetoothDevicesDiscovery({
|
|
|
+ success: function (res) {
|
|
|
+ let devicesList = [];
|
|
|
+ let countsTimes = 0;
|
|
|
+ wx.onBluetoothDeviceFound(function (devices) {
|
|
|
+ //剔除重复设备,兼容不同设备API的不同返回值
|
|
|
+ var isnotexist = true;
|
|
|
+ if (devices.deviceId) {
|
|
|
+ if (devices.advertisData) {
|
|
|
+ devices.advertisData = buf2hex(devices.advertisData)
|
|
|
+ } else {
|
|
|
+ devices.advertisData = ''
|
|
|
+ }
|
|
|
+ for (var i = 0; i < devicesList.length; i++) {
|
|
|
+ if (devices.deviceId === devicesList[i].deviceId) {
|
|
|
+ isnotexist = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isnotexist) {
|
|
|
+ devicesList.push(devices)
|
|
|
+ }
|
|
|
+ } else if (devices.devices) {
|
|
|
+ if (devices.devices[0].advertisData) {
|
|
|
+ devices.devices[0].advertisData = buf2hex(devices.devices[0].advertisData)
|
|
|
+ } else {
|
|
|
+ devices.devices[0].advertisData = ''
|
|
|
+ }
|
|
|
+ for (var i = 0; i < devicesList.length; i++) {
|
|
|
+ if (devices.devices[0].deviceId == devicesList[i].deviceId) {
|
|
|
+ isnotexist = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isnotexist) {
|
|
|
+ devicesList.push(devices.devices[0])
|
|
|
+ }
|
|
|
+ } else if (devices[0]) {
|
|
|
+ if (devices[0].advertisData) {
|
|
|
+ devices[0].advertisData = buf2hex(devices[0].advertisData)
|
|
|
+ } else {
|
|
|
+ devices[0].advertisData = ''
|
|
|
+ }
|
|
|
+ for (var i = 0; i < devices_list.length; i++) {
|
|
|
+ if (devices[0].deviceId == devicesList[i].deviceId) {
|
|
|
+ isnotexist = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isnotexist) {
|
|
|
+ devicesList.push(devices[0])
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS,
|
|
|
+ 'result': true,
|
|
|
+ 'data': devicesList
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ })
|
|
|
+ wx.startBluetoothDevicesDiscovery({
|
|
|
+ allowDuplicatesKey: true,
|
|
|
+ success: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START,
|
|
|
+ 'result': true,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ //开始扫码,清空列表
|
|
|
+ devicesList.length = 0;
|
|
|
+
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ wx.stopBluetoothDevicesDiscovery({
|
|
|
+ success: function (res) {
|
|
|
+ clearInterval(tempTimer);
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP,
|
|
|
+ 'result': true,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ mDeviceEvent.listenConnectBle(true, function (options) {
|
|
|
+ //console.log("我要连接?", (options.isStart))
|
|
|
+
|
|
|
+ if (options.isStart)
|
|
|
+ wx.createBLEConnection({
|
|
|
+ deviceId: options.deviceId,
|
|
|
+ success: function (res) {
|
|
|
+ wx.setBLEMTU({
|
|
|
+ deviceId: options.deviceId,
|
|
|
+ mtu: 128
|
|
|
+ })
|
|
|
+ _self.data.deviceId = options.deviceId
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent({
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CONNECTED,
|
|
|
+ 'result': true,
|
|
|
+ 'data': {
|
|
|
+ deviceId: options.deviceId,
|
|
|
+ name: options.name
|
|
|
+ },
|
|
|
+ });
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ _self.data.deviceId = null
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent({
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CONNECTED,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ else wx.closeBLEConnection({
|
|
|
+ deviceId: options.deviceId,
|
|
|
+ success: function (res) {
|
|
|
+ console.log('断开成功')
|
|
|
+ _self.data.deviceId = null
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent({
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CLOSE_CONNECTED,
|
|
|
+ 'result': true,
|
|
|
+ 'data': {
|
|
|
+ deviceId: options.deviceId,
|
|
|
+ name: options.name
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ _self.data.deviceId = null
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent({
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CLOSE_CONNECTED,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ mDeviceEvent.listenInitBleEsp32(true, function (options) {
|
|
|
+ sequenceControl = 0;
|
|
|
+ sequenceNumber = -1;
|
|
|
+ _self = null
|
|
|
+ _self = {
|
|
|
+ data: {
|
|
|
+ deviceId: null,
|
|
|
+ isConnected: false,
|
|
|
+ failure: false,
|
|
|
+ value: 0,
|
|
|
+ desc: "请耐心等待...",
|
|
|
+ isChecksum: true,
|
|
|
+ isEncrypt: true,
|
|
|
+ flagEnd: false,
|
|
|
+ defaultData: 1,
|
|
|
+ ssidType: 2,
|
|
|
+ passwordType: 3,
|
|
|
+ meshIdType: 3,
|
|
|
+ deviceId: "",
|
|
|
+ ssid: "",
|
|
|
+ uuid: "",
|
|
|
+ serviceId: "",
|
|
|
+ password: "",
|
|
|
+ meshId: "",
|
|
|
+ processList: [],
|
|
|
+ result: [],
|
|
|
+ service_uuid: "0000FFFF-0000-1000-8000-00805F9B34FB",
|
|
|
+ characteristic_write_uuid: "0000FF01-0000-1000-8000-00805F9B34FB",
|
|
|
+ characteristic_read_uuid: "0000FF02-0000-1000-8000-00805F9B34FB",
|
|
|
+ customData: null,
|
|
|
+ md5Key: 0,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let deviceId = options.deviceId
|
|
|
+ _self.data.deviceId = options.deviceId
|
|
|
+ wx.getBLEDeviceServices({
|
|
|
+ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
|
|
|
+ deviceId: deviceId,
|
|
|
+ success: function (res) {
|
|
|
+ var services = res.services;
|
|
|
+ if (services.length > 0) {
|
|
|
+ for (var i = 0; i < services.length; i++) {
|
|
|
+ if (services[i].uuid === _self.data.service_uuid) {
|
|
|
+ var serviceId = services[i].uuid;
|
|
|
+ wx.getBLEDeviceCharacteristics({
|
|
|
+ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ success: function (res) {
|
|
|
+ var list = res.characteristics;
|
|
|
+ if (list.length > 0) {
|
|
|
+ for (var i = 0; i < list.length; i++) {
|
|
|
+ var uuid = list[i].uuid;
|
|
|
+ if (uuid == _self.data.characteristic_write_uuid) {
|
|
|
+ _self.data.serviceId = serviceId;
|
|
|
+ _self.data.uuid = uuid;
|
|
|
+ wx.notifyBLECharacteristicValueChange({
|
|
|
+ state: true, // 启用 notify 功能
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: list[1].uuid,
|
|
|
+ success: function (res) {
|
|
|
+ let characteristicId = _self.data.characteristic_write_uuid
|
|
|
+ //通知设备交互方式(是否加密) start
|
|
|
+ client = util.blueDH(util.DH_P, util.DH_G, crypto);
|
|
|
+ var kBytes = util.uint8ArrayToArray(client.getPublicKey());
|
|
|
+ var pBytes = util.hexByInt(util.DH_P);
|
|
|
+ var gBytes = util.hexByInt(util.DH_G);
|
|
|
+ var pgkLength = pBytes.length + gBytes.length + kBytes.length + 6;
|
|
|
+ var pgkLen1 = (pgkLength >> 8) & 0xff;
|
|
|
+ var pgkLen2 = pgkLength & 0xff;
|
|
|
+ var data = [];
|
|
|
+ data.push(util.NEG_SET_SEC_TOTAL_LEN);
|
|
|
+ data.push(pgkLen1);
|
|
|
+ data.push(pgkLen2);
|
|
|
+ var frameControl = util.getFrameCTRLValue(false, false, util.DIRECTION_OUTPUT, false, false);
|
|
|
+ var value = util.writeData(util.PACKAGE_VALUE, util.SUBTYPE_NEG, frameControl, sequenceControl, data.length, data);
|
|
|
+ var typedArray = new Uint8Array(value);
|
|
|
+ wx.writeBLECharacteristicValue({
|
|
|
+ deviceId: deviceId,
|
|
|
+ serviceId: serviceId,
|
|
|
+ characteristicId: characteristicId,
|
|
|
+ value: typedArray.buffer,
|
|
|
+ success: function (res) {
|
|
|
+ getSecret(deviceId, serviceId, characteristicId, client, kBytes, pBytes, gBytes, null);
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_INIT_ESP32_RESULT,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ //通知设备交互方式(是否加密) end
|
|
|
+ wx.onBLECharacteristicValueChange(function (res) {
|
|
|
+ let list2 = (util.ab2hex(res.value));
|
|
|
+ // start
|
|
|
+ let result = _self.data.result;
|
|
|
+ if (list2.length < 4) {
|
|
|
+ cosnole.log(407);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ var val = parseInt(list2[0], 16),
|
|
|
+ type = val & 3,
|
|
|
+ subType = val >> 2;
|
|
|
+ var dataLength = parseInt(list2[3], 16);
|
|
|
+ if (dataLength == 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ var fragNum = util.hexToBinArray(list2[1]);
|
|
|
+ list2 = isEncrypt(fragNum, list2, _self.data.md5Key);
|
|
|
+ result = result.concat(list2);
|
|
|
+ _self.data.result = result
|
|
|
+ if (_self.data.flagEnd) {
|
|
|
+ _self.data.flagEnd = false
|
|
|
+ if (type == 1) {
|
|
|
+ let what = [];
|
|
|
+ console.log("recieve data subType: ", subType)
|
|
|
+ switch (subType) {
|
|
|
+ case 15:
|
|
|
+ if (result.length == 3) {
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent({
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CONNECT_ROUTER_RESULT,
|
|
|
+ 'result': false,
|
|
|
+ 'data': {
|
|
|
+ 'progress': 0,
|
|
|
+ 'ssid': what.join('')
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ for (var i = 0; i <= result.length; i++) {
|
|
|
+ var num = parseInt(result[i], 16) + "";
|
|
|
+ if (i > 12) what.push(String.fromCharCode(parseInt(result[i], 16)));
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent({
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CONNECT_ROUTER_RESULT,
|
|
|
+ 'result': true,
|
|
|
+ 'data': {
|
|
|
+ 'progress': 100,
|
|
|
+ 'ssid': what.join('')
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ case 19: //自定义数据
|
|
|
+ let customData = [];
|
|
|
+ for (var i = 0; i <= result.length; i++) {
|
|
|
+ customData.push(String.fromCharCode(parseInt(result[i], 16)));
|
|
|
+ }
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA,
|
|
|
+ 'result': true,
|
|
|
+ 'data': customData.join('')
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+
|
|
|
+ break;
|
|
|
+ case util.SUBTYPE_NEGOTIATION_NEG:
|
|
|
+ var arr = util.hexByInt(result.join(""));
|
|
|
+ var clientSecret = client.computeSecret(new Uint8Array(arr));
|
|
|
+ var md5Key = md5.array(clientSecret);
|
|
|
+ _self.data.md5Key = md5Key;
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent({
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_INIT_ESP32_RESULT,
|
|
|
+ 'result': true,
|
|
|
+ 'data': {
|
|
|
+ deviceId,
|
|
|
+ serviceId,
|
|
|
+ characteristicId
|
|
|
+ }
|
|
|
+ });
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 17:
|
|
|
+ getList(result, result.length, 0);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ console.log(468);
|
|
|
+ //_self.setFailProcess(true, util.descFailList[4])
|
|
|
+ console.log("入网失败 468 :", util.failList[4]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ _self.data.result = []
|
|
|
+ } else {
|
|
|
+ //console.log(472);
|
|
|
+ console.log("入网失败 472:", util.failList[4]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // end
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_INIT_ESP32_RESULT,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_INIT_ESP32_RESULT,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ console.log("fail getBLEDeviceCharacteristics:" + JSON.stringify(res))
|
|
|
+ }
|
|
|
+ })
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ fail: function (res) {
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_INIT_ESP32_RESULT,
|
|
|
+ 'result': false,
|
|
|
+ 'data': res
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ console.log("fail getBLEDeviceServices:" + JSON.stringify(res))
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ mDeviceEvent.listenSendRouterSsidAndPassword(true, function (options) {
|
|
|
+ _self.data.password = options.password
|
|
|
+ _self.data.ssid = options.ssid
|
|
|
+ writeDeviceRouterInfoStart(_self.data.deviceId, _self.data.service_uuid, _self.data.characteristic_write_uuid, null);
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ mDeviceEvent.listenSendCustomData(true, function (options) {
|
|
|
+ _self.data.customData = options.customData
|
|
|
+ writeCutomsData(_self.data.deviceId, _self.data.service_uuid, _self.data.characteristic_write_uuid, null);
|
|
|
+ })
|
|
|
+
|
|
|
+ mDeviceEvent.listenSendGetNearRouterSsid(true, function (options) {
|
|
|
+ writeGetNearRouterSsid(_self.data.deviceId, _self.data.service_uuid, _self.data.characteristic_write_uuid, null);
|
|
|
+ })
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+function getList(arr, totalLength, curLength) {
|
|
|
+ // console.log(totalLength)
|
|
|
+ // console.log(arr)
|
|
|
+ var _self = this;
|
|
|
+ if (arr.length > 0) {
|
|
|
+ var len = parseInt(arr[0], 16);
|
|
|
+ curLength += (1 + len);
|
|
|
+ if (len > 0 && curLength < totalLength) {
|
|
|
+ var rssi = 0, name = "";
|
|
|
+ let list = []
|
|
|
+ for (var i = 1; i <= len; i++) {
|
|
|
+ if (i == 1) {
|
|
|
+ rssi = parseInt(arr[i], 16);
|
|
|
+ } else {
|
|
|
+ list.push(parseInt(arr[i], 16))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ name = decodeURIComponent(escape(String.fromCharCode(...list)))
|
|
|
+ let obj = {
|
|
|
+ 'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CONNECT_NEAR_ROUTER_LISTS,
|
|
|
+ 'result': true,
|
|
|
+ 'data': { "rssi": rssi, "SSID": name }
|
|
|
+ }
|
|
|
+ mDeviceEvent.notifyDeviceMsgEvent(obj);
|
|
|
+ arr = arr.splice(len + 1);
|
|
|
+ getList(arr, totalLength, curLength);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/****************************** 对外 ***************************************/
|
|
|
+module.exports = {
|
|
|
+ init: init,
|
|
|
+};
|