Android 低功耗蓝牙的多设备连接与数据接收,简单实现

项目的一个功能,蓝牙多连接。应用同时连接多个设备,等待接收数据,处理后显示图表。

在这之前我没有搞过蓝牙方面的东西,只能从基础开始边看边干。


最开始不知道,看的是传统蓝牙的连接与传输,几天过后,发现与低功耗蓝牙不一样啊,又针对低功耗蓝牙开始找资料。


低功耗蓝牙支持的api最低是18。

基本思路:低功耗蓝牙连接分两种,一种是作为周边设备,一种是作为中心设备。因为需求是多连接,那我们就按照创建一个中心设备的做法来处理。


下面先记录一下,一个低功耗蓝牙的连接:

注:因为程序与硬件是一套设备,所以我不需要扫瞄附近的设备,然后选择连接,直接拿地址进行连接。


蓝牙需要的权限:

 <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />


如果你想你的应用只支持低功耗蓝牙的话,在加一个权限:

 <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>


接下来在activity中,不管周边设备还是中心设备,我们都需要拿到:BluetoothManager和BluetoohAdapter:

//获取BluetoothManager
        BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        //获取BluetoothAdapter
        BluetoothAdapter mBluetoothAdapter = mBluetoothManager.getAdapter();

        //如果蓝牙没有打开 打开蓝牙
        if (!mBluetoothAdapter.isEnabled()) {
            mBluetoothAdapter.enable();
        }


然后就是通过上面拿到的adapter得到BluetoothDevice对象:

BluetoothDevice bluetoothDeviceOne = mBluetoothAdapter.getRemoteDevice("D8:B0:4C:BC:C0:83");

注:1.传入的参数就是你蓝牙的地址。

2.假如你需要多连接,那么这里就要获得多个BluetoothDevice对象,通过不同的地址。


然后就是BluetoothGatt对象:

private BluetoothGatt mBluetoothGattOne;

在拿到上面两个对象后,先校验gatt对象是否在运行:

//如果Gatt在运行,将其关闭
        if (mBluetoothGattOne != null) {
            mBluetoothGattOne.close();
            mBluetoothGattOne = null;
        }

然后就是连接设备,并设置连接的回调:

//连接蓝牙设备并获取Gatt对象
        mBluetoothGattOne = bluetoothDeviceOne.connectGatt(MainActivity.this, true, bluetoothGattCallbackOne);

其中,bluetoothGattCallbackOne就是回调:

/**
     * 第一个设备  蓝牙返回数据函数
     */
    private BluetoothGattCallback bluetoothGattCallbackOne = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                if (newState == BluetoothProfile.STATE_CONNECTED) {
                    setText("设备一连接成功");

                    //搜索Service
                    gatt.discoverServices();
                } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                    setText("设备一连接断开");
                }
            }
            super.onConnectionStateChange(gatt, status, newState);
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            //根据UUID获取Service中的Characteristic,并传入Gatt中
            BluetoothGattService bluetoothGattService = gatt.getService(UUID_SERVICE);
            BluetoothGattCharacteristic bluetoothGattCharacteristic = bluetoothGattService.getCharacteristic(UUID_NOTIFY);

            boolean isConnect = gatt.setCharacteristicNotification(bluetoothGattCharacteristic, true);
            if (isConnect){

            }else {
                Log.i("geanwen", "onServicesDiscovered: 设备一连接notify失败");
            }
            super.onServicesDiscovered(gatt, status);
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {//数据改变
            super.onCharacteristicChanged(gatt, characteristic);
            String data = new String(characteristic.getValue());
            Log.i("geanwen", "onCharacteristicChanged: " + data);
        }
    };

注:1.我的需求就是接收是蓝牙发送过来的数据,假如你需要写入数据,或者其他的功能,在上面的callback中,可以复写对应的方法。

2.上面onConectionStateChange方法就是连接状态改变时回调的方法,在其中判断连接是否成功。

3.上面onServicesDiscovered方法就是在onConectionStateChange连接成功之后,发现该蓝牙的服务。

在这里你可以设置你需要的服务,每个蓝牙连接中会有不同的服务,设置你需要的即可。

4.上面我设置了接收数据的服务,其中传入的几个常量就是我们低功耗蓝牙的服务的固定码,下面贴个例子:

//蓝牙设备的Service的UUID
    public final static UUID UUID_SERVICE = UUID.fromString("0003cdd0-0000-1000-8000-00805f9b0131");

    //蓝牙设备的notify的UUID
    public final static UUID UUID_NOTIFY = UUID.fromString("0003cdd1-0000-1000-8000-00805f9b0131");

大家仔细看好,两个码是不一样的,一开始我以为是一样的,结果调了好久。

因为我这个需求是不能先搜索,在连接,然后选择对应服务的,所以我将这些这些操作都省略,即我提前拿到了这几个服务的码。

5.上面回调方法onCharacteristicChanged方法就是来数据了,接收的方法。

连接一个低功耗蓝牙并接收数据上面就介绍完了,下面说下连接两个或者多个。


到这里是后期来修改的,原来简单的通过上面的连接一个,多次创建对应的对象来实现多连接。

那样第一个代码量有点大,重复工作做的多。性能还不是很好。


下面我在github找到一个框架,大神封装的模块,clone到本地看他的代码,学习一番,

下面贴出地址:

点击打开链接


