假如给你一个硬件设备,在没有文档、没有前开发人员的情况下,你会怎么处理?
是的,在前些天我经历了这么一次,下面会将我自己处理这件工作的整个流程给记载下来。
当接到这个需求的时候,咱们的反响应该都是一样的,首先是张嘴就来:“有文档吗?”。
嘿,巧了,没有。不过没关系,咱能够先自己研究一下,至少咱得知道终究目的是什么。
咱们现在有两个设备,分别是蓝牙心率手环和蓝牙网关,需求做的工作也很简单,便是将手环的各项目标存入数据库。听起来是不是很简单,那咱就开始吧。
文档
首先没有文档那咱就找文档呗,我是先在硬件设备上寻找厂家 Logo,尽管已经被划掉了,但是仍是能看到一些信息,比如厂家的名称,然后在某度查找厂家的名称,找到了厂家的官网。
咱们点开 Introduction 后了解到这个手环的类型是 Imyfit C5
,这是一项很大的收获。
咱继续在官网中寻找看到了 Download 菜单,正当我以为这样就结束了的时候,我发现厂家的官网上并没有供给任何的文档(供给了文档下载页面但下载地址并没有),这下我就懵了,我该怎么办呢?
我抄起键盘便是一顿咔咔乱打给厂家发一份邮件,说了一堆我想要的东西,然后就等候回复了。
这时候我想到了全能的淘宝,所以我翻开我的App直接查找关键字,结果是什么鬼啥也没有啥也不是(这儿其实写这篇记载的时候我又查找了一次点开了商家tab是找到了,但给客服发送音讯并没有得到回复)
尽管没有得到回复,但是我仍是继续测验在百度查找。
功夫不负有心人,居然找到了官方文档,咱便是说,这个东西就不能链接在官网里吗。
这下好了,一顿翻阅后,找到了咱们需求的东西: 物联网网关接口。
点开文档后咱们就能够看到网关的接口文档了,所以我就跟着文档一步一步的操作,这儿就成功的将网关的MQTT客户端装备好了。
数据上报
到目前为止咱们的网关已经装备好了,接下来便是将手环的数据上报到网关,然后网关再将数据上报到咱们的服务器。
这儿因为我在前面踩了个坑,运用 Mistep App 连接手环过手环,导致手环的数据播送并没有生效,一顿折腾自己的 MQTT 环境却没发现问题,
但是呢,到了下班点我仍是得下班的,有什么工作睡一觉再说。
第二天我突然想到了 Mistep 这件事,我测验解除绑定后再测试数据播送。
嘿,还真成功了。(看吧,没有什么工作是睡一觉解决不了的)
咱们用一个客户端去订阅一下音讯看看吧
数据大约便是这个姿态吧,咱们首要关注的便是pack
字段,它便是咱们手环上报过来的16进制数据。
协议解析
这儿就来到了紧张又刺激的编码环节了。
还记得上面咱们找到的文档吗?里面有一个 “终端局域播送接口 -> 蓝牙终端惯例播送API“ 文档。
看到这么多协议,咱们到底应该运用哪一个呢?
还记得前面咱们翻开的 Introduction 吗?里面是不是有一个设备类型 C5
呢?
那好,那就试试 终端C5/C5S 这个协议吧。
依据图中的表格咱们能够知道每个字节对应的音讯类型,
然后咱们就能够依据这个表格来解析咱们的数据了。
(但是我没有看懂”5|bit6“是什么意思,不过没关系咱用不上这个数据)
直接上中心代码
// 将16进制数据包转换为字节数组
byte[] bytes = ByteBufUtil.decodeHexDump("578B000000FF00000000049D67356450003357");
System.out.println(bytes.length);
// 运用 Netty 的 ByteBuf 来读取数据
ByteBuf buf = Unpooled.wrappedBuffer(bytes);
System.out.println("1-心率值: " + buf.readUnsignedByte());
System.out.println("2-4-步数低字节: " + buf.readMediumLE());
System.out.println("5-动态状态: " + buf.readByte());
System.out.println("6-睡眠状态: " + buf.readUnsignedByte());
System.out.println("7-血压舒张压: " + buf.readUnsignedByte());
System.out.println("8-血压收缩压: " + buf.readUnsignedByte());
System.out.println("9-血氧: " + buf.readUnsignedByte());
System.out.println("10-保存: " + buf.readUnsignedByte());
System.out.println("11-播送版本: " + buf.readUnsignedByte());
System.out.println("12-15-UTC: " + buf.readIntLE());
System.out.println("16-静息心率: " + buf.readUnsignedByte());
System.out.println("17-保存: " + buf.readUnsignedByte());
System.out.println("18-电池电量: " + buf.readUnsignedByte());
System.out.println("19-异或校验值: " + buf.readUnsignedByte());
总结
咱们能够看到,编码环节其实只占用了很小的一部分,大部分时间都在为历史原因此折腾,
所以咱们在编码环节尽可能的保存开发文档,给后人削减一些困难。
这儿我想说的是,假如你在做一个项目的时候,遇到了一些问题,不要着急,
先把问题记载下来,然后再去解决,这样你就能够把时间花在更重要的工作上。
(此段来自 Github Copilot 主动生成)