Android BLE 数据写入问题 - 出现错误 133

Posted

技术标签:

【中文标题】Android BLE 数据写入问题 - 出现错误 133【英文标题】:Issue with Android BLE data Write- Getting error 133 【发布时间】:2017-12-20 07:28:50 【问题描述】:

在过去的 6 个月里,我一直致力于 BLE 应用程序。 在我最近的项目中,我正在集成一个自定义 BLE 设备,它在读取数据时会出现同步问题。 “onCharacteristicRead”总是返回 133 错误代码。请通过完整的场景,如果有人有任何解决方案,请帮助我。

场景 定制 BLE 设备提供三种服务。

    紧急情况

    一目了然

    电池电量

我的应用程序中只需要两个服务。电池和紧急情况。 最初,我将使用以下代码扫描设备,

 private void scan() 
        if (isLollyPopOrAbove()) // Start Scanning For Lollipop devices
            mBluetoothAdapter.getBluetoothLeScanner().startScan(scanFilters(), scanSettings(), scanCallback); // Start BLE device Scanning in a separate thread
         else 
            mBluetoothAdapter.startLeScan(mLeScanCallback); // Start Scanning for Below Lollipop device
        
    




   private List<ScanFilter> scanFilters() 
        String emergencyUDID = "3C02E2A5-BB87-4BE0-ADA5-526EF4C14AAA";
        ScanFilter filter = new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString(emergencyUDID)).build();
        List<ScanFilter> list = new ArrayList<ScanFilter>(1);
        list.add(filter);
        return list;
    



   private ScanSettings scanSettings() 
        ScanSettings settings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_BALANCED).build();
        return settings;
    

这工作正常,我正在获得扫描结果,我可以连接到设备。建立连接后,我将从 GattCallBack 进行以下调用

mBluetoothGatt.discoverServices();

然后我得到服务发现完成回调

   @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status)               //BLE service discovery complete
            if (status == BluetoothGatt.GATT_SUCCESS)                                  //See if the service discovery was successful
                Log.i(TAG, "**ACTION_SERVICE_DISCOVERED**" + status);
                broadcastUpdate(BLEConstants.ACTION_GATT_SERVICES_DISCOVERED);                       //Go broadcast an intent to say we have discovered services
             else                                                                       //Service discovery failed so log a warning
                Log.i(TAG, "onServicesDiscovered received: " + status);
            
        

从这里我找到使用提供的 UUID 的可用 MLDP 服务。这也很好用。

但是当我阅读特征时,

public void readCharacteristic(BluetoothGattCharacteristic characteristic) 
        if (mBluetoothAdapter == null || mBluetoothGatt == null)                       //Check that we have access to a Bluetooth radio
            return;
        
        boolean status = mBluetoothGatt.readCharacteristic(characteristic);                              //Request the BluetoothGatt to Read the characteristic
        Log.i(TAG, "READ STATUS " + status);
    

响应状态为真,但“onCharacteristicRead”回调始终为 133

 @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)  //A request to Read has completed
            //String value = characteristic.getStringValue(0);
            //int value = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT32, 0);
//            if(characteristic.getUuid().e)
                if (status == BluetoothGatt.GATT_SUCCESS) 
                    //See if the read was successful
                    Log.i(TAG, "**ACTION_DATA_READ**" + characteristic);
                    broadcastUpdate(BLEConstants.ACTION_DATA_AVAILABLE, characteristic);                 //Go broadcast an intent with the characteristic data
                 else 
                    Log.i(TAG, "ACTION_DATA_READ: Error" + status);
                


        

【问题讨论】:

【参考方案1】:

最后,我找到了处理 133 错误的解决方案。在深入分析的过程中,我发现BLE请求响应过程有一些延迟。所以我为每次读取和写入设置了 500 毫秒的延迟。现在它工作得很好。我已经在各种设备上对其进行了测试及其工作。我不知道这是否是一种解决方法。但这可能对面临类似问题的开发人员有所帮助。

【讨论】:

我遇到了同样的问题,然后我也使用了延迟......但这不是一个好的解决方案,因为当距离更远时,回调可能需要超过 500 毫秒。最好的解决方案是依赖读/写回调。 我正在捕获读写回调(onCharacteristicRead() 和 onCharacteristicWrite())。但这里的问题是,我在读写回调中立即收到 GATT 错误。我认为这个问题没有可用的解决方案。 写入多个值或读取多个值时会出现该错误,对吗?如果是,那么我有一个解决方案。 是的,我首先阅读一些“连接服务”。在读取回调中,我将 App 状态写入同一服务。在写入回调中,我正在读取“紧急服务”状态并将应用程序状态写入读取回调。最后,我正在阅读电池。每次读写,我都需要一些延迟。 对于多次读取,请尝试this 解决方案。对于多次写入提出问题,我会在那里发布答案。【参考方案2】:

错误代码:133 表示 GATT__ERROR,设备不在范围内。在读取事件期间可能存在错误。我建议请先从设备端检查。

一个问题:这个设备需要绑定才能连接吗?

【讨论】:

是的,我也添加了绑定。现在反应越来越好。但还是随机抛出133。

以上是关于Android BLE 数据写入问题 - 出现错误 133的主要内容,如果未能解决你的问题,请参考以下文章

空指针异常错误发送一个特征 BLE android

Android BLE Gatt 连接更改状态

在 Android 中写入 GATT 后的 BLE 回答

无法写入 BLE 特性

IOS 蓝牙 BLE 写入值返回“未知错误”

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