console
var code = '2A0101006F020000634A2640A32100000000000000050000000801004F0602000000010000000100000000220524224404000000000001631B00040001000101000200040000012C0003000800000000000000000004001438393836303631393130303032353238373632362C4823'
code = '2A010100430000005BDE57912F8100000000000000000000800900003004000000FF000000EF0000000000240221203755000200010001050002000400000078B0AB23'
code = code.replace(/\s*/g,"")
//console.log(code)
var index = 0
document.getElementById("show").innerHTML = getFormatCode()
function getFormatCode() {
let orderNo = code.substring(48,52)
if(orderNo == '0008') {
return getEx1FormatCode()
}else if(orderNo == '8009') {
return getSendEx1FormatCode()
}
}
function getSendEx1FormatCode() {
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>'
formatCode += '<br /><span class="m1"></span>' + getCodeStr(16)
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)
formatCode += '<br /><span class="m3"></span>' + operateCode + '<span class="annotation">//操作码 1:电磁阀控制 2:综合控制 3:请求SIM卡信息 4:综合控制EX1</span>'
if(operateCode == 2) {
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(2) + '<span class="annotation">//电磁阀 0:关闭 1:打开</span>'
var extCount = getCodeStr(4)
formatCode += '<br /><span class="m3"></span>' + extCount + '<span class="annotation">//扩展信息数量</span>'
}else if(operateCode == 4) {
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(2) + '<span class="annotation">//电磁阀 0:关闭 1:打开</span>'
formatCode += '<br /><span class="m3"></span>' + getCodeStr(12) + '<span class="annotation">//YY-MM-DD-hh-mm-ss</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 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
}
<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;
}