123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- const readServiceID = '0000FFE0-0000-1000-8000-00805F9B34FB';
- const readID = '0000FFE1-0000-1000-8000-00805F9B34FB';
- const writeServiceID = '0000FFE0-0000-1000-8000-00805F9B34FB';
- const writeID = '0000FFE1-0000-1000-8000-00805F9B34FB';
- const readDataMethod = {
- 255: {
- length: 6,
- read: readDataFF
- }
- };
- var readState = {
- value: null,
- index: 0
- };
- function acceptDevice(device) {
- return device.btid ? true : false;
- }
- function isDevice(device, data) {
- const advertisData = new Uint8Array(data.advertisData);
- const mac = device.btid
- .split('')
- .map((p, i) => parseInt(p + device.btid[i + 1], 16))
- .filter((p, i) => i % 2 == 0);
- if (advertisData.slice(2, 4).toString() == [136, 160].toString() && advertisData.slice(4, 10).toString() == mac.toString()) {
- return true;
- }
- return false;
- }
- function readDataFF(value, index, data) {
- switch (index) {
- case 0:
- // B0 - B19
- data.count = value[1];
- if (!data.voltageList) {
- data.voltageList = [];
- }
- for (var i = 0; i < 9; i++) {
- data.voltageList[i] = Math.round(value[(i + 1) * 2] + value[(i + 1) * 2 + 1] * 256) / 1000;
- }
- break;
- case 1:
- // B20 - B39
- if (!data.voltageList) {
- data.voltageList = [];
- }
- for (var i = 9; i < 19; i++) {
- data.voltageList[i] = Math.round(value[(i - 9) * 2] + value[(i - 9) * 2 + 1] * 256) / 1000;
- }
- break;
- case 2:
- // B40 - B59
- if (!data.voltageList) {
- data.voltageList = [];
- }
- for (var i = 19; i < 24; i++) {
- data.voltageList[i] = Math.round(value[(i - 19) * 2] + value[(i - 19) * 2 + 1] * 256) / 1000;
- }
- data.chargeState = value[10] + 1;
- data.current = Math.round(value[11] + value[12] * 256) / 10;
- data.voltage = Math.round(value[13] + value[14] * 256) / 100;
- data.quantity = value[15];
- data.chargeCurrentCountState = (value[18] >> 0) & 1;
- data.dischargeProtectCharacteristic = (value[18] >> 1) & 1;
- data.equilibrium = (value[19] >> 0) & 1;
- data.disconnectState = (value[19] >> 1) & 1;
- data.dischargeProtectState = (value[19] >> 2) & 1;
- data.chargeProtectState = (value[19] >> 3) & 1;
- data.highTempProtectState = (value[19] >> 4) & 3;
- data.lowTempProtectState = (value[19] >> 6) & 1;
- data.highVoltageDifferenceState = (value[19] >> 7) & 1;
- break;
- case 3:
- // B60 - B79
- data.alarmState = [];
- if (((value[0] >> 0) & 1) == 1) {
- data.alarmState.push('低容量报警');
- }
- if (((value[0] >> 1) & 1) == 1) {
- data.alarmState.push('功率板超温报警');
- }
- if (((value[0] >> 2) & 1) == 1) {
- data.alarmState.push('充电过流报警');
- }
- if (((value[0] >> 3) & 1) == 1) {
- data.alarmState.push('放电过流报警');
- }
- data.faultState = [];
- if (((value[0] >> 4) & 1) == 1) {
- data.alarmState.push('充电MOS管故障');
- }
- if (((value[0] >> 5) & 1) == 1) {
- data.alarmState.push('放电MOS管故障');
- }
- data.chargingMOS = (value[0] >> 6) & 1;
- data.dischargeMOS = (value[0] >> 7) & 1;
- data.cycle = value[1] + value[2] * 256;
- data.tempCount = value[10];
- data.powerBoardTemp = value[11] - 40;
- data.equilibriumBoardTemp = value[12] - 40;
- if (!data.tempList) {
- data.tempList = [];
- }
- for (var i = 0; i < 7; i++) {
- data.tempList[i] = value[13 + i] - 40;
- }
- break;
- case 4:
- // B80 - B99
- data.capacity = Math.round(value[0] + value[1] * 256) / 100;
- data.dischargeCapacity = Math.round(value[2] + value[3] * 256 + value[4] * 65536 + value[5] * 16777216) / 100;
- break;
- case 5:
- // B100 - B120
- if (!data.voltageList) {
- data.voltageList = [];
- }
- for (var i = 24; i < 32; i++) {
- data.voltageList[i] = Math.round(value[(i - 24) * 2] + value[(i - 24) * 2 + 1] * 256) / 1000;
- }
- break;
- }
- console.log(data);
- return data;
- }
- function readData(device, value, data) {
- var value = Array.from(new Uint8Array(value));
- console.log(value);
- if (readState.value == null) {
- if (readDataMethod[value[0]]) {
- readState = {
- value: value[0],
- index: 1
- };
- return readDataMethod[value[0]].read(value, 0, data);
- }
- } else {
- const readStateValue = readState.value;
- const readStateIndex = readState.index;
- readState.index++;
- if (readState.index >= readDataMethod[readState.value].length) {
- readState = {
- value: null,
- index: 0
- };
- }
- return readDataMethod[readStateValue].read(value, readStateIndex, data);
- }
- return false;
- }
- function stateUpdate(device, deviceId) {
- var data = [
- [178, 233, 209, 175, 202, 253, 190, 221],
- [187, 241, 200, 161, 197, 228, 214, 195]
- ];
- return data;
- }
- function turnOn(device, deviceId) {
- var data = [
- [195, 220, 194, 235, 209, 233, 214, 164, 163, 186, 2, 0, 0, 4, 1, 3, 237, 167],
- [1, 6, 0, 216, 0, 1, 200, 49]
- ];
- return data;
- }
- function turnOff(device, deviceId) {
- var data = [
- [195, 220, 194, 235, 209, 233, 214, 164, 163, 186, 2, 0, 0, 4, 1, 3, 237, 167],
- [1, 6, 0, 216, 0, 0, 9, 241]
- ];
- return data;
- }
- function bmsInfo(device, deviceId, info) {
- return false;
- }
- function bmsSet(device) {
- return false;
- }
- module.exports = {
- readServiceID: readServiceID,
- readID: readID,
- writeServiceID: writeServiceID,
- writeID: writeID,
- acceptDevice: acceptDevice,
- isDevice: isDevice,
- readData: readData,
- stateUpdate: stateUpdate,
- turnOn: turnOn,
- turnOff: turnOff,
- bmsInfo: bmsInfo,
- bmsSet: bmsSet
- };
|