要写蓝牙通信,可以看看下面的博客
Android蓝牙通信过程详解https://www.jianshu.com/p/3080fddc315b
android蓝牙BLE(四) —— 实战https://www.jianshu.com/p/a8adcee1f02e
Android蓝牙开发(三)之蓝牙通信https://blog.csdn.net/huangliniqng/article/details/82189735
蓝牙
关于蓝牙通信,之前项目用到过。蓝牙连接在android设备上是通过BluetoothSocket连接,然后io流读写数据,所以可以传数据也可以传文件。
Android实现蓝牙通信涉及到的主要API有BluetoothManager、BluetoothAdapter 、BluetoothDevice、BluetoothSocket。
蓝牙BLE
蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart)也称低功耗蓝牙,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持同等通信范围的同时显著降低功耗和成本
我有印象的是之前看过的智能戒烟打火机,儿童项目时有个手环还是轮椅项目中的一个单独模块都实现过蓝牙通信
蓝牙连接的五种工作状态
- 准备(standby):就绪状态,准备转变为其他状态
- 广播(advertising):向外发送数据的状态
- 监听扫描(scanning):扫描状态的时候,在接受到ADV_IND包时,会发送SCAN_REQ包,可以获得更多的信息
- 准备连接(initiating):发起连接状态,在ADV_IND或者ADV_DIRECT_IND之后,会发送CONNECTT_REQ包,从而建立连接
- 已连接(connected):根据连接时约定的参数,发送CONNECT_EVENT,保持连接不断

具体工作流程如下:
- 可被连接的设备(Advertiser),按照一定的周期广播ADV_IND或者ADV_DIRECT_IND包(可参考“蓝牙协议分析(5)_BLE广播通信相关的技术分析”)。
- 主动连接的设备(Initiator),在收到广播包之后,会回应一个CONNECT_REQ请求,该请求携带了可决定后续“通信时序”的参数,例如双方在哪一个时间点、哪一个Physical Channel收发数据,等等。
- Initiator在发出CONNECT_REQ数据包之后,自动转变为Connection状态,成为Master角色(注意:这是“自动”的,不需要等待另一方的回应)。同样,Advertiser在收到CONNECT_REQ请求之后,也自动转变为Connection状态,成为Slave角色。
- 此后,双方按照CONNECT_REQ参数所给出的约定,定时到切换到某一个Physical Channel上,按照Master->Slave然后Slave->Master的顺序,收发数据,直至连接断开。
在Android手机中,连接的代码非常简单,只有一个api可以调用,如下
private BluetoothGatt connectGattCompat(BluetoothGattCallback bluetoothGattCallback, BluetoothDevice device, boolean autoConnect) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return device.connectGatt(context, autoConnect, bluetoothGattCallback, TRANSPORT_LE);
} else {
return device.connectGatt(context, autoConnect, bluetoothGattCallback);
}
}
之后在bluetoothGattCallback的onConnectionChange的回调里,就可以知道连接的结果。
蓝牙通信是通过io流读写
- 本文作者: 风追着云
- 本文链接: https:/github.com/tuyrt7/tuyrt7.github.io/2019/09/09/蓝牙回顾/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!

SongTaste