ANCS推送簡介

總體原理 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.mobilephone1(Title) ->1 (326) 021-3971(電話號碼,不過劃分方式好怪。。。)如果此號碼存了名字,則是電話本中的名字2(SubTitle) ->空 如果此號碼存了名字,則是mobile3(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 0EventID——0:表示為增加一條通知。EventFlags——1A:即0x1A,具有重要、具有“積極”操作、具有“消極”操作等特性。CategoryID——1:通知的分類為來電。CategoryCount——1:通知的個數為1
NotificationUID——0 0 0 0:即該通知的UID為0。(2)接聽了來電接聽來電后,會收到一條通知,如下:2 1A 1 0 0 0 0 0EventID——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 0EventID——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 00 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。翻譯的意思是:一通未接來電。
復制代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453441.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

好記性不如爛筆頭,記錄幾個常用的Linux操作

作者:老王Shell公共函數庫Linux系統里有一些公共的Shell函數庫可供使用,最重要的是/etc/rc.d/init.d/functions,在/etc/init.d目錄下有很多腳本都用到了這個函數庫,里面提供了很多有用的方法,比如:killproc…

用matlab簡單電路模型,基于MATLAB的電路模型仿真應用

基于MATLAB的電路模型仿真應用實驗指導書一、實驗目的1、掌握采用M文件及SIMULINK對電路進行仿真的方法。2、熟悉POWERSYSTEM BLOCKSET 模塊集的調用、設置方法。3.進一步熟悉M腳本文件編寫的方法和技巧。二、實驗原理1、通過M文件實現電路仿真的一般仿真步驟為&…

春節期間小游戲同時在線人數最高達2800萬人/小時

微信官方發布2018年春節期間微信數據報告:除夕至初五,總共有2,297億條微信消息,28億條微信朋友圈成功發出,音視頻通話總時長175億乙分鐘。其中,90后用廣的消息發送量占總量的42.5%,80后用戶25.9%&#xff0…

C語言中* 和

&x是對x變量取地址,也就是返回的是x的地址。 int *i;這里面的*說明變量i是一個指針,存的是一個地址。 而 *i整體代表的是一個數值,例如可以int *i 5 這里整體的*i代表的是5,而i代表的是這個值存儲的地址

餐館的故事-淺析職責鏈模式

我們在餐館吃飯的時候,一般都是在拿到菜單后,選擇喜歡的菜,然后通知服務員。服務員會將我們的定單交給大廚,大廚可能會親自去做這道菜,也可能安排給小廚來做,總之,我們不用擔心他們沒有人做菜&a…

JDBC數據對象存儲

一:將查詢的結果生成對象,儲存在數組中。 1 package day31;2 3 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.util.ArrayList;8 9 public class java_ob…

個人工作13年的一些人生真實領悟

此文不定期的更新,想起來就寫一些,我都忘了我曾經會過什么了。你可能會在許多的文章里看到類似的,但這些是我個人的真實體會。 1 技術服從于業務 此問題以前的一個文章提過,不再多說。 適用于大多數對技術的盲目崇拜者。在絕大…

matlab非齊次方程組的通解,用matlab求非齊次線性方程組的通解?

先向大家介紹一下非齊次線性方程組。所謂非齊次線性方程組就是方程組等號右邊的常數項不全為零的線性方程組。全部等于零時,就稱為齊次線性方程組。下面我們就講解一下如何利用matlab快速求非齊次線性方程組的通解。工具/材料matlab電腦操作方法01線性方程組Axb的求…

Linux 終端仿真程序Putty

PuTTY是一個Telnet、SSH、rlogin、純TCP以及串行接口連接軟件。較早的版本僅支持Windows平臺,現在的版本中開始支持各類Unix平臺。 用linux作為桌面系統,身為工程師很多時候需要通過Telnet、SSH協議進行遠程管理,通過串口進行設備配置。Putty…

Mysql 數據庫水平分表 存儲過程

數據庫存儲量達到一定程度的時候,就需要進行分表以減輕檢索的消耗。 常用的分表方式包括水平和垂直分表。本次進行的是按照uid進行水平分表。 ##分表思路: 水平分表平均的將數據按照特定方式分配到多個表中。理論上每個表的訪問頻次和數據量都是同一水平…

中國架構師,名符其實有多少?

先說一下讀后感:我前段時間去過幾個公司面試架構師,要求還是蠻高的,要熟悉大數據量處理,要熟悉高并發,要熟悉XX體系架構,要能在關鍵技術上實現突破。總之,架構錯了,就啥都錯了。呵呵…

粗識靜態鏈表

為了彌補鏈表在內存分配上的不足,出現了靜態鏈表這么一個折中的辦法。靜態鏈表比較類似于內存池,它會預先分配一個足夠長的數組,之后鏈表節點都會保存在這個數組里,這樣就不需要頻繁的進行內存分配了。 當然,這個方法的…

php用date語句獲取時間,關于php date()函數獲取時間的設置和使用方法

date()函數是PHP自帶的時間函數,可以獲取當前服務器的時間echo date(Y-m-d H:i:s); //輸出:2020-05-18 11:02:35date()函數中可以使用的字母含義:a-"am"(上午)或者"pm"(下午)A-"AM"或者"PM"Y-年,顯示…

Django_form補充

問題1: 注冊頁面輸入為空,報錯:keyError:找不到passworddef clean(self): print("---",self.cleaned_data) # if self.cleaned_data["password"]self.cleaned_data["repeat_password"]: …

WF4.0:NativeActivity中的錯誤處理

備注:這篇文章的使用環境是.NET framework 4.0 RC 1 在WF4中創建native活動時,NativeActivity是非常強大的。其眾多的功能之一是圍繞錯誤處理。 調度子活動的時的基本錯誤處理。 當NativeActivity執行的時候,它是通過一個NativeActivityConte…

程序員提高建議之踏踏實實“扎馬步”

踏踏實實“扎馬步” 今天無意中看了“校長”的“程序員&司機”,其中談到了關于程序員速成的問題。其實速成班畢業的“系統殺手”早已在遍布大江南北,只是在互聯網時代,互聯網的應用型軟件生命周期越來越短,業務驅動主導…

c語言scanf返回值

1. scanf 函數是有返回值的,它的返回值可以分成三種情況1) 正整數,表示正確輸入參數的個數。例如執行 scanf("%d %d", &a, &b);如果用戶輸入"3 4",可以正確輸入,返回2(正確輸入了兩個變量…

gpgga格式讀取MATLAB,GPS編碼格式及讀取.doc

GPS接收機只要處于工作狀態就會源源不斷地把接收并計算出的GPS導航定位信息通過串口傳送到計算機中。前面的代碼只負責從串口接收數據并將其放置于緩存,在沒有進一步處理之前緩存中是一長串字節流,這些信息在沒有經過分類提取之前是無法加以利用的。因此…

Cadence 電源完整性仿真實踐(二)

轉載于:http://blog.csdn.net/wu20093346/article/details/38050917 通過以上步驟對每個平面進行了單節點分析并觀測了響應曲線,接下來將觀測平面對的目標阻抗是否滿足要求,通過選擇電容器的方法來減小含有電容器阻抗響應曲線中的反諧振波峰。在SigWave窗…

Johnson 全源最短路徑算法

解決單源最短路徑問題(Single Source Shortest Paths Problem)的算法包括: Dijkstra 單源最短路徑算法:時間復雜度為 O(E VlogV),要求權值非負; Bellman-Ford 單源最短路徑算法:時間復雜度為 O…