BLE Gatt onConnectionStateChange 失败,状态 133 和 257

Posted

技术标签:

【中文标题】BLE Gatt onConnectionStateChange 失败,状态 133 和 257【英文标题】:BLE Gatt onConnectionStateChange failed, Status 133 and 257 【发布时间】:2017-11-24 12:02:13 【问题描述】:

我正在尝试将我的信标连接到 Gattservice。在回调 onConnectionStateChange 中,它总是失败,我得到了

状态码 133 和 257。

Somehwere 写道 133 代表许多连接。在我的代码中有带有 gatt.disconnect() 的行。 我不知道如何解决它,因为所有其他 gattexamples 都是相同的。如果发现错误很重要,我正在使用 android 6.0.1 版本和 API 23。 这是我的代码:

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) 

        if(status == BluetoothGatt.GATT_SUCCESS) 
            switch (newState) 
                case BluetoothProfile.STATE_CONNECTED:
                    mBleDevices.add(gatt.getDevice());
                    Log.i("Beacons", "STATE_CONNECTED");

                    runOnUiThread(new Runnable() 
                        @Override
                        public void run() 
                            mBluetoothGatt.discoverServices();
                        
                    );
                    break;
                case BluetoothProfile.STATE_DISCONNECTED:
                    Log.e("Beacons", "STATE_DISCONNECTED");
                    mBleDevices.remove(gatt.getDevice());
                    mBluetoothGatt.disconnect();
                    mBluetoothGatt = null;
                    break;
                default:
                    Log.e("Beacons", "STATE_OTHER");
            
         else 
            Log.e("Beacons", "ERROR WITH CONNECTING " + status);
            mBleDevices.remove(gatt.getDevice());
        
 

我的 ScanCallback 如下所示:

 public void onScanResult(int callbackType, ScanResult result) 
    runOnUiThread(new Runnable() 
       @Override
       public void run() 
          BluetoothDevice btDevice = result.getDevice();
          connectToDevice(btDevice);
       
    );
 

然后像这样开始连接:

 runOnUiThread(new Runnable() 
        @Override
        public void run() 
            mBluetoothGatt = btDevice.connectGatt(getApplicationContext(), true, connectCallback);
        
    );

connectCallback 会导致 onConnectionStateChange 函数。 感谢您的帮助!

【问题讨论】:

你有beacon的服务uuid​​吗? Michalik,您将多次收到扫描回调,因此 onScanResult() 正在多次调用,并且您尝试为每个回调连接设备,即您尝试多次连接设备.尝试在列表视图中显示扫描回调结果,然后连接到相应的设备 是的,但这是连接后应该做的事情,对吗?如果有连接,我调用 gatt.getServices(),将它们保存在一个变量中并检查其中一项服务是否与我想要的相同:gattServices.get(i).getUuid().equals(Battery_Service_UUID) ,并对其进行进一步的操作。 【参考方案1】:

在某些 Android 设备上,如果 Android 手机之前未与外围设备配对(绑定),我会在连接时看到 133 错误。如果我在应用程序尝试在后台连接的同时进入设置 -> 蓝牙,则连接有效。 (奇怪的是,你不需要在屏幕上做任何事情,它只需要启动即可。)一旦第一次成功,错误就永远消失了。

我猜这是一个安全限制,但我还没有找到优雅地解决它的正确方法。

【讨论】:

【参考方案2】:

我必须在调用中指定传输参数来解决这个问题。这是一个可选的第四个参数来指定它是一个 BLE 设备。

mBluetoothGatt = device.connectGatt(this, false, mGattCallback, 2);

https://developer.android.com/reference/android/bluetooth/BluetoothDevice#connectGatt(android.content.Context,%20boolean,%20android.bluetooth.BluetoothGattCallback,%20int)

【讨论】:

添加第四个参数对我有用。谢谢【参考方案3】:

