云服务器内容精选

  • JavaScript编解码插件模板 以下为JavaScript编解码插件的模板,开发者需要按照平台提供的模板,实现对应的接口。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 /** * 设备上报数据到 物联网平台 时调用此接口进行解码, 将设备的原始数据解码为符合产品模型定义的JSON格式数据。 * 该接口名称和入参已经定义好,开发者只需要实现具体接口即可。 * @param byte[] payload 设备上报的原始码流 * @param string topic MQTT设备上报数据时的topic,非MQTT设备上报数据时不携带该参数 * @return string json 符合产品模型定义的JSON格式字符串 */ function decode(payload, topic) { var jsonObj = {}; return JSON.stringify(jsonObj); } /** * 物联网平台下发指令时,调用此接口进行编码, 将产品模型定义的JSON格式数据编码为设备的原始码流。 * 该接口名称和入参格式已经定义好,开发者只需要实现具体接口即可。 * @param string json 符合产品模型定义的JSON格式字符串 * @return byte[] payload 编码后的原始码流 */ function encode(json) { var payload = []; return payload; }
  • 编解码插件质检 编解码插件的质检用于检验编解码是否可以正常使用。 获取编解码插件检测工具。 将检测工具“pluginDetector.jar”、Profile文件的“devicetype-capability.json”和需要检测的编解码插件包“package.zip”和tool文件夹放在同一个目录下。 获取设备数据上报的码流,并在检测工具的“data report”页签,将码流以十六进制格式输入,例如:AA72000032088D0320623399。 点击检测工具的“start detect”,查看解码后的json数据。 日志文本框会打印解码数据,如果提示“report data is success”,表示解码成功。 如果提示“ERROR”,表示解码出现错误。 当解码成功后,检测工具会继续调用编解码插件包的encode方法,对应答消息进行编码。 当提示“encode ack result success”时,表示对设备的应答消息编码成功。 获取应用服务器下发的命令(应用服务器通过调用物联网平台的“创建设备命令”接口进行命令下发),并在检测工具的“data report”页签输入。 点击检测工具的“start detect”,检测工具会调用encode接口对控制命令进行编码。 如果提示“encode cmd result success”,表示对命令编码成功;如果提示“ERROR”,表示对命令编码出现错误。 命令示例: { "identifier": "123", "msgType": "cloudReq", "serviceId": "NBWaterMeterCommon", "cmd": "SET_DEVICE_LEVEL", "mid": 2016, "paras": { "value": "10" }, "hasMore": 0 } 获取设备命令执行结果上报的码流,并在检测工具的“data report”页签,将码流以十六进制格式输入,例如:AA7201000107E0。 点击检测工具的“start detect”,查看解码后的Json数据。 日志文本框会打印解码数据,如果提示“report command result success”,表示解码成功;如果提示“ERROR”,表示解码出现错误。
  • 编解码插件的输入/输出格式样例 假定某款水表支持的服务定义如下: 服务类型 属性名称 属性说明 属性类型(数据类型) Battery - - - - batteryLevel 电量(0--100)% int Meter - - - - signalStrength 信号强度 int - currentReading 当前读数 int - dailyActivityTime 日激活通讯时长 string 那么数据上报时decode接口的输出: { "identifier": "12345678", "msgType": "deviceReq", "data": [ { "serviceId": "Meter", "serviceData": { "currentReading": "46.3", "signalStrength": 16, "dailyActivityTime": 5706 }, "eventTime": "20160503T121540Z" }, { "serviceId": "Battery", "serviceData": { "batteryLevel": 10 }, "eventTime": "20160503T121540Z" } ]} 收到数据上报后,平台对设备的应答响应,调用encode接口编码,输入为 { "identifier": "123", "msgType": "cloudRsp", "request":[ 1, 2 ], "errcode": 0, "hasMore": 0} 假定某款水表支持的命令定义如下: 基本功能名称 分类 名称 命令参数 数据类型 枚举值 WaterMeter 水表 - - - - - CMD SET_TEMPERATURE_READ_PERIOD - - - - - - value int - - RSP SET_TEMPERATURE_READ_PERIOD_RSP - - - - - - result int 0表示成功,1表示输入非法,2表示执行失败 那么命令下发调用encode接口时,输入为 { "identifier": "12345678", "msgType": "cloudReq", "serviceId": "WaterMeter", "cmd": "SET_TEMPERATURE_READ_PERIOD", "paras": { "value": 4 }, "hasMore": 0} 收到设备的命令应答后,调用decode接口解码,解码的输出 { "identifier": "123", "msgType": "deviceRsp", "errcode": 0, "body": { "result": 0 }}
  • 编解码插件打包 插件变成完成后,需要使用Maven打包成jar包,并制作成插件包。 Maven打包 打开DOS窗口,进入“pom.xml”所在的目录。 输入maven打包命令:mvn package。 DOS窗口中显示“BUILD SUC CES S”后,打开与“pom.xml”目录同级的target文件夹,获取打包好的jar包。 jar包命名规范为:设备类型-厂商ID-设备型号-版本.jar,例如:WaterMeter-Huawei-NBIoTDevice-version.jar。 com目录存放的是class文件。 META-INF下存放的是OSGI框架下的jar的描述文件(根据pom.xml配置生成的)。 OSGI-INF下存放的是服务配置文件,把编解码注册为服务,供平台调用(只能有一个xml文件)。 其他jar是编解码引用到的jar包。 制作插件包 新建文件夹命名为“package”,包含一个“preload/”子文件夹。 将打包好的jar包放到“preload/”文件夹。 在“package”文件夹中,新建“package-info.json”文件。该文件的字段说明和模板如下: 注:“package-info.json”需要以UTF-8无BOM格式编码。仅支持英文字符。 表4 “package-info.json”字段说明 字段名 字段描述 是否必填 specVersion 描述文件版本号,填写固定值:"1.0"。 是 fileName 软件包文件名,填写固定值:"codec-demo" 是 version 软件包版本号。描述package.zip的版本,请与下面的bundleVersion取值保持一致。 是 deviceType 设备类型,与Profile文件中的定义保持一致。 是 manufacturerName 制造商名称,与Profile文件中的定义保持一致,否则无法上传到平台。 是 model 产品型号,与Profile文件中的定义保持一致。 是 platform 平台类型,本插件包运行的物联网平台的操作系统,填写固定值:"linux"。 是 packageType 软件包类型,该字段用来描述本插件最终部署的平台模块,填写固定值:"CIGPlugin"。 是 date 出包时间,格式为:"yyyy-MM-dd HH-mm-ss",如"2017-05-06 20:48:59"。 否 description 对软件包的自定义描述。 否 ignoreList 忽略列表,默认为空值。 是 bundles 一组bundle的描述信息。 注:bundle就是压缩包中的jar包,只需要写一个bundle。 是 表5 bundles的字段说明 字段名 字段描述 是否必填 bundleName 插件名称,和上文中pom.xml的Bundle-SymbolicName保持一致。 是 bundleVersion 插件版本,与上面的version取值保持一致。 是 priority 插件优先级,可赋值默认值:5。 是 fileName 插件jar的文件名称。 是 bundleDesc 插件描述,用来介绍bundle功能。 是 versionDesc 插件版本描述,用来介绍版本更迭时的功能特性。 是 package-info.json文件模板: { "specVersion":"1.0", "fileName":"codec-demo", "version":"1.0.0", "deviceType":"WaterMeter", "manufacturerName":"Huawei", "model":"NBIoTDevice", "description":"codec", "platform":"linux", "packageType":"CIGPlugin", "date":"2017-02-06 12:16:59", "ignoreList":[], "bundles":[ { "bundleName": "WaterMeter-Huawei-NBIoTDevice", "bundleVersion": "1.0.0", "priority":5, "fileName": "WaterMeter-Huawei-NBIoTDevice-1.0.0.jar", "bundleDesc":"", "versionDesc":"" }] } 选中“package”文件夹中的全部文件,打包成zip格式(“package.zip”)。 注:“package.zip”中不能包含“package”这层目录。
  • decode接口说明 decode接口的入参binaryData为设备发过来的CoAP报文的payload部分。 设备的上行报文有两种情况需要插件处理(消息④是模组回复的协议ACK,无需插件处理): 设备上报数据(对应图中的消息①) 字段名 类型 是否必填 参数描述 identifier String 否 设备在应用协议里的标识,物联网平台通过decode接口解析码流时获取该参数,通过encode接口编码时将该参数放入码流。 msgType String 是 固定值"deviceReq",表示设备上报数据。 hasMore Int 否 表示设备是否还有后续数据上报,0表示没有,1表示有。 后续数据是指,设备上报的某条数据可能分成多次上报,在本次上报数据后,物联网平台以hasMore字段判定后续是否还有消息。hasMore字段仅在PSM模式下生效,当上报数据的hasMore字段为1时,物联网平台暂时不下发缓存命令,直到收到hasMore字段为0的上报数据,才下发缓存命令。如上报数据不携带hasMore字段,则物联网平台按照hasMore字段为0处理。 data ArrayNode 是 设备上报数据的内容。 表1 ArrayNode定义 字段名 类型 是否必填 参数描述 serviceId String 是 服务的id。 serviceData ObjectNode 是 一个服务的数据,具体字段在profile里定义。 eventTime String 否 设备采集数据时间(格式:yyyyMMddTHHmmssZ)。 如:20161219T114920Z。 示例: { "identifier": "123", "msgType": "deviceReq", "hasMore": 0, "data": [{"serviceId": "NBWaterMeterCommon","serviceData": { "meterId": "xxxx", "dailyActivityTime": 120, "flow": "565656", "cellId": "5656", "signalStrength": "99", "batteryVoltage": "3.5"},"eventTime": "20160503T121540Z" }, {"serviceId": "waterMeter","serviceData": {"internalTemperature": 256},"eventTime": "20160503T121540Z" }]} 设备对平台命令的应答(对应图中的消息⑤) 字段名 类型 参数描述 是否必填 identifier String 设备在应用协议里的标识,物联网平台通过decode接口解析码流时获取该参数,通过encode接口编码时将该参数放入码流。 否 msgType String 固定值"deviceRsp",表示设备的应答消息。 是 mid Int 2字节无符号的命令id。在设备需要返回命令执行结果(deviceRsp)时,用于将命令执行结果(deviceRsp)与对应的命令进行关联。 物联网平台在通过encode接口下发命令时,把物联网平台分配的mid放入码流,和命令一起下发给设备;设备在上报命令执行结果(deviceRsp)时,再将此mid返回给物联网平台。否则物联网平台无法将下发命令和命令执行结果(deviceRsp)进行关联,也就无法根据命令执行结果(deviceRsp)更新命令下发的状态(成功或失败)。 是 errcode Int 请求处理的结果码,物联网平台根据该参数判断命令下发的状态。 0表示成功,1表示失败。 是 body ObjectNode 命令的应答,具体字段由profile定义。 注:body体不是数组。 否 示例: { "identifier": "123", "msgType": "deviceRsp", "mid": 2016, "errcode": 0, "body": { "result": 0 } }
  • encode接口说明 encode接口的入参是JSON格式的数据,是平台下发的命令或应答。 平台的下行报文可以分为两种情况: 平台对设备上报数据的应答(对应图中的消息②) 表2 平台收到设备的上报数据后对设备的应答encode接口的入参结构定义 字段名 类型 参数描述 是否必填 identifier String 设备在应用协议里的标识,物联网平台通过decode接口解析码流时获取该参数,通过encode接口编码时将该参数放入码流。 否 msgType String 固定值"cloudRsp",表示平台收到设备的数据后对设备的应答。 是 request byte[] 设备上报的数据。 是 errcode int 请求处理的结果码,物联网平台根据该参数判断命令下发的状态。 0表示成功,1表示失败。 是 hasMore int 表示平台是否还有后续消息下发,0表示没有,1表示有。 后续消息是指,平台还有待下发的消息,以hasMore字段告知设备不要休眠。hasMore字段仅在PSM模式下生效,且需要“下行消息指示”开启。 是 注:在cloudRsp场景下编解码插件检测工具显示返回null时,表示插件未定义上报数据的应答,设备侧不需要物联网平台给予响应。 示例: { "identifier": "123", "msgType": "cloudRsp", "request": [ 1, 2 ], "errcode": 0, "hasMore": 0 } 平台命令下发(对应图中的消息③) 表3 平台下发命令encode接口的入参结构定义 字段名 类型 参数描述 是否必填 identifier String 设备在应用协议里的标识,物联网平台通过decode接口解析码流时获取该参数,通过encode接口编码时将该参数放入码流。 否 msgType String 固定值"cloudReq",表示平台下发的请求。 是 serviceId String 服务的id。 是 cmd String 服务的命令名,参见profile的服务命令定义。 是 paras ObjectNode 命令的参数,具体字段由profile定义。 是 hasMore Int 表示平台是否还有后续命令下发,0表示没有,1表示有。 后续命令是指,平台还有待下发的消息,以hasMore字段告知设备不要休眠。hasMore字段仅在PSM模式下生效,且需要“下行消息指示”开启。 是 mid Int 2字节无符号的命令id,由物联网平台内部分配(范围1-65535)。 物联网平台在通过encode接口下发命令时,把物联网平台分配的mid放入码流,和命令一起下发给设备;设备在上报命令执行结果(deviceRsp)时,再将此mid返回物联网平台。否则物联网平台无法将下发命令和命令执行结果(deviceRsp)进行关联,也就无法根据命令执行结果(deviceRsp)更新命令下发的状态(成功或失败)。 是 示例: { "identifier": "123", "msgType": "cloudReq", "serviceId": "NBWaterMeterCommon", "mid": 2016, "cmd": "SET_TEMPERATURE_READ_PERIOD", "paras": { "value": 4 }, "hasMore": 0} }