跳至主要內容

采集型水表 BCD 码上报协议解析

约 339 字大约 1 分钟

采集型水表 BCD 码上报协议解析

某客户使用的 RS485 采集型水表不支持标准 Modbus RTU,而采用了 BCD 码。接入 ThingsCloud 后,利用自定义数据上报规则中的云函数,便可以轻松的对上报数据进行解析,生成设备属性 JSON

创建规则时,选择自定义上报,如下图:

然后添加一个 属性解析函数 的操作,如下图:

编写云函数,下边是一个示例:

module.exports = function (identifier, data) {
    /**
     * 参数:
     * identifier:  上报的自定义数据流标识符
     * data:        上报的自定义数据,二进制 Buffer格式
     * 返回值:
     * attributes:  通过自定义上报数据解析生成的设备属性,作为函数返回值。
     */

    var attributes = {};
    
    // 验证数据长度,并校验 CRC
    if (data.length == 13 && Cloud.validateCrc16Modbus(data)) {
        
        // 读取第3-6字节的buffer
        var buf1 = data.slice(3, 7);
        // 读取第7-10字节的buffer
        var buf2 = data.slice(7, 11);

        // 分别计算对应的数值,这里根据水表手册的BCD定义
        var str1 = buf1.toString("hex");
        var number1 = str1.substr(0, 4)/1 + str1.substr(4, 4)/10000;

        var str2 = buf2.toString("hex");
        var number2 = str2.substr(0, 3)/1 + str2.substr(3, 5)/100000;

        // 读取站号
        const station = data[0]

        // 写入属性中
        attributes.station = station;
        attributes.number1 = number1;
        attributes.number2 = number2;
    }
    
    return attributes;
}

详细了解 ThingsCloud 消息规则,请浏览 消息规则