前沿:
在我之前写的代码中都没有实现蓝牙连接多个设备,由于时间的原因没有进行更改。
iOS端实现 蓝牙多个连接确实比安卓的方便,本身利用官方的Demo就可以实现多台连接,只不过自己利用view加以区分就可以。
到此蓝牙4.0之前是通过scoket连接多台设备,不过感觉传输的稳定性没有 BluetoothGatt稳定所以本次我利用BluetoothGatt来连接 蓝牙多台设备
1.由于连接多台设备 我只讲解多台设备的操作 前面的基础连接我不做讲解了
首先连接多台设备需要考虑的问题就是 蓝牙每次连接的时候只能同时连接一个 BluetoothGatt 但是我们需要连接多台的时候 我们可以这样来做 把这个BluetoothGatt放入到一个 Arraylist里面这样不就可以实现多台设备的连接。
所以我们应该在Service代码中添加如下的代码,我运用的是官方的De mo只不过在原有的基础上面进行了修改
如下:
public boolean connect(final String name,final String address,Context context) {
mContext = context;
if (mBluetoothAdapter == null || address == null) {
Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
return false;
}else{
mDeviceAddre.add(address);
mDeviceName.add(name);
}
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
if (device == null) {
Log.w(TAG, "Device not found. Unable to connect.");
return false;
}
BluetoothGatt bluetoothGatt;
bluetoothGatt = device.connectGatt(this, false, mGattCallback);
if(checkGatt(bluetoothGatt)){
connectionQueue.add(bluetoothGatt);
}
Log.d(TAG, "Trying to create a new connection.");
return true;
}
加入这段代码主要是区别是否有相同的有相同的就不让他添加进来
private boolean checkGatt(BluetoothGatt bluetoothGatt) {
if (!connectionQueue.isEmpty()) {
for(BluetoothGatt btg:connectionQueue){
if(btg.equals(bluetoothGatt)){
return false;
}
}
}
return true;
}
还有一点需要注意点就是
蓝牙读书这个 BluetoothGattCharacteristic 也需要 命名成 public List listCharacteristic = new ArrayList<>();
这段代码 目的: 扫描出来的服务 和 特征 需要 添加到 listCharacteristic中去
public void findService(BluetoothGatt gatt)
{
List gattServices = gatt.getServices();
Log.i(TAG, “Count is:” + gattServices.size());
for (BluetoothGattService gattService : gattServices)
{
Log.i(TAG, gattService.getUuid().toString());
Log.i(TAG, UUID_SERVICE.toString());
if(gattService.getUuid().toString().equalsIgnoreCase(UUID_SERVICE.toString()))
{
List gattCharacteristics =
gattService.getCharacteristics();
Log.i(TAG, “Count is:” + gattCharacteristics.size());
for (BluetoothGattCharacteristic gattCharacteristic :
gattCharacteristics)
{
if(gattCharacteristic.getUuid().toString().equalsIgnoreCase(UUID_NOTIFY.toString()))
{
Log.i(TAG, gattCharacteristic.getUuid().toString());
Log.i(TAG, UUID_NOTIFY.toString());
mNotifyCharacteristic = gattCharacteristic;
listCharacteristic.add(mNotifyCharacteristic);
setCharacteristicNotification(gattCharacteristic, true);
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED, gatt.getDevice().getAddress());
return;
}
}
}
}
}
//多台设备断开连接的时候 需要一个一个的去移除 这个跟连接单个设备断开的时候是有区别的
private synchronized void listClose(BluetoothGatt gatt) {
if (!connectionQueue.isEmpty()) {
if (gatt != null) {
for(final BluetoothGatt bluetoothGatt:connectionQueue){
if(bluetoothGatt.equals(gatt)){
bluetoothGatt.close();
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(250);
connectionQueue.remove(bluetoothGatt);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}else{
for (BluetoothGatt bluetoothGatt : connectionQueue) {
bluetoothGatt.close();
}
connectionQueue.clear();
}
}
}
3.demo下载地址:
http://download.csdn.net/detail/a1989214/9837594