【BLE】CC2541之開啟廣播過程
本篇博文最後修改時間:2016年11月11日,09:31。
一、簡介
本文介紹在應用層如何開啟廣播,且解析協議棧在此操作後做了什麼。
二、實驗平臺
協議棧版本:BLE-CC254x-1.4.0
編譯軟體:IAR 8.20.2
硬體平臺:Amart RF開發板(主晶片CC2541)
三、
博主:甜甜的大香瓜
宣告:喝水不忘挖井人,轉載請註明出處。
原文地址:http://blog.csdn.NET/feilusia
聯絡方式:[email protected]
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
甜甜的大香瓜的小店(淘寶店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i 四、實驗前提 1、在進行本文步驟前,請先閱讀以下博文: 暫無 2、在進行本文步驟前,請先實現以下博文:
暫無
五、基礎知識
暫無
六、實驗步驟
1、開啟廣播(simpleBLEPeripheral.c的SimpleBLEPeripheral_Init中)
在應用層開啟廣播功能其實非常簡單,只要把TRUE傳給GAPRole_SetParameter函式中的GAPROLE_ADVERT_ENABLED就可以了。
七、解析協議棧在開啟廣播的操作後做了什麼
1、GAPRole_SetParameter函式中的GAPROLE_ADVERT_ENABLED
case GAPROLE_ADVERT_ENABLED: if ( len == sizeof( uint8 ) ) { uint8 oldAdvEnabled = gapRole_AdvEnabled; gapRole_AdvEnabled = *((uint8*)pValue); if ( (oldAdvEnabled) && (gapRole_AdvEnabled == FALSE) ) { // Turn off Advertising if ( gapRole_state == GAPROLE_ADVERTISING ) { VOID GAP_EndDiscoverable( gapRole_TaskID ); } } else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) ) { // Turn on Advertising if ( (gapRole_state == GAPROLE_STARTED) || (gapRole_state == GAPROLE_WAITING) || (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) ) { VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT ); } } } else { ret = bleInvalidRange; } break;
其中gapRole_AdvEnabled預設是TRUE
static uint8 gapRole_AdvEnabled = TRUE;
首先,每次進到這個函式裡,就會把gapRole_AdvEnabled的值儲存到oldAdvEnabled,再把新的狀態寫到gapRole_AdvEnabled。也就是這兩句:
uint8 oldAdvEnabled = gapRole_AdvEnabled;
gapRole_AdvEnabled = *((uint8*)pValue);
其次,對oldAdvEnabled(舊的廣播開關狀態)和gapRole_AdvEnabled(新傳入的廣播開關狀態)這兩個變數進行了判斷:
1)在廣播狀態下,想關閉廣播----->關閉廣播
2)在不廣播的狀態下,想開啟廣播--->開啟廣播
然而程式碼中並沒有將另外兩種情況編寫進來,也就是
3)在廣播狀態下,還想開啟廣播
4)在不廣播的狀態下,還想關閉廣播
協議棧把這兩種情況劃入了else的bleInvalidRange。
第2)種情況的開廣播,呼叫了gapRole_TaskID任務中的START_ADVERTISING_EVT事件。
else if ( (oldAdvEnabled == FALSE) && (gapRole_AdvEnabled) )
{
// Turn on Advertising
if ( (gapRole_state == GAPROLE_STARTED)
|| (gapRole_state == GAPROLE_WAITING)
|| (gapRole_state == GAPROLE_WAITING_AFTER_TIMEOUT) )
{
VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT );
}
}
2、START_ADVERTISING_EVT事件
if ( events & START_ADVERTISING_EVT )
{
if ( gapRole_AdvEnabled )
{
gapAdvertisingParams_t params;
// Setup advertisement parameters
params.eventType = gapRole_AdvEventType;
params.initiatorAddrType = gapRole_AdvDirectType;
VOID osal_memcpy( params.initiatorAddr, gapRole_AdvDirectAddr, B_ADDR_LEN );
params.channelMap = gapRole_AdvChanMap;
params.filterPolicy = gapRole_AdvFilterPolicy;
if ( GAP_MakeDiscoverable( gapRole_TaskID, ¶ms ) != SUCCESS )
{
gapRole_state = GAPROLE_ERROR;
// Notify the application with the new state change
if ( pGapRoles_AppCGs && pGapRoles_AppCGs->pfnStateChange )
{
pGapRoles_AppCGs->pfnStateChange( gapRole_state );
}
}
}
return ( events ^ START_ADVERTISING_EVT );
}
事件中呼叫GAP_MakeDiscoverable即可開啟廣播。
如果廣播不成功,則會呼叫函式指標pGapRoles_AppCGs指向的回撥函式,並且傳入引數GAPROLE_ERROR,以此來通知應用層廣播不成功。
那麼呼叫的又是哪個回撥函式呢?
追蹤一下pGapRoles_AppCGs發現有個註冊回撥函式的函式
/*********************************************************************
* @brief Does the device initialization.
*
* Public function defined in peripheral.h.
*/
bStatus_t GAPRole_StartDevice( gapRolesCBs_t *pAppCallbacks )
{
if ( gapRole_state == GAPROLE_INIT )
{
// Clear all of the Application callbacks
if ( pAppCallbacks )
{
pGapRoles_AppCGs = pAppCallbacks;
}
// Start the GAP
gapRole_SetupGAP();
return ( SUCCESS );
}
else
{
return ( bleAlreadyInRequestedMode );
}
}
再追蹤一下這個註冊函式,發現在應用層的SBP_START_DEVICE_EVT事件中對此進行了註冊
if ( events & SBP_START_DEVICE_EVT )
{
// Start the Device
VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );
// Start Bond Manager
VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );
// Set timer for first periodic event
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
return ( events ^ SBP_START_DEVICE_EVT );
}
所以當廣播開啟不成功之後,會呼叫simpleBLEPeripheral_PeripheralCBs的回撥函式peripheralStateNotificationCB的GAPROLE_ERROR
// GAP Role Callbacks
static gapRolesCBs_t simpleBLEPeripheral_PeripheralCBs =
{
peripheralStateNotificationCB, // Profile State Change Callbacks
NULL // When a valid RSSI is read from controller (not used by application)
};
case GAPROLE_ERROR:
{
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
HalLcdWriteString( "Error", HAL_LCD_LINE_3 );
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
}
break;
到此,廣播過程就結束了,很簡單吧,哈哈。
相關推薦
【BLE】CC2541之開啟廣播過程
本篇博文最後修改時間:2016年11月11日,09:31。 一、簡介 本文介紹在應用層如何開啟廣播,且解析協議棧在此操作後做了什麼。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Amart RF開發板(主晶
【BLE】CC2541之解析協議棧的晶振初始化過程
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral為例,解析協議棧的晶振初始化過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart
【BLE】CC2541之主機端讀取特征值
roi repl void 定時 store val star content else if 本篇博文最後改動時間:2017年01月06日,11:06。
【BLE】CC2541之連線引數
轉載自: https://blog.csdn.net/feilusia/article/details/46909723 一、簡介 本文介紹CC2541的連線引數。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:S
【BLE】CC2541之電池電量服務
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個電池電量服務。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體: IAR 8.20.2 硬體平臺: Smar
【BLE】CC2541之通訊協議
本篇博文最後修改時間:2016年12月12日,10:51。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何在一個可讀、可寫、可通知、20位元組長的特徵值char6基礎上,新增一個香瓜自定義的通訊協議,並用app傳送指令實現P11口上的LE
【BLE】CC2541之新增特徵值
本篇博文最後修改時間:2017年03月21日,15:32。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個可讀、可寫、可通知、20位元組長的特徵值char6,並用app實現資料的收發。 二、實驗平臺 協議棧版本:BLE-CC254
【BLE】CC2541之32.768kHZ外部晶振
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文介紹外部的32.768K晶振對於CC2541的作用。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart RF(主晶片CC2
【BLE】CC2541實時更新廣播包advertData內容
advertData[]是廣播包資料。 實時更新廣播包的API: extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 ad
【BLE】CC2541之發現服務與特徵值
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程為例,解析CC2541作為主機時是如何發現從機的服務和特徵值的。二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2
【BLE】CC2541之indicate
本篇博文最後修改時間:2017年08月31日,17:00。 一、簡介 本文以SimpleBLEPeripheral為例,講述如何通過按五項按鍵的“center”鍵傳送indicate資料給btool,用PC的串列埠工具打印出“indicate”的“發資料”和“應答”的過程
【BLE】CC2541之回撥函式
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程中simpleBLECentralEventCB函式,來簡要說明回撥函式的定義和呼叫過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編
【BLE】CC2541之主機端獲取notify資料
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程和SimpleBLEPeripheral工程為例,介紹CC2541作為主機時是如何獲取從機char4通道的notify資料。 二、實驗平臺 協議棧版
【BLE】CC2541之通過RSSI測距
本篇博文最後修改時間:2016年11月11日,09:21。 一、簡介 本文介紹如何在SimpleBLEPeripheral工程中,通過RSSI粗略測距。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:
【BLE】-CC2541低功耗測試實驗-晶片驗證篇
實驗介紹 通過檢視晶片手冊cc2541的電氣特性表,cc2541低功耗(LowPower)有三種狀態:PowerMode1(簡稱:PM1)、PowerMode2(簡稱:PM2)、PowerMode3(簡稱:PM3)。 描述: PM1:
【BLE】CC2541獲取裝置的MAC地址實驗
安卓除錯工具掃描時直接顯示就是MAC地址。 蘋果裝置是以UUID的方式顯示。 所以我們直接用安卓裝置來測試。 我們連線時可以知道主機的地址。 變數是gapRole_ConnectedDevAddr,可以在peripherial.c裡搜尋GAP_LINK_
【BLE】CC2541低功耗測試-系統執行篇
1.osal_pwrmgr_powerconserve 描述: osal_pwrmgr_powerconserve()函式低功耗具體的處理函式,可以發現要想支援此功能,必須首先包含POWER_SAVI
【TI BLE】主從機資料互動過程-藍芽Notification方式
1、Notification與Indication的區別 GATT_Indication: 從機通知主機後,主機需要呼叫simpleprofile_writeattrcb,讀取從機的資料。 GATT_Notification: 從機直接傳送資料給主機。 從機和主機連線
【CC2541】CC2541藍芽廣播關閉不成功總結
最近在進行 CC2541藍芽廣播關閉操作會出現關閉廣播不成功現象,主要操作需要注意兩個問題: 在進行開關操作的API函式操作的時候,每次進行開關操作在系統內部實際上是按照任務的方式處理的,每一個任務
【轉】linux之cp/scp命令+scp命令詳解
特殊 是否 用戶登錄 usr 指定 highlight 顯示 檔案 三種 linux之cp/scp命令+scp命令詳解 名稱:cp 使用權限:所有使用者 使用方式: cp [options] source dest cp [options] source