跳到主要内容
版本:4.0
// 从内置的 helper.mjs 模块引入 AckInfo, TermCmd 结构
import {AckInfo, TermCmd} from './helper.mjs'

/**
* 企业侧的指令结构
*/
class EyeCommand {
/**
* @type {string}
*/
cmdId;

/**
* @type {string}
*/
terminal;

/**
* @type {number}
*/
recvTime;

/**
* @type {number}
*/
realTime;

/**
* @type {number}
*/
cacheTime;

/**
* @type {Object}
*/
paras;

set(k, v) {
if (!this.paras) {
this.paras = {};
}

this.paras[k] = v;
}

setTime(k, epochMillis) {
this.set(k, utils.millisToStr(epochMillis));
}

setTimeOpt(k, epochMillis) {
if (epochMillis)
this.setTime(k, epochMillis);
}

getDef(k, defaultValue) {
if (!this.paras)
return defaultValue;

const r = this.paras.get(k);
if (r === undefined)
return defaultValue;

return r;
}
}

/**
* 企业侧的网关报文结构
*/
class EyeGatewayMsg {
/**
* @type {string}
*/
key;

/**
* @type {number}
*/
seq;

/**
* @type {string}
*/
cmdUuid;

/**
* @type {string}
*/
sessionId;

/**
* @type {string}
*/
source;

/**
* @type {string}
*/
recvTime;

/**
* @type {string}
*/
cmdId;

/**
* @type {number | undefined}
*/
error;

/**
* @type {EyeCommand}
*/
command;

/**
* @type {Map<string, Map<string, string>>}
*/
paramGroup;
}

/**
*
* @param {EyeGatewayMsg} msg
* @return {Map<string, string> | undefined}
*/
function paramGroup00(msg) {
if (!msg.paramGroup)
return undefined;

if (typeof msg.paramGroup.get === 'function')
return msg.paramGroup.get('00');
else if (msg.paramGroup.hasOwnProperty('00'))
return msg.paramGroup['00'];
else
return undefined;
}

/**
*
* @param {EyeGatewayMsg} msg
* @param {string} propName
*/
function paramGroup00Prop(msg, propName) {
if (!msg.paramGroup)
return undefined;

let map = msg.paramGroup['00'];
if (!map)
return undefined;

return map[propName];
}

/*
Provided functions:

function strToMillis(s: string): number
function millisToStr(millis: number): string
function hexToGbk(s: string): string
*/

/**
*
* @param {EyeGatewayMsg} ackMsg
* @param {AckInfo} r
*/
function getGeneralAckInfo(ackMsg, r) {
r.ackMsgId = ackMsg.command.cmdId.substring(2);
r.ackSeqNo = ackMsg.seq;
if (ackMsg.error) {
let params = paramGroup00(ackMsg);
if (params) {
let codeStr;
if (typeof params.get === 'function') {
codeStr = params.get("F0010000");
} else if (params.hasOwnProperty('F0010000')) {
codeStr = params['F0010000'];
} else
codeStr = null;

if (codeStr !== null && codeStr !== undefined) {
r.ackCode = parseInt(codeStr);
}
}
} else
r.ackCode = 0;

return r.ackMsgId;
}

