网站建设中的形象满意指的是销售,个人网站怎么申请,wordpress增加小工具,微信app下载最新版本目录
0、前言
一、环境搭建
1.1 安装JDK
1.2 安装eclipse
1.3 安装Maven
二、Profile说明
三、插件编写
3.1 源文件说明
3.2 修改文件路径#xff08;包含#xff09;
3.3 修改pom.xml
3.4 导入工程
3.5 代码实现
3.6 生成jar包 0、前言
本教程分为上、下篇包含
3.3 修改pom.xml
3.4 导入工程
3.5 代码实现
3.6 生成jar包 0、前言
本教程分为上、下篇原作者是我的同事llb90征得其同意后在这里再次发布希望能帮到有需求的人demo可在Github下载。
本文通过一个比较简单又不失全面的例子说明一下华为IoT平台编解码插件线下开发的整个开发流程。对于环境的搭建尽量一笔带过对核心编码部分做比较详细的讲解。第二章Profile部分会先出给一个小例子作为demo编解码的编写按照该pfofile中定义的字段来解析以方便大家理解编解码插件中的代码。本文编写过程中主要参考了“华为IoT平台NB-IoT设备集成开发指南.pdf”。
一、环境搭建
开发编解码插件使用的IDE是eclipse语言是Java。本文尽量以简单的方式告诉你如何将华为提供的编解码样例修改为适合自己的编解码插件。即使你没有什么Java基础只要懂得编程逻辑就好。跟着一起来吧
1.1 安装JDK
JDK版本1.8以上。参考网络教程https://blog.csdn.net/u010058695/article/details/100983213
1.2 安装eclipse
下载并安装eclipse。eclipse下载后解压缩到本地即可运行。
1.3 安装Maven
下载地址是 http://maven.apache.org/download.cgi 下载后的文件解压缩即可然后添加环境变量。
在eclipse中配置maven插件。打开eclipse点击window-Preferences弹出如下窗口 在弹出的窗口左侧栏中依次找到并点击Maven-Installations在右侧点击Add按钮弹出如下图所示窗口 点击Directory选择Maven的路径然后Finish。到此Maven配置完成。
二、Profile说明
Profile实际上是一系列关于设备模型的描述文件每个文件都使用JSON格式键值对。
Profile中首先需要说明设备的基本信息包括厂商ID厂商名称设备类型接入协议以及设备可以提供的哪些服务等其次profile中要针对每一项服务用一个独立的文件进行详细描述。服务可以理解为是对设备消息上下行功能的一个分类一个服务就代表一类功能每个服务下包含若干属性和命令每个属性对应上报消息中的某一个数据每个命令字段则对应下行消息中的某些字段。比如一个电表设备会上报电池电量、功率、电能、电压等可以将电池电量放在Battery服务中属性值为batteryLevel将功率、电能、电压都放在Transmission服务中分别对应该服务下的Power、Energy、Voltage属性。可以在一条消息中上报所有服务的所有属性也可以分开上报。
本例中提供的profile信息基本信息如下
设备类型 MyType
设备型号 MyModel
厂商ID ThirdParty
厂商名称 ThirdParty
协议 Coap
数据服务有两项Battery包含一个属性BatteryLevel两个字节Transmission包含一个属性upData不定长数组profile中表示不定长数组需将属性类型定义为string长度设为一个比较大的数包含一条下行命令CLOUDREQ有两个命令字段cmdType一个字节downData不定长数组。
profile采用在线开发的方式如下图所示 本例中采用一条消息上报所有服务属性的方式。上报数据格式为前两个字节表示batteryLevel属性大端方式第三个字节表示后续数据长度第四个字节至最后表示upData属性。下行命令数据格式为第一个字节表示cmdType第二个字节至最后表示downData。请仔细理解该数据格式插件的编写就是按照数据格式解析出对应的属性值。
三、插件编写
3.1 源文件说明
从华为资源中心下载编解码插件Demo并解压到本地。文件结构如下图所示 源代码在src文件夹下编译生成的插件包在target文件夹下。src 文件夹包含 main 、test 两个子文件夹main下存放源码test下是单元测试代码。官网下载的Demo中源码的路径是src\main\java\com\Huawei\NBIoTDevice\WaterMeter单元测试代码的路径是src\test\java\com\Huawei\NBIoTDevice\WaterMeter。
插件源码文件有5个 aProtocolAdapterImpl.java 可以理解为是插件的入口文件对外提供调用接口。该文件只需要修改两个字符串的定义即可
// 厂商名称
private static final String MANU_FACTURERID Huawei;
// 设备型号
private static final String MODEL NBIoTDevice; 修改为profile当中定义的厂商ID和设备型号。
bCmdProcess.java 实现下行命令的编码工作将从收到的服务器报文中提取出命令字段对应的内容并将其转换成字节流。需要实现的函数是
public byte[] toByte()
cReportProcess.java 实现将收到的二进制码流按照格式解码出对应profile中的属性值并生成JSON格式。需要实现的函数是
//根据二进制码流的格式从中取出对应字节转换成profile中对应属性的值
public ReportProcess(byte[] binaryData)
//将解码出来的属性值封装成JSON格式
public ObjectNode toJsonNode()
dByteBufUtils.java 和 Utilty.java文件封装了一些公共方法不用做修改。也不会使用到。
3.2 修改文件路径包含
插件包名的要求是com.厂商名称.设备型号.设备类型。因此下载下来的代码要根据自己的设备修改下文件路径。即将Huawei文件夹重命名为profile中定义的厂商名称NBIoTDevice文件夹重命名为profile中定义的设备型号WaterMeter文件夹重命名为profile中定义的设备类型。注意src\main 和src\test 下都要修改。在本例中需要修改为
src\main\java\com\ThirdParty\MyModel\MyTyp
src\test\java\com\ThirdParty\MyModel\MyType
3.3 修改pom.xml
打开pom.xml文件修改第7行“artifactId”和第88行“Bundle-SymbolicName”的值为设备类型-厂商ID-设备型号。在本例中需要修改为MyType-ThirdParty-MyModel。
3.4 导入工程
打开eclipse点击file-import在弹出窗口中选择maven工程如下图所示 之后在弹出的窗口中点击Browse选择工程路径pom.xml文件所在路径。工程导入后如下图所示 从图8可以看到首次导入工程后是有错误的。这是因为我们在第2节中将文件路径修改了与代码里面的包路径不一致引起的。解决方法为依次打开源文件将第一行的
package com.Huawei.NBIoTDevice.WaterMeter;
修改为
package com.ThirdParty.MyModel.MyType;
打开OSGI_INF目录下的CodeProvideHandler.xml 文件 打开后文件内容如下图所示 将Name 、 Class* 内的路径也修改为对应的包路径 3.5 代码实现
前面说明了各个源文件要修改的地方本节中具体讲解实现的方法。
a修改ProtocolAdatpterImpl.java文件
在文件中找到如下两行
// 厂商名称
private static final String MANU_FACTURERID Huawei;
// 设备型号
private static final String MODEL NBIoTDevice;将MANU_FACTURERID 和 MODEL定义修改为profile中定义的厂商ID和设备型号本例中需要修改为
// 厂商名称
private static final String MANU_FACTURERID ThirdParty;
// 设备型号
private static final String MODEL MyModel;b解码实现
解码是将NB模组上报的二进制码流按格式解析出对应字段的过程。解码的代码在ReportProcess.java 文件中。
第一个函数public ReportProcess(byte[] binaryData) 入参 byte[] binaryData就是NB模组上报的二进制码流。解码得到数据存储在成员变量当中。本例中的代码实现如下 NB上报二进制数据的格式为前两个字节表示batteryLevel大端整型第三个字节表示后边还有多少字节第四个字节往后表示不定长字段upData。因此解码的思路便是
首先判断数据长度是否合法至少应为3个字节对应第37行代码数据长度应不小于第3个字节的值加上3对应第42行代码。该部分代码属于保护性代码。将前两个字节拼成一个16位的整型数据表示batteryLevel对应第47行代码。根据第三个字节的值创建一个Byte数组将第四个字节往后的内容拷贝至该数组内得到upData。对应第50~53行代码。
System.arraycopy 是JDK提供的数组拷贝函数:第一个参数是源数组第二个参数是偏移表示从源数组的第几个字节开始拷贝第三个参数是目的数组第四个参数是目的数组的偏移第5个参数表示拷贝的长度。
第二个函数public ObjectNode toJsonNode() 返回一个ObjectNode对象JSON。该函数的功能是将解码后得到的数据按照规定格式填入一个JSON对象中。本例中生成的JSON对象的内容格式如下图所示 JSON对象的内容格式要求是msgType: deviceReq, 表示设备上报数据固定不动“data”数组对象数组中的每个元素分别对应profile中的一个服务“serviceID”的值是profile中定义的服务名称“serviceData”的值是该服务下所有的属性值。本例中profile定义了两个服务Battery服务中有一个BatteryLevel属性;Transmission服务中有一个upData属性。由图13的“upData”的值可以看出数组类型的值需要将二进制流转成base64编码的格式。
该函数的代码实现如下图所示 该函数代码比较简单主要是用到了 ObjectMapper 这个类该类提供了JAVA中操作JSON数据的方法可对照图13上报数据格式仔细理解该部分代码。
c编码实现
编码是将IoT平台收到的服务器下行数据服务器下行数据是http或者https协议从中提取出下行字段并将其拼成二进制码流。编码部分的代码在 CmdProcess.java 文件中。需要实现的函数是public byte[] toByte()
本例中该函数的实现代码如下图所示 服务器下行命令的JSON数据格式是 msgType: cloudReq, 固定值表示服务器下行命令
serviceIdprofile中对应的服务本例中是Transmission,
cmdprofile中定义的下行命令本例中是CLOUDREQ,
parasprofile中定义的下行命令的各个字段本例中是cmdType和downData两个字段图16中cmdType的值是2downData是一个不定长数组base64编码格式。
因此编码的思路是
判断下行命令是否是profile中定义的。对应第77行代码。获取cmdType字段的值该值占一个字节。对应第78行代码。获取downData的值该值是base64编码形式需转成二进制码流对应第79行代码。将两个字段的值拼接成一个二进制数组并返回。对应第81~84行代码。
3.6 生成jar包
经过前面的工作后代码就已经准备好了接下来是生成JAR包。在DOS窗口中进入pom.xml文件所在路径执行 mvn package 命令最后弹出如下图所示的结果则表明生成Jar包成功。如果有错误则根据提示再去修改代码然后重新执行 mvn package。 在工程目录的target文件夹下存放生成的JAR包“MyType-ThirdParty-MyModel-1.0.0.jar”。JAR包的命名规则是
设备类型-厂商ID-设备型号-版本号.jar
好至此插件编写任务完成。插件打包、插件质检、插件签名等内容见下篇教程。