[轉(zhuǎn)載]藍(lán)牙4.0 BLE peripheral 廣播設(shè)置

掃描回應(yīng)scan response 當(dāng)我們使用lightblue軟件或者CC254X的Central程序來掃描從機(jī)時,如果從機(jī)正在廣播,將被掃描到并且可以看到從機(jī)的設(shè)備名,發(fā)射功率等信息,而這些數(shù)據(jù)并沒有出現(xiàn)在廣播數(shù)據(jù)中,這是為什么呢?下圖是lightblue掃描到的信息:

002sNcnygy6KFtNDbZq84&690.jpeg

當(dāng)從機(jī)接收到主機(jī)發(fā)來的掃描請求時,會有一個掃描回應(yīng)scan response ,這個response中,攜帶了從機(jī)的設(shè)備名,發(fā)射功率等信息

1、定義掃描數(shù)據(jù)
static uint8 scanRspData[] =
{
// complete name
6, // 第一段長度指的是從機(jī)名的長度+1,這個1是GAP_ADTYPE_LOCAL_NAME_COMPLETE這個宏
GAP_ADTYPE_LOCAL_NAME_COMPLETE,
'a','b','c','d','e',

// 連接時間范圍 Min 和 Max 值的連接時間間隔
//(2 個八位字節(jié) Min,2 個八位字節(jié)最大) (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 發(fā)射功率
0x02, // length of this data
GAP_ADTYPE_POWER_LEVEL,
0 // 0dBm
};
2、定義廣告數(shù)據(jù)
static uint8 advertData[] =
{
// 這將設(shè)置要使用有限可發(fā)現(xiàn)模式 (廣告 30 秒的時間) 的設(shè)備而不是一般可發(fā)現(xiàn)模式 (無限期地做廣告)

0x02, // length of this data
GAP_ADTYPE_FLAGS,//發(fā)現(xiàn)模式
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, //不支持BR/EDR,CC2540是單模芯片,不支持BR/EDR

//服務(wù)的 UUID,通知中央設(shè)備什么服務(wù)包括在此外圍設(shè)備

0x03, // length of this data
GAP_ADTYPE_16BIT_MORE, // s服務(wù): 更多的 16 位 可用 Uuid 但不是全部

LO_UINT16( SIMPLEPROFILE_SERV_UUID ), //0xFFF0
HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
};
一般從機(jī)為service,因此從機(jī)設(shè)備會有一個 attDeviceName 和 主機(jī)掃描時發(fā)現(xiàn)設(shè)備的名稱
主機(jī)掃面到的設(shè)備名稱 我們在scanRspData中的前幾位定義格式為 長度+標(biāo)記(判定數(shù)組表達(dá)的數(shù)據(jù)是什么意思比如設(shè)備名 間隔時間 發(fā)射功率等等)+設(shè)備名稱
attDeviceName 我們可以單獨(dú)定義,例如 static uint8 attDeviceName[GAP_DEVICE_NAME_LEN] = "Osama";
然后用 GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );//GAP GATT服務(wù)器參數(shù)設(shè)置 這一句修改的是service的名稱
將數(shù)據(jù)加載到GATT層
3、設(shè)置 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 );//表示外設(shè)關(guān)閉廣播持續(xù)時間,
                                                                                          //該值為零表示無限期關(guān)閉廣播直到下一次
                                                                                           //廣播使能信號到來。

GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );  //外設(shè)用于回復(fù)主機(jī)掃描請求的信息
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );        //包含在廣播里的信息

GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );//使能自動更新連接參數(shù),可以讓外設(shè)連接失敗時自動調(diào)整連接
                                                                                              //參數(shù)以便重新連接。
GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );//設(shè)置最小連接間隙,缺省值為80個單位(每單位1.25ms)
GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );//設(shè)置最大連接間隙,缺省值為3200個單位
GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );//外設(shè)鄙視參數(shù),缺省為零。
GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );//最大耐心等待時間,缺省為1000個單位

}
4、設(shè)置廣告時間
{
uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;

GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt ); //最小的廣告時間間隔,在有限的可發(fā)現(xiàn)模式時
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt ); //最大的廣告時間間隔,在有限的可發(fā)現(xiàn)模式時
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );//最小的廣告時間間隔,在一般可發(fā)現(xiàn)模式時
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );//最大的廣告時間間隔,在一般可發(fā)現(xiàn)模式時

}
5、// Setup the GAP Bond Manager //GAP 綁定管理器設(shè)置
{
uint32 passkey = 0; // passkey "000000" //密鑰
uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;//配對模式,配置成等待主機(jī)的配對請求
uint8 mitm = TRUE;
uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;//只顯示設(shè)備
uint8 bonding = TRUE;

GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey ); //密鑰,范圍是 0-999999,默認(rèn)值為 0

GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );//告訴綁定管理器是否配對通過,不論它等待一個請求從控制設(shè)備或者是自己發(fā)起配對.默認(rèn)的設(shè)置是等待一個請求從控制設(shè)備. 配對模式:配置成等待主機(jī)的配對請求

GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );//設(shè)置中間人保護(hù)是否使能.如果使能了,配對請求將鑒定連接在從和主之間.profile默認(rèn)的值為FALSE,即使應(yīng)用設(shè)置它為TRUE在初始化的時候. 打開密鑰保護(hù)的配對算法

GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );//告訴綁定管理器設(shè)備的輸入和輸出的能力.為了判斷設(shè)備是否有顯示屏或者輸入鍵盤這個參數(shù)是需要的.然而,默認(rèn)的值為GAPBOND_IO_CAP_DISPLAY_ONLY,表明設(shè)備有一個顯示屏但沒有鍵盤.即使設(shè)備沒有物理意義上的顯示器,一個展示的鑰匙(在用戶指導(dǎo)中)被認(rèn)為是一個顯示器.默認(rèn)的萬能鑰匙是一個六位數(shù)字字符串”000000”.

GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );//使能綁定.profile默認(rèn)的值為FALSE,即使SimpleBLEPeripheral應(yīng)用設(shè)置它為TRUE在初始化時.

}
6、GATT Server的相關(guān)設(shè)置函數(shù)。
// 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是必須強(qiáng)制存在的(Mandatory)以及自己設(shè)計的profile server.
作為GATT的server和client,主要通過Attribute來進(jìn)行交互,當(dāng)client請求server讀取數(shù)據(jù)時,通過如下注冊的回調(diào)函數(shù)來進(jìn)行訪問。
// Register callback with SimpleGATTprofile
VOID SimpleProfile_RegisterAppCBs( &simpleBLEPeripheral_SimpleProfileCBs );//給應(yīng)用注冊回調(diào)函數(shù)
在回調(diào)函數(shù)中對時間做出處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容