/**
* 从消息中取出对象
*
* @param {string} strMsg 字符串消息
* @return {AckInfo | undefined}
*/
export function getAckInfo(strMsg) {
let ackMsgId;
let ackParams;
let params;

/**
* @type {EyeGatewayMsg}
*/
const ackMsg = JSON.parse(strMsg);

// console.debug('parsed :' + JSON.stringify(ackMsg));
if (!ackMsg.command || !ackMsg.command.cmdId)
return undefined;

const r = new AckInfo();
r.simNo = ackMsg.key;
r.origCmdId = ackMsg.cmdUuid;

switch (ackMsg.command.cmdId) {
case "169205": // 查询远程录像目录应答
let ack = paramGroup00Prop(ackMsg, '060D1023');
// console.log(`060D1023=${ack}`);
if (ack) {
ackMsgId = "1205";
let ap = {};
let list = [];
const resList = ack.split(";");
resList.forEach(res => {
const items = res.split(",");
// console.log(`items.length=${items.length}`);
if (items && items.length >= 10) {
const avRes = {};
avRes.chan = parseInt(items[1]);
avRes.startTm = utils.strToMillis(items[2]);
avRes.endTm = utils.strToMillis(items[3]);
avRes.almSt808 = parseInt(items[4]);
avRes.almSt1078 = parseInt(items[5]);
avRes.mediaTyp = parseInt(items[6]);
avRes.codeStrm = parseInt(items[7]);
avRes.stgTyp = parseInt(items[8]);
avRes.fileSz = parseInt(items[9]);

list.push(avRes);
}
});
// console.log(JSON.stringify(list));
ap.resList = list;

ackParams = ap;
}
break;

case "168107": // 查询终端属性应答
ackMsgId = "0107";
params = paramGroup00(ackMsg);
if (params) {
let ap = {};
let s = params.get("00000001");
ap.terminalType = parseInt(s, 16);
ap.factoryId = utils.hexToGbk(params.get("00010004"));
ap.modal = utils.hexToGbk(params.get("00010003"));
ap.terminalId = utils.hexToGbk(params.get("00010001"));
ap.iccid = params.get("00000005");
ap.hardwareVer = params.get("00010101");
ap.firmwareVer = params.get("00010103");
ap.gnssModuleAttrs = parseInt(params.get("00000008"), 16)
ap.commModuleAttrs = parseInt(params.get("00000009"), 16)

ackParams = ap;
}
break;

case "169003": // 查询终端音视频属性应答
ackMsgId = "1003";
params = paramGroup00(ackMsg);
if (params) {
let ap = {};
ap.audioCodec = parseInt(params.get("00020004"));
ap.audioChannels = parseInt(params.get("00020005"));
ap.audioSampleRate = parseInt(params.get("00020006"));
ap.audioBitsPerSample = parseInt(params.get("00020007"));
ap.audioFrameSize = parseInt(params.get("00020008"));
ap.supportAudioOut = parseInt(params.get("00020009")) !== 0;
ap.videoCodec = parseInt(params.get("00020010"))
ap.maxAudioChannels = parseInt(params.get("00020011"));
ap.maxVideoChannels = parseInt(params.get("00020012"));

ackParams = ap;
}
break;

case "169206": // 远程录像上传应答,通用应答
ackMsgId = getGeneralAckInfo(ackMsg, r);
break;

case "169101": // 实时播放应答,通用应答
ackMsgId = getGeneralAckInfo(ackMsg, r);
break;

case "169201": // 回放应答,通用应答
ackMsgId = getGeneralAckInfo(ackMsg, r);
break;

case "169208": // 报警附件上传指令 应答
ackMsgId = getGeneralAckInfo(ackMsg, r);
break;
}
r.ackMsgId = ackMsgId;
r.ackParams = ackParams ? JSON.stringify(ackParams) : undefined;

return r;
}

