ANCS推送簡介

史前圖騰發表於2017-12-13

總體原理 ANCS通過藍芽BLE 4.0實現,僅支援iPhone 4S及以上且系統版本在IOS 7以上的手機,同時在外設端需要支援藍芽4.0協議。

1、外設端進行廣播,手機開啟藍芽,搜尋外設,連線外設,之後進行繫結(這很重要,否則無法接收通知)

2、外設在連線建立後需要監聽手機上的ANCS Service中的Notification Source

3、當有通知時,手機會給外設發訊息,說明是哪個應用的通知

4、如果外設想進一步獲取通知的詳情,就往Control Point寫控制資訊,獲取詳情

5、詳情會通過Data Source發過來


ANCS 服務

服務名: AppleNotification Center Service UUID:7905F431-B5CE-4E99-A40F-4B1E122D00D0

角色:

NC:Notification Consumer  (i410e)     NP:Notification Provider  (iOS裝置)

服務特徵值:

Notification Source:   UUID9FBF120D-6301-42D9-8C58-25E699A21DBD (notifiable) Control Point:  UUID 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9 (writeable with response) Data Source: UUID 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB (notifiable)   Note:訪問該服務需要進行配對。 ANCS服務尋找完畢後,就可以開啟監聽通知功能了,這裡需要注意的是,不能同一時間開啟通知源特徵Notification Source的通知和資料來源特徵Data Source的通知功能,所以這裡可以開啟了一個定時任務,讓資料來源特徵在1s後再打來通知功能。

Notification Source

iOS裝置(NP)用來通知i410e(NC)相應的通知;當i410e訂閱(set Notify)該特徵值後就可以接收通知訊息(i410e已自動執行); 格式:

ANCS推送簡介
  Category count: iOS通知中當前category的數量;(例如當有兩個未讀郵件的時候,又收到一個郵件通知,categoryCount就為3); NotificationUID: 一個32位的唯一的數字ID,通過這個ID可以用來傳送命令操作iOS通知。   
ANCS推送簡介
ANCS推送簡介
ANCS推送簡介

Control Point 和 Data Source

NC可以通過Control Point 對iOS通知執行操作;(獲取通知內容或者刪除通知等) NC通過對Control Point特徵值寫特殊的命令來實現獲取通知內容等操作,如果執行成功,NP就會迅速的通過Data Source 特徵值的傳送通知內容到NC來響應該操作。 共三種:

  • 1.獲取通知屬性
    ANCS推送簡介
該命令通過Control Point發出

CommandID :固定為0;
NotificationUID: 特定通知的ID,通過NS 的通知獲取。
AttributeIDs:NC希望讀取的變數ID列表,有些變數可能需要跟一個16bit的數說明想要的最大長度;
複製程式碼

ANCS推送簡介

NP端響應格式:
該響應通過DS通知給到NC
複製程式碼

ANCS推送簡介

CommandID :固定為0;
NotificationID: 特定通知的ID,通過NS 的通知獲取。
Attribute List:查詢結果列表,每一項的格式都是:ID/16bit  Length/Value,每個attribute都是一個字串,其長度由Length指定,但是此字串不是以NULL結尾。若找不到對應的Attribute,則Length為0

* 如果返回的訊息長度大於GATT最大傳輸長度(MTU),則其會被分割成多個分段。藍芽裝置必須將這些分段組裝起來。當所有請求屬性的內容都接收完成後,此過程才算完成;
複製程式碼
  • 2.獲取App屬性

ANCS推送簡介

通過Control Point發出
CommandID :固定為1;
AppIdentifier:app的字串識別符號,以Null結束。
AttributeIDs:希望獲得屬性的列表;
複製程式碼

ANCS推送簡介

響應:
通過DS通知給到NC
複製程式碼

ANCS推送簡介

CommandID :固定為1;
AppIdentifier:app的字串識別符號,以Null結束。
Attribute List:屬性值列表,每一個格式都是:ID/16-bit Length/Value,每個attribute都是一個字串,其長度由Length指定,但是此字串不是以NULL結尾。若找不到對應的Attribute,則Length為0;

