藍牙接收蘋果手機通知 ANCS協議分析


藍牙接收蘋果手機通知 ANCS協議分析

轉載,請注明出處:http://www.cnblogs.com/alexcai/p/4321514.html

 

綜述

現在有許多藍牙手表、手環都能接收蘋果iphone手機的系統通知,那這是怎么實現的呢?

其實,這都有賴於蘋果IOS 7開始提供的ANCS協議,ANCS(蘋果通知中心, Apple Notification Center Service)的目的是提供給藍牙外設一種簡單、方便的獲取ios設備通知信息的方式。使得藍牙手環、手表可以收到蘋果手機的來電、短信及各種應用的通知信息。

下面,本文就來帶你學習蘋果ANCS協議。

 

演示

下面一段視頻演示了一款藍牙手表接收蘋果手機通知,查看詳情的方法:

我在TI CC2541芯片上實現了完整的ANCS協議,可以完成通知的監聽,詳情查看功能,並且提供相關代碼和硬件,感興趣的童鞋可以到淘寶鏈接查看購買:

https://item.taobao.com/item.htm?id=44730522676

 

總體原理

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

1、外設端進行廣播,手機打開藍牙,搜索外設,連接外設,之后進行綁定(這很重要,否則無法接收通知)

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

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

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

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

 

協議詳解(官方文檔翻譯)

依賴

ANCS的使用沒有依賴,它是GATT的一個子集,任何一個實現了GATT client的設備可以方便的從ios設備獲取通知信息。

 

傳輸注意事項

如果沒有特殊說明,通過ANCS傳輸的數值均使用小端模式。

如果沒有特殊說明,通過ANCS傳輸的字符串均使用UTF-8編碼。

 

概念定義

l  ANCS:蘋果通知中心服務

l  NP(Notification Provider):通知的產生者,一般是ios設備

l  NC(Notification Consumer):通知的消費者,一般是藍牙設備

l  iOS notification:ios設備里出現的通知

l  GATT notification:GATT characteristic發送的通知

 

Service定義

ANCS使用了一個私有UUID作為其Service的UUID:

7905F431-B5CE-4E99-A40F-4B1E122D00D0

 

NP(手機)上只有一個ANCS實例,基於ios的機制,ANCS沒有辦法保證一直運行。

所以NC(外設)需要搜索並且監聽(subscribe)Service Changed characteristic,以保證能夠監聽到所有通知。

 

Characteristic類型

所涉及的characteristic

 1、Notification Source:

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

   基本通知源,通知一些計數的信息;

  

 2、Control Point:

   UUID 69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9(writeable with response)

   控制器,用於向ios設備寫入控制信息,例如讀取詳情;

 

 3、Data Source:

   UUID 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB(notifiable)

   數據源,用於提供詳細數據,在控制信息寫入后通過此characteristic返回;

 

還有許多其他characteristic,不過只有Notification Source是強制的,其他的都是可選的。

 

Notification Source

通知信息更新時,從NP(手機)發給NC(外設)的消息。

有以下一些情況:

l  新的ios通知到來;

l  ios通知有改動;

l  ios通知移除;

 

 

EventID:消息類型,添加(0)、修改(1)、刪除(2);

EventFlags:消息優先級,靜默(1)、重要(2);

CategoryID:消息類型;

l  CategoryCount:消息計數;

l  NotificationUID:通知ID,可以通過此ID獲取詳情;

 

Notification的生命周期如下:

 

 

Get Notification Attributes

當NC(外設)希望從NP(手機)讀取Notification的詳細信息時,它需要向Control Point characteristic發送一些命令,格式如下:

 

CommandID:設為0;

l  NotificationUID:對應Notification Source中相同名字的字段;

AttributeIDs:NC希望讀取的變量ID列表,有些變量可能需要跟一個16bit的數說明想要的最大長度;

 

NP(手機)接收到此命令后,會通過Data Source characteristic將結果返回(通過GATT Notification),所以你需要監聽這個參數。此命令發出后對應的返回信息如下:

 

CommandID:為0;

