blog

BluetoothでApple携帯電話からの通知を受け取る ANCSプロトコル分析

概要 現在、アップルiphone携帯電話からシステム通知を受信できるBluetooth時計、ブレスレット、周辺機器などがたくさんあります。実は、Apple IOS7以降で提供されているANCSプロトコ...

Dec 6, 2020 · 6 min. read
シェア

概要

現在、多くのブルートゥース腕時計、ブレスレット、周辺機器などがリンゴのiphone携帯電話からのシステム通知を受信することができます。

実際、アップルのIOS 7が提供し始めたANCSプロトコルのおかげです。

ANCS

ANCSの目的は、iosデバイスから通知情報を取得するためのシンプルで便利な方法をBluetooth周辺機器に提供することです。そのため、Bluetoothブレスレットや時計は、Apple携帯電話からの着信、テキストメッセージ、および様々なアプリケーションの通知情報を受信することができます。

この記事では、Apple ANCSプロトコルについて説明します。

全体原理

ANCSはBluetooth BLE 4.0経由で実装され、iPhone 4S以上、システムバージョンIOS 7以上の携帯電話のみをサポートしています。

1、ブロードキャストの周辺端、携帯電話は、周辺機器を検索し、Bluetoothを開き、バインディングの後に、周辺機器を接続します。

2、外部接続は、確立後、携帯電話のANCSサービスの通知ソースをリッスンする必要があります。

3, 通知があると、携帯電話は周辺機器にメッセージを送信し、どのアプリケーションの通知かを示します。

4, 届出の詳細について、外部からのさらなるアクセスが想定される場合は、コントロールポイントに管理情報を書き込み、その詳細を入手します。

5、詳細はデータソースを通して送信されます。

プロトコルの詳細

依存関係

GATTのサブセットであるANCSの使用に依存することはなく、GATTクライアントを実装しているデバイスであれば、iosデバイスからの通知メッセージを簡単に取得することができます。

トランスミッション

指定がない場合、ANS経由で送信される値は小端モードを使用します。

指定しない場合、ANS経由で送信される文字列はUTF-8でエンコードされます。

コンセプトの定義

