首页 理论教育 实现蓝牙通信的方法与步骤

实现蓝牙通信的方法与步骤

时间:2026-01-23 理论教育 对我是小斗 版权反馈
【摘要】:蓝牙通信的结构如图9-10所示。图9-10蓝牙通信的结构图一、使用蓝牙的响应权限在Andorid Manfifest.xml使用蓝牙的响应权限,代码如下:二、配置本机蓝牙模块配置蓝牙模块主要使用蓝牙核心类Bluetooth Adapter,代码如下:三、搜索蓝牙设备使用Bluetooth Adapter的start Discovery()方法来搜索蓝牙设备。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。

设备间的蓝牙通信使用两个Service(即服务器段Serivce和客户端Service)来分别控制服务器端和客户端的蓝牙通信。每个Service控制着若干线程,Service与其下属线程之间使用Handler进行通信,Service与Activity之间的通信使用Broadcast进行通信,需要传递的数据通过一个自定义数据实体来进行传递。蓝牙通信的结构如图9-10所示。

使用蓝牙开发的具体步骤如下。

图示

图9-10 蓝牙通信的结构图

一、使用蓝牙的响应权限

在Andorid Manfifest.xml使用蓝牙的响应权限,代码如下:

图示

二、配置本机蓝牙模块

配置蓝牙模块主要使用蓝牙核心类Bluetooth Adapter,代码如下:

图示

三、搜索蓝牙设备

使用Bluetooth Adapter的start Discovery()方法来搜索蓝牙设备。startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。调用该方法后,搜索过程实际上在一个System Service中进行,可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。

请求Discovery后,系统开始搜索蓝牙设备,在这个过程中,系统会发送以下3个广播:

(1)ACTION_DISCOVERY_START:开始搜索;

(2)ACTION_DISCOVERY_FINISHED:搜索结束;

(3)ACTION_FOUND:找到设备,这个Intent中包含EXTRA_DEVICE和EXTRA_CLASS两个extra fields,分别为BluetooDevice和BluetoothClass。

可以注册相应的BroadcastReceiver来接收响应的广播,以便实现某些功能。代码如下:

图示

四、蓝牙Socket通信(https://www.xing528.com)

如果打算建议连接两个蓝牙设备,必须实现服务器端与客户端的机制。当两个设备在同一个RFCOMM channel下分别拥有一个连接的BluetoothSocket,这两个设备才可以说建立了连接。

服务器设备与客户端设备获取BluetoothSocket的途径是不同的。服务器设备是通过接收一个incoming connection来获取,客户端设备则是通过打开一个到服务器的RFCOMM channel来获取的。

1.服务器端的实现

通过调用Bluetooth Adapter 的listen UsingRfcommWithServiceRecord(String,UUID)方法来获取BluetoothServerSocket(UUID用于客户端与服务器端之间的配对)。

调用BluetoothServerSocket的accept()方法监听连接请求,如果收到请求,则返回一个BluetoothSocket实例(此方法为block方法,应置于新线程中)。

如果不想再接收其他连接,则调用BluetoothServerSocket的close()方法释放资源(调用该方法后,之前获得的BluetoothSocket实例并没有关闭。但由于RFCOMM在一个时刻只允许在一条channel中有一个连接,因此一般在接收一个连接后,便关闭BluetoothServerSocket)。服务器端的代码如下:

图示

图示

2.客户端的实现

通过搜索得到服务器端的BluetoothService,调用BluetoothService 的listen UsingRfcomm WithServiceRecord(String,UUID)方法,获取BluetoothSocket(该UUID应该与服务器端的UUID相同)。

调用BluetoothSocket的connect()方法(block方法),如果UUID同服务器端的UUID匹配,并且连接被服务器端接收,则connect()方法返回。

注意:在调用connect()方法之前,应当确定当前没有搜索设备,否则连接会变得非常慢且容易失败。客户端的代码如下:

图示

图示

3.连接管理(数据通信)

分别通过BluetoothSocket的getInputStream()和getOutputStream()方法获取InputStream和OutputStream,使用read(bytes[])和write(bytes[])方法分别进行读写操作。

注意:read(bytes[])方法会一直block,直到从流中读取到信息,而write(bytes[])方法并不经常block。(如另一设备没有及时read或者中间缓冲区已满时,write方法会block。)

图示

图示

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