一、簡介
二、實驗平臺
協議棧版本:BLE-CC254x-1.4.0
編譯軟件:IAR 8.20.2
硬件平臺:Smart RF(主芯片CC2541)
三、版權聲明
聲明:喝水不忘挖井人,轉載請註明出處。
原文地址:http://write.blog.csdn.NET/postedit
聯繫方式:[email protected]
開源四軸羣:84342712
四、關於藍牙廣播參數
廣播advertising,只有從設備處於廣播狀態,主機才能夠搜索到;
掃描迴應scan response 當我們使用lightblue軟件或者CC254X的Central程序來掃描從機時,如果從機正在廣播,將被掃描到並且可以看到從機的設備名,發射功率等信息,而這些數據並沒有出現在廣播數據中,這是爲什麼呢?下圖是lightblue掃描到的信息:
當從機接收到主機發來的掃描請求時,會有一個掃描迴應scan response ,這個response中,攜帶了從機的設備名,發射功率等信息
1、定義掃描數據
static uint8 scanRspData[] =
{
// complete name
6, // 第一段長度指的是從機名的長度+1,這個1是GAP_ADTYPE_LOCAL_NAME_COMPLETE這個宏
GAP_ADTYPE_LOCAL_NAME_COMPLETE,
'a','b','c','d','e',
// 連接時間範圍 Min 和 Max 值的連接時間間隔
//(2 個八位字節 Min,2 個八位字節最大) (0xFFFF 表示沒有 conn 間隔 min 或 max)
0x05, // length of this data
GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), // 100ms
HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),
LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), // 1s
HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),
//TX 電源級別: 0xXX:-127 到 + 127 dBm 發射功率
0x02, // length of this data
GAP_ADTYPE_POWER_LEVEL,
0 // 0dBm
};
2、定義廣告數據
static uint8 advertData[] =
{
// 這將設置要使用有限可發現模式 (廣告 30 秒的時間) 的設備而不是一般可發現模式 (無限期地做廣告)
0x02, // length of this data
GAP_ADTYPE_FLAGS,//發現模式
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, //不支持BR/EDR,CC2540是單模芯片,不支持BR/EDR
//服務的 UUID,通知中央設備什麼服務包括在此外圍設備
0x03, // length of this data
GAP_ADTYPE_16BIT_MORE, // s服務: 更多的 16 位 可用 Uuid 但不是全部
LO_UINT16( SIMPLEPROFILE_SERV_UUID ), //0xFFF0
HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
};
一般從機爲service,因此從機設備會有一個 attDeviceName 和 主機掃描時發現設備的名稱
主機掃面到的設備名稱 我們在scanRspData中的前幾位定義格式爲 長度+標記(判定數組表達的數據是什麼意思比如設備名 間隔時間 發射功率等等)+設備名稱
attDeviceName 我們可以單獨定義,例如 static uint8 attDeviceName[GAP_DEVICE_NAME_LEN] = "Osama";
然後用 GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );//GAP GATT服務器參數設置 這一句修改的是service的名稱
將數據加載到GATT層
3、設置 GAP Peripheral Role Profile
{
#if defined( CC2540_MINIDK )
// For the CC2540DK-MINI keyfob, device doesn't start advertising until button is pressed
uint8 initial_advertising_enable = FALSE;
#else
// For other hardware platforms, device starts advertising upon initialization
uint8 initial_advertising_enable = TRUE;
#endif
// By setting this to zero, the device will go into the waiting state after
// being discoverable for 30.72 second, and will not being advertising again
// until the enabler is set back to TRUE
uint16 gapRole_AdvertOffTime = 0;
uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;
uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;
uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;
// Set the GAP Role Parameters
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );//廣播使能
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );//表示外設關閉廣播持續時間,
//該值爲零表示無限期關閉廣播直到下一次
//廣播使能信號到來。
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData ); //外設用於回覆主機掃描請求的信息
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData ); //包含在廣播裏的信息
GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );//使能自動更新連接參數,可以讓外設連接失敗時自動調整連接
//參數以便重新連接。
GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );//設置最小連接間隙,缺省值爲80個單位(每單位1.25ms)
GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );//設置最大連接間隙,缺省值爲3200個單位
GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );//外設鄙視參數,缺省爲零。
GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );//最大耐心等待時間,缺省爲1000個單位
}
4、設置廣告時間
{
uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt ); //最小的廣告時間間隔,在有限的可發現模式時
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt ); //最大的廣告時間間隔,在有限的可發現模式時
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );//最小的廣告時間間隔,在一般可發現模式時
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );//最大的廣告時間間隔,在一般可發現模式時
}
5、//
Setup the GAP Bond Manager //GAP
綁定管理器設置
{
uint32 passkey = 0; // passkey "000000" //密鑰
uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;//配對模式,配置成等待主機的配對請求
uint8 mitm = TRUE;
uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;//只顯示設備
uint8 bonding = TRUE;
GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey ); //密鑰,範圍是 0-999999,默認值爲 0
GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );//告訴綁定管理器是否配對通過,不論它等待一個請求從控制設備或者是自己發起配對.默認的設置是等待一個請求從控制設備. 配對模式:配置成等待主機的配對請求
GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );//設置中間人保護是否使能.如果使能了,配對請求將鑑定連接在從和主之間.profile默認的值爲FALSE,即使應用設置它爲TRUE在初始化的時候. 打開密鑰保護的配對算法
GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );//告訴綁定管理器設備的輸入和輸出的能力.爲了判斷設備是否有顯示屏或者輸入鍵盤這個參數是需要的.然而,默認的值爲GAPBOND_IO_CAP_DISPLAY_ONLY,表明設備有一個顯示屏但沒有鍵盤.即使設備沒有物理意義上的顯示器,一個展示的鑰匙(在用戶指導中)被認爲是一個顯示器.默認的萬能鑰匙是一個六位數字字符串”000000”.
GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );//使能綁定.profile默認的值爲FALSE,即使SimpleBLEPeripheral應用設置它爲TRUE在初始化時.
}
6、GATT Server的相關設置函數。
// Initialize GATT attributes GGS_AddService( GATT_ALL_SERVICES ); // GAP Service GATTServApp_AddService( GATT_ALL_SERVICES ); // GATT attributes DevInfo_AddService(); // Device Information Service SimpleProfile_AddService( GATT_ALL_SERVICES ); // Simple GATT Profile
通常一個GATT中GAP server和GATT server是必須強制存在的(Mandatory)以及自己設計的profile server.
作爲GATT的server和client,主要通過Attribute來進行交互,當client請求server讀取數據時,通過如下注冊的回調函數來進行訪問。
// Register callback with SimpleGATTprofile VOID SimpleProfile_RegisterAppCBs( &simpleBLEPeripheral_SimpleProfileCBs );//給應用註冊回調函數
在回調函數中對時間做出處理。