阅读时长10分钟
蓝牙技术是一种近距离无线连接技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。
历史
:蓝牙技术是世界著名的 5 家大公司一爱立信(Ericsson)、诺基亚(Nokia)、东芝(Toshiba)、国际商用机器公司(IBM)和英特尔(Intel),于 1998 年 5 月联合宣布的一种无线通信新技术。蓝牙设备是蓝牙技术应用的主要载体,,常见蓝牙设备比如电脑、手机,平板等。
原理
: 蓝牙是通过发送频率为 2.4GHZ 的 ISM 波段的电磁波来在主设备与从通信之间通信。
系统组成
:蓝牙技术系统中的底层硬件模块由基带、跳频和链路管理。其中,基带是完成蓝牙数据和跳频的传输。无线调频层是不需要授权的通过 2.4GHz ISM 频段的微波,数据流传输和过滤就是在无线调频层实现的,主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。链路管理实现了链路建立、连接和拆除的安全控制。
通信方式
:支持蓝牙技术的主设备与从设备,他们之间是通过协议
来互相交换数据。协议
类似于两个美国人交流使用英语,两个日本人交流使用日语, 两条狗交流使用狗叫。
蓝牙模式
:在蓝牙 1.0,蓝牙 2.0,蓝牙 3.0 技术的不停迭代过程中,蓝牙 4.0 将蓝牙分为了两种模式:单模蓝牙(又叫做低功耗蓝牙)
和双模蓝牙
.直到发展到今天的蓝牙 5.0(默认支持 2 种模式)双模蓝牙: 大数据,速率快。常见的蓝牙音箱,是典型的双模蓝牙,它需要传输大量的音频数据。
单模蓝牙: 小数据,低功耗。常见的小米手环,蓝牙温度计则属于单模蓝牙,使用纽扣电池就可以运行数月至数年。行业里一般不讲单模蓝牙,而是统一称为低功耗蓝牙。
蓝牙设备之间要互传数据,首先设备之间需要相互认识,也就是建立连接。而设备的连接是按照 GATT协议
的要求建立,只要符合 GATT协议
就可以建立连接。
主设备向周围发送电磁波开始寻找,允许被查找的从设备,如果处于主设备的信号范围内,那么就会被发现。接下来主设备发起连接 connect 请求,从设备允许此连接请求,通信的通道建立完毕。
通信通道建立完毕后,主设备与从设备就可以开始互传数据。
此时
GATT协议
给 主设备 取名为 客户端, 从设备 取名为 服务端(这里有点绕). 此时只有主设备可以发起通信事件:读取从设备提供了哪些的服务,希望向从设备发送数据,希望接收从设备发出的数据。
flutter 代码演示:
void scan(){
// 扫描设备
flutterBlue.startScan(timeout: Duration(seconds: 4));
// 监听扫描结果
var subscription = flutterBlue.scanResults.listen((results) {
for (ScanResult scanResult in results) {
print('发现设备:${scanResult.device.name} ! 设备信号强度rssi: ${scanResult.rssi}');
if (scanResult.device.name == "我的小米手环") {
// 准备连接设备
readyToConnect(scanResult.device);
// 停止扫描
flutterBlue.stopScan();
}
}
});
}
void readyToConnect(BluetoothDevice device) async {
// 开始连接设备
await device.connect();
// 连接成功后,发现服务(有多种服务)
List<BluetoothService> services = await device.discoverServices();
for (var service in services) {
// 使用 0000fff0-0000-1000-8000-00805f9b34fb 这个服务
if(service.uuid=="0000fff0-0000-1000-8000-00805f9b34fb"){
// 获取服务上的Characteristic.
// 一个服务上有多种 characteristic 特征值
var characteristics = service.characteristics;
for(BluetoothCharacteristic c in characteristics) {
// 读
List<int> value = await c.read();
print(value);
// 写
await c.write([0x12, 0x34])
}
}
}
}
在蓝牙开发过程中, Service uuid
以及 Characteristic uuid
是我们需要重点关注的对象.与硬件 读写数据都是通过这个。
在蓝牙官方文档中,已经定义了一系列 Service,在 服务发现 Service Discovery 文档中可以看到:
GATT 全称为 Generic Attribute Profile 属性配置文件
。这个配置列表文件上记录了 Service 和 Characteristic 数据。
为什么要记录这两种数据? 因为在设备的发现与连接过程中使用的是 GAP(Generic Access Profile) 协议, 这个协议规定了两个设备之间发现与连接,必须带有配置表 Profile ,而配置表上记录着 Service 和 Characteristic 数据信息。
例如,一家酒店提供 吃饭/住宿/娱乐 等等一系列服务。
标准UUID为128位
,蓝牙协议栈中一般采用 16 位,也就是两个字节的 UUID 格式。
例如,0x1A00 描述酒店的酒店名称
例如,0x1A01 描述酒店的星级
例如,0x1A02 描述酒店的成立日期
例如,0x1B00 描述吃饭服务中的川菜
例如,0x1B01 描述吃饭服务中的粤菜
例如,0x1B02 描述吃饭服务中的闽南菜
需要注意的是,每一个蓝牙设备中都有很多服务,而具体服务含义以及要使用哪种服务 uuid,都需要由硬件提供商告知使用者
。
------ 如果文章对你有用,感谢右上角 >>>点赞 | 收藏 <<<