console
var code = '5b0f05010b3134303631333238363232180c1e103a2204cffbcfa2ecd6f7b7fecef1c6f73a3131322e39302e3138332e31343bd6f7b6cbbfda3a383031303bceb4b5c7c2bcbbe3b1a8bce4b8f43a3130c3eb3bd0ddc3dfbbe3b1a8bce4b8f43a313230c3eb3bc8b1caa1bbe3b1a8bce4b8f43a3330c3eb3bcfdecbd93a3130303bb3accbd9b3d6d0f8cfded6c63a3130c3eb3bc6a3c0cdc3c5cfde3a3134343030c3eb3bb5b1ccecc6a3c0cdc3c5cfde3a3836343030c3eb3bd7eed0a1d0ddcfa23a31323030c3eb3bb3accbd9d4a4beafb2eed6b53a31304b4d2f483bc6a3c0cdd4a4beafb2eed6b53a31383030c3eb3bc0efb3ccb1ed3a32343833342e336b6d3bb1b1b6b73a32065d'
code = code.replace(/\s*/g,"")
//console.log(code)
var index = 0
document.getElementById("show").innerHTML = getFormatCode()
function getFormatCode() {
let orderNo = code.substring(2,4)
if(orderNo == '0f') {
return get0xFFormatCode()
}else if(orderNo == '8009') {
return getSendEx1FormatCode()
}
}
function get0xFFormatCode() {
var formatCode = getCodeStr(2)
formatCode += '<br /><span class="m1"></span>' + getCodeStr(2)
formatCode += '<br /><span class="m1"></span>' + getCodeStr(4)
formatCode += '<br /><span class="m1"></span>' + getCodeStr(2)
var sn = getCodeStr(22)
formatCode += '<br /><span class="m2"></span>' + sn + '<span class="annotation">//主机号 ' + hexCharCodeToStr(sn) + '</span>'
formatCode += '<br /><span class="m2"></span>' + getCodeStr(2)
formatCode += '<br /><span class="m2"></span>' + getCodeStr(2)
formatCode += '<br /><span class="m2"></span>' + getCodeStr(2)
formatCode += '<br /><span class="m2"></span>' + getCodeStr(2)
formatCode += '<br /><span class="m2"></span>' + getCodeStr(2)
formatCode += '<br /><span class="m2"></span>' + getCodeStr(2)
var alarmTypeDescLen = getCodeStr(2)
formatCode += '<br /><span class="m2"></span>' + alarmTypeDescLen + '<span class="annotation">//报警类型描述长度 ' + parseInt(alarmTypeDescLen, 16) + '</span>'
var alarmTypeDesc = getCodeStr(parseInt(alarmTypeDescLen, 16) * 2)
formatCode += '<br /><span class="m2"></span>' + alarmTypeDesc + '<span class="annotation">//报警类型描述 ' + hexCharCodeToStr(alarmTypeDesc) + '</span>'
var alarmDescLen = getCodeStr(2)
formatCode += '<br /><span class="m2"></span>' + alarmDescLen + '<span class="annotation">//报警描述长度 ' + parseInt(alarmDescLen, 16) + '</span>'
var alarmDesc = getCodeStr(parseInt(alarmDescLen, 16) * 2)
formatCode += '<br /><span class="m2"></span>' + alarmDesc + '<span class="annotation">//报警描述</span>'
formatCode += '<br /><span class="m2"></span>' + getCodeStr(2) + '<span class="annotation">//报警类型 Message 0x06 消息</span>'
formatCode += '<br /><span></span>' + getCodeStr(2)
return formatCode
}
function getEx1FormatCode() {
var formatCode = getCodeStr(2)
formatCode += '<br /><span class="m1"></span>' + getCodeStr(4)
formatCode += '<br /><span class="m1"></span>' + getCodeStr(4)
formatCode += '<br /><span class="m1"></span>' + getCodeStr(2)
var sn = getCodeStr(16)
formatCode += '<br /><span class="m1"></span>' + sn + '<span class="annotation">//SN ' + parseInt(sn, 16) + '</span>'
var model = getCodeStr(16)
formatCode += '<br /><span class="m1"></span>' + model
formatCode += '<br /><span class="m1"></span>' + getCodeStr(4)
formatCode += '<br /><span class="m1"></span>' + getCodeStr(4)
formatCode += '<br /><span class="m2"></span>' + getCodeStr(2) + '<span class="annotation">//接口类型 1:UART</span>'
var length = getCodeStr(4)
formatCode += '<br /><span class="m2"></span>' + length + '<span class="annotation">//长度 ' + parseInt(length, 16) + '</span>'
var operateCode = getCodeStr(2)
if(operateCode == 1) {
formatCode += '<br /><span class="m3"></span>' + operateCode + '<span class="annotation">//操作码</span>'
var alarmCode = getCodeStr(2)
formatCode += '<br /><span class="m3"></span>' + alarmCode + '<span class="annotation">//报警标志位 ' + getAlarmStr(alarmCode) + '</span>'
let colorStr = getCodeStr(4)
formatCode += '<br /><span class="m3"></span>' + colorStr + '<span class="annotation">//颜色状态 ' + parseInt(colorStr, 16).toString(2) + '</span>'
let lightStr = getCodeStr(4)
formatCode += '<br /><span class="m3"></span>' + lightStr + '<span class="annotation">//闪烁状态 ' + parseInt(lightStr, 16).toString(2) + '</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(12) + '<span class="annotation">//YY-MM-DD-hh-mm-ss</span>'
var electricQuantity = getCodeStr(2)
formatCode += '<br /><span class="m3"></span>' + electricQuantity + '<span class="annotation">//电池余量 ' + parseInt(electricQuantity, 16) + '%</span>'
var flowCountHex = getCodeStr(8)
var flowCountInt = parseInt(flowCountHex, 16)
var reviseFlowCount = 0
if(model == '0000000000000002') {
reviseFlowCount = Math.round(Math.trunc(flowCountInt / 30) * 5)
console.log(reviseFlowCount)
reviseFlowCount += Math.round((flowCountInt % 30 / 5.8))
console.log(reviseFlowCount)
}else {
if(flowCountInt > 32) {
reviseFlowCount = Math.trunc(flowCountInt / 1.1666)
}else {
reviseFlowCount = Math.trunc(flowCountInt - (flowCountInt / 6))
}
}
formatCode += '<br /><span class="m3"></span>' + flowCountHex + '<span class="annotation">//水流传感(报' + flowCountInt + '升,校正' + reviseFlowCount + '升)</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(2) + '<span class="annotation">//电磁阀 0:关闭 1:打开</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(2) + '<span class="annotation">//信道误码率</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(2) + '<span class="annotation">//信号强度指示</span>'
}else if(operateCode == 2) {
//复位
formatCode += '<br /><span class="m3"></span>' + getCodeStr(4) + '<span class="annotation">//滤芯复位状态</span>'
}else if(operateCode == 4) {
//上报单次流量值
formatCode += '<br /><span class="m3"></span>' + operateCode + '<span class="annotation">//操作码:上报单次流量值</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(8) + '<span class="annotation">//水流检测脉冲数</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(8) + '<span class="annotation">//持续时间,单位秒</span>'
}else if(operateCode == 6) {
formatCode += '<br /><span class="m3"></span>' + operateCode + '<span class="annotation">//操作码</span>'
var alarmCode = getCodeStr(2)
formatCode += '<br /><span class="m3"></span>' + alarmCode + '<span class="annotation">//报警标志位 ' + getAlarmStr(alarmCode) + '</span>'
let colorStr = getCodeStr(8)
formatCode += '<br /><span class="m3"></span>' + colorStr + '<span class="annotation">//颜色状态 ' + parseInt(colorStr, 16).toString(2) + '</span>'
let lightStr = getCodeStr(8)
formatCode += '<br /><span class="m3"></span>' + lightStr + '<span class="annotation">//闪烁状态 ' + parseInt(lightStr, 16).toString(2) + '</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(8) + '<span class="annotation">//呼吸灯状态</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(12) + '<span class="annotation">//YY-MM-DD-hh-mm-ss</span>'
var electricQuantity = getCodeStr(2)
formatCode += '<br /><span class="m3"></span>' + electricQuantity + '<span class="annotation">//电池余量' + parseInt(electricQuantity, 16) + '%</span>'
var flowCountHex = getCodeStr(8)
var flowCountInt = parseInt(flowCountHex, 16)
var reviseFlowCount = 0;
if(flowCountInt > 32) {
reviseFlowCount = Math.trunc(flowCountInt / 1.1666)
}else {
reviseFlowCount = Math.trunc(flowCountInt - (flowCountInt / 6))
}
formatCode += '<br /><span class="m3"></span>' + flowCountHex + '<span class="annotation">//水流传感(报' + flowCountInt + '升,校正' + reviseFlowCount + '升)</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(2) + '<span class="annotation">//电磁阀 0:关闭 1:打开</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(2) + '<span class="annotation">//信道误码率</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(2) + '<span class="annotation">//信号强度指示</span>'
//扩展字段
var extCount = getCodeStr(4)
formatCode += '<br /><span class="m3"></span>' + extCount + '<span class="annotation">//扩展信息数量</span>'
for(var i = 0; i < extCount; i++) {
var extLength = 0
if(i == 0) {
extLength = 10
}else if(i == 1) {
extLength = 16
}else if(i == 2) {
extLength = 24
}else if(i == 3) {
extLength = 48
}else if(i == 4) {
extLength = 16
}else if(i == 5) {
extLength = 12
}
var extStr = getCodeStr(extLength)
var extContentLength = parseInt(extStr.substring(4,8), 16) * 2
var extContent = extStr.substr(-extContentLength)
console.log(extContent)
var remarkStr = ''
if(i == 0) {
remarkStr = parseInt(extContent, 16) + ' 用水时状态:0:正常 不响(1:logo5秒+闪红 2:logo5秒+长红)3:只响 响(4:logo5秒+闪红 5:logo5秒+长红)'
}else if(i == 1) {
remarkStr = parseInt(extContent, 16) + ' 超长用水报警阀值(单位:秒)';
}else if(i == 2) {
var flowStr = extStr.substring(8,32)
remarkStr = parseInt(extContent, 16) + ' 设备累积水流脉冲量 ' + parseInt(flowStr, 16) / 1515 + '升'
}else if(i == 3) {
remarkStr = parseInt(extContent, 16) + ' SIM卡ICCID'
}else if(i == 4) {
remarkStr = parseInt(extContent, 16) + ' TDS值'
}else if(i == 5) {
remarkStr = parseInt(extContent, 16) + ' 水压传感ADC值'
}
formatCode += '<br /><span class="m3"></span>' + extStr + '<span class="annotation">//' + remarkStr + '</span>'
}
}
formatCode += '<br /><span class="m1"></span>' + getCodeStr(4)
formatCode += '<br /><span></span>' + getCodeStr(2)
return formatCode
}
function getCodeStr(i) {
var codeStr = code.substr(index, i)
index += i
return codeStr
}
function getAlarmStr(code) {
var alarmStr = ''
var alarmCode = parseInt(code, 16).toString(2).padStart(8, '0')
alarmStr += alarmCode + ' : '
var isAlarm = false
var alarmReverseArr = alarmCode.split('').reverse()
for(i = 0; i < alarmReverseArr.length; i++) {
if(alarmReverseArr[i] == 1) {
isAlarm = true
switch(i) {
case 0:
alarmStr += '漏水报警 '
break;
case 1:
alarmStr += '低电报警 '
break;
case 2:
alarmStr += '打开电磁阀 '
break;
case 3:
alarmStr += '一键报障'
break;
}
}
}
if(!isAlarm) {
alarmStr += '无报警'
}
return alarmStr
}
//ASCII码转16进制
function strToHexCharCode(str) {
if (str === "") {
return "";
} else {
var hexCharCode = [];
hexCharCode.push("0x");
for (var i = 0; i < str.length; i++) {
hexCharCode.push((str.charCodeAt(i)).toString(16));
}
return hexCharCode.join("");
}
}
//十六进制转ASCII码
function hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStr.trim();
var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
var len = rawStr.length;
if (len % 2 !== 0) {
alert("存在非法字符!");
return "";
}
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16);
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join("");
}
<p id="show"></p>
#show {
color: white;
}
.m1 {
margin-left:20px;
}
.m2 {
margin-left:40px;
}
.m3 {
margin-left:60px;
}
.m4 {
margin-left:80px;
}
.annotation {
color: #888;
margin-left: 10px;
}