總體原理
ANCS通過藍牙BLE 4.0實現(xiàn),僅支持iPhone 4S及以上且系統(tǒng)版本在IOS 7以上的手機校摩,同時在外設(shè)端需要支持藍牙4.0協(xié)議败晴。
1、外設(shè)端進行廣播史翘,手機打開藍牙枉长,搜索外設(shè),連接外設(shè)琼讽,之后進行綁定(這很重要必峰,否則無法接收通知)
2、外設(shè)在連接建立后需要監(jiān)聽手機上的ANCS Service中的Notification Source
3钻蹬、當有通知時吼蚁,手機會給外設(shè)發(fā)消息,說明是哪個應(yīng)用的通知
4问欠、如果外設(shè)想進一步獲取通知的詳情肝匆,就往Control Point寫控制信息,獲取詳情
5顺献、詳情會通過Data Source發(fā)過來
ANCS 服務(wù)
服務(wù)名: AppleNotification Center Service
UUID:7905F431-B5CE-4E99-A40F-4B1E122D00D0
角色:
NC:Notification Consumer (i410e)
NP:Notification Provider ([iOS](http://lib.csdn.net/base/1)設(shè)備)
服務(wù)特征值:
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:訪問該服務(wù)需要進行配對旗国。
ANCS服務(wù)尋找完畢后,就可以打開監(jiān)聽通知功能了注整,這里需要注意的是能曾,不能同一時間打開通知源特征Notification Source的通知和數(shù)據(jù)源特征Data Source的通知功能,所以這里可以開啟了一個定時任務(wù)肿轨,讓數(shù)據(jù)源特征在1s后再打來通知功能寿冕。
Notification Source
iOS設(shè)備(NP)用來通知i410e(NC)相應(yīng)的通知;當i410e訂閱(set Notify)該特征值后就可以接收通知消息(i410e已自動執(zhí)行)椒袍;
格式:
Category count: iOS通知中當前category的數(shù)量驼唱;(例如當有兩個未讀郵件的時候,又收到一個郵件通知驹暑,categoryCount就為3)玫恳;
NotificationUID: 一個32位的唯一的數(shù)字ID,通過這個ID可以用來發(fā)送命令操作iOS通知优俘。
Control Point 和 Data Source
NC可以通過Control Point 對iOS通知執(zhí)行操作纽窟;(獲取通知內(nèi)容或者刪除通知等)
NC通過對Control Point特征值寫特殊的命令來實現(xiàn)獲取通知內(nèi)容等操作,如果執(zhí)行成功兼吓,NP就會迅速的通過Data Source 特征值的發(fā)送通知內(nèi)容到NC來響應(yīng)該操作臂港。
共三種:
-
1.獲取通知屬性
該命令通過Control Point發(fā)出
CommandID :固定為0;
NotificationUID: 特定通知的ID视搏,通過NS 的通知獲取审孽。
AttributeIDs:NC希望讀取的變量ID列表,有些變量可能需要跟一個16bit的數(shù)說明想要的最大長度浑娜;
NP端響應(yīng)格式:
該響應(yīng)通過DS通知給到NC
CommandID :固定為0佑力;
NotificationID: 特定通知的ID,通過NS 的通知獲取筋遭。
Attribute List:查詢結(jié)果列表打颤,每一項的格式都是:ID/16bit Length/Value暴拄,每個attribute都是一個字符串,其長度由Length指定编饺,但是此字符串不是以NULL結(jié)尾乖篷。若找不到對應(yīng)的Attribute,則Length為0
* 如果返回的消息長度大于GATT最大傳輸長度(MTU)透且,則其會被分割成多個分段撕蔼。藍牙設(shè)備必須將這些分段組裝起來。當所有請求屬性的內(nèi)容都接收完成后秽誊,此過程才算完成鲸沮;
- 2.獲取App屬性
通過Control Point發(fā)出
CommandID :固定為1;
AppIdentifier:app的字符串標識符锅论,以Null結(jié)束讼溺。
AttributeIDs:希望獲得屬性的列表;
響應(yīng):
通過DS通知給到NC
CommandID :固定為1最易;
AppIdentifier:app的字符串標識符肾胯,以Null結(jié)束。
Attribute List:屬性值列表耘纱,每一個格式都是:ID/16-bit Length/Value敬肚,每個attribute都是一個字符串,其長度由Length指定束析,但是此字符串不是以NULL結(jié)尾艳馒。若找不到對應(yīng)的Attribute,則Length為0员寇;
* 關(guān)于分段以及傳輸結(jié)束的判斷標準弄慰,與Get Notification Attributes一致;
-
3.對通知執(zhí)行操作
CommandID :固定為2蝶锋;
NotificationUID: 特定通知的ID陆爽,通過NS 的通知獲取。
ActionID:從通知源中拿到的可以操作的類型,“積極”操作或“消極”操作.
從iOS8之后扳缕,NP可以通知NC一些相關(guān)的動作(接通慌闭、掛斷電話;刪除通知等)躯舔,NC可以根據(jù)NP的通知執(zhí)行對應(yīng)的操作驴剔。
從NS的通知event flag中 EventFlagPositiveAction和EventFlagNegativeAction位可以判斷是否能夠執(zhí)行對應(yīng)的操作。
通過獲取通知屬性對應(yīng)的屬性IDNotificationAttributeIDPositiveActionLabel和NotificationAttributeIDNegativeActionLabel可以獲取到對應(yīng)的操作描述(接聽/掛斷粥庄、清楚)丧失。
錯誤碼:
對Control Point執(zhí)行操作的時候,收到的NP端未識別的操作的響應(yīng)
I410e 返回有區(qū)別惜互,以規(guī)范為準布讹。
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
其他應(yīng)用的ID:
短信: com.apple.MoileSMS
微信: com.tencent.xin
QQ: com.tencent.mqq
365: com.365rili.Coco
Any.Do:com.anydo.AnyDO
系統(tǒng)提示:com.apple.reminders
下面以來電為例黍析,解析期間收到的通知卖怜。來電時存在兩種操作,不同的操作會收到不同的通知阐枣。
1马靠、接聽了電話
(1)來了一同電話
BLE設(shè)備將會收到一則通知,如下:
0 1A 1 1 0 0 0 0
EventID——0:表示為增加一條通知蔼两。
EventFlags——1A:即0x1A甩鳄,具有重要、具有“積極”操作额划、具有“消極”操作等特性妙啃。
CategoryID——1:通知的分類為來電。
CategoryCount——1:通知的個數(shù)為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:通知的個數(shù)為0恃锉。
NotificationUID——0 0 0 0:即該通知的UID為0羽历。
解析出的意思是:刪除來電通知。
2淡喜、拒接了電話
(1)來了一同電話
BLE設(shè)備將會收到一則通知秕磷,如下:
0 1A 1 1 0 0 0 0
EventID——0:表示為增加一條通知。
EventFlags——1A:即0x1A炼团,具有重要澎嚣、具有“積極”操作疏尿、具有“消極”操作等特性。
CategoryID——1:通知的分類為來電易桃。
CategoryCount——1:通知的個數(shù)為1褥琐。
NotificationUID——0 0 0 0:即該通知的UID為0。
解析出來的意思就是說:來了一通電話晤郑。
(2)拒接了來電
如拒接了來電敌呈,BLE設(shè)備將收到兩則通知,如下:
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:通知的個數(shù)為0签赃。
NotificationUID——0 0 0 0:即該通知的UID為0谷异。
解析出的意思是:刪除來電通知。
對第二條通知進行解析如下:
EventID——0:表示為新增一條通知锦聊。
EventFlags——18:即0x1A歹嘹,具有重要、具有“消極”操作等特性孔庭。
CategoryID——2:通知的分類為未接來電荞下。
CategoryCount——1:通知的個數(shù)為1。
NotificationUID——1 0 0 0:即該通知的UID為1史飞。
翻譯的意思是:一通未接來電尖昏。