假如给你一个硬件设备,在没有文档、没有前开发人员的情况下,你会怎么处理?

是的,在前些天我经历了这么一次,下面会将我自己处理这件工作的整个流程给记载下来。

当接到这个需求的时候,咱们的反响应该都是一样的,首先是张嘴就来:“有文档吗?”。

嘿,巧了,没有。不过没关系,咱能够先自己研究一下,至少咱得知道终究目的是什么。

咱们现在有两个设备,分别是蓝牙心率手环和蓝牙网关,需求做的工作也很简单,便是将手环的各项目标存入数据库。听起来是不是很简单,那咱就开始吧。

只给一个硬件设备你会怎么做?

文档

首先没有文档那咱就找文档呗,我是先在硬件设备上寻找厂家 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 主动生成)