l  NotificationUID:對應之前請求的UID;

l  AttributeList:查詢結果列表,每一項的格式都是:ID/16bit  Length/Value,每個attribute都是一個字符串,其長度由Length指定,但是此字符串不是以NULL結尾。若找不到對應的Attribute,則Length為0;

 

* 如果返回的消息長度大於GATT最大傳輸長度(MTU),則其會被分割成多個分段。藍牙設備必須將這些分段組裝起來。當所有請求屬性的內容都接收完成后,此過程才算完成;

 

Get App Attributes

此命令允許NC(外設)讀取NP(手機)上安裝app的特定屬性,它需要向Control Point characteristic發送一些命令,格式如下:

 

CommandID:設成1;

l  AppIdentifier:App ID,這個字符串必須使用NULL結尾(“\0”吧);

AttributeIDs:希望獲得屬性的列表;

 

此命令的響應消息格式如下:

 

CommandID:為1;

l  AppIdentifier:App ID,與之前的請求ID對應;

l  AttributeList:屬性值列表,每一個格式都是:ID/16-bit Length/Value,每個attribute都是一個字符串,其長度由Length指定,但是此字符串不是以NULL結尾。若找不到對應的Attribute,則Length為0;

 

* 關於分段以及傳輸結束的判斷標准,與Get Notification Attributes一致;

 

Session(會話)

ANCS session 在NC(外設)訂閱Notification Source之后開始,在取消訂閱或者連接斷開之后結束。由於ANCS不是一個完全同步的服務,它不會在會話中記錄狀態。所以,所有的NotificationUID以及AppIdentifier僅在某個特定的會話周期內有效。(換句話說,那些ID只是在會話后開始的計數,下次再連接重新計數)

當某個會話結束時,NC(外設)需要清空所有ID以及數據內容。當新的會話開始時,NP(手機)會盡量把現有的通知都發給NC(外設)。NC(外設)可以使用這些信息知道當前尚未處理的通知有哪些。

 

Attribute Fetching and Caching(參數緩存)

我們建議,只在用戶做出操作時才獲取attribute。例如,一開始只是展示一個通知列表,然后在用戶點擊某一個后才查詢詳細的信息。

另外,我們建議在一次會話中建立一張App attribute的緩存表,這樣可以避免重復獲取一些常量attribute。

 

Error Codes

寫入Control Point characteristic時,可能會有錯誤發生,錯誤碼定義如下(在哪里返回錯誤碼。。。同一次請求中么):

0xA0 : 未知命令,commandID非法;

0xA1 : 無效命令,命令的格式錯誤;

0xA2 : 無效參數,某一個參數(例如NotificationID無效)

 

如果有錯誤發生,就不會有Data Source返回。

 

時序圖

下面展示了NP與NC之間的常見交互時序:

 

 

下面的圖展示了獲取詳細信息的時序:

 

 

 

CategoryID

 

 

EventID

 

 

EventFlags

 

 

CommandID

 

 

NotificationAttributeID

 

 

 

 

AppAttributeID

 

 

實際實驗之DataSource讀取

主要是介紹一下讀取的各個AttrID返回的都是啥:

電話:

AttrID

返回值

0(App ID)

com.apple.mobilephone

1(Title)

1 (326) 021-3971(電話號碼,不過划分方式好怪。。。)

如果此號碼存了名字,則是電話本中的名字

2(SubTitle)

如果此號碼存了名字,則是mobile

3(Message)

Incoming Call

 

短信:

AttrID

返回值

0(App ID)

com.apple.MoileSMS

1(Title)

10698109555991

01051726663

+86 132-6021-3971

如果此號碼存了名字,則是電話本中的名字

2(SubTitle)

3(Message)

短信的內容

 

微信:

AttrID

返回值

0(App ID)

com.tencent.xin

1(Title)

微信

2(SubTitle)

3(Message)

發信人:內容

 

其他應用的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 . r e m i n d e r s

 

轉載,請注明出處:http://www.cnblogs.com/alexcai/p/4321514.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM