BLE(Bluetooth Low Energy)

不知道从哪一年开始,BLE突然火了起来,可能是苹果推动的iBeacon,推了BLE一把吧

BLE模块越做越小,越做越省点,于是他们就纷纷往智能硬件上面去集成了,比如说什么手环啊,码表啊,门锁,窗帘啊,灯啊,炫轮啊,之类的.

How does it work

这里不是说BLE在底层如何工作,只是从上层软件开发的角度,讲讲BLE怎么工作

BLE必须提到的几个名词

  1. peripheral
  2. central
  3. service
  4. characteristic
  5. UUID

Peripheral

传说中的外设,也就是那些个手环啊,码表啊,炫轮啊之类的东西,他们在不停地广播自己存在的信号,可以让别人知道自己存在,自己的名字,自己有些什么Service.别人也可以根据这个广播计算以下RSSI(信号强度)

Central

暂且叫他主机吧,因为在定义中,并不是叫Peripheral和Central,而是Master和Slave(太难听了,还是使用iOS中的外设中心吧).

Central可以接收到广播帧,并且知道它的Mac地址啊,拥有哪些Service啊,名字啊……

Service

服务,假设一个蓝牙可以提供很多信息,比如说,电量啊,心率啊,速度啊,还有自定义的一些数据.如果通过数据帧头来区分他们,会非常的麻烦.所以BLE有Service这个概念,一个Service负责一件事情,清晰明了.

Characteristic

特征值,每个服务可以拥有多个特征值,每个特征值都有权限,比如Read,Write,Write Without Response,Notify……

UUID

好吧,这么多东西,怎么标示嘞?用UUID咯…

BLE有专用UUID是16位的,然而标准的UUID是128位的.

总结一下

每一个外设(Peripheral)可以拥有很多的服务(Service),每一个服务(Service)可以拥有多个特征值(Characteristic),使用UUID来确定Service和Characteristic.

说说公有协议

由于BLE的Service和Characteristic的UUID是16位的,那就说有很多很多很多的UUID可以被定义.选择太多,就容易出乱子.所以大概是IEEE还是IEC还是SIG之类的组织专门定了一大堆公有协议

这个链接里面的Service是他们定的,貌似已经被大家接受了.

速度和踏频

为什么只说速度与踏频的公有协议呢?

因为我们刚好在做这个……

Service UUID: 0x1816
Characteristic UUID: 0x2A5B (至少得有Notify,Read权限)

有了这两个东西,你的App或者其他智能硬件就可以进行过滤扫描和连接了

具体协议

Flag(必须):8位
    0x01==(速度数据)
    0x02==(踏频数据)
    0x03= (速度数据+踏频数据)
速度数据:
    32位:累计轮胎圈数[溢出清零]
    16位:时间(精确到1/1024秒)[溢出清零]
踏频数据:
    16位:累计曲柄圈数[溢出清零]
    16位:时间(精确到1/1024秒)[溢出清零]

举个例子

轮子在3.7353秒转动了103圈,曲柄在54.1093秒转动了202

03 67 00 00 00 f1 0e 00 ca d8 70