藍牙4.0 BLE peripheral 廣播設置

一、簡介

本文主要講解藍牙廣播參數說明


二、實驗平臺

協議棧版本:BLE-CC254x-1.4.0

編譯軟件:IAR 8.20.2

硬件平臺:Smart RF(主芯片CC2541)


版權聲明

博主:si_zhou_qun_84342712

聲明:喝水不忘挖井人,轉載請註明出處。

原文地址: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 );//給應用註冊回調函數

在回調函數中對時間做出處理。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章