ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java-Android BLE多个连接

2019-10-25 14:35:29  阅读:255  来源: 互联网

标签:broadcastreceiver bluetooth-lowenergy java android


我正在尝试创建一个应用程序,该应用程序可以连接并接收来自多个蓝牙低能耗设备的通知.我想知道如何实现这一目标.每个连接是否需要一个单独的线程?考虑到API的异步性质,如何确保能够按发现的顺序发现服务并设置通知.我目前正在使用此处提供的相同结构:
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html.此设置仅用于单个连接.我是否能够保持这种结构,即在BluetoothLeService类中扩展Service类并绑定到该服务.最近,我发现Service类是一个单例,因此我将如何创建BluetootLeService类的不同实例并接收广播并注册广播接收器/接收器以处理来自适当设备的更改.

解决方法:

I am wondering how this can be achieved

要实现多个BLE连接,您必须存储多个BluetoothGatt对象,并将这些对象用于不同的设备.要存储BluetoothGatt的多个连接对象,可以使用Map

private Map<String, BluetoothGatt> connectedDeviceMap; 

On Service onCreate初始化地图

connectedDeviceMap = new HashMap<String, BluetoothGatt>();

然后在调用device.connectGatt(this,false,mGattCallbacks);之前要连接到GATT Server,请检查设备是否已连接.

  BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(deviceAddress);
  int connectionState = mBluetoothManager.getConnectionState(device, BluetoothProfile.GATT);

  if(connectionState == BluetoothProfile.STATE_DISCONNECTED ){
   // connect your device
   device.connectGatt(this, false, mGattCallbacks);
  }else if( connectionState == BluetoothProfile.STATE_CONNECTED ){
   // already connected . send Broadcast if needed
  }

在BluetoothGattCallback上,如果连接状态为CONNECTED,则将BluetoothGatt对象存储在Map上;如果连接状态为DISCONNECTED,则将其从Map中删除

        @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status,
            int newState) {

        BluetoothDevice device = gatt.getDevice();
        String address = device.getAddress();

        if (newState == BluetoothProfile.STATE_CONNECTED) {

            Log.i(TAG, "Connected to GATT server.");

            if (!connectedDeviceMap.containsKey(address)) {
                  connectedDeviceMap.put(address, gatt);
              }
             // Broadcast if needed
            Log.i(TAG, "Attempting to start service discovery:" +
                    gatt.discoverServices());

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.i(TAG, "Disconnected from GATT server.");
            if (connectedDeviceMap.containsKey(address)){
              BluetoothGatt bluetoothGatt = connectedDeviceMap.get(address);
              if( bluetoothGatt != null ){
                   bluetoothGatt.close();
                   bluetoothGatt = null;
              } 
              connectedDeviceMap.remove(address);                
            }
            // Broadcast if needed
        }
    }

同样,在onServicesDiscovered(BluetoothGatt gatt,int status)方法中,您也可以在参数上设置BluetoothGatt连接对象,然后可以从该BluetoothGatt获取设备.以及其他回调方法,例如public void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic特性),您将获得gatt形式的设备.

当您需要writeCharacteristic或writeDescriptor时,请从Map中获取BluetoothGatt对象,并使用该BluetoothGatt对象为不同的连接调用gatt.writeCharacteristic(characteristic)gatt.writeDescriptor(descriptor).

Do I need a separate thread for each connection?

我认为您不需要为每个连接使用单独的线程.只需在后台线程上运行服务即可.

希望这对您有所帮助.

标签:broadcastreceiver,bluetooth-lowenergy,java,android
来源: https://codeday.me/bug/20191025/1929423.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有