单/组播601芯片请流报文

2022年2月23日补充

这个udp请流折磨了我两天

我一开始就认为udp只有广播来着,随着深入的了解,发现居然还有单播,多播(组播)

上午时间,我一直傻不垃圾的用广播去请流,还在质疑我是不是广播的代码写出bug了,谁知道这个广播ip是唯一的,255.255.255.255,就是对该网段的全部设备发送广播,关键是还指定不了

然后就摸到了单播组播两种方式,组播限定的目的端口是224.0.0.0-239.255.255.255

单播的ip好像可以指定,我就用的单播来请流,请流还算顺利,但奇怪的是是从组播那边返回来的

我就纳闷了,不可科学啊,代码在这里

android:Udp广播/单播/组播的实现_谢桥的博客-CSDN博客广播public class MainActivity extends AppCompatActivity { private Button sub_btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main5);https://blog.csdn.net/title71/article/details/123088143

—————————————————我是分割线————————————————

差不多就是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; // 两个字符对应一个byteint h = hexDigits.indexOf(hexChars[pos]) << 4; // 注1int l = hexDigits.indexOf(hexChars[pos + 1]); // 注2if(h == -1 || l == -1) { // 非16进制字符return null;}bytes[i] = (byte) (h | l);}return bytes;}