* 關於分段以及傳輸結束的判斷標準,與Get Notification Attributes一致;
複製程式碼
  • 3.對通知執行操作
    ANCS推送簡介
CommandID :固定為2;
NotificationUID: 特定通知的ID,通過NS 的通知獲取。
ActionID:從通知源中拿到的可以操作的型別,“積極”操作或“消極”操作.
從iOS8之後,NP可以通知NC一些相關的動作(接通、結束通話電話;刪除通知等),NC可以根據NP的通知執行對應的操作。
 
從NS的通知event flag中 EventFlagPositiveAction和EventFlagNegativeAction位可以判斷是否能夠執行對應的操作。
通過獲取通知屬性對應的屬性IDNotificationAttributeIDPositiveActionLabel和NotificationAttributeIDNegativeActionLabel可以獲取到對應的操作描述(接聽/結束通話、清楚)。
複製程式碼

錯誤碼: 對Control Point執行操作的時候,收到的NP端未識別的操作的響應

ANCS推送簡介

I410e 返回有區別,以規範為準。 0xAA0, 0xAA1, 0xAA2, 0xAA3,

實際實驗之DataSource讀取
主要是介紹一下讀取的各個AttrID返回的都是啥:

0(App ID) ->com.apple.mobilephone

1(Title) ->1 (326) 021-3971(電話號碼,不過劃分方式好怪。。。)如果此號碼存了名字,則是電話本中的名字

2(SubTitle) ->空 如果此號碼存了名字,則是mobile

3(Message) ->Incoming Call

 
其他應用的ID:
簡訊: com.apple.MoileSMS
微信: com.tencent.xin
QQ: com.tencent.mqq
365: com.365rili.Coco
Any.Do:com.anydo.AnyDO
系統提示:com.apple.reminders
複製程式碼
下面以來電為例,解析期間收到的通知。來電時存在兩種操作,不同的操作會收到不同的通知。
1、接聽了電話

(1)來了一同電話

BLE裝置將會收到一則通知,如下:

0 1A 1 1 0 0 0 0

EventID——0:表示為增加一條通知。

EventFlags——1A:即0x1A,具有重要、具有“積極”操作、具有“消極”操作等特性。

CategoryID——1:通知的分類為來電。

CategoryCount——1:通知的個數為1
NotificationUID——0 0 0 0:即該通知的UID為0。

(2)接聽了來電

接聽來電後,會收到一條通知,如下:

2 1A 1 0 0 0 0 0

EventID——2:表示為刪除一條通知。

EventFlags——1A:即0x1A,具有重要、具有“積極”操作、具有“消極”操作等特性。

CategoryID——1:通知的分類為來電。

CategoryCount——0:通知的個數為0。
NotificationUID——0 0 0 0:即該通知的UID為0。

解析出的意思是:刪除來電通知。

2、拒接了電話

(1)來了一同電話

BLE裝置將會收到一則通知,如下:

0 1A 1 1 0 0 0 0

EventID——0:表示為增加一條通知。

EventFlags——1A:即0x1A,具有重要、具有“積極”操作、具有“消極”操作等特性。

CategoryID——1:通知的分類為來電。

CategoryCount——1:通知的個數為1。
NotificationUID——0 0 0 0:即該通知的UID為0。

解析出來的意思就是說:來了一通電話。

(2)拒接了來電

如拒接了來電,BLE裝置將收到兩則通知,如下:

2 1A 1 0 0 0 0 0

0 18 2 1 1 0 0 0

對第一條通知進行解析如下:

EventID——2:表示為刪除一條通知。

EventFlags——1A:即0x1A,具有重要、具有“積極”操作、具有“消極”操作等特性。

CategoryID——1:通知的分類為來電。

CategoryCount——0:通知的個數為0。
NotificationUID——0 0 0 0:即該通知的UID為0。

解析出的意思是:刪除來電通知。

對第二條通知進行解析如下:

EventID——0:表示為新增一條通知。

EventFlags——18:即0x1A,具有重要、具有“消極”操作等特性。

CategoryID——2:通知的分類為未接來電。

CategoryCount——1:通知的個數為1。
NotificationUID——1 0 0 0:即該通知的UID為1。

翻譯的意思是:一通未接來電。
複製程式碼