NRF5 SDK藍芽開發——peripheral裝置廣播報文分析
peripheral裝置廣播報文分析
試驗條件:
- iar for arm開發平臺
- 1塊nRF52832開發板
- 應用程式開發版本:nRF5_SDK_15.0.0_a53641a
- 協議棧韌體: s132_nrf52_6.0.0_softdevice.hex
- 2個基於Ble平臺開發好的產品
central裝置與peripheral裝置的連線的前提,需要peripheral裝置定時往外發送廣播報文,而central裝置進入掃描模式,接收所有廣播報文。為了實現對peripheral裝置廣播報文的分析,一方面通過例項結合藍芽核心協議來分析,一方面,在NRF52系列平臺,通過peripheral裝置的程式碼來分析廣播內容。
通訊試驗搭建
1。 nRF52832開發板跑central裝置程式來抓包,例程在
examples\ble_central\ble_app_uart_c
,同時配置RF_LOG資訊列印到串列埠,並且在"sdk_config.h"
中,LOG資訊輸出等級為4,如下程式碼所示,
// <o> NRF_LOG_DEFAULT_LEVEL - Default Severity level
// <0=> Off
// <1=> Error
// <2=> Warning
// <3=> Info
// <4=> Debug
#ifndef NRF_LOG_DEFAULT_LEVEL
#define NRF_LOG_DEFAULT_LEVEL 4
#endif
2。central裝置初始化完畢後,都會觸發
BLE_GAP_EVT_ADV_REPORT
事件,該事件在函式static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
中處理。進入on_adv_report
,進入ble_advdata_uuid_find
,合適位置新增 程式碼如下, 這樣在搜尋到任一個peripheral裝置廣播報文,都會列印報文資訊。
NRF_LOG_DEBUG("p_encoded_data,%d" ,data_len);
NRF_LOG_HEXDUMP_DEBUG(p_encoded_data, data_len);
使用nRF Connect工具對廣播報文解析的內容¢ral裝置抓包輸出到串列埠的原始資料,使用兩個例項,對比如下
[15:53:56.117]收←◆<debug> app: p_encoded_data,19
<debug> app: 02 01 06 0F 09 4B 65 65|.....Kee
<debug> app: 73 6F 6E 20 62 61 73 65|son base
<debug> app: 30 30 31 |001
<debug> app: p_encoded_data,4
<debug> app: 03 03 E0 FF |....
<debug> app: p_encoded_data,29
<debug> app: 02 01 06 05 02 F0 FF B0|........
<debug> app: FF 0A FF 00 00 FF FF FF|........
<debug> app: FF 64 00 FF 00 00 00 00|.d......
<debug> app: 00 00 00 00 00 |.....
<debug> app: p_encoded_data,27
<debug> app: 11 09 62 61 73 65 2D 69|..base-i
<debug> app: 34 2E 30 30 30 30 32 35|4.000025
<debug> app: 31 39 05 12 08 00 20 00|19.... .
<debug> app: 02 0A 04 |...
例項資料解析
藍芽核心協議中,廣播報文及掃描響應報文協議定義如下,
該藍芽廣播報文包含的資訊個數是可以自定義的。每一個資訊在協議中都是固定的“長度+型別+內容”組成,廣播報文由一個個資訊前後拼接而成。根據藍芽補充協議,對應上述Keeson base001裝置,解析如下:
02 01 06 :型別為“Flags”:設定了兩個標誌位GeneralDiscoverable,BrEdrNotSupported
0F 09 4B 65 65 73 6F 6E 20 62 61 73 65 30 30 31 03 03 E0 FF:型別為“Complete local name”:名稱為Keeson base001
03 03 E0 FF:型別為 “Complete list of 16-bit Service UUIDs”:UUID為0xFFE0
總結來說,這段廣播報文使用了3條資訊,長度分別為02,0F,03,型別分別為01,09,03。
程式碼追溯
Nrf52藍芽系列,peripheral裝置定時往外發送廣播報文,報文引數初始化如下所示,
/**@brief Function for initializing the Advertising functionality.
*/
static void advertising_init(void)
{
uint32_t err_code;
ble_advertising_init_t init;
memset(&init, 0, sizeof(init));
init.advdata.name_type = BLE_ADVDATA_FULL_NAME; //定義了名稱顯示型別
init.advdata.include_appearance = false;//是否包含裝置外觀
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;//標誌顯示
init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);//UUID顯示
init.srdata.uuids_complete.p_uuids = m_adv_uuids;
init.config.ble_adv_fast_enabled = true;
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
init.evt_handler = on_adv_evt;
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);
ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}
廣播報文資訊支援的型別在“ble_gap.h”
/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format
* @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm
* @{ */
#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */
#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */
#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */
#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */
#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */
#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */
#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */
#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */
#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */
#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */
#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */
#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */
#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */
#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */
#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */
#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */
相關推薦
NRF5 SDK藍芽開發——peripheral裝置廣播報文分析
peripheral裝置廣播報文分析 試驗條件: iar for arm開發平臺 1塊nRF52832開發板 應用程式開發版本:nRF5_SDK_15.0.0_a53641a 協議棧韌體: s132_nrf52_6.0.0_softdevice.hex 2
藍芽開發(二)掃描裝置
一、申請位置許可權 在Android6.0以後要掃描藍芽裝置,還需要請求位置許可權: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <
iOS藍芽開發(二)在裝置端實現Central角色
若想在裝置上實現Central角色的功能,主要有以下步驟: 2.搜尋周圍廣播的裝置 3.與一個外設進行連線,並探索外設提供的服務 4.向外設傳送讀寫characteristic的請求,如果有需要訂閱characteristic值得更新,來跟蹤資料的變化。 myCe
Android藍芽開發教程(一)——搜尋藍芽裝置
Android藍芽功能的開發一直是很多新手頭疼的問題,網上雖然也有很多教程貼,但大多都寫得不全面,不能讓我們真正掌握藍芽開發的基本知識。本教程主要講解搜尋藍芽裝置、藍芽裝置之間的連線和藍芽之間的通訊三個主要模組。掌握了這三個,基本就能進行簡單的藍芽開發了。
關於藍芽開發,必須注意的廣播
/**有註釋的廣播,藍芽連線時都會用到 * * bind一般會停止搜尋ACTION_DISCOVERY_FINISHED * @param cxt */ intentFilter.addAction(BluetoothDevice.ACTION_FOUND)
Android藍芽開發(一)之開啟藍芽和裝置搜尋
Android藍芽開發系列目錄: 一、判斷是否系統是否支援藍芽 在使用藍芽之前,我們首先要判斷手機裝置是否支援藍芽,雖然現在基本都支援藍芽了,但是為了程式碼的嚴謹性我們還是需要在程式碼中判斷: private BluetoothManager bluetoothma
微信硬體藍芽開發教程之新增藍芽裝置(1)
申請裝置功能 a. 登入公眾平臺,點選左邊功能欄的“新增功能外掛”,選擇“裝置功能”。 b. 點選“開通”,閱讀並同意《微信公眾平臺微信互聯裝置功能服務協議》,開通成功。 c. 裝置功能開通後,公眾號即擁有伺服器介面、 AirKiss、 AirSync 以及
android藍芽開發 藍芽裝置的查詢和連線
Android對於藍芽開發從2.0版本的sdk才開始支援,而且模擬器不支援,測試至少需要兩部手機,所以制約了很多技術人員的開發。 1. 首先,要操作藍芽,先要在AndroidManifest.xml里加入許可權 // 管理藍芽裝置的許可權 <
安卓開發之自動連線藍芽2.0裝置(音響,耳機)
背景 前面的文章介紹了藍芽4.0的連線,讀寫操作等,這篇文章主要是藍芽2.0(傳統藍芽)與藍芽耳機,音響等自動連線。 許可權 和BLE一樣,藍芽2.0進行藍芽相關操作,也需要使用到藍芽許可權,在AndroidManifest.xml清單檔案中新增相應許
Android開發藍芽與ble裝置的通訊
一、寫在前面的話 一直想寫一篇關於藍芽與ble裝置通訊的部落格,但是一直也不知道從何下手,可能是之前思路不清晰吧,也就一直拖拖拖,拖到現在。最近又做到關於ble裝置的專案了,在此總結一下吧。(如有不到位或者不太對的地方,希望各位多多指教) 二、關於藍
Android 藍芽開發常用UUID表
// Sample Services. attributes.put("0000180d-0
微信小程式 藍芽開發 Demo 外掛
微信小程式藍芽操作 由於開發要求,要在微信小程式加上藍芽操作,於是乎就自己寫了個封裝了個藍芽外掛bletool,方便自己以後使用,下面介紹一下使用方法和反饋引數 先來看初始化 整合之後藍芽的操作就變得簡單很多了,先把寫好的bletool.js放到utils包下(具體放哪看你們自己的了
Android藍芽開發之低功耗藍芽(藍芽4.0)開發全記錄
主要內容概況 前面我記錄了開發藍芽2.0的過程,今天準備介紹現在的主流藍芽技術,藍芽4.0的開發,該藍芽技術是在Android4.3(API級別18)版本引入的API。 官方文件 具體的區別主要以下幾點: 1.新的藍芽技術提供了連線服務的方法,以前是沒有提供連線藍芽的方法
Android藍芽開發之經典藍芽(藍芽2.0)開發全記錄
前言部分 最近因為需要開始藍芽相關開發,所以在網上搜索了很多內容,並且結合自己的開發過程做了一個總結,先儲備上,也許可能幫到正在做藍芽開發的同學。 藍芽很早就是android裝置上基本通訊功能了,只是以前的沒有那麼多藍芽裝置,現在藍芽裝置種類繁多,所以經常會有人遇到藍芽相關的開發
【藍芽開發】MCU選型的重要性!
部落格也大半年沒更新了,大半年的時間因為做著其他的專案,對藍芽的應用少了,更換MCU等原因。忙了個大半年時間,今天突然看到部落格,才想起我的部落格還有許多沒寫。今天我就不講技術了,講講MCU選型的重要性,也是我做專案的經歷,原本使用的是藍芽晶片,這款晶片的優勢是可以進行藍芽通訊,屬於單模模組,BLE
iOS之藍芽開發—CoreBluetooth詳解
CoreBluetooth的API是基於BLE4.0的標準的。這個框架涵蓋了BLE標準的所有細節。僅僅只有新的iOS裝置和Mac是和BLE標準相容.在CoreBluetooth框架中,有兩個主要的角色:周邊和中央(Peripheral and Central) ,整個框架
IOS Ble藍芽開發實現
1.本篇博文闡述如何開發Ble藍芽。在藍芽中的一些常見服務,掃描,以及連結; 主藍芽類檔案.h 主藍芽類檔案.m UUID檔案 藍芽列表展示的檔案 一:引入Ble藍芽的框架<CoreBluetooth/CoreBluetooth.h>
1 android藍芽開發---與藍芽模組進行通訊
原文地址 http://www.cnblogs.com/wenjiang/p/3200138.html 近半個月來一直在搞android藍芽這方面,主要是專案需要與藍芽模組進行通訊。開頭的進展很順利,但因為藍芽模組不在我這裡,所以只能用手機測試。一開頭就發現手機的藍芽
iOS藍芽開發 —— 連線列印機發送16進位制資料的問題
最近在做公司的一個藍芽連線印表機的專案,正常的藍芽連線印表機進行列印沒問題,但是要傳送一個16進位制的指令來獲取藍芽裝置資訊時頗費了一番功夫,現做如下記錄: Byte byteArray[] = {0x1d ,0x67 ,0x61}; NSData *sendData = [NSData data
藍芽開發--Google文件(譯) (文章末有完整專案連結)
藍芽 Android平臺包括對藍芽網路堆疊的支援,允許裝置與其他藍芽裝置進行無線交換資料。應用程式框架通過Android藍芽API提供對藍芽功能的訪問。這些API讓應用程式無線連線到其他藍芽裝置,實現點對點和多點無線功能。 使用藍芽API,Android應用