差不多就是10进制转16进制
命令前缀 | 指令 | 应答号 | 终端标识 | 访问密码 | 2b | 8b | 2b | 4b | 2b |
直接说吧
命令前缀 2B | 固定为2字节:0x9AA9 | 控制指令 8B |
指令类型 | 组播地址 | 目的端口号 | 控制字节 | 1b | 4b | 2b | 1b |
| 应答号 2B | 0表示不需芯片应答,非0表示需要芯片收到指令后做应答,取值为1到65535循环递增 | 终端标识 4B | 可设置0或唯一编号 | 访问密码 2B | 省为芯片ID号低16位(测试板取0) |
详细说说控制指令
指令类型 1B | 固定:0x20 | 组播地址 4B | 例如 224.0.1.10要将其拆分成 224+000+001+010,分别转换为16进制,如:e0+00+01+0a就是:0xE000010A 表示 | 目的端口号 2B | 十进制 49156? (转)十六? 0xC004 | 控制字节 1B | bit0为1, bit4~2:取值0到7,用于流量控制,表示千兆输出最高突发速率,其中0约44Mbps,依次减半, 22M,10M,5M,2.5M,1.25M. ?6表示54M, 7表示极速。 |
由于,两个十六进制为等于1个字节,我可以归纳如下示例报文,可以这么写,具体根据自己实际需求来写
命令前缀 | 指令 | 应答号 | 终端标识 | 访问密码 | 9AA9 | 20E000010AC00403 | 0001 | 00000000 | 0000 |
命令前缀 | 指令 | 应答号 | 终端标识 | 访问密码 | 9AA9 | 20ee01ee01138903 | 0000 | 00000000 | 0000 | |
指令类型 | 组播地址 | 目的端口号 | 控制字节 | 20 | ee01ee01 | 1389 | 03 |
| | | |
ee01ee01 - >238.1.238.1
1389 - > 5001
转换成byte发送:9AA920ee01ee011389030000000000000000
目的ip:192.168.200.211
目的端口:65530
将字符串分割转换成byte数组【十分重要】?
public static byte[] hex2Bytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
int length = hexString.length() / 2;
char[] hexChars = hexString.toCharArray();
byte[] bytes = new byte[length];
String hexDigits = "0123456789abcdef";
for (int i = 0; i < length; i++) {
int pos = i * 2; // 两个字符对应一个byte
int h = hexDigits.indexOf(hexChars[pos]) << 4; // 注1
int l = hexDigits.indexOf(hexChars[pos + 1]); // 注2
if(h == -1 || l == -1) { // 非16进制字符
return null;
}
bytes[i] = (byte) (h | l);
}
return bytes;
}
|