目录
一、 文件结构
Global.java文件中很杂,这是个囊括了BLE和WiFi全部实验用到的所有常量的文件。
我将其分为四块:
—三个UUID。 (进行蓝牙通信时用到)
—节点控制命令READ_****_SENSOR (命令相应节点进行工作)
—名字。 毫无用处
—WiFi节点IP地址以及端口号port:4001 (进行WiFi通信时用到)
二、 UUID及其延伸
下面只重点介绍三个UUID以及他们背后的知识。
至于节点控制命令和WiFi_IP地址这些死记硬背的东西在附件里面都有,不再赘述。
//大赛蓝牙服务:
①public static final String UUID_DS_SERVICE = "0000fff0-0000-1000-8000-00805f9b34fb";
//大赛蓝牙特征
②public static final String UUID_DS_CHARACTERISTIC = "0000fff6-0000-1000-8000-00805f9b34fb";
//大赛特征描述
③public static final String UUID_DS_DESCRIPTOR = "00002902-0000-1000-8000-00805f9b34fb";
想要了解上面三个UUID得从整个低功耗蓝牙BLE的工作流程来。通过上面的UUID我们可以提取三个关键词:Service、Characteristic、Descriptor。那这三个有什么关系呢?
1.BLE协议栈分析
我们只需了解红框中的部分即可,剩下的在D平台的比赛中涉及不到。
2. 通信结构:client/server(C/S) 架构
客户端要访问某一个数据,就发送一个request/请求(其实就是一条命令),服务端再把相应的数据返回给客户端,这就是C/S架构。
以蓝牙温湿度节点实验为例子,实验箱的蓝牙温湿度节点就是Server,我们的phone或者Pad就是Client。Client发送请求温湿度数据的指令,温湿度节点返回相应数据。
服务是以数据为载体的,所以说server提供服务其实就是提供各种有价值的数据。
3.GATT简介
低功耗蓝牙BLE实际上是建立在GATT数据通信协议之上的。GATT全称Generic Attribute Profile(直译即:通用属性协议),是一个在蓝牙连接之上的发送和接收较短的数据段的通用规范,这些很短的数据段被称为属性/句柄(Attribute)。
GATT层定义了使用 ATT (数据交互协议)的服务框架和配置文件(profiles)的结构,是将ATT封装后的对外接口。BLE 中所有的数据通信都需要经过 GATT,GATT负责处理向上与应用打交道。
Service、Characteristic、Descriptor三者的关系如下图所示。
- 每个GATT由完成不同功能的Service组成;
- 每个Service由不同的Characteristic组成;
- 每个Characteristic由一个value和一个或者多个Descriptor组成;而value才真正的包含数据,Descriptor是对这个value进行的说明和描述,当然我们可以从不同角度来描述和说明,因此可以有多个Descriptor。
4.UUID通用唯一识别码
上面那么些Service、Characteristic、Descriptor,我用的时候得找到才行,这就用到了UUID。
1. Service 的UUID:用来表示蓝牙设备(在实验中为节点)所提供的服务。设备中每一个不同的 Service 都有一个 128 bit 的 UUID 作为这个 Service 的独立标志。
Base_UUID的值为: 00000000-0000-1000-8000-00805F9B34FB。
一个蓝牙设备可以提供多种服务,比如蓝牙音频传输等,每个服务都对应一个UUID,其中在蓝牙协议栈里,这些默认提供的profile都是有对应的UUID的,也就是默认UUID。就比如UUID_DS_CHARACTERISTIC的那个字段就是最著名的UUID,用于串口通信。
我们可以使用自己生成的UUID来连接,别人的UUID对不上是无法进行连接的,我们也无法连接上别人的设备,要是懒的自定义就用默认的,当然这样可能会发生误连
这里给出的三个大赛UUID作用就是让我们扫描连接蓝牙的时候只出现实验箱的蓝牙节点,其他设备(参赛选手的手机电脑)的蓝牙通通过滤掉,防止干扰我们的实验。这三个UUID已经是实验箱节点固件里已经烧好的,我们只需程序中也用使用同样的UUID便可建立与实验箱节点的连接。2. 每一个 Characteristic 也有一个唯一的 UUID 作为标识符
举一个简单的例子进行说明:常见的小米手环是一个BLE设备,假设它包含三个Service,分别是提供设备信息的Service、提供步数的Service、检测心率的Service;设备信息的service中包含的characteristic包括厂商信息、硬件信息、版本信息等;心率Service则包括心率characteristic等,心率characteristic中的value则真正的包含心率的数据,而descriptor则是对该value的描述说明,比如value的单位啊,描述啊,R/W权限等。
看下面的代码,就是一个外设提供的诸多服务的UUID。
public class BleConstant {
/**
* 服务 UUID
*/
public static final String SERVICE_UUID = "0000ff01-0000-1000-8000-00805f9b34fb";
/**
* 特性写入 UUID
*/
public static final String CHARACTERISTIC_WRITE_UUID = "0000ff02-0000-1000-8000-00805f9b34fb";
/**
* 特性读取 UUID
*/
public static final String CHARACTERISTIC_READ_UUID = "0000ff10-0000-1000-8000-00805f9b34fb";
/**
* 描述 UUID
*/
public static final String DESCRIPTOR_UUID = "00002902-0000-1000-8000-00805f9b34fb";
/**
* 电池服务 UUID
*/
public static final String BATTERY_SERVICE_UUID = "0000180f-0000-1000-8000-00805f9b34fb";
/**
* 电池特征(特性)读取 UUID
*/
public static final String BATTERY_CHARACTERISTIC_READ_UUID = "00002a19-0000-1000-8000-00805f9b34fb";
/**
* OTA服务 UUID
*/
public static final String OTA_SERVICE_UUID = "5833ff01-9b8b-5191-6142-22a4536ef123";
/**
* OTA特征(特性)写入 UUID
*/
public static final String OTA_CHARACTERISTIC_WRITE_UUID = "5833ff02-9b8b-5191-6142-22a4536ef123";
/**
* OTA特征(特性)表示 UUID
*/
public static final String OTA_CHARACTERISTIC_INDICATE_UUID = "5833ff03-9b8b-5191-6142-22a4536ef123";
/**
* OTA数据特征(特性)写入 UUID
*/
public static final String OTA_DATA_CHARACTERISTIC_WRITE_UUID = "5833ff04-9b8b-5191-6142-22a4536ef123";
}
大概知识就介绍到此,具体如何用程序实现BLE通信,参考如下这篇blog
(48条消息) EXPT_1:E1BleTemperatureNodeActivity_why you learn hard?的博客-CSDN博客