SOURCE

console 命令行工具 X clear

                    
>
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:正常 不响(1logo5秒+闪红 2logo5秒+长红)3:只响  响(4logo5秒+闪红 5logo5秒+长红)'
            }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) + ' SIMICCID'
            }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("");
    }
}

//十六进制转ASCIIfunction 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;
}