3

我正在开发与 BLE 设备通信的应用程序。我可以轻松地在特性上写入 20 个字节,但是当它超过 20 个字节时就会产生问题。我正在使用

mBluetoothGatt.requestMtu(512);

成功后写特征。

 @Override
                    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
                        super.onMtuChanged(gatt, mtu, status);

                        if (status == BluetoothGatt.GATT_SUCCESS) {
                            System.out.print("Mtu Granted");
//                            this.supportedMTU = mtu;
                        }
                    }

这在棉花糖和棒棒糖中运行良好。但它在牛轧糖(三星 Galaxy s6)中不起作用。

4

2 回答 2

2

我遇到了同样的问题,所以我将 mtu 请求放在一个循环中,它似乎在定期尝试 2 次后工作。

            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (!mtuConfirmed) {
                        mBluetoothGatt.requestMtu(512);
                        mtuRequestCounter++;
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    Log.d(TAG, "MTU change reply received after " + mtuRequestCounter + " attempts");
                }
            }).start();
于 2017-12-01T17:12:48.943 回答
1

我有同样的问题。这是因为我同时收到了来自 Gatt 对象的多个请求。我打电话GATT.discoverServices()GATT.requestMtu(512)同时。而且总是只有第一个电话有效。Gatt 对象有几个回调,例如,您可以先请求更改 MTU。然后当onMtuChanged被调用时,你打电话来询问另一个请求。就我而言,GATT.discoverServices()

于 2021-02-28T04:52:24.960 回答