一.界面层接口
所有与底层(蓝牙文件)处理与协议类封装在 BT8510Device ( bt8510_device.h ),它是一个全局单例对象, 通过BT8510Device::Instance() 访问.
BT8510Device::Instance()->bluetoothManager(); 是蓝牙管理器的封装对象,对蓝牙操作大多使这个对象.
二.使用流程
-
初始化 BT8510Device::Instance()->initDevice(QWidget * splash = nullptr);
在主程序或引导窗口显示函数执行.
注: 如果splash 不为空,则会试着在蓝牙初始化完成后调用finish()自动关闭splash窗口 -
启动设备.
在联接窗口调用
BT8510Device::Instance()->startDevice(); 它将完成蓝牙的启动工作
-
检测并重联绑定设备
BT8510Device::Instance()->bluetoothManager()->reconnectDevice();
返回为false表示没有绑定设备.
为true表示绑定并开始重联设备如果成功联接,将发送
BT8510Device::Instance()->bluetoothManager()将发送信号 deviceConnected(HBluetoothDevice *)) .
收到这个信号进入下一个界面.
4.绑定设备
BT8510Device::Instance()->bluetoothManager()->startBindDevice(10000);
参数最大绑定时间.
如果无论绑定成功失败后,BT8510Device::Instance()->bluetoothManager()将发送信号deviceBindChanged(HBluetoothDevice*)
失败参数中设备对象为空,成功指向绑定设备,界面可以根据结果进行不同提示
5.联接设备
绑定设备并没有立刻联接,可以直接在deviceBindChanged()的slot前
BT8510Device::Instance()->bluetoothManager()->connectDevice(HBluetoothDevice*) 连接设备.
6.断开设备
在工作界面可以执行 ,会将当前设备断开
BT8510Device::Instance()->bluetoothManager()->disconnectDevice();
成功断开后BT8510Device::Instance()->bluetoothManager()将发送信号 devicedisconnected(HBluetoothDevice *)) .
收到信号后返回上一界面.
![](https://img.haomeiwen.com/i1493747/77d216db9cbdad47.png)
三.蓝牙协议收发
整个通讯协议有9条协议,均由设备主动发起
//查询设备信息
BT8510Device::Instance()->queryDeviceInfo();
收到数据后, 将收到信号通知,BT8510Device,deviceInfoUpdate();
其中各项数据已经解析到BT8510Device各个属性当中,界面直接取就行
如 BT8510Device::Instance()->platform(); //设备属性
其余均
Qt 蓝牙连接流程
scan
开始联接
-
QLowEnergyController::connectToService(QBluetoothDeviceInfo );
-
成功后发来 QLowEnergyController::connected() 消息
-
在slot函数调用
//开始扫描本设备有哪一些服务
QLowEnergyController::discoverServices();
4.如果成功, 每扫描到一个服务,会触发一次消息
QLowEnergyController::serviceDiscovered(QBluetoothUuid)
5.在相应的slot方法里根据 QBluetoothUuid创建对的服务
QLowEnergyService *service = QLowEnergyController::createServiceObject(uuid);
// 扫描成功后,再调用去扫描该服务下有多少char
如果是 service->state() == QLowEnergyService::DiscoveryRequired
表示还需要继续扫描,则调用 QLowEnergyService::discoverDetails();
否则可以直接(这种情况比较少)
或直接从 QLowEnergyService::characteristics() 读取相应char列表
6.扫描到新的char后,会以事件QLowEnergyService::stateChanged 通知
注意这里有几种状态,其中 只有QLowEnergyService::ServiceDiscovered
表示扫描到所有属性.
此时可以对应的service 是sender
QLowEnergyService *service = qobject_cast<QLowEnergyService *>(sender());
此时扫描到属性在
const QList<QLowEnergyCharacteristic> chars = service->characteristics();
网友评论