版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 NORDIC藍牙BLE4.0方案SDK例子ANCS代碼分析參考:SDK11.0.0nRF5_SDK_11.0.0_89a8197examplesble_peripheralble_app_ancs_c1. 主函數下面結合上面的函數慢慢展開講解。2. 宏定義3. 定時器timers_init如下圖3.1. APP_TIMER_APPSH_INT宏Nordic的定時器是通過RTC1模擬出了一個定時器時鐘隊列,所以在初始化
2、時需要傳入的參數有兩個:APP_TIMER_PRESCALER:時鐘分頻APP_TIMER_OP_QUEUE_SIZE:timer的隊列第3個參數是是否啟動調度,這里true表示啟用任務調度。也就是說會調用app_timer_evt_schedule函數進行時間任務調度,后面會講解。上面的初始化時使用的宏,那么真正的初始化函數是:上面又是一個宏進行封裝的,實體如下:不繼續(xù)向下分析了,到這定時器就初始化完畢了。截取SDK說明文檔中的說明吧!3.2. 定時器創(chuàng)建app_timer_create定時器創(chuàng)建函數如下:這里定時器句柄是通過宏進行定義的:這個宏的函數原型是:上面的“
3、#” 表示連接前后的字符,也就是上面的宏表示static app_timer_t m_sec_req_timer_id_data= 0 ; static const app_timer_id_t timer_id = &m_sec_req_timer_id_data;實際上這個宏就是定義個兩個變量。3.3. 回調函數sec_req_timeo
4、ut_handler回 調函數的作用,從名字上看的話,這個回調函數應該與安全管理有關,那么到底什么關系呢?我們知道ANCS服務必須是在配對綁定啟動加密之后才能進行服務 的,也就是必須進行配對綁定,然而配對就必須通過安全管理進行,所以這個回調函數是從機啟動加密請求,然而為啥又通過定時器進行控制呢?這里只有當連接建 立之后進行一次調用,所以在創(chuàng)建定時器時使用的APP_TIMER_MODE_SINGLE_SHOT參數,為什么需要用定時器,因為剛剛建立連接時需要 給雙方一定的緩沖時間,在后面啟動定時器時會傳入定時時間的??纯催@個函數吧:這個回調函數有個入口參數,void * p_context。這個參
5、數是在啟動定時器時傳進來的,當然看有沒有用了,如果沒有用,就傳入NULL。在ANCS應用中是在設備進行連接之后進行發(fā)起的,因為需要綁定,所以需要用到nordic的SDK中的設備管理文件,所以這個啟動定時器是在設備管理事件回調函數中調用。4. 協(xié)議棧初始化ble_stack_init()協(xié)議棧初始化ble_stack_init()函數原型如下:第710函數設置低頻時鐘源,并初始化協(xié)議棧,第2個參數是在使用調度或者RTOS時傳入的回調函數句柄,例如如果帶有freertos時,會傳入一個回調函數,這個回調函數會發(fā)出一個二值信號量,這個信號量發(fā)給協(xié)議棧。
6、第713行其實就是初始化結構體ble_enable_params,這個結構體如下:第721行是根據程序所需的內存大小來動態(tài)的進行設置起始地址和ram大小。在mdk中有一個可以設置RAM大小的地方:但是程序并不是一定是從這個地方開始,所以這個函數進行重新調整,具體怎么調整可以自己看源碼,如果需要調整會打?。?.1. 協(xié)議棧事件有哪些第728和第732行是向協(xié)議棧和系統(tǒng)注冊事件對應的處理函數。52832的整個協(xié)議都是通過事件進行驅動的,協(xié)議棧和事件可以向應用層發(fā)送許多的事件,應用層更具得到的事件在進行相應的處理,例如那么這些怎么知道協(xié)議棧和系統(tǒng)到底能發(fā)送那些事件給應用層呢?
7、可以查看一下注冊函數傳入的參數是什么:也就只有知道ble_evt_t這個結構體中有哪些事件即可:從上面可以了解到evt_id都是以BLE_<module>_EVT定義的枚舉,然而有哪些模塊可以上傳事件呢?在上圖的191行的聯(lián)合體中定義了5個模塊可以向應用發(fā)送事件。在ble_ranges.h的頭文件中有如下宏:這個宏就是各個事件枚舉的起始值和結束值,根據這些宏可查找到這5個事件的所有枚舉。分別為:l 公共事件l GAP事件l L2CAP事件l GATT客戶端事件l GATT服
8、務器事件4.2. 系統(tǒng)事件有哪些先看看系統(tǒng)分發(fā)事件函數中到底分發(fā)了哪些東西:追溯到函數里面去的話可以發(fā)現(xiàn),上面兩個函數用到的事件ID只用到兩個:NRF_EVT_FLASH_OPERATION_SUCCESS /flash操作成功NRF_EVT_FLASH_OPERATION_ERROR /flash操作失敗ble_advertising_on_sys_evt這個函數是當flash失敗時開始廣播。5. 設備管理5.1. 設備管理初
9、始化在52832的SDK11中加了device_manager_init函數,包含了之前版本的安全參數初始化的內容。device_manager_init這個函數傳入的參數為bool類型,為true時擦除flash中存儲的所有設備信息,為false時就不擦除綁定的設備信息,這些信息用于廣播白名單列表以及秘鑰的一些保存。第469行調用pstorage_init()函數將flash進行初始化。第465行將傳入的參數賦值個一個結構體,這個結構體作為參數傳入dm_init()函數,其實就是進行flash進行擦除的函數。register_param.sec_param結構體變量將開始的定義的安全管理的宏
10、傳入結構體,這個安全管理參數只進行綁定,臨時秘鑰TK為6個0。第490行為設備管理注冊,第一個參數m_app_handle為這個函數的返回值,也就是設備管理返回的一個應用層用的句柄。52832最多可以保存8個設備的信息,多了就要去擦除。5.2. 設備管理事件回調函數在485行還傳入了一個函數device_manager_evt_handler,這個函數的函數定義如下:分別是:l 連接完成事件l 連接斷開事件l 加密開始事件l 加密完成事件l 已經處于加密通信連接
11、l 加密重新建立6. 對端設備服務發(fā)現(xiàn)對端設備有么有ANCS的服務,需要本地設備在連接之后去發(fā)現(xiàn)對端設備的服務,這里的初始化函數如下:上面的調用了一個函數,同時也傳入了一個函數。ble_db_discovery_init函數定義如下:db_disc_handler函數定義如下:7. 任務調度隊列Scheduler_init函數如下:如果不跑rtos,SDK11中是使用一個隊列來管理多個任務的,因為中斷中不能處理太多和時間太長的任務,所以在中斷中將相應的事件標志以及處理函數放入隊
12、列,然后在主函數中,一直輪訓這個隊列處理相應的任務。從上面分析可以大概了解,應該有3個函數需要調用:l 列初始化函數APP_SCHED_INIT;l 事件注入隊列的函數app_sched_event_put;l 放在主循環(huán)中的一個函數來輪訓隊列app_sched_execute。繼續(xù)往下走可以知道ble_ancs_c_on_db_disc_evt函數是對ANCS服務的具體發(fā)現(xiàn),傳入的兩個參數,第一個參數是應用層定義的關于ANCS的一個結構體,第二個參數是設備發(fā)現(xiàn)時協(xié)議棧向應用層上報的事件7.1. APP_
13、SCHED_INIT他其實是一個宏:這里注意傳入的兩個參數:l EVENT_SIZE這個 size的大小就像定義一個聯(lián)合體,聯(lián)合體所占用的內存是變量中占用內存最大的那個,這里的size也是這樣的,假設有3個任務,這3任務產生的事件分別 為1、3、7個,假設每個事件所占用的內存為1個字節(jié)。那么這里傳入的EVENT_SIZE應該為7*1byte,即7個字節(jié)。l QUEUE_SIZE任 務調度室隊列的大小,這個隊列其實就像一個緩存,中斷函數是這個緩存的數據生成者,主循環(huán)是這個緩存的消耗者,假設中斷生產的數據比主循環(huán)消耗的數據要 快,那么是不是通過擴大緩存來
14、解決這個不平衡的問題。通用這個QUEUE_SIZE也是根據中斷產生事件的速度來覺得這個隊列的大小的,假設有2個地方用 到了app_sched_event_put,那么這個隊列的最小設置為2。如果調用app_sched_event_put的頻率非常高,那就就要嘗試 這擴大這個大小了。7.2. app_sched_event_put他的函數定義如下:傳入的參數有3個,先看第3個app_sched_event_handler_t,這是一個函數指針。定義如下:可以知道,前兩個參數其實就在這個回調函數的參數。7.2.1. app_timer_evt_schedule在講定時器章節(jié)
15、中的APP_TIMER_APPSH_INT宏中,有傳入一個定時器的回調函數:進入看看:app_timer_evt_get函數就是任務的處理函數7.2.2. ANCS實例中的任務調度時最終調用的定時器回調函數而這里實際的處理函數是在創(chuàng)建定時器時傳入的回調函數:8. 連接參數連接參數有哪些需要設置?4個供主機參考的參數,最小連接間隔、最大連接間隔、從機潛伏期和連接超時時間。具體函數如下:第350行設置的是安全模式,在ble4.0中有如下幾種安全模式:安全模式1等級1:連接無需安全管理安全模式1等級2:需要加密但無中間人保護/加密的未認證配對安全模式1
16、等級3:有加密且有中間人保護/加密的認證配對安全模式2等級1:簽名但無中間人保護/數據簽名的未認證配對安全模式2等級2:中間人簽名保護/帶數據簽名的認證配對這里設置的是安全模式1等級1,即沒有安全需求,這里是不是有疑問,ANCS不是必須進行綁定嗎?為啥設置怎么低的安全等級,因為這個里程中安全請求是有本地發(fā)起的。第352行將設備名字傳入協(xié)議棧。第364行設置的就是基本的連接參數。9. 廣播初始化廣播初始化主要是設置一些廣播間隔時間、超時時間以及廣播模式等等參數。也會設置廣播內容,例如廣播自己有哪些服務UUID,也可以廣播自己想要得到哪些服務的UUI
17、D,也可以設置掃描應答的數據。本例具體函數如下:這里需要注意的是,廣播初始化一定要放到服務初始化函數的后面,因為廣播初始化中有些參數是由服務初始化時傳遞上來的,例如:第804行的UUID類型就是服務初始化時協(xié)議棧傳出來的。第814和815行設置的是自己希望對端設備擁有的服務的UUID,即ANCS服務。第826行就是廣播的初始化函數了,在這個函數中傳入了一個事件回調函數on_adv_evt,在協(xié)議棧初始化時向協(xié)議棧以及系統(tǒng)注冊的事件分發(fā)函數是連接之后的回調,這里只是一個廣播事件回調函數,那就看看廣播事件到底有哪些事件可以產生:可見廣播事件也不多??!上面的最后兩個事件如果白名單沒有使能或者沒有啟用定向廣播,這兩個事件是可以不用的。看看本例中的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度建筑工程合同結算與支付方式及必要性3篇
- 二零二五年度國有企業(yè)國有資產無償托管協(xié)議3篇
- 二零二五年度企業(yè)社會責任公益捐贈三方協(xié)議書范本3篇
- 2025版酒店品牌代理合作協(xié)議范本(含市場調研)3篇
- 江西省上饒市(2024年-2025年小學六年級語文)部編版隨堂測試(上學期)試卷及答案
- 二零二五年度個人承包車間高端設備研發(fā)與生產合同3篇
- 二零二五年度商品房銷售認籌合同及公積金貸款協(xié)議3篇
- 陜西省手機電子廢棄物綜合利用項目可行性研究報告
- 陜西某鋁模板項目可行性研究報告
- 2025年商場新品發(fā)布活動場地租賃及宣傳合同3篇
- 國有企業(yè)考勤制度管理辦法
- 濾波器計算器
- 人教版六年級上冊道德與法治知識點
- 期貨從業(yè)資格(期貨基礎知識)歷年真題試卷匯編27
- 人工智能學習通超星期末考試答案章節(jié)答案2024年
- 北師大版(2019)必修第二冊Unit 5 Humans and nature Lesson 3 Race to the pole教學設計
- 《毛概》23版學習通超星期末考試答案章節(jié)答案2024年
- 臨建工程量清單
- 宜賓五糧液股份有限公司招聘考試試卷及答案
- 2024CSCO胰腺癌診療指南解讀
- 窗簾采購投標方案(技術方案)
評論
0/150
提交評論