Commit 86fff45a2cd9755fd6bd77f64ab34b12b8f67253
1 parent
b5a79ddd
电信IOT插件
Showing
10 changed files
with
611 additions
and
0 deletions
pom.xml
@@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
10 | <version>1.0-SNAPSHOT</version> | 10 | <version>1.0-SNAPSHOT</version> |
11 | <modules> | 11 | <modules> |
12 | <module>zteits-job</module> | 12 | <module>zteits-job</module> |
13 | + <module>zteits-nbiot</module> | ||
13 | </modules> | 14 | </modules> |
14 | 15 | ||
15 | </project> | 16 | </project> |
16 | \ No newline at end of file | 17 | \ No newline at end of file |
zteits-job/src/main/resources/application-dany.properties
0 → 100644
1 | +server.port=8075 | ||
2 | + | ||
3 | +#park-datasource | ||
4 | +park-datasource.url=jdbc:mysql://172.19.128.115:3306/zt_park?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true | ||
5 | +park-datasource.username=park | ||
6 | +park-datasource.password=MySQL57@123 | ||
7 | + | ||
8 | +#order-datasource | ||
9 | +order-datasource.driverClassName=com.mysql.jdbc.Driver | ||
10 | +order-datasource.url=jdbc:mysql://172.19.128.115/zt_order_n?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true | ||
11 | +order-datasource.username=order | ||
12 | +order-datasource.password=MySQL57@123 | ||
13 | + | ||
14 | +#道闸平台地址-获取空闲车位数使用 | ||
15 | +dzurl.qingdao=http://47.104.7.222:12220 | ||
16 | +dzurl.nanze=http://121.40.121.40:8087 | ||
17 | +irain.bjxc.getfreeberthNum= | ||
18 | +dzurl.irain=http://api.parkingwang.com:8280 | ||
19 | +dzurl.irain.appid=avakrky0gk1m7n00 | ||
20 | +dzurl.irain.appsecret=rrr6uz3aqvutpsq2lsna0k18cea4mabw | ||
21 | + | ||
22 | + | ||
23 | +spring.redis.host=172.19.0.178 | ||
24 | +spring.redis.port=6379 | ||
25 | +spring.redis.password=myredis | ||
26 | +spring.redis.database=0 |
zteits-nbiot/lib/com.huawei.m2m.cig.tup-1.3.1.jar
0 → 100644
No preview for this file type
zteits-nbiot/package/VehicleDetector-ZTEITS-ZTEITS-1.0.0.jar
0 → 100644
No preview for this file type
zteits-nbiot/package/package.zip
0 → 100644
No preview for this file type
zteits-nbiot/pom.xml
0 → 100644
1 | +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
2 | + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
3 | + <modelVersion>4.0.0</modelVersion> | ||
4 | + | ||
5 | + <groupId>com.zteits.nbiot</groupId> | ||
6 | + <!-- 请修改为你的编解码插件的名字,命名规范:设备类型-厂商ID-设备型号,例如:WaterMeter-Huawei-NBIoTDevice --> | ||
7 | + <artifactId>VehicleDetector-ZTEITS-ZTEITS</artifactId> | ||
8 | + <version>1.0.0</version> | ||
9 | + <!-- 请检查这里的值为bundle,不能为jar --> | ||
10 | + <packaging>bundle</packaging> | ||
11 | + | ||
12 | + <properties> | ||
13 | + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||
14 | + <junit.version>4.11</junit.version> | ||
15 | + <fasterxml.jackson.version>2.7.4</fasterxml.jackson.version> | ||
16 | + <felix.maven.plugin.version>2.5.4</felix.maven.plugin.version> | ||
17 | + <json.lib.version>2.4</json.lib.version> | ||
18 | + <m2m.cig.version>1.3.1</m2m.cig.version> | ||
19 | + <slf4j.api.version>1.7.6</slf4j.api.version> | ||
20 | + <basedir>./</basedir> | ||
21 | + </properties> | ||
22 | + | ||
23 | + <dependencies> | ||
24 | + <!-- 单元测试使用 --> | ||
25 | + <dependency> | ||
26 | + <groupId>junit</groupId> | ||
27 | + <artifactId>junit</artifactId> | ||
28 | + <version>${junit.version}</version> | ||
29 | + </dependency> | ||
30 | + <!-- 日志使用 --> | ||
31 | + <dependency> | ||
32 | + <groupId>org.slf4j</groupId> | ||
33 | + <artifactId>slf4j-api</artifactId> | ||
34 | + <version>${slf4j.api.version}</version> | ||
35 | + </dependency> | ||
36 | + <!-- 转换JSON使用,必须 --> | ||
37 | + <dependency> | ||
38 | + <groupId>com.fasterxml.jackson.core</groupId> | ||
39 | + <artifactId>jackson-databind</artifactId> | ||
40 | + <version>${fasterxml.jackson.version}</version> | ||
41 | + </dependency> | ||
42 | + <!-- Huawei提供的编解码接口,必须 --> | ||
43 | + <!-- systemPath请替换成你本地的目录 \codecDemo\lib\com.huawei.m2m.cig.tup-1.3.1.jar --> | ||
44 | + <dependency> | ||
45 | + <groupId>com.huawei</groupId> | ||
46 | + <artifactId>protocal-jar</artifactId> | ||
47 | + <version>1.3.1</version> | ||
48 | + <scope>system</scope> | ||
49 | + <systemPath>${basedir}/lib/com.huawei.m2m.cig.tup-1.3.1.jar</systemPath> | ||
50 | + </dependency> | ||
51 | + | ||
52 | + <!-- 本例中数据转换使用到的jar,你用到的jar请写到这里,记得把artifactId填入后面的Embed-Dependency --> | ||
53 | + <dependency> | ||
54 | + <groupId>net.sf.json-lib</groupId> | ||
55 | + <artifactId>json-lib</artifactId> | ||
56 | + <version>2.4</version> | ||
57 | + <classifier>jdk15</classifier> | ||
58 | + </dependency> | ||
59 | + | ||
60 | + </dependencies> | ||
61 | + <build> | ||
62 | + <plugins> | ||
63 | + <!-- 编码需要使用JDK1.8版本 --> | ||
64 | + <plugin> | ||
65 | + <groupId>org.apache.maven.plugins</groupId> | ||
66 | + <artifactId>maven-compiler-plugin</artifactId> | ||
67 | + <configuration> | ||
68 | + <source>1.8</source> | ||
69 | + <target>1.8</target> | ||
70 | + </configuration> | ||
71 | + </plugin> | ||
72 | + <!-- OSGI规范打包配置 --> | ||
73 | + <plugin> | ||
74 | + <groupId>org.apache.felix</groupId> | ||
75 | + <artifactId>maven-bundle-plugin</artifactId> | ||
76 | + <version>${felix.maven.plugin.version}</version> | ||
77 | + <extensions>true</extensions> | ||
78 | + <configuration> | ||
79 | + <buildDirectory>./target</buildDirectory> | ||
80 | + <archive> | ||
81 | + <addMavenDescriptor>false</addMavenDescriptor> | ||
82 | + </archive> | ||
83 | + <instructions> | ||
84 | + <Bundle-RequiredExecutionEnvironment>J2SE-1.5</Bundle-RequiredExecutionEnvironment> | ||
85 | + <Bundle-Activator></Bundle-Activator> | ||
86 | + <Service-Component>OSGI-INF/*</Service-Component> | ||
87 | + <!-- 请修改为你的编解码插件的名字,命名规范:设备类型-厂商ID-设备型号,例如:WaterMeter-Huawei-NBIoTDevice --> | ||
88 | + <Bundle-SymbolicName>VehicleDetector-ZTEITS-ZTEITS</Bundle-SymbolicName> | ||
89 | + <Export-Package></Export-Package> | ||
90 | + <Import-Package> | ||
91 | + org.slf4j, | ||
92 | + org.slf4j.spi, | ||
93 | + org.apache.log4j.spi, | ||
94 | + com.huawei.m2m.cig.tup.modules.protocol_adapter, | ||
95 | + com.fasterxml.jackson.databind, | ||
96 | + com.fasterxml.jackson.databind.node | ||
97 | + </Import-Package> | ||
98 | + <!-- 除junit,slf4j-api,jackson-databind,protocal-jar, 其他所有的依赖包,必须把包对应的artifactId填入Embed-Dependency。artifactId之间以逗号分隔。 --> | ||
99 | + <Embed-Dependency> | ||
100 | + json-lib | ||
101 | + </Embed-Dependency> | ||
102 | + </instructions> | ||
103 | + </configuration> | ||
104 | + <executions> | ||
105 | + <execution> | ||
106 | + <id>generate-resource</id> | ||
107 | + <goals> | ||
108 | + <goal>manifest</goal> | ||
109 | + </goals> | ||
110 | + </execution> | ||
111 | + </executions> | ||
112 | + </plugin> | ||
113 | + </plugins> | ||
114 | + </build> | ||
115 | +</project> | ||
0 | \ No newline at end of file | 116 | \ No newline at end of file |
zteits-nbiot/src/main/java/com/zteits/nbiot/decoder/Utilty.java
0 → 100644
1 | +package com.zteits.nbiot.decoder; | ||
2 | + | ||
3 | + | ||
4 | +import java.util.Arrays; | ||
5 | + | ||
6 | +public class Utilty { | ||
7 | + | ||
8 | + private static Utilty instance = new Utilty(); | ||
9 | + | ||
10 | + public static Utilty getInstance() { | ||
11 | + return instance; | ||
12 | + } | ||
13 | + | ||
14 | + public static final int MIN_MID_VALUE = 1; | ||
15 | + | ||
16 | + public static final int MAX_MID_VALUE = 65535; | ||
17 | + | ||
18 | + | ||
19 | + public static int bytes2Int(byte[] b, int start, int length) { | ||
20 | + int sum = 0; | ||
21 | + int end = start + length; | ||
22 | + for (int k = start; k < end; k++) { | ||
23 | + int n = ((int) b[k]) & 0xff; | ||
24 | + n <<= (--length) * 8; | ||
25 | + sum += n; | ||
26 | + } | ||
27 | + return sum; | ||
28 | + } | ||
29 | + | ||
30 | + public static byte[] int2Bytes(int value, int length) { | ||
31 | + byte[] b = new byte[length]; | ||
32 | + for (int k = 0; k < length; k++) { | ||
33 | + b[length - k - 1] = (byte) ((value >> 8 * k) & 0xff); | ||
34 | + } | ||
35 | + return b; | ||
36 | + } | ||
37 | + | ||
38 | + public boolean isValidofMid(int mId) { | ||
39 | + if (mId < MIN_MID_VALUE || mId > MAX_MID_VALUE) { | ||
40 | + return false; | ||
41 | + } | ||
42 | + return true; | ||
43 | + } | ||
44 | + | ||
45 | + public static String parseByte2HexStr(byte[] buf) { | ||
46 | + if (null == buf) { | ||
47 | + return null; | ||
48 | + } | ||
49 | + | ||
50 | + StringBuffer sb = new StringBuffer(); | ||
51 | + for (int i = 0; i < buf.length; i++) { | ||
52 | + String hex = Integer.toHexString(buf[i] & 0xFF); | ||
53 | + if (hex.length() == 1) { | ||
54 | + hex = '0' + hex; | ||
55 | + } | ||
56 | + sb.append(hex.toUpperCase()); | ||
57 | + } | ||
58 | + return sb.toString(); | ||
59 | + } | ||
60 | + /** | ||
61 | + * 16进制转换成为integer | ||
62 | + * @return | ||
63 | + */ | ||
64 | + public static Integer hexStringToInteger(byte[] original, int from, int to) { | ||
65 | + String s = Utilty.parseByte2HexStr(Arrays.copyOfRange(original, from, to)); | ||
66 | + return Integer.parseInt(s,16); | ||
67 | + } | ||
68 | + | ||
69 | + /** | ||
70 | + * 16进制转换成为string类型字符串 | ||
71 | + * @return | ||
72 | + */ | ||
73 | + public static String hexStringToString(byte[] original, int from, int to) { | ||
74 | + String s = Utilty.parseByte2HexStr(Arrays.copyOfRange(original, from, to)); | ||
75 | + if (s == null || s.equals("")) { | ||
76 | + return null; | ||
77 | + } | ||
78 | + s = s.replace(" ", ""); | ||
79 | + byte[] baKeyword = new byte[s.length() / 2]; | ||
80 | + for (int i = 0; i < baKeyword.length; i++) { | ||
81 | + try { | ||
82 | + baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); | ||
83 | + } catch (Exception e) { | ||
84 | + e.printStackTrace(); | ||
85 | + } | ||
86 | + } | ||
87 | + try { | ||
88 | + s = new String(baKeyword, "UTF-8"); | ||
89 | + new String(); | ||
90 | + } catch (Exception e1) { | ||
91 | + e1.printStackTrace(); | ||
92 | + } | ||
93 | + return s; | ||
94 | + } | ||
95 | +} |
zteits-nbiot/src/main/java/com/zteits/nbiot/decoder/ZteitsCmdProcess.java
0 → 100644
1 | +package com.zteits.nbiot.decoder; | ||
2 | + | ||
3 | +import com.fasterxml.jackson.databind.JsonNode; | ||
4 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
5 | + | ||
6 | +import java.util.Arrays; | ||
7 | +import java.util.Date; | ||
8 | + | ||
9 | +public class ZteitsCmdProcess { | ||
10 | + | ||
11 | + private String msgType = "cloudRsp"; | ||
12 | + private String serviceId = "VehicleDetectorInfo"; | ||
13 | + private String cmd = "SET_DEVICE_LEVEL"; | ||
14 | + private int hasMore = 1; | ||
15 | + //请求处理的结果码,0表示成功,1表示失败 | ||
16 | + private int errcode = 1; | ||
17 | + private int mid = 0; | ||
18 | + private byte[] requests; | ||
19 | + private JsonNode paras; | ||
20 | + | ||
21 | + | ||
22 | + public ZteitsCmdProcess() { | ||
23 | + } | ||
24 | + | ||
25 | + public ZteitsCmdProcess(ObjectNode input) { | ||
26 | + | ||
27 | + try { | ||
28 | + this.msgType = input.get("msgType").asText(); | ||
29 | + this.requests = input.get("request").binaryValue(); | ||
30 | + /* | ||
31 | + 平台收到设备上报消息,编码ACK | ||
32 | + { | ||
33 | + "msgType":"cloudRsp", | ||
34 | + "request": ***,//设备上报的码流 | ||
35 | + "errcode":0, | ||
36 | + "hasMore":0 | ||
37 | + } | ||
38 | + * */ | ||
39 | + if (msgType.equals("cloudRsp")) { | ||
40 | + //在此组装ACK的值 | ||
41 | + this.errcode = input.get("errcode").asInt(); | ||
42 | + this.hasMore = input.get("hasMore").asInt(); | ||
43 | + } | ||
44 | + } catch (Exception e) { | ||
45 | + this.errcode = 1; | ||
46 | + e.printStackTrace(); | ||
47 | + } | ||
48 | + | ||
49 | + } | ||
50 | + | ||
51 | + public byte[] toByte() { | ||
52 | + try { | ||
53 | + /* | ||
54 | + 平台收到设备的上报数据,根据需要编码ACK,对设备进行响应,如果此处返回null,表示不需要对设备响应。 | ||
55 | + * */ | ||
56 | + if (this.msgType.equals("cloudRsp")) { | ||
57 | + | ||
58 | + byte[] ack = new byte[28]; | ||
59 | + ack[0] = (byte) 0x77; | ||
60 | + ack[1] = (byte)0x00; | ||
61 | + //请求处理的结果码。 | ||
62 | + //0表示成功,1表示失败 | ||
63 | + if(errcode == 0){ | ||
64 | + ack[2] = (byte)0x70; | ||
65 | + }else if(errcode == 1){ | ||
66 | + ack[2] = (byte)0x30; | ||
67 | + } | ||
68 | + //packCount 2H | ||
69 | + ack[3] = requests[18]; | ||
70 | + ack[4] = requests[19]; | ||
71 | + //magId 4H | ||
72 | + ack[5] = requests[22]; | ||
73 | + ack[6] = requests[23]; | ||
74 | + ack[7] = requests[24]; | ||
75 | + ack[8] = requests[25]; | ||
76 | + //command 2H | ||
77 | + ack[9] = (byte)0x00; | ||
78 | + ack[10] = (byte)0x00; | ||
79 | + //时间8H | ||
80 | + ack[11] = (byte)0x00; | ||
81 | + ack[12] = (byte)0x00; | ||
82 | + ack[13] = (byte)0x00; | ||
83 | + ack[14] = (byte)0x00; | ||
84 | + Long time = new Date().getTime()/1000; | ||
85 | + byte[] timeByte = Utilty.int2Bytes(time.intValue(), 4); | ||
86 | + ack[15] = timeByte[0]; | ||
87 | + ack[16] = timeByte[1]; | ||
88 | + ack[17] = timeByte[2]; | ||
89 | + ack[18] = timeByte[3]; | ||
90 | + | ||
91 | + ack[19] = (byte)errcode; | ||
92 | + ack[20] = (byte)0x00; | ||
93 | + ack[21] = (byte)0x00; | ||
94 | + ack[22] = (byte)0x00; | ||
95 | + ack[23] = (byte)0x00; | ||
96 | + ack[24] = (byte)0x00; | ||
97 | + ack[25] = (byte)0x00; | ||
98 | + return CRC16Util.appendCrc16(ack); | ||
99 | + } | ||
100 | + return null; | ||
101 | + } catch (Exception e) { | ||
102 | + e.printStackTrace(); | ||
103 | + return null; | ||
104 | + } | ||
105 | + } | ||
106 | + | ||
107 | +} |
zteits-nbiot/src/main/resources/OSGI-INF/CodecProvideHandler.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="com.zteits.nbiot.decoder.ProtocolAdapterImpl"> | ||
3 | + <implementation class="com.zteits.nbiot.decoder.ProtocolAdapterImpl"/> | ||
4 | + <service> | ||
5 | + <provide interface="com.huawei.m2m.cig.tup.modules.protocol_adapter.IProtocolAdapter" /> | ||
6 | + </service> | ||
7 | +</scr:component> |
zteits-nbiot/src/test/java/com/thrid/party/codec/demo/ProtocolServiceImplTest.java
0 → 100644
1 | +package com.thrid.party.codec.demo; | ||
2 | + | ||
3 | +import com.zteits.nbiot.decoder.ProtocolAdapterImpl; | ||
4 | +import org.junit.Before; | ||
5 | +import org.junit.Test; | ||
6 | + | ||
7 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
8 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
9 | +import com.huawei.m2m.cig.tup.modules.protocol_adapter.IProtocolAdapter; | ||
10 | + | ||
11 | +/** | ||
12 | + * Unit test for simple App. | ||
13 | + */ | ||
14 | +public class ProtocolServiceImplTest { | ||
15 | + | ||
16 | + private IProtocolAdapter protocolAdapter; | ||
17 | + | ||
18 | + @Before | ||
19 | + public void setProtocolAdapter() { | ||
20 | + this.protocolAdapter = new ProtocolAdapterImpl(); | ||
21 | + } | ||
22 | + | ||
23 | + /** | ||
24 | + * 测试用例1:设备向平台上报数据。 | ||
25 | + * <p> | ||
26 | + * <pre> | ||
27 | + * 设备上报数据:AA72000032088D0320623399 | ||
28 | + * </pre> | ||
29 | + * | ||
30 | + * @throws Exception | ||
31 | + */ | ||
32 | + @Test | ||
33 | + public void testDecodeDeviceReportData() throws Exception { | ||
34 | + byte[] deviceReqByte = initDeviceReqByte(); | ||
35 | + ObjectNode objectNode = protocolAdapter.decode(deviceReqByte); | ||
36 | + String str = objectNode.toString(); | ||
37 | + System.out.println(str); | ||
38 | + } | ||
39 | + | ||
40 | + public static void main(String[] args) throws Exception { | ||
41 | + IProtocolAdapter protocolAdapter = new ProtocolAdapterImpl(); | ||
42 | + byte[] deviceReqByte = initDeviceReqByte(); | ||
43 | + ObjectNode cloudRspObjectNode = initCloudRspObjectNode(deviceReqByte); | ||
44 | + byte[] outputByte2 = protocolAdapter.encode(cloudRspObjectNode); | ||
45 | + System.out.println("cloudRsp output:" + parseByte2HexStr(outputByte2)); | ||
46 | + } | ||
47 | + | ||
48 | + /** | ||
49 | + * 测试用例2:平台向设备下发控制命令: | ||
50 | + * <p> | ||
51 | + * <pre> | ||
52 | + * { | ||
53 | + * //"identifier": "123", | ||
54 | + * "msgType": "cloudReq", | ||
55 | + * "cmd": "SET_DEVICE_LEVEL", | ||
56 | + * "mid": 2016, | ||
57 | + * "paras": { "value": "10" }, | ||
58 | + * "hasMore": 0 | ||
59 | + * } | ||
60 | + * </pre> | ||
61 | + */ | ||
62 | + @Test | ||
63 | + public void testEncodeIoTSendCommand() throws Exception { | ||
64 | + ObjectNode CloudReqObjectNode = initCloudReqObjectNode(); | ||
65 | + byte[] outputByte = protocolAdapter.encode(CloudReqObjectNode); | ||
66 | + System.out.println("cloudReq output:" + parseByte2HexStr(outputByte)); | ||
67 | + } | ||
68 | + | ||
69 | + /** | ||
70 | + * 测试用例3:设备对平台命令的应答消息 有命令短id | ||
71 | + * <p> | ||
72 | + * <pre> | ||
73 | + * 设备应答消息:AA7201000107E0 | ||
74 | + * | ||
75 | + * <pre> | ||
76 | + * | ||
77 | + * @throws Exception | ||
78 | + */ | ||
79 | + @Test | ||
80 | + public void testDecodeDeviceResponseIoT() throws Exception { | ||
81 | + byte[] deviceRspByte = initDeviceRspByte(); | ||
82 | + ObjectNode objectNode = protocolAdapter.decode(deviceRspByte); | ||
83 | + String str = objectNode.toString(); | ||
84 | + System.out.println(str); | ||
85 | + } | ||
86 | + | ||
87 | + /** | ||
88 | + * 测试用例4:平台收到设备的上报数据后对设备的应答,如果不需要应答则返回null即可 | ||
89 | + * <pre> | ||
90 | + * { | ||
91 | + * "identifier": "0", | ||
92 | + * "msgType": "cloudRsp", | ||
93 | + * "request": [AA,72,00,00,32,08,8D,03,20,62,33,99], | ||
94 | + * "errcode": 0, | ||
95 | + * "hasMore": 0 | ||
96 | + * } | ||
97 | + * | ||
98 | + * <pre> | ||
99 | + * | ||
100 | + * @throws Exception | ||
101 | + */ | ||
102 | + @Test | ||
103 | + public void testEncodeIoTResponseDevice() throws Exception { | ||
104 | + byte[] deviceReqByte = initDeviceReqByte(); | ||
105 | + ObjectNode cloudRspObjectNode = initCloudRspObjectNode(deviceReqByte); | ||
106 | + byte[] outputByte2 = protocolAdapter.encode(cloudRspObjectNode); | ||
107 | + System.out.println("cloudRsp output:" + parseByte2HexStr(outputByte2)); | ||
108 | + } | ||
109 | + | ||
110 | + public static String parseByte2HexStr(byte[] buf) { | ||
111 | + if (null == buf) { | ||
112 | + return null; | ||
113 | + } | ||
114 | + | ||
115 | + StringBuffer sb = new StringBuffer(); | ||
116 | + for (int i = 0; i < buf.length; i++) { | ||
117 | + String hex = Integer.toHexString(buf[i] & 0xFF); | ||
118 | + if (hex.length() == 1) { | ||
119 | + hex = '0' + hex; | ||
120 | + } | ||
121 | + sb.append(hex.toUpperCase()); | ||
122 | + } | ||
123 | + return sb.toString(); | ||
124 | + } | ||
125 | + | ||
126 | + /* | ||
127 | + * 初始化:设备数据上报码流 | ||
128 | + */ | ||
129 | + private static byte[] initDeviceReqByte() { | ||
130 | + /** | ||
131 | + * 本例入参: 57 58 48 53 50 5F 4D 44 21 00 00 00 00 5A 9E 68 42 01 00 01 0B B8 | ||
132 | + 01 13 1D B1 12 00 14 00 1E 00 0F 04 00 00 01 00 00 02 00 05 00 0A 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 27 8F | ||
133 | + */ | ||
134 | + byte[] byteDeviceReq = new byte[60]; | ||
135 | + | ||
136 | + | ||
137 | + | ||
138 | + byteDeviceReq[0] = (byte) 0x57; | ||
139 | + byteDeviceReq[1] = (byte) 0x58; | ||
140 | + byteDeviceReq[2] = (byte) 0x48; | ||
141 | + byteDeviceReq[3] = (byte) 0x53; | ||
142 | + | ||
143 | + byteDeviceReq[4] = (byte) 0x50; | ||
144 | + byteDeviceReq[5] = (byte) 0x5F; | ||
145 | + byteDeviceReq[6] = (byte) 0x4D; | ||
146 | + byteDeviceReq[7] = (byte) 0x44; | ||
147 | + | ||
148 | + byteDeviceReq[8] = (byte) 0x21; | ||
149 | + | ||
150 | + byteDeviceReq[9] = (byte) 0x00; | ||
151 | + | ||
152 | + byteDeviceReq[10] = (byte) 0x00; | ||
153 | + byteDeviceReq[11] = (byte) 0x00; | ||
154 | + byteDeviceReq[12] = (byte) 0x00; | ||
155 | + | ||
156 | + byteDeviceReq[13] = (byte) 0x5A; | ||
157 | + byteDeviceReq[14] = (byte) 0x9E; | ||
158 | + byteDeviceReq[15] = (byte) 0x68; | ||
159 | + byteDeviceReq[16] = (byte) 0x42; | ||
160 | + byteDeviceReq[17] = (byte) 0x01; | ||
161 | + | ||
162 | + byteDeviceReq[18] = (byte) 0x00; | ||
163 | + byteDeviceReq[19] = (byte) 0x01; | ||
164 | + byteDeviceReq[20] = (byte) 0x0B; | ||
165 | + byteDeviceReq[21] = (byte) 0xB8; | ||
166 | + byteDeviceReq[22] = (byte) 0x01; | ||
167 | + byteDeviceReq[23] = (byte) 0x13; | ||
168 | + byteDeviceReq[24] = (byte) 0x1D; | ||
169 | + byteDeviceReq[25] = (byte) 0xB1; | ||
170 | + byteDeviceReq[26] = (byte) 0x12; | ||
171 | + byteDeviceReq[27] = (byte) 0x00; | ||
172 | + byteDeviceReq[28] = (byte) 0x14; | ||
173 | + byteDeviceReq[29] = (byte) 0x00; | ||
174 | + byteDeviceReq[30] = (byte) 0x1E; | ||
175 | + byteDeviceReq[31] = (byte) 0x00; | ||
176 | + byteDeviceReq[32] = (byte) 0x0F; | ||
177 | + | ||
178 | + byteDeviceReq[33] = (byte) 0x04; | ||
179 | + byteDeviceReq[34] = (byte) 0x00; | ||
180 | + byteDeviceReq[35] = (byte) 0x00; | ||
181 | + byteDeviceReq[36] = (byte) 0x01; | ||
182 | + byteDeviceReq[37] = (byte) 0x00; | ||
183 | + byteDeviceReq[38] = (byte) 0x00; | ||
184 | + byteDeviceReq[39] = (byte) 0x02; | ||
185 | + byteDeviceReq[40] = (byte) 0x00; | ||
186 | + byteDeviceReq[41] = (byte) 0x05; | ||
187 | + byteDeviceReq[42] = (byte) 0x00; | ||
188 | + byteDeviceReq[43] = (byte) 0x0A; | ||
189 | + byteDeviceReq[44] = (byte) 0x00; | ||
190 | + byteDeviceReq[45] = (byte) 0x0F; | ||
191 | + byteDeviceReq[46] = (byte) 0x00; | ||
192 | + byteDeviceReq[47] = (byte) 0x00; | ||
193 | + byteDeviceReq[48] = (byte) 0x00; | ||
194 | + byteDeviceReq[49] = (byte) 0x00; | ||
195 | + byteDeviceReq[50] = (byte) 0x00; | ||
196 | + byteDeviceReq[51] = (byte) 0x00; | ||
197 | + byteDeviceReq[52] = (byte) 0x00; | ||
198 | + byteDeviceReq[53] = (byte) 0x00; | ||
199 | + byteDeviceReq[54] = (byte) 0x00; | ||
200 | + byteDeviceReq[55] = (byte) 0x00; | ||
201 | + byteDeviceReq[56] = (byte) 0x00; | ||
202 | + byteDeviceReq[57] = (byte) 0x00; | ||
203 | + byteDeviceReq[58] = (byte) 0x27; | ||
204 | + byteDeviceReq[59] = (byte) 0x8F; | ||
205 | + | ||
206 | + | ||
207 | + | ||
208 | + return byteDeviceReq; | ||
209 | + } | ||
210 | + | ||
211 | + /* | ||
212 | + * 初始化:平台向设备命令下发数据 | ||
213 | + */ | ||
214 | + private static ObjectNode initCloudReqObjectNode() { | ||
215 | + ObjectMapper mapper = new ObjectMapper(); | ||
216 | + ObjectNode cloudReqObjectNode = mapper.createObjectNode(); | ||
217 | + ObjectNode paras = mapper.createObjectNode(); | ||
218 | + paras.put("value", "10"); | ||
219 | + cloudReqObjectNode.put("identifier", "123"); | ||
220 | + cloudReqObjectNode.put("msgType", "cloudReq"); | ||
221 | + cloudReqObjectNode.put("cmd", "SET_DEVICE_LEVEL"); | ||
222 | + cloudReqObjectNode.put("paras", paras); | ||
223 | + cloudReqObjectNode.put("hasMore", 0); | ||
224 | + cloudReqObjectNode.put("mid", 2016); | ||
225 | + return cloudReqObjectNode; | ||
226 | + } | ||
227 | + | ||
228 | + /* | ||
229 | + * 初始化:设备对平台的响应码流 | ||
230 | + */ | ||
231 | + private static byte[] initDeviceRspByte() { | ||
232 | + /* | ||
233 | + * 测试用例:有命令短mid 设备应答消息:AA7201000107E0 | ||
234 | + */ | ||
235 | + byte[] byteDeviceRsp = new byte[12]; | ||
236 | + byteDeviceRsp[0] = (byte) 0xAA; | ||
237 | + byteDeviceRsp[1] = (byte) 0x72; | ||
238 | + byteDeviceRsp[2] = (byte) 0x01; | ||
239 | + byteDeviceRsp[3] = (byte) 0x00; | ||
240 | + byteDeviceRsp[4] = (byte) 0x01; | ||
241 | + byteDeviceRsp[5] = (byte) 0x07; | ||
242 | + byteDeviceRsp[6] = (byte) 0xE0; | ||
243 | + return byteDeviceRsp; | ||
244 | + } | ||
245 | + | ||
246 | + /* | ||
247 | + * 初始化:平台对设备的应答数据 | ||
248 | + */ | ||
249 | + private static ObjectNode initCloudRspObjectNode(byte[] device2CloudByte) { | ||
250 | + | ||
251 | + ObjectMapper mapper = new ObjectMapper(); | ||
252 | + ObjectNode cloudRspObjectNode = mapper.createObjectNode(); | ||
253 | + cloudRspObjectNode.put("msgType", "cloudRsp"); | ||
254 | + // 设备上报的码流 | ||
255 | + cloudRspObjectNode.put("request", device2CloudByte); | ||
256 | + cloudRspObjectNode.put("errcode", 0); | ||
257 | + cloudRspObjectNode.put("hasMore", 0); | ||
258 | + return cloudRspObjectNode; | ||
259 | + } | ||
260 | +} |