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 |
|
||||||||
|
应答号 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 | ||||||||
|
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;}