前言
最近开发蓝牙遇到问题很多,现在开始一一记录书写,先从经典蓝牙开始,后从低功耗蓝牙写,一直没什么时间,只能抽空写了!好了,进入主题
什么是金典蓝牙
经典蓝牙和低功耗蓝牙,我在最开始的时候也是傻傻分不清,以为蓝牙就是一套封装使用就可以了,没想到还有那么多道道,那他们两个的区别在于哪里呢?
很简单,经典蓝牙就是socket开发通信,低功耗的就是属性特征通信开发,记住这点就好,所以开发经典蓝牙感觉相对简单快捷一点,因为大部分人已经开发过TCP通信了,所以蓝牙开发也是一样的流程,照搬套用即可!
通信机制
所以说,要在两台设备上创建连接,就需要实现服务器端和客户端机制,TCP通信不也是这样,相信大家了解tcp的肯定就恍然大悟了,金典蓝牙开发也就不过如此
下面介绍下简单的通信过程
在服务端启动监听,等待客户端的连接请求 -> 有连接请求后连接 -> 连接成功后有一个socket(也即套接字)-> 通过socket套接字得到IO流 -> 往输入流中读数据,或者往输出流中写数据 -> 即可以实现两台设备之间的通讯;
上面说过,要在两台设备上创建连接,需要实现服务器端和客户端机制,其中有一台需要开放服务端的套接字,另外一台作为客户端,需要通过蓝牙的Mac地址向服务端发送连接请求;当我们的服务端和客户端在同一个频道上的话,就可以进行连接;之后服务端会接收一个套接字,这个套接字会作为服务端和客户端 进行通信的接口;
设置服务端过程
下面就说下Qt设置蓝牙服务的过程:
Qt过程原理
设置服务器套接字 并 接受连接的基本过程:QBluetoothServer通过调用 listen方法来启动监听,定义如下:
bool listen(const QBluetoothAddress &address = QBluetoothAddress(), quint16 port = 0)
QBluetoothServiceInfo listen(const QBluetoothUuid &uuid, const QString &serviceName = QString())
然后通过监听newConnection信号,在对应连接的插槽中调用 nextPendingConnection()来获得 QBluetoothSocket 对象,连接发送和接收数据。
除非要接受更多连接,否则调用 close() 结束该次通信;
android 过程原理
Qt 这边是简洁了很多了,如果是android这边,采用原生语言实现首先就要通过调用
listenUsingRfcommWithServiceRecord(String, UUID) 获取 BluetoothServerSocket;
通过调用 accept() 开始侦听连接请求
设置客户端过程
实现原理都是一样的!下面再来说说客户端的设置过程,一般我们的应用担当的就是客户端,很少需要担当服务端的,就好TCP一样道理!
Qt过程原理
Qt 实现 首先获取本地设备 进行扫描 QBluetoothDeviceDiscoveryAgent,通过扫描到的Mac地址,Mac地址是一个设备的全世界唯一的标识;生成QBluetoothSocket,然后发起连接即可!
android过程原理
android 原生是首先要获取表示该远程设备的BluetoothDevice对象,这个对象是通过蓝牙的Mac地址构造的;通过BluetoothDevice对象,获取BluetoothSocket并发起连接,使用BluetoothDevice对象调用createRfcommSocketToServiceRecord(UUID),获取BluetoothSocket,再通过connect()发起连接;
这里说下,android的所有实现都是在线程中操作!
好了经典蓝牙开发的概念就到这里,android的原理才是最正确过程,因为Qt帮我们做了很多事情,所以真正的很多过程被省略简化了!感觉就好像Qt的过程和原生的不太一样,其实内部实现都是一样的,可以参考TCP通信原理
觉得分享的内容还不错, 就请作者喝杯咖啡吧~~
关注公众号
关注公众号,可下载pdf资源