试试这个:开始扫描:

    private void scanLeDevice(final boolean enable) 
        if (enable) 
            ParcelUuid uuid = ParcelUuid.fromString("Your Beacon Service UUID");
            ScanFilter scanFilter = new ScanFilter.Builder().setServiceUuid(uuid).build();
            ScanSettings settings = new ScanSettings.Builder()
                    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                    .setReportDelay(0)
                    .build();

            if (Build.VERSION.SDK_INT < 21) 
                mBluetoothAdapter.startLeScan(mLeScanCallback);
             else 
               mLEScanner.startScan(Collections.singletonList(scanFilter), settings, mScanCallback);
            
         else 
            if (Build.VERSION.SDK_INT < 21) 
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
             else 
                mLEScanner.stopScan(mScanCallback);
            
        
    

对于scanCallBack

private ScanCallback mScanCallback = new ScanCallback() 
        @Override
        public void onScanResult(int callbackType, ScanResult result) 
            Log.i("callbackType", String.valueOf(callbackType));
            Log.i("result", result.toString());
            BluetoothDevice btDevice = result.getDevice();
            connectToDevice(btDevice);
        

        @Override
        public void onBatchScanResults(List<ScanResult> results) 
            for (ScanResult sr : results) 
                Log.i("ScanResult - Results", sr.toString());
            
        

        @Override
        public void onScanFailed(int errorCode) 
            Log.e("Scan Failed", "Error Code: " + errorCode);
        
    ;

private BluetoothAdapter.LeScanCallback mLeScanCallback =
            new BluetoothAdapter.LeScanCallback() 
                @Override
                public void onLeScan(final BluetoothDevice device, int rssi,
                                     byte[] scanRecord) 
                    runOnUiThread(new Runnable() 
                        @Override
                        public void run() 
                            Log.i("onLeScan", device.toString());
                            connectToDevice(device);
                        
                    );
                
            ;

连接设备

public void connectToDevice(BluetoothDevice device) 
    if (mGatt == null) 
        mGatt = device.connectGatt(this, false, gattCallback);
        scanLeDevice(false);// will stop after first device detection
    

gatt回调

 private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() 
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) 
            Log.i("onConnectionStateChange", "Status: " + status);
            switch (newState) 
                case BluetoothProfile.STATE_CONNECTED:
                    Log.i("gattCallback", "STATE_CONNECTED");
                    gatt.discoverServices();
                    break;
                case BluetoothProfile.STATE_DISCONNECTED:

                    Log.e("gattCallback", "STATE_DISCONNECTED");
                    break;
                default:
                    Log.e("gattCallback", "STATE_OTHER");
            

        

然后重写 onServicesDiscovered 方法。

【讨论】:

好的,错误状态消失了,但是现在代码没有进入mScanCallback。它只会启动和停止扫描。也许调用 scanLeDevice(false) 放错地方了? 首先你必须设置 scanLeDevice(true) 并在设备连接后设置 scanLeDevice(false); 对于按钮单击事件的演示,在“connectToDevice()”方法设置“scanLeDevice(false)”中连接设备后放置“scanLeDevice(true)”。 是的,好吧我明白了,但它并没有涉及到设备正在连接的那部分,然后我在成功连接后放置了 scanLeDevice(false)(在 gattCallback 中) .之后出现错误。 扫描失败,错误代码:1【参考方案4】:

133 是一个通用错误,除了连接失败之外没有任何意义。它可能意味着许多不同的东西。您需要查看 Logcat 并找出它未连接的原因或 hci snoop 日志。

【讨论】:

以上是关于BLE Gatt onConnectionStateChange 失败,状态 133 和 257的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙 BLE GATT 剖析-- GATT UUID and 举例

BLE 堆栈 - GATT 与 ATT

蓝牙 GATT 向 BLE 设备发送数据

BLE GATT 介绍

GATT特性BLE读取速度慢

阻止 BLE 设备连接到 GATT 服务器