總體原理 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已自動執行); 格式:
Category count: iOS通知中當前category的數量;(例如當有兩個未讀郵件的時候,又收到一個郵件通知,categoryCount就為3); NotificationUID: 一個32位的唯一的數字ID,通過這個ID可以用來傳送命令操作iOS通知。Control Point 和 Data Source
NC可以通過Control Point 對iOS通知執行操作;(獲取通知內容或者刪除通知等) NC通過對Control Point特徵值寫特殊的命令來實現獲取通知內容等操作,如果執行成功,NP就會迅速的通過Data Source 特徵值的傳送通知內容到NC來響應該操作。 共三種:
- 1.獲取通知屬性
該命令通過Control Point發出
CommandID :固定為0;
NotificationUID: 特定通知的ID,通過NS 的通知獲取。
AttributeIDs:NC希望讀取的變數ID列表,有些變數可能需要跟一個16bit的數說明想要的最大長度;
複製程式碼
NP端響應格式:
該響應通過DS通知給到NC
複製程式碼
CommandID :固定為0;
NotificationID: 特定通知的ID,通過NS 的通知獲取。
Attribute List:查詢結果列表,每一項的格式都是:ID/16bit Length/Value,每個attribute都是一個字串,其長度由Length指定,但是此字串不是以NULL結尾。若找不到對應的Attribute,則Length為0
* 如果返回的訊息長度大於GATT最大傳輸長度(MTU),則其會被分割成多個分段。藍芽裝置必須將這些分段組裝起來。當所有請求屬性的內容都接收完成後,此過程才算完成;
複製程式碼
- 2.獲取App屬性
通過Control Point發出
CommandID :固定為1;
AppIdentifier:app的字串識別符號,以Null結束。
AttributeIDs:希望獲得屬性的列表;
複製程式碼
響應:
通過DS通知給到NC
複製程式碼
CommandID :固定為1;
AppIdentifier:app的字串識別符號,以Null結束。
Attribute List:屬性值列表,每一個格式都是:ID/16-bit Length/Value,每個attribute都是一個字串,其長度由Length指定,但是此字串不是以NULL結尾。若找不到對應的Attribute,則Length為0;
* 關於分段以及傳輸結束的判斷標準,與Get Notification Attributes一致;
複製程式碼
- 3.對通知執行操作
CommandID :固定為2;
NotificationUID: 特定通知的ID,通過NS 的通知獲取。
ActionID:從通知源中拿到的可以操作的型別,“積極”操作或“消極”操作.
從iOS8之後,NP可以通知NC一些相關的動作(接通、結束通話電話;刪除通知等),NC可以根據NP的通知執行對應的操作。
從NS的通知event flag中 EventFlagPositiveAction和EventFlagNegativeAction位可以判斷是否能夠執行對應的操作。
通過獲取通知屬性對應的屬性IDNotificationAttributeIDPositiveActionLabel和NotificationAttributeIDNegativeActionLabel可以獲取到對應的操作描述(接聽/結束通話、清楚)。
複製程式碼
錯誤碼: 對Control Point執行操作的時候,收到的NP端未識別的操作的響應
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。
翻譯的意思是:一通未接來電。
複製程式碼