Android蓝牙通信:Socket与Gatt详解

0 下载量 95 浏览量 更新于2024-08-29 收藏 189KB PDF 举报
"这篇资源主要介绍了Android手机之间通过蓝牙进行通信的两种常见方式:Socket和Gatt,特别是针对Android 5.0及以后版本的Gatt通信。作者在学习和实践过程中总结了相关经验和注意事项,旨在帮助读者理解这两种通信方法的原理和实现步骤。" 在Android系统中,蓝牙通信是设备间数据传输的重要手段。本文主要讨论了两种通信模式——Socket和Gatt(Generic Attribute Profile),它们都是基于客户端-服务器(CS)架构。 1. Socket通信方式: Socket通信是最基础的蓝牙连接方式,适用于对实时性要求较高的场景。服务端使用`listenUsingInsecureRfcommWithServiceRecord`接口开启监听,等待客户端连接。这个接口创建了一个RFCOMM (Serial Port Profile) socket,并且设置了一个特定的服务记录,使得客户端可以通过这个UUID找到并连接到服务端。一旦连接建立,两端就可以通过输入流和输出流进行数据交换。 服务端示例代码: ``` mSocket = mBleAdapter.listenUsingInsecureRfcommWithServiceRecord("GomeServer", Constants.BLE_SERVICE_UUID); ``` 客户端则通过`createInsecureRfcommSocketToServiceRecord`方法寻找并连接到指定服务记录的服务器。 2. Gatt通信方式: Gatt主要用于低功耗蓝牙(Bluetooth Low Energy, BLE)设备,从Android 5.0开始被广泛使用。Gatt通信模型更为复杂,涉及到角色定义(Central和Peripheral)、服务(Services)和特性(Characteristics)。Central设备扮演客户端角色,Peripheral设备扮演服务器角色。 Central设备首先扫描发现Peripheral设备,然后连接、发现服务、读写特性值或订阅通知。Peripheral设备则需要定义自己的服务和特性,以供Central设备交互。Gatt通信的一个关键概念是“Characteristic UUID”,它唯一标识了一个蓝牙特性。 在Gatt通信中,数据传输通常包括以下步骤: - Central设备连接Peripheral设备。 - 发现Peripheral设备提供的服务和特性。 - Central设备可以读取或写入Characteristic的值,或者订阅Characteristic的改变通知。 - Peripheral设备在Characteristic值改变时,可以发送通知到已订阅的Central设备。 对于Gatt通信,开发者需要对BLE协议栈有深入理解,包括如何构建和解析服务描述,以及如何处理连接、断开、读写操作等事件。 在实际应用中,选择Socket还是Gatt取决于具体需求。如果需要与传统蓝牙设备通信,或者需要高吞吐量的数据传输,Socket可能更合适。而如果目标设备是BLE设备,或者对功耗有严格控制,Gatt则更为适合。理解这两种通信方式的工作原理和使用场景,能帮助开发者更好地设计和实现Android蓝牙应用。