1. 程式人生 > >nRF51822SDK中db_discovery學習筆記

nRF51822SDK中db_discovery學習筆記

ble_Central模式下ble_app_hrs_c例程中的db_discovery學習筆記

不管Notification還是Indication,master端連線完成salve端後首先必須對他們進行ENABLE。使能他們除了conn handle之外還需要cccd handle(Client Characteristic Configuration Descriptor客戶端特性配置描述符)。使能完成後通過notification和indication傳輸資料需要conn handle和handle value。這些都必須通過db discovery進行獲得。

1. db_discovery_init()—service characteristic descriptor掃描初始化

m_num_of_handlers_reg = 0;
m_initialized = true;
m_num_of_discoveries_made = 0;
m_pending_usr_evt_index = 0;

2. hrs_c_init()—訂閱Heart rate service

2.1. 把hrs_c_evt_handler函式地址傳送給m_ble_hrs_c結構體的evt_handler函式指標,當通過notification接收到心率資料時回撥hrs_c_evt_handler函式

hrs_c_init_obj.evt_handler = hrs_c_evt_handler;
ble_hrs_c_init(&m_ble_hrs_c, &hrs_c_init_obj);

2.2. 把hrs_uuid和db_discover_evt_handler回撥函式傳送給m_registered_handlers待搜尋到匹配的service uuid就回調db_discover_evt_handler,在該回調函式內部再次回撥2.1節中的hrs_c_evt_handler,只不過evt_type由BLE_HRS_C_EVT_HRM_NOTIFICATION變為了BLE_HRS_C_EVT_DISCOVERY_COMPLETE

hrs_uuid.type = BLE_UUID_TYPE_BLE;
hrs_uuid.uuid = BLE_UUID_HEART_RATE_SERVICE;
ble_db_discovery_evt_register(&hrs_uuid,db_discover_evt_handler);

bas service訂閱也是一樣的邏輯

3. ble_db_discovery.c中相關程式筆記

3.1 .service characteristic descriptor掃描和回撥介面

sd_ble_gattc_primary_services_discover—>on_primary_srv_discovery_rsp;
sd_ble_gattc_characteristics_discover—>on_characteristic_discovery_rsp;
sd_ble_gattc_descriptors_discover—>on_descriptor_discovery_rsp.
與client的連線建立完成後通過呼叫ble_db_discovery_start介面就可以自動掃描client端的service characteristic descriptor並通過註冊的回撥函式通知application層進行相應處理。

3.2 .service 掃描

呼叫ble_db_discovery_start後從登錄檔m_registered_handlers中的第一個service uuid開始掃描,掃描完成後回撥on_primary_srv_discovery_rsp;
把掃描到的service uuid和handle range儲存到m_ble_hrs_c結構體中的services[curr_srv_ind]中;
搜尋handle range範圍內的characteristics。

3.3 .characteristics掃描

把discovered characteristics儲存到m_ble_hrs_c.services[m_ble_hrs_c.curr_srv_ind].charateristics中並更新char_count;
檢查每一個service對應的characteristic是否有descriptor需要搜尋,如果有開始搜尋,如果沒有就呼叫掃描結束處理函式discovery_complete_evt_trigger和on_srv_disc_completion。

3.4 .descriptor掃描

Loop through all the descriptors to find the CCCD(Client Characteristic Configuration Descriptor)
p_char_being_discovered->cccd_handle = p_desc_disc_rsp_evt->descs[i].handle;通過該handle可以操作使能notification等相關配置操作。

3.5 .discovery_complete_evt_trigger和on_srv_disc_completion

把搜尋完成的service的相關結果儲存到m_pending_user_evts中,待所有service的characteristic和descriptor全部搜尋完成後逐一回調註冊的回撥函式;
on_srv_disc_completion:determine if there are more services to be discovered,and if so, initiate the discovery of the next service.

4. 疑問點

