Android蓝牙开发主要分为两大类,分别是传统蓝牙开发和BLE(Bluetooth Low Energy)低功耗蓝牙开发。现在普遍使用的是低功耗蓝牙,除了手机,在智能穿戴设备上运用尤为广泛。
传统蓝牙开发步骤:
Bluetooth(蓝牙) | Android中文API
1.打开蓝牙
2.查找附近已配对或可用的设备
3.连接设备
4.设备间数据交换
所有的蓝牙API都在android.bluetooth包下,下面有一些类和接口的摘要,需要用到下面的类来建立连接:
BluetoothAdapter:代表本地蓝牙适配器。BluetoothAdapter是所有蓝牙交互的入口。使用这个可以发现其他蓝牙设备,查询已配对的设备列表,使用一个已知的MAC地址来实例化一个BluetoothDevice,以及创建一个BluetoothServerSocket来监听与其他设备的通信。
BluetoothDevice:代表一个远程蓝牙设备,使用这个来请求一个与远程设备的BluetoothSocket连接,或者查询关于设备名称、地址、类和连接状态等设备信息。
BluetoothSocket:代表一个蓝牙Socket的接口(和TCPSocket类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过InputStream和OutputStream交换数据。
BluetoothServerSocket:代表一个开放的服务器socket,它监听接收的请求。为了连接两台android设备,一个设备必须使用这个类开启一个服务器socket。当一个远程蓝牙设备开始一个和该设备的连接请求,BluetoothServerSocket将会返回一个已连接的BluetoothSocket接受该连接。
BluetoothClass:描述一个蓝牙设备的基本特性和性能。这是一个只读的属性集合,它定义了设备的主要和次要的设备类以及它的服务。
1.打开蓝牙
Bluetooth Permissions:
主要声明的权限:BLUETOOTH和BLUETOOTH_ADMIN
为了初始化设备或控制蓝牙设备,你必须请求BlUETOOTH_ADMIN权限,使用时还必须拥有BLUETOOTH权限。
如果设备支持蓝牙,但是没有开启,这个过程使用BluetoothAdapter用两步完成。
①获取BluetoothAdapter
一般获取都是调用BluetoothAdapter。getDefaultAdapter();
②Enable Bluetooth
接下来要保证蓝牙是开启的。调用isEnabled()来检查蓝牙最近是否是开启的。如果这个方法返回fale,那么蓝牙没有开启。调用startActivityForResult()并使用ACTION_REQUEST_ENABLE方法Intent。这将发出一个请求来利用系统设置开启蓝牙(不需要停止自己的应用)
一般会出现一个对话框,请求用户开启蓝牙。传给startActivityForResult()的REQUEST_ENABLE_BT必须是一个大于0的整型常量,系统在你的onActivityResult()实现中返回给你作为requestCode参数。
如果需要时刻监听蓝牙的状态,应用可以监听ACTION_STATE_CHANGED广播Intent,任何时候蓝牙状态改变,系统将会广播该Intent.
2.查找设备(Finding Devices)
使用BluetoothAdapter,你可以通过设备检测或者查询已配对来找到远程蓝牙设备。设备检测是一个浏览的过程,它查找附近的蓝牙可用设备,然后请求每个设备的相关信息。虽然,附近的蓝牙设备仅在它目前是可被检测的状态下时才会回应发现请求。如果一个设备是可被检测的,它将通过分享一些数据来响应检测请求,例如设备的名称,类,以及MAC地址。
一旦一个连接第一次和一个远程设备进行连接,一个匹配的请求会自动呈现在用户的面前。当一个设备配对后,设备的基本信息(例如设备的名称、类、MAC地址)将被保存,并且可以使用蓝牙接口进行访问。使用已知的MAC地址,一个连接可以在任何时间被初始化,而不需要执行检测。
注意:配对和连接之间有一点不同的,配对意味着两台设备是知道彼此存在的,他们有一个共享的连接密钥。可以用于授权以及建立一个加密的连接。而连接意味着设备目前共享一个RFCOMM通道,并且可以彼此传输数据。
①查询绑定的设备
②发现和查找设备
在查找设备的时候,需要调用startDiscovery()函数。这个进程会立即运行,这个扫描进程大概会持续12秒。
获取的设备信息,如MAC地址会用来下面步骤的连接。
注意:查找设备是一个很消耗资源的过程,一旦发现了一个设备去连接,在连接设备之前要及时取消扫描,调用的函数是cancelDiscovery(),在设备已经连接后,就不要再调用扫描,如果调用的话,会明显减少连接可用带宽。
如果你是让自己设备可被其他设备发现,可调用以下方法:
最大可设置被发现时间3600s。
三、连接设备,此处讨论的是作为客户端连接
上面获得的BluetoothDevice,利用BluetoothDevice来得到一个BluetoothSocket,然后初始化该连接。
下面是基本的过程:
1.使用BluetoothDevice,通过调用createRfcommSocketToServiceRecord(UUID)来得到一个BluetoothSocket。
注意:这里将初始化一个BluetoothSocket,它连接到该BluetoothDevice。这里传递的UUID必须和服务器设备开启它的BluetoothServerSocket时使用的UUID相匹配。
2.通过调用connect()初始化一个连接。
执行这个操作的时候,系统将会去查找,并匹配UUID。如果查找成功,就会分享RFCOMM通道,而connect()将会返回。这个方法时阻塞的,所以该方法应该放在子线程中调用。
注意:在连接时,也就是调用connect()函数之前,要保证设备没有执行设备查找工作。如果正在查找设备,那么连接尝试将会很大程度的减缓,并且有可能失败。
四、输出解析与传输
连接成功之后,使用BluetoothSocekt实现数据传输。
1.分别通过getInputStream()和getOutputStream()来得到InputStream和OutputStream来控制Socket之间的传输。
2.使用read(byte[] )和write(byte[])来实现数据的读写。
有些细节必须要考虑。应该为所欲的输入和输出的数据流使用一个专属的线程,这十分重要。因为read()和write()操作都是阻塞调用。
构造器需要必须的数据流,并且一旦执行,线程将会等待InputStream中过来的数据。
发送数据只需要在主活动中调用线程的write()方法,并将需要的数据传递给他即可。
线程的cancle方法很重要,在任何时候连接中断都要及时关闭BluetoothSocket。