123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- const common = require('../common.js');
- const FMBMS = require('./FMBMS.js');
- const readServiceID = '0000FEE7-0000-1000-8000-00805F9B34FB';
- const readID = '000036F6-0000-1000-8000-00805F9B34FB';
- const writeServiceID = '0000FEE7-0000-1000-8000-00805F9B34FB';
- const writeID = '000036F5-0000-1000-8000-00805F9B34FB';
- const MTU = 115;
- const app = getApp();
- let subIndex = -1
- let commands = [];
- let currentCommandIndex = 1;
- function acceptDevice(device) {
- return device.btid ? true : false;
- }
- function isSingleBt() {
- console.log('是单蓝牙');
- return true;
- }
- function haveBms() {
- console.log('是单蓝牙并且带bms');
- return true;
- }
- 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);
-
-
-
-
- const result = data.name.startsWith("ZX");
-
-
- if (result) {
- return true
- }
- return false;
- }
- function alterConnect(device, deviceId) {
-
-
-
-
-
-
-
- let data=[ 0x1F, 0x0F]
- const device_name=app.globalData.connectionState[deviceId].deviceName
- const device_sn=stringToHexArray(device_name)
- data.push(...device_sn)
- data.push(0x08, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x67, 0xAC, 0x53, 0xE7, 0x08, 0x00)
-
-
- const crc_data = '0x'+crc8IEEE8023(data).toString(16).toUpperCase()
- data.push(crc_data,0xAA,0xAA)
- data.unshift(0x22,0x22,0x01)
-
- return [data]
- }
- function crc8IEEE8023(data) {
- const poly = 0x07;
- let crc = 0x00;
- for (let i = 0; i < data.length; i++) {
- crc ^= data[i];
- for (let j = 0; j < 8; j++) {
- if (crc & 0x80) {
- crc = ((crc << 1) ^ poly) & 0xFF;
- } else {
- crc = (crc << 1) & 0xFF;
- }
- }
- }
- return crc;
- }
- function stringToHexArray(str) {
- const result = [];
- for (let i = 0; i < str.length; i++) {
- const charCode = str.charCodeAt(i);
- const hexValue=`0x${charCode.toString(16).toUpperCase()}`
- const hexDataValue=parseInt(hexValue,16)
- result.push(hexDataValue);
- }
- return result;
- }
- function readData(device, value, data) {
-
- var test = new Uint8Array(value);
- const normalArray = Array.from(test);
-
-
- if((normalArray[0]==0x00) && (normalArray[1]==0x01) && normalArray.length==2){
- switch (normalArray[1]) {
- case 0x01:
- uni.showModal({
- title: '提示',
- confirmText: '开始升级',
- content: '登陆成功,当前处于升级模式是否开始升级',
- success: function(res) {
- if (res.confirm) {
- currentCommandIndex=0
- otaUpgrade().then(()=>{
-
- sendNextCommand(device.mac_id)
- })
- } else {}
- }
- });
- break;
- }
- }
- switch(normalArray[3]){
- case 0x00:
- sendNextCommand(device.mac_id)
- break;
-
-
- case 0x01:
- uni.hideLoading();
- console.log(normalArray,commands.length,currentCommandIndex-1,commands[currentCommandIndex-3],commands[currentCommandIndex-2],commands[currentCommandIndex-1], 'value**************************');
- common.simpleToast('升级文件回复失败', 2000)
-
- break;
- }
-
-
-
- return data;
- }
- function sendCommand(cmd, data = []) {
- let cmdData = [0x22, 0x22]
-
-
-
- const dataLen=parseInt(data.length.toString(16).toUpperCase(), 16)
-
-
- const pData=[dataLen,cmd]
- const crcData='0x'+crc8IEEE8023(pData).toString(16).toUpperCase()
- cmdData.push(cmd,dataLen,cmd,crcData,0xAA, 0xAA)
-
- return cmdData
- }
- function turnOnCar(device, deviceId) {
- return [sendCommand(0x02,[0x02])];
- }
- function turnOffCar(device, deviceId) {
- return [sendCommand(0x03,[0x03])];
- }
- function findCarCmd(device, deviceId) {
- return [sendCommand(0x06,[0x06])];
- }
- function openCarSeat(device, deviceId) {
- return [sendCommand(0x07,[0x07])];
- }
- function openCarTrunk(device, deviceId) {
- return [sendCommand(0x08,[0x08])];
- }
- function getCarPressure(device, deviceId) {
- return [sendCommand(0x4A,[0x4A])];
- }
- function switchFactory(device, deviceId) {
-
-
-
- return [[0x22,0x22,0x54,0x01,0x01,0x12,0xAA,0xAA]]
-
- }
- function otaUpgrade(device){
-
- const data = readBinBinarayToCommand()
- data.then(result=>{commands=result})
-
-
- return data
- }
- async function readBinBinarayToCommand() {
- let res =await uni.request({
- url: 'https://opt.bms16.com/ota.BIN',
- method: 'GET',
- responseType: 'arraybuffer',
- });
- const arrayBuffer=res[1].data
- const uint8Array = new Uint8Array(arrayBuffer);
- const test = splitArrayIntoChunks(uint8Array, 80);
- const data =makeArr(test)
- return data
- }
- function sendNextCommand(mac_id) {
- console.log('开始发送指令');
-
- if (currentCommandIndex >= commands.length-1) {
- uni.hideLoading();
- common.simpleToast('所有指令发送完成', 2000)
- return;
- }
- const deviceId = Object.keys(app.globalData.connectionState).find((i) => app.globalData.connectionState[i].device.mac_id == mac_id);
- if (deviceId == undefined) {
- console.log('deviceId == undefined');
- return ;
- }
- const command = [commands[currentCommandIndex]];
- if(command.length==0){
- return
- }
-
- var buffer;
- buffer = common.toArrayBuffer(command.shift());
-
- uni.writeBLECharacteristicValue({
- deviceId: deviceId,
- serviceId: writeServiceID,
- characteristicId: writeID,
- value: buffer,
- success() {
-
- },
- fail(err) {
- console.error('指令发送失败', err);
- }
- });
- currentCommandIndex++;
- }
- function splitArrayIntoChunks(array, chunkSize) {
- const numChunks = Math.ceil(array.length / chunkSize);
- return Array.from({ length: numChunks }, (_, i) => {
- return array.slice(i * chunkSize, (i + 1) * chunkSize);
- });
- }
- function makeArr(array) {
- const result = [];
- let endPackage;
- for (let i = 0; i < array.length; i ++) {
- endPackage = 0x00
- if((i + 1) >= array.length){
-
- endPackage = 0x01
- }
-
-
- let startArray = []
- const packageLen=parseInt((array[i].length+8).toString(16).toUpperCase(), 16)
-
-
- const totalPackageSize=[0x00,0x00,0x01,0xeb,0xfc]
- startArray.push(packageLen,...totalPackageSize)
-
- const ids=splitNumber(i)
- startArray.push(...ids)
-
- startArray.push(endPackage)
-
- const formattedChunk = array[i].map(byte => `0x${byte.toString(16).toUpperCase()}`);
- startArray.push(...formattedChunk)
-
-
-
-
- const crcStr='0x'+crc8IEEE8023(startArray).toString(16).toUpperCase()
- const testCrc=parseInt(crcStr,16)
-
- startArray.push(crcStr)
- startArray.push(0xAA,0xAA)
- startArray.unshift(0x22,0x22,0x30)
- result.push(startArray);
- }
-
- return result;
- }
- function splitNumber(num) {
- let highByte = (num >> 8) & 0xFF;
-
- let lowByte = num & 0xFF;
-
-
- let highHex = highByte.toString(16).toUpperCase().padStart(2, '0');
- let lowHex = lowByte.toString(16).toUpperCase().padStart(2, '0');
-
-
- return ['0x' + highHex, '0x' + lowHex];
- }
- module.exports = {
- readServiceID: readServiceID,
- readID: readID,
- writeServiceID: writeServiceID,
- writeID: writeID,
- MTU: MTU,
- acceptDevice: acceptDevice,
- isDevice: isDevice,
- alterConnect: alterConnect,
- readData: readData,
- turnOffCar: turnOffCar,
- isSingleBt: isSingleBt,
- haveBms: haveBms,
- switchFactory: switchFactory,
- otaUpgrade,
- findCarCmd,
- turnOffCar,
- turnOnCar,
- getCarPressure
- };
|