2

ANCS にサブスクライブする BLE ペリフェラルがあります。また、アプリが接続するいくつかのカスタム サービスもホストします。

ANCS のため、設定アプリで周辺機器 (xxx) への接続を行う必要があります。そのため、アプリ内から BLE 接続を開始する機能はありません。これにより、UseEx がクリーンに保たれ、「コーナー ケース」が減少します。

ユーザーが設定アプリで接続するという考えです。その後、周辺機器が範囲外に出た場合、iOS は範囲内に戻ると自動的に再接続します。

ただし、クライアントは、たとえば部屋を出た後、周辺機器が再接続しないことがよくあることに気付きました。

これを確実に再現するには、iPhone から約 15 メートル離れた金属製の箱の中に BLE 周辺機器を配置する必要があります。ケースを適切な速度で開閉することで、10 秒程度の時間枠内で一連の失敗した ANCS 接続要求を誘発できます。

以下は、信号損失による最初の接続失敗を示すデバイス コンソール ログです。

Mar 18 16:38:05 afes-iPhone BTLEServer[107] <Notice>: (Note ) Central "xxx" is now subscribed to characteristic "ANCS Data Source"
Mar 18 16:38:07 afes-iPhone BTServer[68] <Error>: Core       Connection timed out to device "xxxxxxx"
Mar 18 16:38:07 afes-iPhone BTLEServer[107] <Notice>: (Note ) Peripheral "xxx" is now disconnected: Error Domain=CBErrorDomain Code=6 "The connection has timed out unexpectedly." UserInfo=0x14528470 {NSLocalizedDescription=The connection has timed out unexpectedly.}
Mar 18 16:38:07 afes-iPhone BTLEServer[107] <Notice>: (Note ) Connecting peripheral "xxx"...
Mar 18 16:38:07 afes-iPhone BTLEServer[107] <Notice>: (Note ) Central "xxx" is now unsubscribed from characteristic "ANCS Notification Source"
Mar 18 16:38:07 afes-iPhone BTLEServer[107] <Notice>: (Note ) Central "xxx" is now unsubscribed from characteristic "ANCS Data Source"
Mar 18 16:38:08 afes-iPhone BTLEServer[107] <Notice>: (Note ) Peripheral "xxx" is now connected
Mar 18 16:38:08 afes-iPhone Preferences[164] <Warning>: (Warn ) CoreBluetooth: API MISUSE: <CBPeripheral: 0x14da8170, identifier = xxxxxx, name = xxx, state = disconnected> can only accept commands while in the connected state
....
Mar 18 16:38:09 afes-iPhone BTServer[68] <Error>: Core       Connection timed out to device "xxxxxxxxx"
Mar 18 16:38:09 afes-iPhone BTLEServer[107] <Notice>: (Note ) Peripheral "xxx" is now disconnected: Error Domain=CBErrorDomain Code=6 "The connection has timed out unexpectedly." UserInfo=0x1453daf0 {NSLocalizedDescription=The connection has timed out unexpectedly.}
Mar 18 16:38:09 afes-iPhone BTLEServer[107] <Notice>: (Note ) Connecting peripheral "xxx"...
Mar 18 16:38:09 afes-iPhone BTLEServer[107] <Notice>: (Note ) Peripheral "xxx" did not use any built-in service, strike #1

...

そして、金属製の箱を適切に開閉し続けると、同じ「API MISUSE」を 3 回続けて行うことができます。

次のメッセージが表示されます。

Mar 18 16:38:12 afes-iPhone BTLEServer[107] <Notice>: (Note ) Peripheral "xxx" did not use any built-in service, strike #2

...

Mar 18 16:38:16 afes-iPhone BTLEServer[107] <Notice>: (Note ) Peripheral "xxx" did not use any built-in service, strike #3

...

これは、周辺機器をある種の「グレーリスト」に配置する「スリー ストライク アンド アウト」アルゴリズムのようです。時間は 11 秒程度の範囲内である必要があります。尋問を遅くすることはできません。または、ペアリング タイムアウトを伴う 30 秒のキー交換に逆らうことはできません。

このグレー リストは、ユーザーが [設定] を開いて手動で接続しない限り、iOS がこの周辺機器の ANCS への再接続を許可しないことを意味します。

つまり、CBCentralManager - retrieveConnectedPeripheralsWithServices: メソッドは、接続されていないため、周辺機器を取得しません。

以前に確認したペリフェラルの UDID を保存し、didDisconnectPeripheral へのコールバック時に -retrievePeripheralsWithIdentifiers を使用して再接続するという回避策を追加する必要がありました。

ただし、ANCS 接続の継続性を維持するために、Bluetooth-central UIBackground モードを Info.plist に追加して、アプリがバックグラウンドで didDisconnectPeripheral を受信すると再接続が行われるようにする必要もありました。もちろん、アプリがアンロードされ、状態の保存と復元が行われない場合、ANCS 接続は再び切断されます。

また、ウォッチドッグ タイマーを使用して、フォアグラウンドで接続状態を定期的にチェックしています。

効果を再現するのは困難ですが、クライアントは非常に頻繁にそれを見ることができるようです.BLEデバイスの場合、接続の信頼性が低い可能性が高いことは確かです.

ANCS が iOS でより堅牢に処理されていれば、アプリの電力効率を大幅に向上させ、より少ない労力でアプリを開発できたはずです。

使用するデバイスは、iOS 8.1 および 8.2 の iPhone 4S および iPhone 6 です。

質問: ANCS でこの動作を見た人はいますか?

4

0 に答える 0