import dxMap from '../../dxmodules/dxMap.js'
|
import dxComm from '../../dxmodules/dxCommon.js'
|
import log from '../../dxmodules/dxLogger.js'
|
import api from './api.js'
|
import driver from '../driver.js'
|
import logger from '../../dxmodules/dxLogger.js'
|
import accessService from '../service/accessService.js'
|
|
const uartBleService = {}
|
let map = dxMap.get("subcontracting")
|
uartBleService.receiveMsg = function (hexData) {
|
// 解析头部
|
let totalHex = parseInt(hexData.substring(0, 2), 16)
|
let indexHex = parseInt(hexData.substring(2, 4), 16)
|
let payloadHex = hexData.substring(4)
|
|
if (totalHex == 1) {
|
//就一个包直接处理
|
processPayload(payloadHex)
|
} else {
|
//多个包需要组包
|
if (indexHex == 1) {
|
//第一个包,初始化缓存
|
map.put("subcontracting", payloadHex)
|
} else if (indexHex > 1 && indexHex < totalHex) {
|
//中间包,累积到缓存
|
let cachedPayload = map.get("subcontracting") || ""
|
map.put("subcontracting", cachedPayload + payloadHex)
|
} else if (indexHex == totalHex) {
|
//最后一个包,合并缓存并处理
|
let cachedPayload = map.get("subcontracting") || ""
|
let fullPayload = cachedPayload + payloadHex
|
processPayload(fullPayload)
|
//清除缓存
|
map.del("subcontracting")
|
} else {
|
//包序号异常
|
log.info("分包序号异常: indexHex=" + indexHex + ", totalHex=" + totalHex)
|
map.del("subcontracting")
|
}
|
}
|
}
|
|
// 处理完整payload的函数
|
function processPayload(payloadHex) {
|
// try {
|
let payloadData = JSON.parse(dxComm.utf8HexToStr(payloadHex))
|
logger.info("blePayloadData",JSON.stringify(payloadData))
|
switch (payloadData.cmd) {
|
case "control":
|
control(payloadData.data)
|
break;
|
case "getConfig":
|
getConfig(payloadData.data)
|
break;
|
case "setConfig":
|
setConfig(payloadData.data)
|
break;
|
case "upgradeFirmware":
|
upgradeFirmware(payloadData.data)
|
break;
|
case "access":
|
accessService.access({ type: 600, code: payloadData.data.data, serialNo: payloadData.data.serialNo});
|
break;
|
default:
|
log.info("未定义此接口: " + payloadData.cmd)
|
break;
|
}
|
// } catch (error) {
|
// log.info("解析payload失败: " + error.message)
|
// }
|
}
|
|
function control(data) {
|
let res = api.control(data)
|
if (typeof res == 'string') {
|
//错了
|
driver.uartBle.send("0101" + dxComm.strToUtf8Hex(reply(data.serialNo, res, "100000")))
|
} else {
|
driver.uartBle.send("0101" + dxComm.strToUtf8Hex(reply(data.serialNo, undefined, "000000")))
|
}
|
|
}
|
|
function getConfig(data) {
|
let res = api.getConfig(data)
|
if (typeof res == 'string') {
|
//错了
|
driver.uartBle.send("0101" + dxComm.strToUtf8Hex(reply(data.serialNo, res, "100000")))
|
} else {
|
// 成功时 data 可能很大,需要分包发送,每包<=180字节(360 hex)
|
let payloadHex = dxComm.strToUtf8Hex(reply(data.serialNo, res, "000000"))
|
sendInPackets(payloadHex)
|
}
|
}
|
|
function setConfig(data) {
|
let res = api.setConfig(data.data)
|
if (typeof res == 'string') {
|
//错了
|
driver.uartBle.send("0101" + dxComm.strToUtf8Hex(reply(data.serialNo, res, "100000")))
|
} else {
|
driver.uartBle.send("0101" + dxComm.strToUtf8Hex(reply(data.serialNo, undefined, "000000")))
|
}
|
}
|
|
function upgradeFirmware(data) {
|
let res = api.upgradeFirmware(data.data)
|
if (typeof res == 'string') {
|
//错了
|
driver.uartBle.send("0101" + dxComm.strToUtf8Hex(reply(data.serialNo, res, "100000")))
|
} else {
|
driver.uartBle.send("0101" + dxComm.strToUtf8Hex(reply(data.serialNo, undefined, "000000")))
|
}
|
}
|
|
|
// 回复格式构建
|
function reply(serialNo, data, code) {
|
return JSON.stringify({
|
serialNo: serialNo,
|
code: code,
|
data: data,
|
time: Math.floor(Date.parse(new Date()) / 1000)
|
})
|
}
|
|
// 按 180 字节(360 hex)拆分发送
|
function sendInPackets(payloadHex) {
|
if (!payloadHex) return
|
const MAX_HEX_PER_PACKET = 360
|
const total = Math.max(1, Math.ceil(payloadHex.length / MAX_HEX_PER_PACKET))
|
for (let i = 0; i < total; i++) {
|
const start = i * MAX_HEX_PER_PACKET
|
const end = start + MAX_HEX_PER_PACKET
|
const chunk = payloadHex.substring(start, end)
|
const totalHex = total.toString(16).padStart(2, '0')
|
const indexHex = (i + 1).toString(16).padStart(2, '0')
|
driver.uartBle.send(totalHex + indexHex + chunk)
|
}
|
}
|
export default uartBleService
|