Xamarin/Android 和可怕的蓝牙 LE 错误 133 (GATT_ERROR)

Bet*_*ker 5 c# android bluetooth xamarin

我正在尝试编写一个跨平台的 Xamarin Forms 应用程序(在 C# 中)来与蓝牙 LE 设备通信。我已经下载了几个包(Plugin.BLE 和 Acr.Ble),但都不起作用(它们都扫描但无法连接),所以我想我会尝试直接使用 Android API 来看看这是否有助于我理解出了什么问题。顺便说一句,我在运行 Android 6.0.1 版的 Nexus 7 平板电脑上运行。

我正在成功扫描设备:

BluetoothManager bluetoothManager = (BluetoothManager)Forms.Context.GetSystemService (Android.Content.Context.BluetoothService);
m_adapter = bluetoothManager.Adapter;
if ((m_adapter == null) || (!m_adapter.IsEnabled))
    return false;
m_scanCallback = new BlueCallback (this);
m_adapter.BluetoothLeScanner.StartScan (m_scanCallback);
Run Code Online (Sandbox Code Playgroud)

并且我看到了我想与之交谈的设备(在本例中,是处于服务器模式的 TI 开发板 MSP-EXP430F5438,正在运行其 SPPLE 演示应用程序)。所以我停止扫描:

m_adapter.BluetoothLeScanner.StopScan (m_scanCallback);
Run Code Online (Sandbox Code Playgroud)

然后我连接到所需的设备:

m_gattCallback = new BlueGattCallback ();
m_gatt = m_selectedDevice.ConnectGatt (Forms.Context, false, m_gattCallback);
Run Code Online (Sandbox Code Playgroud)

我几乎立即接到回电说连接失败:

BlueGattCallback.OnConnectionStateChange(gatt, status=133, newState=Disconnected)
Run Code Online (Sandbox Code Playgroud)

我阅读了这个谷歌错误报告,所以在我的回调中我尝试直接在我的回调中调用 Connect() :

if ( ((int)status == 133) && (numRetries < 10) )
{
    numRetries++;
    bool connect = gatt.Connect ();
    Debug.WriteLine ("   gatt.Connect() returned " + connect);
}
Run Code Online (Sandbox Code Playgroud)

此代码反复失败并返回错误 133 且速度非常快(所有 10 次重试大约需要 3 秒)。

知道这里出了什么问题吗?

Mar*_*skI 1

由于这取决于每个供应商开发的 BLE 堆栈,因此该错误通常比任何其他类型的设备更容易发生在三星设备上,Android 6 是最不稳定的。

对于任何遇到 133 错误并因此而度过许多不眠之夜的人来说。我建议使用Sweetblue 包装器,但是您需要自己包装该库才能在 C# 中使用。它抽象了 BLE 的许多不稳定部分,并提供良好的重试机制以及在某些情况下的优雅降级。

但最终这并不能解决所有问题,您需要自己处理一些不稳定的问题。