2016-11-29 120 views
2

私は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秒かかる)。

ここで何が問題になるのでしょうか?

+0

p.s.私が知る限り、どのスレッドも実行していないので、これはすべてメインのUIスレッドで発生しています。 –

+1

p.p.s.私はちょうどチェックし、コールバックはスレッドで発生しているので、Device.BeginInvokeOnMainThread()を使用してメインのUIスレッドでgatt.Connect()を呼び出すようにコードを変更しました。 p.p.p.s. Acr.BleプラグインはiOS上で正しく動作するので、これはAndroidのみの問題です。 –

+0

p.p.p.p.s.私たちは注4とG4でもこれを試しましたが、まったく同じ結果でした。 –

答えて

0

これは、各ベンダーが開発するBLEスタックに依存しているため、一般にSamsungのデバイスではエラーが発生しますが、Android 6は最も不安定です。

したがって、133エラーに遭遇し、そのために多くの不眠の夜を持つ人にとっては、 Sweetblue ラッパーを使用することをお勧めしますが、C#で使用するにはライブラリを自分でラップする必要があります。 これは、BLEの不安定な部分の多くを抽象化し、場合によっては正常な再試行メカニズムと優雅な劣化を提供します。

しかし、これですべての問題が解決するわけではなく、あなた自身が不安定な状態に対処する必要があります。

関連する問題