# 透传协议

直接将设备消息转为透传消息,在平台中通过订阅/device/*/*/message/direct来处理上报的透传消息

注意

透传协议目前仅支持MQTT的传输类型

# 获取透传协议

可前往github (opens new window)下载透传协议源码

# 消息解析

说明

解析设备透传到平台的消息,需要在产品或设备详情-数据解析tab页中的脚本输入框中定义函数为function decode(context){xxx}

context API说明

名称 参数说明 说明 示例
topic 获取消息topic context.topic()
payload 获取原始报文。原始报文为io.netty.buffer.ByteBuf类型 context.payload()
json 获取可转换为json的报文 context.json()
pathVars pattern:字符串类型的变量格式
path:字符串类型的变量参数
提取路径中的参数 context.pathVars("/{deviceId}/**","/test/**")

解码后的数据转换为平台消息

//解码函数
function decode(context) {
    
    /**
     * 设备上报消息
     */
    var reportMessage =  {
        "messageType": "REPORT_PROPERTY",
        "deviceId":"设备ID",
        "properties": {
            "属性ID": "属性值"
        }
    }

    /**
     * 读取属性回复消息
     */
    var readMessageReply =  {
        "messageType": "READ_PROPERTY_REPLY",
        "deviceId":"设备ID",
        "properties": {
            "属性ID": "属性值"
        }
    }

    /**
     * 修改属性回复消息
     */
    var writeMessageReply =  {
        "messageType": "WRITE_PROPERTY_REPLY",
        "deviceId":"设备ID",
        "properties": {
            "属性ID": "属性值"
        }
    }
    
    /**
     * 功能调用回复消息
     */
    var invokeMessageReply =  {
        "messageType":"INVOKE_FUNCTION_REPLY",
        "deviceId":"设备ID",
        "functionId":"功能Id",
        "output":"功能返回结果对象"
    }

    /**
     * 事件上报
     */
    var invokeMessage =  {
        "messageType":"EVENT",
        "event":"事件Id",
        "data":"事件对象"
    }

    //return xxxMesage;
}

完整示例


//解码函数
function decode(context) {
    //原始报文
    var buffer = context.payload();
    // 转为json
    // var json = context.json();
    //mqtt 时通过此方法获取topic
    // var topic = context.topic();

    // 提取设备Id
    var deviceId = context.pathVars("/{deviceId}/**",topic)
    
    //温度属性
    var temperature = buffer.getShort(3) * 10;
    //湿度属性
    var humidity = buffer.getShort(6) * 10;
    return {
        "messageType": "REPORT_PROPERTY",
        "deviceId": deviceId,
        "properties": {
            "temperature": temperature,
            "humidity": humidity
        }
    };
}


# 消息编码

说明

编码平台指令下发消息,需要在产品或设备详情-数据解析tab页中的脚本输入框中定义函数为function encode(context){xxx}

context API说明

名称 参数说明 说明 示例
topic topic:字符串类型的指令topic 设置指令topic context.topic("/xxxx/**")
message 获取下发指令的原始消息对象 context.message()
setPayload strOrHex:字符串类型或16进制的报文
charset:报文字符集
设置下发指令报文 context.message("0x01654","UTF-8")
setPayload strOrHex:字符串类型或16进制的报文 设置下发指令报文,默认UTF-8字符集 context.message("0x01654","UTF-8")
setPayload data:报文对象,目前支持字符串类型和byte数组类型 设置下发指令报文 context.message("0x01654","UTF-8")
whenFunction functionId:String类型的功能Id
supplier:可执行函数类型,入参为功能输入参数。返回值为对象类型
当原始指令为功能调用消息并且函数Id为functionId或*时执行supplier逻辑,并将supplier返回值添加到下发指令报文 context.whenFunction("functionId", function(args){ return xxx })
whenWriteProperty property:String类型的属性Id
supplier:可执行函数类型,入参为属性值。返回值为对象类型
当原始指令为修改属性消息且修改的属性集合Id包含property或property为*时执行supplier逻辑,并将supplier返回值添加到下发指令报文 context.whenWriteProperty("temperature", function(value) { return xxx })
whenReadProperties supplier:可执行函数类型,入参为读取属性的集合。返回值为对象类型 当原始指令为读取属性消息时执行,并将supplier返回值添加到下发指令报文 context.whenReadProperties("*", function(list){ return xxx })
whenReadProperty property:String类型的属性Id
supplier:可执行函数类型,返回值为对象类型
当原始指令为读取属性消息且读取的属性集合Id包含property或property为*时执行supplier逻辑,并将supplier返回值添加到下发指令报文 context.whenReadProperty("temperature", function(){ return xxx })

完整示例


//编码函数
function encode(context) {
    //获取原始消息对象
    var message = context.message();
    
    //获取设备Id
    var deviceId = message.deviceId;
    //构建topic
    var topic = "/" + deviceId + "/**";
    //设置指令topic
    context.topic(topic);
    
    //设置下发指令报文
    context.setPayload("xxxx");
    
    //当下发的消息为函数调用类型,并且函数Id为`open_the_door`时,执行如下逻辑
    context.whenFunction("open_the_door", function (args){
        var code = args.code;
        var password = args.password;
        //其它逻辑处理 ... ...
        return "xxxx";
    });
}

注意

下发指令目前仅支持DirectDeviceMessage.消息类型