/*@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. /
typedef struct
{
uint16_t count; /*< Characteristic count. /
ble_gattc_char_t chars[1]; /*< Characteristic data, variable length. /
} ble_gattc_evt_char_disc_rsp_t;

/*@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. /
typedef struct
{
uint16_t count; /*< Descriptor count. /
ble_gattc_desc_t descs[1]; /*< Descriptor data, variable length. /
} ble_gattc_evt_desc_disc_rsp_t;
掃描service對應的characteristic和descriptor時往往可以掃描到幾個,但是ble_gattc_evt_char_disc_rsp_t和ble_gattc_evt_desc_disc_rsp_t結構體卻在其中只定義了一個元素。當掃描到幾個時,解析依然可以成功,但.h標頭檔案加了防寫不可更改。

相關推薦

nRF51822SDKdb_discovery學習筆記

ble_Central模式下ble_app_hrs_c例程中的db_discovery學習筆記 不管Notification還是Indication,master端連線完成salve端後首先必須對他們進行ENABLE。使能他們除了conn handle之外還需

前端HTMLfloat學習筆記

spl 學習 html中 同時 進行 alt 但是 資料 str 也就是說本來你排好的界面設計,但是因為浮動會導致元素脫離文檔流,使得其他非浮動的塊級元素會無視這個浮動元素所占據的空間,或者是內聯元素的變化,導致排版出現問題。 常見的float帶來的問題: 這就是問題

phptraits學習筆記

mina markdown 組織結構 public access 類繼承 ams requests class traits學習 越來越多的框架和代碼開始使用traits方式去組織一些功能,這是非常高效的代碼組織結構。 通過trait來減少不必要的類繼承關

在vs2015 c++學習筆記(孫鑫視訊2)

//#include<cstdlib> #include<iostream> using namespace std; //父類 class Animal { public://訪問方式三種:public、private、protected Animal(i

AndroidPackageManager學習筆記(2)-PackageInfo

PackageInfo 我們通過下面的方法獲得PackageInfo物件資訊: getInstalledPackages(int flags) 引數flags有如下的值: GET_ACTIVITIES :值為1.如果想獲得所有<activity>標籤的

AndroidTelephony學習筆記(9)-Phone相關類

PhoneNumberUtils 提供多種方法工具處理電話號碼字串,工具類。 Constants FORMAT_JAPAN:日本區號列表 FORMAT_NANP:北美洲電話區號列表 FORMAT_UNKNOWN:未知地區 PAUSE TOA_International

VS2013Python學習筆記[環境搭建]

前言   Python是一個高層次的結合瞭解釋性、編譯性、互動性和麵向物件的指令碼語言。 Python的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。 Python 是一種解釋型語言: 這意味著開發過

java學習筆記——java對象的創建,初始化,引用的解析

初始 學習筆記 style article 學習 base 表達 如果 bsp 如果有一個A類。 1、例如以下表達式: A a1 = new A(); 那麽A是類,a1是引用。new A()是對象。僅僅是a1這個引用指向了new A()這個對象。 2、又如: A

sqlite學習筆記7:C語言使用sqlite之打開數據庫

實例 clas details code 返回 pri san filename stdlib.h 數據庫的基本內容前面都已經說得差點兒相同了。接下看看如何在C語言中使用sqlite。 一 接口 sqlite3_open(const char *filename, s

sqlite學習筆記11:C語言使用sqlite之刪除記錄

false done mta ase rom real not null -a ubun 最後一節,這裏記錄下怎樣刪除數據。 前面全部的代碼都繼承在這裏了,在Ubuntu14.04和Mac10.9上親測通過。 #include <stdio.h> #in

學習筆記】Java生成對象的5方法

目標 獲得 cti com pre lan except 我們 highlight 概述:本文介紹以下java五種創建對象的方式: 1.用new語句創建對象,這是最常用的創建對象的方式。 2.使用Class類的newInstance方法 3.運用反射手段,調用java.la

sqlite學習筆記9:C語言使用sqlite之插入數據

name article void num mes cut cpp content int 前面創建了一張表,如今給他插入一些數據。插入數據跟創建表差點兒相同,不過SQL語言不一樣而已,完整代碼例如以下: #include <stdio.h> #inclu

【lua學習筆記】——2在sublime配置Lua運行環境

author command ges () 作者 ctrl+ bindings text inf 一、讓Sublime可以運行lua腳本 打開sublime 選擇tools-->Build System-->New Build System 在新出現的文件中

JavaSECollection集合框架學習筆記(1)——具有索引的List

alt 很快 存取 array 架構圖 一是 第一個元素 技術 發現 前言:因為最近要重新找工作,Collection(集合)是面試中出現頻率非常高的基礎考察點,所以好好惡補了一番。 復習過程中深感之前的學習不系統,而且不能再像剛畢業那樣死背面試題,例如:String是

JavaSECollection集合框架學習筆記(2)——拒絕重復內容的Set和支持隊列操作的Queue

%d eof 是否 face 出錯 can 3.2 lean als 前言:俗話說“金三銀四銅五”,不知道我要在這段時間找工作會不會很艱難。不管了,工作三年之後就當給自己放個暑假。 面試當中Collection(集合)是基礎重點.我在網上看了

Android第一行代碼學習筆記二---在活動使用Toast

一行代碼 就會 onclick log sta contex instance and undle Toast:是Android系統提供的一種非常好的提醒方式,在程序中可以使用它將一些短小的信息通知給用戶,這些信息會在一段時間後自動消失,並且不會占用任何屏幕空間。 首先需要

vue2.0學習筆記之webpack-simple模板的路由簡單配置案例

nbsp 主頁 default code vue 兩個文件 new ebp 命名 以下是完成後的目錄結構 案例基礎是已經用 webpack+vue-cli 創建了一個名為 vue_router的工程 , 並安裝了vue-rout

Linux學習筆記4-CentOS7redis3.2.9安裝教程

錯誤 img make .gz 需要 down images red pre redis下載地址:http://www.redis.cn/download.html 1、將下載過來的redis-3.2.9.tar.gz文件復制到/usr/local文件夾下 2、tar x

9.Laravel5學習筆記:在laravel註冊自己的服務到容器

pri script -128 ring nts date require 一次 name 問題描寫敘述 或許標題寫的不夠清楚。實際情況是,在我使用laravel的過程中。須要將自己的一個類,通過服務提供者註冊到IOC容器中,可是在實際操作過程中。

C語言學習筆記 (003) - C/C++的實參和形參(轉)

變化 避免 影響 學習筆記 ++ nbsp 過去 情況 真的 今天突然看到一道關於形參和實參的題,我居然不求甚解。藐視過去在我的腦海裏只有一個參數的概念,對於形參和實參的區別還真的不知道,作為學習了幾年C++的人來說,真的深深感覺對不起自己對不起C++老師 T。T 我