/**
* 将 TermCmd 模型的指令转换成 JSON 字符串消息(后面投递到消息队列)
*
* @param {TermCmd} cmd 指令
* @return {String | undefined} JSON 字符串消息
*/
export function convertTermCmd(cmd) {
utils.log(cmd);

const r = new EyeGatewayMsg();
r.key = cmd.getSimNo();
r.cmdUuid = cmd.getExternalId();
r.source = "media";
const time = new Date();
r.recvTime = utils.millisToOdtStr(time.getTime());

const c = new EyeCommand();
c.realTime = 1;

const cp = cmd.getParams();

// console.log(cp);
// console.log(JSON.stringify(r));
// console.log("msgId=" + cmd.getMsgId());

switch (cmd.getMsgId()) {
case "8107":
c.cmdId = "13FF02";
break;

case "9003":
c.cmdId = "13FF04";
break;

case "9101":
c.cmdId = "169101";
c.set("060D1001", cp.getServerIp());
c.set("060D1002", cp.getTcpPort());
c.set("060D1003", cp.getUdpPort());
c.set("060D1004", cp.getChan());
c.set("060D1005", cp.getDataTyp() ? cp.getDataTyp() : 0);
c.set("060D1006", cp.getCodeStrm() ? cp.getCodeStrm() : 0);
utils.log(JSON.stringify(c));
break;

case "9102":
c.cmdId = "169102";
c.set("060D1004", cp.getChan());
c.set("06091001", cp.getCtrl());
c.set("06091002", cp.getCloseAction() ? cp.getCloseAction() : 0);
c.set("060D1006", cp.getCodeStrm() ? cp.getCodeStrm() : 0);
break;

case "9105":
c.cmdId = "169105";
c.set("060D1004", cp.getChan());
c.set("06091003", cp.getLostRate());
break;

case "9201":
c.cmdId = "169201";
c.set("060D1001", cp.getServerIp());
c.set("060D1002", cp.getTcpPort());
c.set("060D1003", cp.getUdpPort());
c.set("060D1004", cp.getChan());
c.set("060D1005", cp.getMediaTyp());
c.set("060D1006", cp.getCodeStrm());
c.set("06091005", cp.getStgTyp());
c.set("060D1008", cp.getMode());
c.set("060D1009", cp.getFactor() ? cp.getFactor() : 0);
c.setTime("05010001", cp.getStartTm());
c.setTimeOpt("05010002", cp.getEndTm());
break;

case "9202":
c.cmdId = "169202";
c.set("060D1004", cp.getChan());
c.set("060D1008", cp.getCtrl());
c.set("060D1009", cp.getFactor() ? cp.getFactor() : 0);
if (cp.tm)
c.setTime("05010001", cp.getTm());
break;

case "9205":
c.cmdId = "169205";
c.set("060D1004", cp.getChan());
c.setTimeOpt("05010001", cp.getStartTm());
c.setTimeOpt("05010002", cp.getEndTm());
c.set("06091004", cp.getAlmFilter808() + ',' + cp.getAlmFilter1078());
c.set("060D1005", cp.getMediaTyp());
c.set("060D1006", cp.getCodeStrm());
c.set("06091005", cp.getStgTyp());
utils.log(JSON.stringify(c));
break;

case "9206":
c.cmdId = "169206";
c.set("060D100C", cp.getFtpHost());
c.set("060D100D", cp.getFtpPort());
c.set("060D100E", cp.getFtpUser());
c.set("060D100F", cp.getFtpPwd());
c.set("060D1010", cp.getUploadPath());
c.set("060D1004", cp.getChan());
c.setTime("05010001", cp.getStartTm());
c.setTime("05010002", cp.getEndTm());
let f = cp.getAlmFilter1078();
f <<= 32;
f |= cp.getAlmFilter808();
c.set("06091004", f);
c.set("060D1005", cp.getMediaTyp());
c.set("060D1006", cp.getCodeStrm());
c.set("06091005", cp.getStgTyp());
c.set("06091006", cp.getWhen());
break;

case "9207":
c.cmdId = "169207";
c.set("0008000F", cp.getOrigSeqNo());
c.set("06091001", cp.getCtrl());
break;

case "9208":
c.cmdId = "169208";
c.set("060D1001", cp.getServerIp());
c.set("0101010C", cp.getTcpPort());
c.set("0101010D", cp.getUdpPort());
c.set("060D1017", cp.getAlmNo());
c.set("060D1018", cp.getAlmId());
break;

default:
return undefined;
}

r.cmdId = c.cmdId;
r.command = c;
return JSON.stringify(r);
}