smartmeter-app/utils/blufi/xBlufi-wx-impl.js
2024-04-27 17:20:50 +08:00

1526 lines
41 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

let tempTimer = 0;
let client = null;
let util = null;
let mDeviceEvent = null;
let crypto = null;
let md5 = null;
let aesjs = null;
const timeOut = 20; //超时时间
let mac_id;
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: "000000FF-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 Utf8ArrayToStr(buffer) {
var out, i, len, c;
var char2, char3;
var array = new Uint8Array(buffer)
// console.log('array',array);
// console.log('array.ArrayBuffer',array.ArrayBuffer);
// console.log('array[[Uint8Array]]',array.ArrayBuffer);
out = "";
len = array.length;
i = 0;
// console.log('len',len);
while (i < len) {
c = array[i++];
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// 0xxxxxxx
out += String.fromCharCode(c);
break;
case 12:
case 13:
// 110x xxxx 10xx xxxx
char2 = array[i++];
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
}
}
// console.log('out',out);
return out;
}
function string2buffer1(str) {
// 首先将字符串转为16进制
let val = ""
for (let i = 0; i < str.length; i++) {
if (val === '') {
val = str.charCodeAt(i).toString(16)
} else {
val += ',' + str.charCodeAt(i).toString(16)
}
}
// 将16进制转化为ArrayBuffer
return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
})).buffer
}
function string2buffer(str) {
var bytes = new Array();
for (var i = 0; i < str.length; i++) {
var c = str.charCodeAt(i);
var s = parseInt(c).toString(2);
if (c >= parseInt('000080', 16) && c <= parseInt('0007FF', 16)) {
var af = '';
for (var j = 0; j < (11 - s.length); j++) {
af += '0';
}
af += s;
var n1 = parseInt('110' + af.substring(0, 5), 2);
var n2 = parseInt('110' + af.substring(5), 2);
if (n1 > 127) n1 -= 256;
if (n2 > 127) n2 -= 256;
bytes.push(n1);
bytes.push(n2);
} else if (c >= parseInt('000800', 16) && c <= parseInt('00FFFF', 16)) {
var af = '';
for (var j = 0; j < (16 - s.length); j++) {
af += '0';
}
af += s;
var n1 = parseInt('1110' + af.substring(0, 4), 2);
var n2 = parseInt('10' + af.substring(4, 10), 2);
var n3 = parseInt('10' + af.substring(10), 2);
if (n1 > 127) n1 -= 256;
if (n2 > 127) n2 -= 256;
if (n3 > 127) n3 -= 256;
bytes.push(n1);
bytes.push(n2);
bytes.push(n3);
} else if (c >= parseInt('010000', 16) && c <= parseInt('10FFFF', 16)) {
var af = '';
for (var j = 0; j < (21 - s.length); j++) {
af += '0';
}
af += s;
var n1 = parseInt('11110' + af.substring(0, 3), 2);
var n2 = parseInt('10' + af.substring(3, 9), 2);
var n3 = parseInt('10' + af.substring(9, 15), 2);
var n4 = parseInt('10' + af.substring(15), 2);
if (n1 > 127) n1 -= 256;
if (n2 > 127) n2 -= 256;
if (n3 > 127) n3 -= 256;
if (n4 > 127) n4 -= 256;
bytes.push(n1);
bytes.push(n2);
bytes.push(n3);
bytes.push(n4);
} else {
bytes.push(c & 0xff);
}
}
let array = [];
for (let i = 0; i < bytes.length; i++) {
array[i] = bytes[i]
}
let array_int8 = Uint8Array.from(array)
return array_int8.buffer;
}
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 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);
uni.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) { }
});
}
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);
console.log('data.ssid', data.ssid)
console.log('data.password', data.password)
var ssid = string2buffer(data.ssid)
var password = string2buffer(data.password)
console.log('ssid', ssid)
console.log('password', password)
uni.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: ssid,
success: function (res) {
uni.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: password,
success: function (res) {
// if (obj.flag) {
// writeDeviceRouterInfoStart(deviceId, serviceId, characteristicId, obj.laveData);
// } else {
// writeRouterSsid(deviceId, serviceId, characteristicId, null);
// }
},
fail: function (res) { }
});
// if (obj.flag) {
// writeDeviceRouterInfoStart(deviceId, serviceId, characteristicId, obj.laveData);
// } else {
// writeRouterSsid(deviceId, serviceId, characteristicId, null);
// }
},
fail: function (res) { }
});
}
// #define CMD_IAP_PROM 0x80 // IAP编程命令
// #define CMD_IAP_ERASE 0x81 // IAP擦除命令
// #define CMD_IAP_VERIFY 0x82 // IAP校验命令
// #define CMD_IAP_END 0x83 // IAP结束标志
// #define CMD_IAP_INFO 0x84 // IAP获取设备信息
// #define CMD_IAP_SUM 0x85 // 校验和
// #define CMD_OTHER 0xee // 校验和
const CMD_IAP_PROM = 0x80;
const CMD_IAP_ERASE = 0x81;
const CMD_IAP_VERIFY = 0x82;
const CMD_IAP_END = 0x83;
const CMD_IAP_INFO = 0x84;
const CMD_IAP_SUM = 0x85;
function write_cmd_erase(deviceId, serviceId, characteristicId, data) {
var value = util.write_ota_erase(CMD_IAP_ERASE, 4, 0, 0);
var typedArray = new Uint8Array(value);
console.log("送擦除数据")
uni.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: typedArray.buffer,
// value: buffer,
success: function (res) {
console.log("送数据成功")
},
fail: function (res) { //console.log(257);
}
});
}
function send_ota_data(deviceId, serviceId, characteristicId, data) {
return new Promise(function (resolve, reject) {
uni.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: data,
// value: buffer,
success: function (res) {
console.log("送数据成功")
let obj = {
'type': mDeviceEvent
.XBLUFI_TYPE
.TYPE_RECIEVE_MY_DATA,
'result': true,
'data': 99
};
mDeviceEvent
.notifyDeviceMsgEvent(
obj
);
resolve(res)
},
fail: function (res) {
console.log("送数据失败")
reject(res)
}
});
});
}
function send_ota_data_num(deviceId, serviceId, characteristicId, data, num) {
return new Promise(function (resolve, reject) {
uni.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: data,
// writeType:'writeNoResponse',
// value: buffer,
success: function (res) {
// console.log("送数据成功")
// let obj = {
// 'type': mDeviceEvent
// .XBLUFI_TYPE
// .TYPE_RECIEVE_MY_DATA,
// 'result': true,
// 'data': num
// };
// mDeviceEvent
// .notifyDeviceMsgEvent(
// obj
// );
resolve(res)
},
fail: function (res) {
console.log("送数据失败")
reject(res)
}
});
});
}
function send_end_data(deviceId, serviceId, characteristicId, data) {
return new Promise(function (resolve, reject) {
uni.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: data,
// value: buffer,
success: function (res) {
console.log("送数据成功")
let obj = {
'type': mDeviceEvent
.XBLUFI_TYPE
.TYPE_RECIEVE_MY_DATA,
'result': true,
'data': 100
};
mDeviceEvent
.notifyDeviceMsgEvent(
obj
);
resolve(res)
},
fail: function (res) {
console.log("送数据失败")
reject(res)
}
});
});
}
function sleep6() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('ok');
}, 6000);
});
}
var StreamBinaryString = function (s) {
this._p = 0;
this._s = this.fromBinaryString(s);
};
StreamBinaryString.prototype = {
constructor: StreamBinaryString,
fromBinaryString(e) {
var t = e || '';
var f = [];
for (var i = 0; i < t.length; i++) {
f[i] = String.fromCharCode(t.charCodeAt(i) & 255);
}
return f.join('');
},
read: function (array, offset, count) {
if (arguments.length == 1) {
var result = this._s.substr(this._p, array);
this._p += array;
return result;
} else {
var result = 0;
for (var i = 0; i < count; i++) {
array[i] = this._s.charCodeAt(this._p);
this._p += 1;
result++;
}
return result;
}
},
readByte: function () {
var result = this._s.charCodeAt(this._p);
this._p += 1;
return result;
},
readInt8: function (signed) {
var result = this._s.charCodeAt(this._p);
if (signed && result > 127) {
result -= 256;
}
this._p += 1;
return result;
},
readInt16: function () {
var result = ((this._s.charCodeAt(this._p) << 8) + this._s.charCodeAt(this._p + 1));
this._p += 2;
return result;
},
readInt32: function () {
var result = ((this._s.charCodeAt(this._p) << 24) + (this._s.charCodeAt(this._p + 1) << 16) + (this._s
.charCodeAt(
this._p + 2) << 8) + this._s.charCodeAt(this._p + 3));
this._p += 4;
return result;
},
eof: function () {
return this._p >= this._s.length;
}
};
function write_cmd_program(deviceId, serviceId, characteristicId, data) {
var address = 0;
var len = 0;
var buf = 0;
var dv = 0;
let result;
console.log("更新122")
const mtu = 212;
uni.setBLEMTU({
deviceId: self
.data
.deviceId,
mtu,
success: (
res
) => {
console
.log(
"setBLEMTU success>>",
res
)
},
fail: (
res
) => {
console
.log(
"setBLEMTU fail>>",
res
)
},
});
var value1 = util.write_ota_erase(CMD_IAP_ERASE, 4, 0, 0);
var typedArray1 = new Uint8Array(value1);
console.log("送擦除数据", result)
send_ota_data(deviceId, serviceId, characteristicId, typedArray1.buffer);
setTimeout(function () {
uni.request({
// url: 'https://www.zenghi.com/gj/地升幕.bin', //仅为示例,并非真实接口地址。
//url: 'https://www.zenghi.com/gj/BLE钉钉.bin', //仅为示例,并非真实接口地址。
// url: 'https://www.zenghi.com/gj/电子秤.bin', //仅为示例,并非真实接口地址。
responseType: 'arraybuffer',
success: (res) => {
dv = new DataView(res.data);
var bufferLength = dv.byteLength;
var sum = 0;
for (var i = 0; i < bufferLength; i++) {
sum += dv.getUint8(i)
}
result = dv
console.log(result);
console.log("content-length", bufferLength);
console.log("sum", sum);
len = bufferLength
var p_data = 0;
var p_ii = 0;
while (address <= len) {
var offst = 176;
if (address + 176 > len) {
offst = len - address;
}
var value = util.write_ota_program(CMD_IAP_PROM, offst, address, result);
var typedArray = new Uint8Array(value);
send_ota_data_num(deviceId, serviceId, characteristicId, typedArray.buffer, (address /
len));
address = address + 176;
}
// return new Promise
var value2 = util.write_ota_sum(CMD_IAP_SUM, bufferLength, sum);
var typedArray2 = new Uint8Array(value2);
console.log("送结束数据", value2)
send_ota_data_num(deviceId, serviceId, characteristicId, typedArray2.buffer, 100);
},
fail: function (res) {
console.log("获取失败");
}
})
}
, "1000");
// var requestTask =
}
function write_cmd_program_zy(deviceId, serviceId, characteristicId, data) {
var address = 0;
var len = 0;
var buf = 0;
var dv = 0;
let result;
console.log("更新122")
const mtu = 212;
uni.setBLEMTU({
deviceId: self
.data
.deviceId,
mtu,
success: (
res
) => {
console
.log(
"setBLEMTU success>>",
res
)
},
fail: (
res
) => {
console
.log(
"setBLEMTU fail>>",
res
)
},
});
var value1 = util.write_ota_erase(CMD_IAP_ERASE, 4, 0, 0);
var typedArray1 = new Uint8Array(value1);
console.log("送擦除数据", result)
send_ota_data(deviceId, serviceId, characteristicId, typedArray1.buffer);
setTimeout(function () {
uni.request({
url: 'https://www.zenghi.com/gj/地升幕.bin', //仅为示例,并非真实接口地址。
//url: 'https://www.zenghi.com/gj/BLE钉钉.bin', //仅为示例,并非真实接口地址。
// url: 'https://www.zenghi.com/gj/电子秤.bin', //仅为示例,并非真实接口地址。
responseType: 'arraybuffer',
success: (res) => {
dv = new DataView(res.data);
var bufferLength = dv.byteLength;
var sum = 0;
for (var i = 0; i < bufferLength; i++) {
sum += dv.getUint8(i)
}
result = dv
console.log(result);
console.log("content-length", bufferLength);
console.log("sum", sum);
len = bufferLength
var p_data = 0;
var p_ii = 0;
while (address <= len) {
var offst = 176;
if (address + 176 > len) {
offst = len - address;
}
var value = util.write_ota_program(CMD_IAP_PROM, offst, address, result);
var typedArray = new Uint8Array(value);
send_ota_data_num(deviceId, serviceId, characteristicId, typedArray.buffer, (address /
len));
address = address + 176;
}
// return new Promise
var value2 = util.write_ota_sum(CMD_IAP_SUM, bufferLength, sum);
var typedArray2 = new Uint8Array(value2);
console.log("送结束数据", value2)
send_ota_data_num(deviceId, serviceId, characteristicId, typedArray2.buffer, 100);
},
fail: function (res) {
console.log("获取失败");
}
})
}
, "1000");
// var requestTask =
}
function write_cmd_program_yk(deviceId, serviceId, characteristicId, data) {
var address = 0;
var len = 0;
var buf = 0;
var dv = 0;
let result;
console.log("更新122")
const mtu = 212;
uni.setBLEMTU({
deviceId: self
.data
.deviceId,
mtu,
success: (
res
) => {
console
.log(
"setBLEMTU success>>",
res
)
},
fail: (
res
) => {
console
.log(
"setBLEMTU fail>>",
res
)
},
});
var value1 = util.write_ota_erase(CMD_IAP_ERASE, 4, 0, 0);
var typedArray1 = new Uint8Array(value1);
console.log("送擦除遥控器数据", result)
send_ota_data(deviceId, serviceId, characteristicId, typedArray1.buffer);
setTimeout(function () {
uni.request({
url: 'https://www.zenghi.com/gj/遥控器.bin', //仅为示例,并非真实接口地址。
//url: 'https://www.zenghi.com/gj/BLE钉钉.bin', //仅为示例,并非真实接口地址。
// url: 'https://www.zenghi.com/gj/电子秤.bin', //仅为示例,并非真实接口地址。
responseType: 'arraybuffer',
success: (res) => {
dv = new DataView(res.data);
var bufferLength = dv.byteLength;
var sum = 0;
for (var i = 0; i < bufferLength; i++) {
sum += dv.getUint8(i)
}
result = dv
console.log(result);
console.log("content-length", bufferLength);
console.log("sum", sum);
len = bufferLength
var p_data = 0;
var p_ii = 0;
while (address <= len) {
var offst = 176;
if (address + 176 > len) {
offst = len - address;
}
var value = util.write_ota_program(CMD_IAP_PROM, offst, address, result);
var typedArray = new Uint8Array(value);
send_ota_data_num(deviceId, serviceId, characteristicId, typedArray.buffer, (address /
len));
address = address + 176;
}
// return new Promise
var value2 = util.write_ota_sum(CMD_IAP_SUM, bufferLength, sum);
var typedArray2 = new Uint8Array(value2);
console.log("送结束数据", value2)
send_ota_data_num(deviceId, serviceId, characteristicId, typedArray2.buffer, 100);
},
fail: function (res) {
console.log("获取失败");
}
})
}
, "1000");
// var requestTask =
}
function write_cmd_program_fg(web, deviceId, serviceId, characteristicId, data) {
var address = 0;
var len = 0;
var buf = 0;
var dv = 0;
let result;
console.log("更新122")
const mtu = 212;
uni.setBLEMTU({
deviceId: self
.data
.deviceId,
mtu,
success: (
res
) => {
console
.log(
"setBLEMTU success>>",
res
)
},
fail: (
res
) => {
console
.log(
"setBLEMTU fail>>",
res
)
},
});
var value1 = util.write_ota_erase(CMD_IAP_ERASE, 4, 0, 0);
var typedArray1 = new Uint8Array(value1);
console.log("翻盖柜", web)
send_ota_data(deviceId, serviceId, characteristicId, typedArray1.buffer);
setTimeout(function () {
uni.request({
url: web, //仅为示例,并非真实接口地址。
//url: 'https://www.zenghi.com/gj/BLE钉钉.bin', //仅为示例,并非真实接口地址。
// url: 'https://www.zenghi.com/gj/电子秤.bin', //仅为示例,并非真实接口地址。
responseType: 'arraybuffer',
success: (res) => {
dv = new DataView(res.data);
var bufferLength = dv.byteLength;
var sum = 0;
for (var i = 0; i < bufferLength; i++) {
sum += dv.getUint8(i)
}
result = dv
console.log(result);
console.log("content-length", bufferLength);
console.log("sum", sum);
len = bufferLength
var p_data = 0;
var p_ii = 0;
while (address <= len) {
var offst = 176;
if (address + 176 > len) {
offst = len - address;
}
var value = util.write_ota_program(CMD_IAP_PROM, offst, address, result);
var typedArray = new Uint8Array(value);
var qq = send_ota_data_num(deviceId, serviceId, characteristicId, typedArray.buffer, (address /
len))
address = address + 176;
console.log("送数据", qq)
}
// return new Promise
var value2 = util.write_ota_sum(CMD_IAP_SUM, bufferLength, sum);
var typedArray2 = new Uint8Array(value2);
console.log("送结束数据", value2)
send_ota_data_num(deviceId, serviceId, characteristicId, typedArray2.buffer, 100);
},
fail: function (res) {
console.log("获取失败");
}
})
}
, "1000");
// var requestTask =
}
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);
console.log("开始送数据")
console.log("deviceId", deviceId)
console.log("serviceId", serviceId)
console.log("characteristicId", characteristicId)
// const buffer = new ArrayBuffer(8);
console.log("data", data)
if (data.indexOf("update") != -1 && data.indexOf("all_update") == -1) {
console.log("送数update据成功")
write_cmd_program(deviceId, serviceId, characteristicId, data)
}
else if (data.indexOf("upzydsm") != -1 ) {
console.log("送数upzydsm据成功")
write_cmd_program_zy(deviceId, serviceId, characteristicId, data)
}
else if (data.indexOf("upykdate") != -1 ) {
console.log("送数upykdate据成功")
write_cmd_program_yk(deviceId, serviceId, characteristicId, data)
}
else if (data.indexOf("fgdate") != -1 ) {
write_cmd_program_fg('https://fg.zenghi.com/gj/翻盖柜.bin',deviceId, serviceId, characteristicId, data)
}
// else if (data.indexOf("ble_go7p") != -1 ) {
// console.log("送数update据成功")
// write_cmd_program7p(deviceId, serviceId, characteristicId, data)
// }
else {
var buffer = string2buffer(data)
uni.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
// value: typedArray.buffer,
value: buffer,
success: function (res) {
console.log("送数据成功")
},
fail: function (res) { //console.log(257);
}
});
}
}
function readCutomsData(deviceId, serviceId, characteristicId) {
console.log("开始送数据")
console.log("deviceId", deviceId)
console.log("serviceId", serviceId)
console.log("characteristicId", characteristicId)
// const buffer = new ArrayBuffer(8);
console.log("buffer", buffer)
var buffer = string2buffer(data)
uni.readBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
// value: typedArray.buffer,
// value: buffer,
success: function (res) {
console.log("读数据成功")
},
fail: function (res) { //console.log(257);
}
});
}
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);
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);
uni.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);
uni.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);
uni.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("./util.js");
crypto = require("./crypto/crypto-dh.js");
md5 = require("./crypto/md5.min.js");
aesjs = require("./crypto/aes.js");
uni.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) {
//第一步检查蓝牙适配器是否可用
uni.onBluetoothAdapterStateChange(function (res) {
if (!res.available) { }
}); //第二步关闭适配器,重新来搜索
uni.closeBluetoothAdapter({
complete: function (res)
{
console.log("这里蓝牙数据")
uni.openBluetoothAdapter({
success: function (res) {
uni.getBluetoothAdapterState({
success: function (res) {
console.log("这里蓝牙数据222")
{
let devicesList = [];
let countsTimes = 0;
uni.onBluetoothDeviceFound(function (devices) {
//剔除重复设备兼容不同设备API的不同返回值
var isnotexist = true;
// console.log('devices',devices);
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) {
// console.log(devices.devices[0])
if (devices.devices[0].name != '开发板'
&& devices.devices[0].name != 'SMART_R2XS'
) {
// console.log("跳过")
isnotexist = false;
}
isnotexist = true;
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);
});
uni.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);
}
});
}
// uni.stopBluetoothDevicesDiscovery({
// success: function (res)
// 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 {
uni.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) uni.createBLEConnection({
deviceId: options.deviceId,
success: function (res) {
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 uni.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: "000000FF-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;
mac_id = options.deviceId;
setTimeout(() => {
uni.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: deviceId,
success: function(res) {
console.log("服务发现456", 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;
uni.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: deviceId,
serviceId: serviceId,
success: function(res) {
var list = res.characteristics;
if (list.length > 0) {
console.log("list@@@@@@@", list)
for (var i = 0; i < list.length; i++) {
var uuid = list[i].uuid;
console.log("uuid", uuid)
if (uuid == self.data.characteristic_write_uuid) {
self.data.serviceId = serviceId;
self.data.uuid = uuid;
console.log("uuid", uuid)
uni.notifyBLECharacteristicValueChange({
state: true,
// 启用 notify 功能
deviceId: deviceId,
serviceId: serviceId,
characteristicId: list[0].uuid,
success: function(res) {
console.log("成功", res)
writeCutomsData(self.data.deviceId, self.data.service_uuid, self.data.characteristic_write_uuid, "get_fw");
setTimeout(() => {
const mtu = 212;
uni.setBLEMTU({
deviceId: self.data.deviceId,
mtu,
success: (
res
) => {
console
.log(
"set1212BLEMTU success>>",
res
)
},
fail: (
res
) => {
},
});
}, 1000);
uni.onBLECharacteristicValueChange(function(res) {
var my_str = Utf8ArrayToStr(res.value)
if(my_str.indexOf("wifi_ok") != -1)
{
console.log("获取到wifiok设备数据OK", my_str);
mDeviceEvent.notifyDeviceMsgEvent({
'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CONNECT_ROUTER_RESULT,
'result': true,
'data': {
'progress': 100,
'ssid': ""
}
});
} else if(my_str.indexOf("wifi_err") != -1) {
console.log("获取到设备数据失败", my_str);
mDeviceEvent.notifyDeviceMsgEvent({
'type': mDeviceEvent.XBLUFI_TYPE.TYPE_CONNECT_ROUTER_RESULT,
'result': false,
'data': {
'progress': 0,
'ssid': ""
}
});
}
else
{
let obj = {
'type': mDeviceEvent.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA,
'result': true,
'data': my_str
};
mDeviceEvent.notifyDeviceMsgEvent(obj);
}
});
},
fail: function(res) {
console.log("监听", res)
uni.onBLECharacteristicValueChange(function(res) {
var my_str = Utf8ArrayToStr(res.value)
{
let obj = {
'type': mDeviceEvent.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA,
'result': true,
'data': my_str
};
mDeviceEvent.notifyDeviceMsgEvent(obj);
}
});
// 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;
}
}
}
else
{
}
},
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));
}
});
},2000);
});
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, self.data);
});
mDeviceEvent.listenSendCustomData(true, function(options) {
self.data.customData = options.customData;
// writeCutomsData(self.data.deviceId, self.data.service_uuid, self.data.characteristic_write_uuid, null);
writeCutomsData(mac_id, self.data.service_uuid, self.data.characteristic_write_uuid, self.data.customData);
});
}
/****************************** 对外 ***************************************/
module.exports = {
init: init
};