l ANCS:Apple Notification Centre Service(アップル通知センターサービス

l NP:通知ジェネレーター、通常はiosデバイス

l NC: 通知された消費者、通常はBluetoothデバイス

l iOS通知:iOSデバイスに表示される通知。

l GATT通告:GATTの特徴によって送られる通告

Service

ANCSはプライベートUUIDをサービスのUUIDとして使用します:

7905f431-b5ce-4e99-a40f-4b1e122d00d0

ANCSのインスタンスはNP上に1つしかなく、iosのメカニズムに基づくと、ANCSが常に実行されることを保証する方法はありません。

** すべての通知を聞くことができます。**

Characteristic

関与する特性

1.通知ソース

UUID 9FBF120D-6301-42D9-8C58-25E699A21DBD(notifiable)

いくつかのカウントについて通知する基本的な通知ソースです;

2.コントロールポイント

iosデバイスに読み取り詳細などの制御情報を書き込むためのコントローラ;

3.データソース

制御情報が書き込まれた後、このCHARACTERISTICを介して返される詳細データのデータソース;

他にも多くの特徴がありますが、Notification Sourceだけが必須で、他は任意です。

通知元

通知メッセージの更新時にNP****からNCに送信されるメッセージ。

シナリオはいくつかあります:

l 新しいios通知が届きました;

iosの通知が変更されました;

ios通知が削除されました;

l EventID:メッセージタイプ、追加、変更、削除;

l EventFlags: メッセージの優先度、サイレント、重要;

l CategoryID:メッセージ・タイプ;

l CategoryCount:メッセージ数;

l NotificationUID:通知ID、このIDで詳細を取得できます;

通知のライフサイクルは以下の通り:

Get Notification Attributes

l CommandID:0に設定します;

l NotificationUID:通知ソースの同名のフィールドに対応します;

l AttributeIDs:NCが読み取りを希望する変数IDのリスト。変数によっては、希望する最大長を示す16ビットの数値が続く必要があります;

NP はこのコマンドを受信すると、Data Source 特性を介して結果を返すので、このパラメータをリッスンする必要があります。このコマンドが発行された後に対応するリターン・メッセージは以下のとおりです:

l CommandID: 0;

l NotificationUID: 対応するリクエストのUID;

l AttributeList:クエリー結果のリスト、各項目のフォーマットは:ID/16bit Length/Value、各属性は文字列で、その長さはLengthで指定されますが、この文字列はNULL終端ではありません。対応する属性が見つからない場合、Lengthは0になります;

  • 返されたメッセージの長さが GATT の最大伝送長を超える場合、複数のセグメントに分割されます。Bluetooth デバイスはこれらのセグメントをアセンブルする必要があります。すべてのリクエスト属性の内容を受信すると、プロセスは完了します;

Get App Attributes

このコマンドにより、NCはNPにインストールされたアプリの特定の属性を読み取ることができ、以下のフォーマットでControl Point特性にいくつかのコマンドを送信する必要があります:

l CommandID:1に設定;

l AppIdentifier: App ID。この文字列はNULL終端でなければなりません;

l AttributeIDs:必要な属性のリスト;

このコマンドの応答メッセージ・フォーマットは以下のとおりです:

l CommandID: 1;

l AppIdentifier: リクエストIDに対応するアプリID;

l AttributeList:属性値のリストで、各属性のフォーマットは ID/16-bit Length/Valueで、各属性はLengthで指定される長さの文字列ですが、この文字列はNULL終端ではありません。対応する Attribute が見つからない場合、Length は 0 になります;

  • セグメンテーションと送信終了の判断基準は、Get Notification Attributesと一致しています;

Session

ANCSセッションは、NCがNotification Sourceをサブスクライブした後に開始し、サブスクライブの解除または接続の切断後に終了します。ANCSは完全な同期サービスではないため、セッション中の状態は記録されません。したがって、すべてのNotificationUIDとAppIdentifierは、特定のセッション期間のみ有効です。

セッションが終了すると、NCはすべてのIDとデータ内容をクリアする必要があります。新しいセッションが始まると、NPは既存のすべての通知をNCに送信しようとします。

Attribute Fetching and Caching

例えば、最初に通知のリストを表示し、ユーザが1つをクリックした後にのみ詳細を照会るなど、ユーザがアクションを起こしたときにのみ属性を取得することをお勧めします。

また、1つのセッションでアプリ属性のキャッシュテーブルを作成し、一部の定数属性を繰り返し取得しないようにすることも推奨されます。

Error Codes

コントロール・ポイント特性の書き込み時にエラーが発生することがあり、エラーコードは以下のように定義されています:

0xA0 : 不明なコマンド、不正な commandID;

0xA1 :無効なコマンドです;

0xA2: パラメータが無効です。

エラーが発生した場合、データ ソースは返されません。

タイミングチャート

NPとNCに共通する相互作用のタイミングは以下の通り:

詳細を取得するタイミングは以下の図の通りです:

CategoryID

EventID

EventFlags

CommandID

NotificationAttributeID

AppAttributeID

DataSource読み込みの実践実験

主なポイントは、それぞれのAttrIDが何を返すかを記述することです:

電話

属性ID

戻り値

0 (アプリID)

コムアップルモバイルフォン

1 (タイトル)

1 021-7931

この番号に名前が保存されている場合は、電話帳の名前になります。

2 (サブタイトル)

がらがら

この番号に名前が保存されている場合、それは携帯電話です。

3(メッセージ)

着信

SMS:

属性ID

戻り値

0 (アプリID)

com.apple.MoileSMS

1 (タイトル)

+86 132-6021-7931

この番号に名前が保存されている場合は、電話帳の名前になります。

2 (サブタイトル)

がらがら

3(メッセージ)

SMSの内容

属性ID

戻り値

0 (アプリID)

1 (タイトル)

2 (サブタイトル)

がらがら

3(メッセージ)

送信者:コンテンツ

他のアプリケーションのID:

QQ: c o m . T E N C E N T . m q q

365: c o m . 3 6 5 r i l i . C o c o

Any.Do: c o m . A N Y D O . A n y D O

システムのヒント: c o m . a p p l e . システムヒント

帰属を明記した上で転載:

Read next

Swift-Extension ストレージ属性を追加する

Swiftでは、拡張機能で "格納属性 "を直接追加することはできません。しかし、実際には、拡張機能を使用して既に作成されたクラスに新しい格納属性を追加するために使用されることがよくあります。例えば、異なる UIView インスタンスを区別するために UIView クラスにプロパティを追加します。 このプロパティを UIView エクステンションに直接追加すると、UIView のインスタンスは UIView...

Dec 5, 2020 · 1 min read