栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android与单片机---开发板---智能硬件---智能设备---数据协议--开发总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android与单片机---开发板---智能硬件---智能设备---数据协议--开发总结

  • 既然把byte转为了8个bit位,那我们又怎么再把bit转回为byte呢?


public static byte bit2Byte(byte[] bytes) {
if (bytes.length != 8) return 0;
String binary = “”;
byte result;
for (byte b : bytes) {
binary += b;
}
if (bytes[0] == 0) {
// 正数
result = (byte) Integer.parseInt(binary, 2);
} else {
// 负数
result = (byte) (Integer.parseInt(binary, 2) - 256);
}
return result;
} 3.2 上面已经说了byte与bit的相互转化,现在就轮到int了

  • 上面已经说了一个int占4个字节32个bit
  • Integer类已经为我们封装好了转bit的方法,如下:

String s = Integer.toBinaryString(35235);
//输出结果
1000100110100011

  • 可以看到没有32位,这是为什么呢?这是因为高位都是为0所以就直接省略了,当然我们也可以主动补齐32位只需要在高位补0即可。
  • bit再转回为int

int result = Integer.parseInt(“1000100110100011”, 2);
//输出结果
35235

  • 这里需要注意的是Integer.toBinaryString()可以将负数转化为二进制,但是Integer.parseInt("", 2)不能直接将负数的二进制转为int,如下:

String radix = Integer.toBinaryString(-35235);
System.out.println(radix);
int result = Integer.parseInt(radix, 2);
System.out.println(result);

程序执行会报一个java.lang.NumberFormatException: For input string:"11111111111111110111011001011101"异常,那我们怎么将负数的转回为int呢?当然是有方法的啦,如下:

//需要借助 BigInteger类
String radix = Integer.toBinaryString(-3535);
BigInteger integer = new BigInteger(radix, 2);
System.out.println(integer.intValue());
//输出结果
-3535

3.3当然我们可以通过电脑的计算器来计算二进制

3.4 上面我们说了一个int占32个字节也就是4个byte,那理所当然一个int可以转成2个byte或者4个byte,如下:


public static byte[] intTo2Bytes(int value) {
byte[] src = new byte[2];
src[0] = (byte) (value & 0xFF);
src[1] = (byte) ((value >> 8) & 0xFF);
return src;
}


public static byte[] intTo4Bytes(int value) {
byte[] src = new byte[4];
src[0] = (byte) (value & 0xFF);
src[1] = (byte) ((value >> 8) & 0xFF);
src[2] = (byte) ((value >> 16) & 0xFF);
src[3] = (byte) ((value >> 24) & 0xFF);
return src;
}

这里需要注意的是int转byte[]的时候是高位在数组的0下标 还是低位在数组的0下标,上面的两个方法都是低位在数组的0下标

四、上面bb了一大堆,现在我们通过一个具体的协议来深入了解这些内容 4.1 协议如下:

这里需要解释下uchar、uint是什么意思?uchar = unsigned char 、uint = unsigned int,也就是无符号的数据,也就是表示了这个数据是正数

  • 1、对协议进行分析可以得知:整个数据包是由两部分组成的包头+扩展数据包,其中包头占固定的32个字节
  • 2、首先我们得分析包头里面的每一个字段所占了多少个字节
  • uchar 占1个字节
  • uint 占4个字节
  • 2、那我们重点就是得来分析包头的数据需要怎么封装,通过协议我们可以看出包头内一共包含6个字段,分别表示如下:
  • 第一个为固定的"DH",总共占2个字节
  • 第二个为版本1.0 ,总共占2个字节
  • 第三个为扩展数据长度"extlen" ,总共占4个字节
  • 第四个为扩展数据类型取值0或1 ,总共占1个字节
  • 第五个为保留字段不使用就0补齐,总共占3个字节
  • 第六个为保留字段不使用就0补齐,总共占20个字节
  • 3、通过上面一顿分析,我们就轻松的理清了每个字段所占的字节了
4.2 Talk is cheap. Show me the code.

//magic
byte[] magicB = {‘D’, ‘H’};
//协议版本1.0转成int也就是1
byte[] versionB =

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

开源分享完整内容戳这里

{0, 1};
//扩展数据长度,这里假定扩展数据的长度为67
byte[] extLenB = intTo4Bytes(67);
//扩展数据类型 0:JSON、1:二进制数据;这里使用JSON
byte[] extType = {0};
//两个保留字段,直接0补齐,上面已经分析了两个字段一共占23个字节
byte[] reserved = new byte[23];
//这里将上面的多个数据合并至一个byte[]
byte[] data = byteMergerAll(magicB, versionB, extLenB, extType, reserved);

到这里包头的数据就已经处理好了,还可以进一步对它进行封装

  • 这里提供一个多个数据数组合并的工具方法


public static byte[] byteMergerAll(byte[]… bytes) {
int allLength = 0;
for (byte[] b : bytes) {
allLength += b.length;
}
byte[] allByte = new byte[allLength];
int countLength = 0;
for (byte[] b : bytes) {
System.arraycopy(b, 0, allByte, countLength, b.length);
countLength += b.length;
}
return allByte;
} 4.3 封装包头数据


public static byte[] getPkgHead(int extLen) {
//magic
byte[] magicB = {‘D’, ‘H’};
//协议版本1.0转成int也就是1
byte[] versionB = {0, 1};
//扩展数据长度,这里假定扩展数据的长度为67
byte[] extLenB = intTo4Bytes(extLen);
//扩展数据类型 0:JSON、1:二进制数据;这里使用JSON
byte[] extType = {0};
//两个保留字段,直接0补齐,上面已经分析了两个字段一共占23个字节
byte[] reserved = new byte[23];
//这里将上面的多个数据合并至一个byte[]
return byteMergerAll(magicB, versionB, extLenB, extType, reserved);
} 4.4上面已经把包头处理好了那现在就可以发送命令了

//扩展数据:这里就需要根据实际的文档来生成了,我这里就随便写一个了
String extData = “{“id”:12,“cmd”:“open”}”;
byte[] extDataB = extData.getBytes();
//获取包头
byte[] pkgHead = getPkgHead(extDataB.length);
//一个完整的数据包
byte[] sendData = byteMergerAll(pkgHead, extDataB);

到这里一个完整的数据包就愉快的结束了也就实现了与设备的通信了;重点:以后再拿到一个协议首先研究一下由多少个部分组成,每个组成的部分占多少个字节,是高位到低位还是低位到高位

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

需要展开的架构学习笔记导图的加群免费获取 Android架构设计大群(185873940)

PS:群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~
希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

需要展开的架构学习笔记导图的加群免费获取 Android架构设计大群(185873940)

[外链图片转存中…(img-M9aBLo8f-1637300441936)]

PS:群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/572908.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号