如何在 android 中将特征写入 BLE GATT 服务器?

Posted

技术标签:

【中文标题】如何在 android 中将特征写入 BLE GATT 服务器?【英文标题】:How to write the Characteristics into BLE GATT server in android? 【发布时间】:2016-03-29 04:37:21 【问题描述】:

我正在研究蓝牙低功耗 GATT 以与芯片进行通信。我可以读取芯片的响应,但我无法将特征发送到该芯片并通知一些特征。能不能帮忙啊。

提前致谢。

【问题讨论】:

请说明您使用的是什么蓝牙设备/芯片。请记住,如果它是您从供应商处获得的定制芯片 - 请与供应商联系以了解具体信息。对于这些有限的信息,没有人可以提供帮助。 您好,他们在 BoreCam 芯片和 CoreCam 芯片中提供了一些 MAC 地址 我不知道 BoreCam 是什么,除非它是 Broadcom。如果没有具体的制造商和型号等细节,也没有详细展示您尝试过的东西,没有人可以帮助您。 是不是像Beacon一样为你提供ff2/ ff1之类的服务? 【参考方案1】:

假设您的 BluetoothGattServer 设置正确,向服务注册的特征以及添加到 BluetoothGattServer 的服务,以下是向通知特征发送一些数据的示例:

    private static final UUID serviceUuid   = UUID.fromString("SOME-SERVICE-UUID");
    private static final UUID characteristicUuid = UUID.fromString("SOME-CHAR-UUID");
    private BluetoothGattServer gattServer;
    private BluetoothDevice peerDevice;

    public void sendNotification(byte p1, byte p2, byte p3, byte p4, int correlationid) 
        ByteBuffer bb = ByteBuffer.allocate(8);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.put(p1).put(p2).put(p3).put(p4).putInt(correlationid);
        BluetoothGattCharacteristic notifyingChar = gattServer.getService(serviceUuid).getCharacteristic(characteristicUuid);
        notifyingChar.setValue(bb.array());
        gattServer.notifyCharacteristicChanged(peerDevice, notifyingChar, false);
    

当数据在BluetoothGattServerCallback.onNotificationSent 方法中发送时,您将收到一个事件:

    @Override
    public void onNotificationSent(BluetoothDevice device, int status) 
        super.onNotificationSent(device, status);
        Log.d("SVC", "BluetoothGattServerCallback.onNotificationSent");
    

【讨论】:

【参考方案2】:

首先,我强烈建议您使用名为RxandroidBle 的令人惊叹的蓝牙 LE 开源库。这将使整个过程变得更容易。

在项目中包含该库后,您需要执行以下操作:

    确保蓝牙已启用,并且您已向用户请求位置权限。 扫描设备

例子:

RxBleClient rxBleClient = RxBleClient.create(context);

Disposable scanSubscription = rxBleClient.scanBleDevices(
        new ScanSettings.Builder()
            // .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // change if needed
            // .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // change if needed
            .build()
        // add filters if needed
)
    .subscribe(
        scanResult -> 
            // Process scan result here.
        ,
        throwable -> 
            // Handle an error here.
        
    );

// When done, just dispose.
scanSubscription.dispose();
    连接到所需的设备并使用writeCharacteristic() 方法写入所需的字节。

例子:

device.establishConnection(false)
    .flatMapSingle(rxBleConnection -> rxBleConnection.writeCharacteristic(characteristicUUID, bytesToWrite))
    .subscribe(
        characteristicValue -> 
            // Characteristic value confirmed.
        ,
        throwable -> 
            // Handle an error here.
        
    ); 
    如果您想为某个特征设置通知/指示,则可以执行以下操作:

例子:

device.establishConnection(false)
    .flatMap(rxBleConnection -> rxBleConnection.setupNotification(characteristicUuid))
    .doOnNext(notificationObservable -> 
        // Notification has been set up
    )
    .flatMap(notificationObservable -> notificationObservable) // <-- Notification has been set up, now observe value changes.
    .subscribe(
        bytes -> 
            // Given characteristic has been changes, here is the value.
        ,
        throwable -> 
            // Handle an error here.
        
    );

他们的 Github 页面上有很多信息,他们也有他们的own dedicated tag in ***。

【讨论】:

以上是关于如何在 android 中将特征写入 BLE GATT 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 应用程序中快速写入 BLE 特征

如何从 Swift 中的 BLE 外设特征写入回调中提取数据?

如何在 Xamarin/Android 上启用多个 BLE 特征通知?

安卓 4.3 BLE

为啥在 Android 中将 autoConnect 设置为 true 时,App 不会重新连接到 BLE 设备?

如何从android中的BLE设备获取实际值?