一、蓝牙简介
现有的蓝牙主要分为两类:
-
经典蓝牙:3.0版本以下的蓝牙,都称为“经典蓝牙”,功耗高、传输数据量大、传输距离只有10米。
-
低功耗蓝牙:4.0及以上版本的蓝牙就是低功耗蓝牙也叫BLE,低功耗,数据量小,距离50米左右。
Android4.3以上对这两种蓝牙都是支持的,不过经典蓝牙和低功耗蓝牙的API是不一样的,如果用低功耗蓝牙API的方法去连接经典蓝牙设备,是连不上的。
蓝牙小车上用的大部分是经典蓝牙,所以我们这里介绍经典蓝牙API的使用。
二、经典蓝牙通信流程及相关API
经典蓝牙通信的流程是:发现设备->配对/绑定设备->建立连接->数据通信
经典蓝牙通信涉及到的API主要有:
-
BluetoothAdapter主要负责蓝牙的打开、关闭扫描。
-
BluetoothSocket主要负责蓝牙的连接、读写数据。
接下来我们介绍具体的方法:
1.获取BluetoothAdapter对象
使用BluetoothAdapter.getDefaultAdapter()方法即可以获取该对象,
2.打开蓝牙
判断蓝牙是否开启: bluetoothAdapter.isEnabled()
打开蓝牙的方式:
(1)异步自动开启蓝牙,调用bluetoothAdapter的enable方法,这种方法打开蓝牙不会弹出提示,但是蓝牙不会立即处于开启状态
(2)同步提示开启蓝牙,打开一个Intent:BluetoothAdapter.ACTION_REQUEST_ENABLE
3.扫描设备
开始扫描设备的方法:startDiscovery()
取消扫描设备的方法:cancelDiscovery()
扫描是在后台进行的,需要利用广播接收者接收扫描结果
扫描设备过程中,扫描开始、扫描结束、发现设备, 均会有相应的广播发出
4.连接设备
可以通过设备地址连接蓝牙,首先调用getRemoteDevice()方法获取蓝牙设备,然后调用device.createRfcommSocketToServiceRecord()方法获取bluetoothSocket,在连接前需要调用cancelDiscovery()方法取消扫描,最后进行连接调用connect()方法进行连接
5.蓝牙数据收发
收,即读数据:
bytes = bluetoothSocket.getInputStream().read(buffer);
法,即写数据:
bluetoothSocket.getOutputStream().write(buffer);
6.蓝牙的操作权限
在AndroidManifest里面添加权限
首先是使用蓝牙的权限:
<uses-permission android:name="android.permission.BLUETOOTH" />
其次是蓝牙设备管理的权限:
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
三、具体实现
我们采用一个Button弹出蓝牙设置的对话框,再用一个列表列出已绑定的蓝牙设备,如果需要的蓝牙设备不在列表中,则需要扫描设备。如果需要的蓝牙设备已在列表中,则只需要点击需要连接的蓝牙设备即可。点击设备后将进行蓝牙连接,连接成功或失败均会弹出提示。蓝牙连接成功后就可以进行控制指令的收发了。
这里我将蓝牙相关操作放到了一个BluetoothUtils类中,另外蓝牙扫描和已绑定设备用一个Activity进行呈现。在这个Activity中有个广播接收者,用于接收扫描到的新设备和扫描结束的广播,将新扫描到的设备添加到列表中。
需要发送的指令需要和单片机端进行配合,这里需要查看小车控制手册,或者小车的源码,如果小车端收到“ONA”会前进,则安卓端也要发送“ONA”,小车收到后才能前进。