Android 8.1 连接到调用 connectGatt 的 BLE 外围设备。回调总是说断开连接。从不连接

Posted

技术标签:

【中文标题】Android 8.1 连接到调用 connectGatt 的 BLE 外围设备。回调总是说断开连接。从不连接【英文标题】:Android 8.1 connecting to a BLE peripheral calling connectGatt. Callback always says disconnected. Never connects 【发布时间】:2018-04-27 17:06:31 【问题描述】:

我是 android 编程新手,正在尝试编写一个与 BLE 外围设备配合使用的应用程序。我有一个我编写的 ios 应用程序,它做同样的事情,我的 iOS 应用程序已经按照我想要的方式运行。

我编写了一个扫描外围设备列表的活动。到目前为止,这似乎运行良好。

然后我选择一个外围设备并将 BluetoothDevice 对象传递给一个“设备详细信息”活动,该活动应该连接到外围设备,然后用它做一些事情。

在我的设备详细信息活动中,我获取了对连接按钮的引用,然后添加了一个点击侦听器。点击监听器创建一个 MyBluetoothGattCallback 实例,然后将其用作调用 connectGatt() 的参数。这个调用确实返回了看起来像一个有效的 BluetoothGatt 对象。调用了 MyBluetoothGattCallback,但只调用了一次,状态为 133,状态为 0。这似乎是 BluetoothProfile.STATE_DISCONNECTED。回调不再被调用。每次我按下连接按钮时都会发生这种情况。

我已经确保只有一个扫描操作发生,并且从应用程序的主要活动中停止。所以此时没有进行扫描。

我的问题是我应该做些什么不同的事情才能使连接正常工作?

public class DeviceDetails extends AppCompatActivity 

public BluetoothDevice mBluetoothDevice;
public BluetoothSocket mBluetoothSocket;
public BGXBluetoothGattCallback mGattCallback;
public BluetoothGatt mBluetoothGatt;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_device_details);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    TextView titleTextView = findViewById(R.id.DeviceDetailsTitleTextView);

    mBluetoothDevice = (BluetoothDevice) getIntent().getExtras().getParcelable("BLUETOOTH_DEVICE");
    String sdeviceName = mBluetoothDevice.getName();
    if (null == sdeviceName) 
        sdeviceName = "No device name";
    

    titleTextView.setText(sdeviceName);

    Button connectButton = findViewById(R.id.connectButton);
    connectButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Log.d("debug", "Connect button pressed");
            if (null == mGattCallback) 
                mGattCallback = new MyBluetoothGattCallback();
            

            mBluetoothGatt = mBluetoothDevice.connectGatt(DeviceDetails.this, false, mGattCallback);

        
    );

这是我的 BluetoothGattCallback 子类:

public class MyBluetoothGattCallback extends BluetoothGattCallback 
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) 
    super.onConnectionStateChange(gatt,status,newState);

    Log.d("debug", "onConnectionStateChange status: " + status + " newState: "+newState);

    switch(newState) 
        case BluetoothProfile.STATE_CONNECTING:
            Log.d("debug", "connection state: CONNECTING.");
            break;
        case BluetoothProfile.STATE_CONNECTED:
            Log.d("debug", "connection state: CONNECTED.");
            break;
        case BluetoothProfile.STATE_DISCONNECTING:
            Log.d("debug", "connection state: DISCONNECTING.");
            break;
        case BluetoothProfile.STATE_DISCONNECTED:
            Log.d("debug", "connection state: DISCONNECTED.");
            break;
        default:
            Log.d("debug", "connection state: OTHER.");
            break;
    


@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) 
    super.onServicesDiscovered(gatt, status);
    Log.d("debug", "onServicesDiscovered.");
    

【问题讨论】:

【参考方案1】:

事实证明,导致看到结果的这段代码没有任何问题。我从嵌入式设备中清除了绑定信息,重新启动手机,然后连接,发现服务等。

【讨论】:

以上是关于Android 8.1 连接到调用 connectGatt 的 BLE 外围设备。回调总是说断开连接。从不连接的主要内容,如果未能解决你的问题,请参考以下文章

无法从android okhttp3连接到节点websocket

Qt Connect 无法连接到插槽

无法连接到 android KivyMD 上的 mysql 数据库

连接到上游时connect()失败(111:连接被拒绝)

RxSwift:多次连接到 Connectable Observable

Windows 8.1 服务无法连接到 SQL Server 数据库