《AMOMCU-CC254x開發(fā)板快速入門.pdf 》 筆記
阿莫淘寶店: https://amomcu.taobao.com/
什么是協(xié)議棧
- 協(xié)議:定義的是一系列的通信標(biāo)準(zhǔn)蚣录,通信雙方需要共同按照這一標(biāo)準(zhǔn)進(jìn)行正常的數(shù)據(jù)收發(fā)馒索;
- 協(xié)議棧:是協(xié)議的具體實現(xiàn)形式缸托,通俗的理解就是用代碼實現(xiàn)的函數(shù)庫俗扇,以便于開發(fā)人員調(diào)用驶社。
使用BLE 協(xié)議棧進(jìn)行開發(fā)的基本思路可以概括為如下三點:
- 用戶對于BLE 無線網(wǎng)絡(luò)的開發(fā)就簡化為應(yīng)用層的C 語言程序開發(fā),用戶不需要深入研究復(fù)雜的BLE 協(xié)議棧炸站;
- Bluetooth-LE 低功耗藍(lán)牙中數(shù)據(jù)采集,只需要用戶在應(yīng)用層加入傳感器的讀取函數(shù)即可疚顷。
- 如果考慮到節(jié)能旱易,可以根據(jù)數(shù)據(jù)采集周期進(jìn)行定時,定時時間到就喚醒BLE腿堤。
image.png
注意;所有的協(xié)議棧demo都要放到Projects/BLE 這個目錄下編譯運行
術(shù)語
1. profile
- 通信協(xié)議
- 位于從機(jī)中
藍(lán)牙組織規(guī)定了一系列的標(biāo)準(zhǔn)Profile阀坏,例如HID OVER GATT、防丟器笆檀、心率計等
每個Profile中會包含多個Service2. service
- 服務(wù)/從機(jī)的能力:電量信息服務(wù)忌堂,系統(tǒng)信息服務(wù)
- 每個Service 里又包含多個Characteristic 特征值。
3. characteristic
- 特征值
- 可以理解為一個標(biāo)簽酗洒,通過這個標(biāo)簽可以獲取或者寫入想要的內(nèi)容士修。
- BLE 主從機(jī)的通信均是通過Characteristic 來實現(xiàn)
4. UUID
- 統(tǒng)一識別碼
- Service 和Characteristic,都需要一個唯一的UUID來標(biāo)識樱衷。
主從機(jī)互相發(fā)送數(shù)據(jù) 資料4.3節(jié)
主-》從:GATT_WriteCharValue 函數(shù)
從-》主:GATT_Notification 函數(shù)
紙尿褲中的例子如下:
紙尿褲的例子
從機(jī)接收數(shù)據(jù)
- 從機(jī)收到主機(jī)發(fā)來的數(shù)據(jù)后棋嘲,會產(chǎn)生一個GATT Profile Callback 調(diào)用,
- 我們在這個callback 中接收主機(jī)發(fā)送的數(shù)據(jù)
-
這個callback 在從機(jī)初始化時向Profile 注冊矩桂。
下面的例子同樣來自紙尿褲/藥盒:
image.png
image.png
該回調(diào)函數(shù)的一個例子:
*********************************************************************
* @fn simpleProfileChangeCB
*
* @brief Callback from SimpleBLEProfile indicating a value change
*
* @param paramID - parameter ID of the value that was changed.
*
* @return none
*/
static void simpleProfileChangeCB( uint8 paramID )
{
uint8 newValue;
uint8 newChar6Value[SIMPLEPROFILE_CHAR6_LEN];
uint8 returnBytes;
switch( paramID )
{
case SIMPLEPROFILE_CHAR1:
/**
判斷是否是寫特征值Characteristic 1沸移,如果是,將characteristic1 的value 復(fù)制到newValue 中耍鬓,然后可以通過lcd 輸出顯示。
*/
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR1, &newValue, &returnBytes );
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
HalLcdWriteStringValue( "Char 1:", (uint16)(newValue), 10, HAL_LCD_LINE_3 );
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
break;
case SIMPLEPROFILE_CHAR3:
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR3, &newValue, &returnBytes );
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
HalLcdWriteStringValue( "Char 3:", (uint16)(newValue), 10, HAL_LCD_LINE_3 );
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
break;
case SIMPLEPROFILE_CHAR6:
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR6, newChar6Value, &returnBytes );
if(returnBytes > 0)
{
if(simpleBLE_CheckIfUse_Uart2Uart()) //使用透傳模式時才透傳
{
NPI_WriteTransport(newChar6Value,returnBytes);
// 這里可以處理一下數(shù)據(jù)流妻,比如發(fā)命令點燈
// MT 命令處理 函數(shù)
simpleBLE_MT_CMD_Handle(newChar6Value,returnBytes);
}
}
break;
default:
// should not reach here!
break;
}
}
GATT 的Service 和 Client
- GATT 有Service 和Client之分
- Central 作為Client牲蜀, Peripheral 作為Service
- 主機(jī)Central 會調(diào)用 GATT_WriteCharValue 或者GATT_ReadCharValue 來和從機(jī)通信
- 而Peripheral 需要通過notify 的方式,也就是調(diào)用GATT_Notification 發(fā)起和主機(jī)的通信
- 一般來說绅这,Peripheral notify 的方式涣达,速度要比直接讀寫的速度要慢。