Xamarin / Android和恐惧蓝牙LE错误133(GATT_ERROR)

时间:2016-11-29 18:05:24

标签: c# android xamarin bluetooth

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

我正在成功扫描设备:

\s

我看到了我要与之交谈的设备(在这种情况下,TI开发板MSP-EXP430F5438处于服务器模式,运行其SPPLE演示应用程序)。所以我停止了扫描:

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);

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

m_adapter.BluetoothLeScanner.StopScan (m_scanCallback);

我几乎立刻回电话说连接失败了:

m_gattCallback = new BlueGattCallback ();
m_gatt = m_selectedDevice.ConnectGatt (Forms.Context, false, m_gattCallback);

我读了this Google bug report所以在我的回调中我尝试直接在回调中调用Connect():

BlueGattCallback.OnConnectionStateChange(gatt, status=133, newState=Disconnected)

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

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

1 个答案:

答案 0 :(得分:0)

因为这取决于每个供应商开发的BLE堆栈, 三星设备上的错误通常比任何其他类型都要多,Android 6是最不稳定的。

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

但最终这并没有解决所有问题,你需要自己处理一些不稳定因素。