蓝牙
Android 平台包含蓝牙网络堆栈支持,此支持能让设备以无线方式与其他蓝牙设备交换数据。应用框架提供通过 Android Bluetooth API 访问蓝牙功能的权限。这些 API 允许应用以无线方式连接到其他蓝牙设备,从而实现点到点和多点无线功能。
Android 应用可通过 Bluetooth API 执行以下操作:
扫描其他蓝牙设备
查询本地蓝牙适配器的配对蓝牙设备
建立 RFCOMM 通道
通过服务发现连接到其他设备
与其他设备进行双向数据传输
管理多个连接
使用配置文件
获取默认适配器(请参阅设置蓝牙)。
设置 BluetoothProfile.ServiceListener。此侦听器会在 BluetoothProfile 客户端连接到服务或断开服务连接时向其发送通知。
使用 getProfileProxy() 与配置文件所关联的配置文件代理对象建立连接。在以下示例中,配置文件代理对象是一个 BluetoothHeadset 实例。
在 onServiceConnected() 中,获取配置文件代理对象的句柄。
获得配置文件代理对象后,您可以用其监视连接状态,并执行与该配置文件相关的其他操作。
设置蓝牙
您需验证设备支持蓝牙,确保在此情况下启用该功能,这样您的应用才能通过蓝牙进行通信。
如果设备不支持蓝牙,则应正常停用任何蓝牙功能。如果设备支持蓝牙但已停用此功能,则您可以请求用户在不离开应用的同时启用蓝牙。借助 BluetoothAdapter,您可以分两步完成此设置:
获取 BluetoothAdapter。
所有蓝牙 Activity 都需要 BluetoothAdapter。如要获取 BluetoothAdapter,请调用静态的 getDefaultAdapter() 方法。此方法会返回一个 BluetoothAdapter 对象,表示设备自身的蓝牙适配器(蓝牙无线装置)。整个系统只有一个蓝牙适配器,并且您的应用可使用此对象与之进行交互。如果 getDefaultAdapter() 返回 null,则表示设备不支持蓝牙。
启用蓝牙。
下一步,您需要确保已启用蓝牙。调用 isEnabled(),以检查当前是否已启用蓝牙。如果此方法返回 false,则表示蓝牙处于停用状态。如要请求启用蓝牙,请调用 startActivityForResult(),从而传入一个 ACTION_REQUEST_ENABLE Intent 操作。此调用会发出通过系统设置启用蓝牙的请求(无需停止应用)。
查找设备
利用 BluetoothAdapter,您可以通过设备发现或查询配对设备的列表来查找远程蓝牙设备。
设备发现是一个扫描过程,它会搜索局部区域内已启用蓝牙功能的设备,并请求与每台设备相关的某些信息。此过程有时也被称为发现、查询或扫描。但是,只有在当下接受信息请求时,附近区域的蓝牙设备才会通过启用可检测性响应发现请求。如果设备已启用可检测性,它会通过共享一些信息(例如设备的名称、类及其唯一的 MAC 地址)来响应发现请求。借助此类信息,执行发现过程的设备可选择发起对已检测到设备的连接。
在首次与远程设备建立连接后,系统会自动向用户显示配对请求。当设备完成配对后,系统会保存关于该设备的基本信息(例如设备的名称、类和 MAC 地址),并且可使用 Bluetooth API 读取这些信息。借助远程设备的已知 MAC 地址,您可以随时向其发起连接,而无需执行发现操作(假定该设备仍处于有效范围内)。
请注意,被配对与被连接之间存在区别:
被配对是指两台设备知晓彼此的存在,具有可用于身份验证的共享链路密钥,并且能够与彼此建立加密连接。
被连接是指设备当前共享一个 RFCOMM 通道,并且能够向彼此传输数据。当前的 Android Bluetooth API 要求规定,只有先对设备进行配对,然后才能建立 RFCOMM 连接。在使用 Bluetooth API 发起加密连接时,系统会自动执行配对。
连接设备
如要在两台设备之间创建连接,您必须同时实现服务器端和客户端机制,因为其中一台设备必须开放服务器套接字,而另一台设备必须使用服务器设备的 MAC 地址发起连接。服务器设备和客户端设备均会以不同方法获得所需的 BluetoothSocket。接受传入连接后,服务器会收到套接字信息。在打开与服务器相连的 RFCOMM 通道时,客户端会提供套接字信息。
当服务器和客户端在同一 RFCOMM 通道上分别拥有已连接的 BluetoothSocket 时,即可将二者视为彼此连接。这种情况下,每台设备都能获得输入和输出流式传输,并开始传输数据,相关详细介绍请参阅管理连接部分。本部分介绍如何在两台设备之间发起连接。
连接技术
一种实现技术是自动将每台设备准备为一个服务器,从而使每台设备开放一个服务器套接字并侦听连接。在此情况下,任一设备都可发起与另一台设备的连接,并成为客户端。或者,其中一台设备可显式托管连接并按需开放一个服务器套接字,而另一台设备则发起连接。
作为服务器连接
通过调用 listenUsingRfcommWithServiceRecord() 获取 BluetoothServerSocket。
该字符串是服务的可识别名称,系统会自动将其写入到设备上的新服务发现协议 (SDP) 数据库条目。此名称没有限制,可直接使用您的应用名称。SDP 条目中也包含通用唯一标识符 (UUID),这也是客户端设备连接协议的基础。换言之,当客户端尝试连接此设备时,它会携带 UUID,从而对其想要连接的服务进行唯一标识。为了让服务器接受连接,这些 UUID 必须互相匹配。
UUID 是一种标准化的 128 位格式,可供字符串 ID 用来对信息进行唯一标识。UUID 的特点是其足够庞大,因此您可以选择任意随机 ID,而不会与其他任何 ID 发生冲突。在本例中,其用于对应用的蓝牙服务进行唯一标识。如要获取供应用使用的 UUID,您可以从网络上的众多随机 UUID 生成器中任选一种,然后使用 fromString(String) 初始化一个 UUID。
通过调用 accept() 开始侦听连接请求。
这是一个阻塞调用。当服务器接受连接或异常发生时,该调用便会返回。只有当远程设备发送包含 UUID 的连接请求,并且该 UUID 与使用此侦听服务器套接字注册的 UUID 相匹配时,服务器才会接受连接。连接成功后,accept() 将返回已连接的 BluetoothSocket。
如果您无需接受更多连接,请调用 close()。
此方法调用会释放服务器套接字及其所有资源,但不会关闭 accept() 所返回的已连接的 BluetoothSocket。与 TCP/IP 不同,RFCOMM 一次只允许每个通道有一个已连接的客户端,因此大多数情况下,在接受已连接的套接字后,您可以立即在 BluetoothServerSocket 上调用 close()。
private class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerSocket;
public
今天的文章蓝牙通信开发分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65066.html