我正在尝试编写一个跨平台的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秒)。
知道这里出了什么问题吗?
答案 0 :(得分:0)
因为这取决于每个供应商开发的BLE堆栈, 三星设备上的错误通常比任何其他类型都要多,Android 6是最不稳定的。
所以对于任何因为它而遇到133错误并且有许多不眠之夜的人。我建议使用Sweetblue 但是,您需要自己包装库以便在C#中使用。 它抽象了BLE的许多不稳定部分,并提供良好的重试机制以及在某些情况下的优雅降级。
但最终这并没有解决所有问题,你需要自己处理一些不稳定因素。