Xamarin/Android和恐惧蓝牙LE错误133(GATT_ERROR)
问题描述:
我想写一个跨平台的Xamarin Forms应用程序(在C#中)与蓝牙LE设备交谈。我已经下载了一些软件包(Plugin.BLE和Acr.Ble),但都没有工作(他们都扫描但不会连接),所以我想我会尝试直接使用Android API来查看这是否会帮助我理解什么是失败。顺便说一句,我在运行Android 6.0.1版的Nexus 7平板电脑上运行。Xamarin/Android和恐惧蓝牙LE错误133(GATT_ERROR)
我成功地在扫描设备:
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);
,我看到我想跟(在这种情况下,TI开发板MSP-EXP430F5438在服务器模式下的设备,运行他们SPPLE演示应用程序)。所以我停止扫描:
m_adapter.BluetoothLeScanner.StopScan (m_scanCallback);
,然后我连接到所需设备:
m_gattCallback = new BlueGattCallback();
m_gatt = m_selectedDevice.ConnectGatt (Forms.Context, false, m_gattCallback);
,我几乎立即收到回电说连接失败:
BlueGattCallback.OnConnectionStateChange(gatt, status=133, newState=Disconnected)
我读this Google bug report所以在我的回调中,我试着直接在我的回调中调用Connect():
if (((int)status == 133) && (numRetries < 10))
{
numRetries++;
bool connect = gatt.Connect();
Debug.WriteLine (" gatt.Connect() returned " + connect);
}
此代码失败,错误133反复且很快(所有10次重试大约需要3秒)。
任何想法是怎么回事错在这里?
答
由于这取决于每个供应商开发的BLE堆栈,因此在三星设备上出现的错误通常比其他任何类型都多,Android 6最不稳定。
因此,任何人遇到133错误,并有许多不眠之夜,因为它。我会推荐使用Sweetblue 包装器,但是你需要自己打包库以便在C#中使用。 它抽象了许多BLE的不稳定部分,并提供了良好的重试机制以及在某些情况下的优雅降级。
但最终这并不能解决所有问题,您需要自己处理一些不稳定因素。
p.s.据我所知,我没有执行任何线程,所有这些都发生在主UI线程中。 –
p.p.s.我刚刚检查过,并且我的回调正在一个线程中发生,所以我更改了代码以使用Device.BeginInvokeOnMainThread()在我的主UI线程中调用gatt.Connect(),但它并没有帮助。 p.p.p.s. Acr.Ble插件在iOS上正常工作,因此这是一个仅限Android的问题。 –
p.p.p.p.s.我们在Note 4和G4上尝试了这一点,结果完全相同。 –