私はBluetooth LEデバイスと通信するためにクロスプラットフォームのXamarin Formsアプリケーション(C#で)を書こうとしています。私はいくつかのパッケージ(Plugin.BLEとAcr.Ble)をダウンロードしていますが、いずれも動作していません(スキャンしても接続できません)ので、Android APIを直接使用して、何が失敗しているのか。ところで、Androidバージョン6.0.1を搭載したNexus 7タブレットを使用しています。Xamarin/Androidと恐ろしいBluetooth 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);
と私は彼らのSPPLEデモアプリケーションを実行している、私はサーバーモードで(この場合は、TI開発ボードMSP-EXP430F5438に話をしたいデバイスを参照してください。
私は正常にデバイスをスキャンしています)。バック接続が失敗したと言って
m_gattCallback = new BlueGattCallback();
m_gatt = m_selectedDevice.ConnectGatt (Forms.Context, false, m_gattCallback);
と私はかなりすぐにコールを取得:
m_adapter.BluetoothLeScanner.StopScan (m_scanCallback);
をしてから、私は目的のデバイスに接続します。だから私は、スキャンを停止
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秒かかる)。
ここで何が問題になるのでしょうか?
p.s.私が知る限り、どのスレッドも実行していないので、これはすべてメインのUIスレッドで発生しています。 –
p.p.s.私はちょうどチェックし、コールバックはスレッドで発生しているので、Device.BeginInvokeOnMainThread()を使用してメインのUIスレッドでgatt.Connect()を呼び出すようにコードを変更しました。 p.p.p.s. Acr.BleプラグインはiOS上で正しく動作するので、これはAndroidのみの問題です。 –
p.p.p.p.s.私たちは注4とG4でもこれを試しましたが、まったく同じ結果でした。 –