本篇文章,制作学习记录使用,就简单介绍下在Android端BLE蓝牙通讯。
BLE蓝牙通讯必须建立服务端和客户端。
从讲解之前我们先简单介绍下一下一个类BluetoothManager(蓝牙管理器),BluetoothAdapter(蓝牙适配器),BluetoothDevice(蓝牙设备),BluetoothSocket(蓝牙通讯客户端Socket),BluetoothServerSocket(蓝牙通讯服务端Socket)
,BluetoothGatt(操作GAT服务),BluetoothLeScanner(BLE蓝牙扫描器)
BluetoothManager是专门管理蓝牙的,其中主要使用的方法有
getAdapter: 获取蓝牙适配器,一个手机只有一个蓝牙适配器对象;
getConnectionState: 获取远程蓝牙设备的连接状态;
getConnectedDevices: 获取连接过的远程设备;
getDevicesMatchingConnectionStates:根据不同的连接状态来获取匹配的设备;
openGattServer:打开本地蓝牙的GAT服务。作用是将第三方请求对蓝牙的一些操作进行处理并返回;
BluetoothAdapter主要作用就是用来操作蓝牙的,一个手机中只有一个蓝牙适配器,其中主要使用的方法有
getDefaultAdapter:获取全局唯一的蓝牙适配器l;
getRemoteDevice:获取指定地址的蓝牙设备对象;
getBluetoothLeAdvertiser:获取全局唯一的一个蓝牙广告对象;
getBluetoothLeScanner:获取全局唯一的BLE蓝牙扫描器;
isEnabled:判断蓝牙是否是开启状态;
isLeEnabled:判断BLE蓝牙目前是否是开启状态;
disableBLE:禁用掉BLE蓝牙;
enableBLE:启用BLE蓝牙;
getState:获取目前蓝牙所处的状态;
getLeState:获取目前BLE蓝牙所处的状态;
enable:开启蓝牙;
disable:禁用蓝牙;
getAddress:获取本地蓝牙地址;
getName:获取本地蓝牙名称;
setName:设置本地蓝牙名称;
getScanMode:获取蓝牙扫描模式;
setScanMode:设置蓝牙扫描模式;
startDiscovery:开始发现新设备;
cancelDiscovery:取消发现新设备;
isMultipleAdvertisementSupported:判断是否支持发送广告;
getBondedDevices:获取已经绑定过的设备;
listenUsingRfcommWithServiceRecord:创建监听,主要作用就是获取输入流和输出流实现和蓝牙的基本通讯;
BluetoothDevice是蓝牙描述对象,一个实体对象;
BluetoothSocket,BluetoothServerSocket都封装了输入流和输出流以实现蓝牙之间的基本通讯;
BluetoothLeScanner蓝牙扫描器,主要作用是发现蓝牙,
主要用到的方法只有两个,那就是startScan开始蓝牙扫描,stopScan停止扫描
BluetoothGatt,主要是实现监听对蓝牙读写的一些回调实现;
蓝牙通讯
第一部就是开启蓝牙,开启蓝牙有两种方式实现:
方法一:
mBluetoothAdapter.enable();直接开启,但是还会提示权限请求;
方法二:
startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE),1);
第二部就是扫描蓝牙设备,扫描蓝牙设备有三种方法:
方法一:
mBluetoothAdapter.startDiscovery();(通过接受广播的方式来接受扫描返回结果)
方法二:
mBluetoothAdapter.startLeScan(callback); (过时的方法)
方法三:
mBluetoothAdapter.getBluetoothLeScanner().startScan(callback);
设备扫描完毕,就要实现蓝牙拦截通讯了:
mBluetoothSocket=mBluetoothDevice.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));
mBluetoothSocket.connect();
要保证要链接和被链接两端的UUID一致。
如果连接成功接下来就是简单的Socket通讯了;
但是如果要读取或者修改远程蓝牙的一些属性,就要这样
mBluetoothDevice.connectGatt(context, autoConnect,callback)
但是如果要重写写入或者读取蓝牙设备的属性的回调和处理逻辑,可以这样处理:
mBluetoothManager.openGattServer(context,callback);
如果要向其它的蓝牙设备广告自己的信息,可以这样:
bluetoothLeAdvertiser.startAdvertising(AdverseSettings,AdvertiseData,AdvertiseCallback);