具体使用,他的文档中记录的很详细了

学习思路之后自己也封装一下。


实现多连接过程中遇到了几个问题,这里记录下。

当你的业务需求需要连接多个设备的时候,

需要考验你的手机/平板的设备了,(价钱高一些性能好一些)

我试用的华为6.0的平板,同时连接三个是相对稳定一些,一次搜索并连接三个,第四个设备需要重新搜索才能成功。

小米的7.0系统的平板,连接四个很快的。


部分手机/平板是国内厂商定制的,不能搜索到蓝牙设备或者不能连接设备,可能的原因是硬件设备没有对这些厂商进行兼容。






### 回答1: Android低功耗蓝牙通过使用BluetoothLeScanner类的startScan()方法来接收数据。以下是接收数据的步骤: 1. 获取BluetoothAdapter实例:使用BluetoothAdapter.getDefaultAdapter()方法获取设备上的蓝牙适配器实例。 2. 检查设备是否支持低功耗蓝牙: 调用BluetoothAdapter的isMultipleAdvertisementSupported()方法来检查设备是否支持低功耗蓝牙。 3. 获取BluetoothLeScanner实例:调用BluetoothAdapter的getBluetoothLeScanner()方法来获取BluetoothLeScanner实例。 4. 创建ScanCallback:创建一个ScanCallback的匿名类实例,重写onScanResult()方法以处理扫描结果。 5. 开始扫描:调用BluetoothLeScanner的startScan()方法开始扫描低功耗蓝牙设备,传入ScanCallback实例作为参数。 6. 处理扫描结果:在ScanCallback的onScanResult()方法中,可以获取到扫描到的蓝牙设备的信息,包括设备的名称、物理地址和广告数据,可以进一步解析广告数据来获取需要的信息。 7. 停止扫描:当需要停止扫描时,调用BluetoothLeScanner的stopScan()方法。 总结:以上是Android低功耗蓝牙接收数据的基本步骤。在扫描到低功耗蓝牙设备后,可以通过解析广告数据来获取到设备发送的数据,进一步处理或显示到应用程序界面。 ### 回答2: 在Android设备上,接收低功耗蓝牙(BLE)数据主要分为以下几个步骤: 1. 获取蓝牙适配器:首先,需要通过调用`BluetoothAdapter.getDefaultAdapter()`方法获取到BluetoothAdapter对象,该对象用于管理本地蓝牙适配器。 2. 开启低功耗蓝牙:通过调用`adapter.enable()`方法来启用低功耗蓝牙。 3. 扫描低功耗蓝牙设备:使用`adapter.startLeScan()`方法开始扫描低功耗蓝牙设备,并通过设置回调函数获取扫描结果。 4. 连接低功耗蓝牙设备:在扫描到设备后,通过调用`device.connectGatt()`方法连接低功耗蓝牙设备,并获取BluetoothGatt对象。 5. 发现服务:连接成功后,通过调用`BluetoothGatt.discoverServices()`方法发现低功耗蓝牙设备所支持的服务。 6. 获取特征值:在发现服务之后,通过遍历服务列表和特征值列表,找到需要接收数据的特征值。 7. 设置数据接收回调:通过调用`BluetoothGattCharacteristic.setCharacteristicNotification()`方法设置特征值的通知,以便能够接收到来自设备数据。 8. 接收数据:当设备向特征值发送数据时,通过实现BluetoothGattCallback对象的`onCharacteristicChanged()`方法来接收数据。 需要注意的是,上述步骤中的具体实现方式会因为项目需求和代码结构的不同而有所差异。因此,在实际开发中,可以参考Android官方文档和相关开发文档,根据具体情况进行适当调整和扩展。 ### 回答3: 在Android设备上,接收低功耗蓝牙(Bluetooth Low Energy,BLE)数据可以通过以下步骤进行: 1. 创建一个BLE设备连接:首先,通过BluetoothAdapter对象获取BluetoothLeScanner,然后使用该对象扫描周围的BLE设备。找到目标设备后,使用设备的BluetoothDevice对象创建一个BLE连接。 2. 设置一个回调接口:创建一个BluetoothGattCallback对象,并重写其onConnectionStateChange、onServicesDiscovered和onCharacteristicChanged等方法。这些方法将在BLE连接状态改变、BLE服务发现和BLE特征改变时被调用。 3. 连接设备:使用BluetoothGatt对象连接到目标设备,可以通过调用connect()方法来建立连接。 4. 发现设备的服务:连接建立后,使用BluetoothGatt对象的discoverServices()方法来发现设备的服务和特征。 5. 获取特征对象:从设备的服务列表中获取目标特征的BluetoothGattCharacteristic对象。 6. 启用数据通知:使用BluetoothGatt对象的setCharacteristicNotification()方法启用该特征的通知功能。 7. 获取特征的描述对象:从特征对象中获取其描述符(BluetoothGattDescriptor)。 8. 设置描述对象的值:使用BluetoothGattDescriptor对象的setValue()方法设置其值。 9. 更新描述对象:使用BluetoothGatt对象的writeDescriptor()方法将描述符的值写入设备。 10. 数据接收:当设备发送数据时,BluetoothGattCallback对象的onCharacteristicChanged方法将被调用,你可以在该方法中获取数据。 综上所述,通过上述步骤可以在Android设备实现低功耗蓝牙数据接收功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值