《AMOMCU-CC254x开发板快速入门.pdf 》 笔记
阿莫淘宝店: https://amomcu.taobao.com/
什么是协议栈
- 协议:定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发;
- 协议栈:是协议的具体实现形式,通俗的理解就是用代码实现的函数库,以便于开发人员调用。
使用BLE 协议栈进行开发的基本思路可以概括为如下三点:
image.png
- 用户对于BLE 无线网络的开发就简化为应用层的C 语言程序开发,用户不需要深入研究复杂的BLE 协议栈;
- Bluetooth-LE 低功耗蓝牙中数据采集,只需要用户在应用层加入传感器的读取函数即可。
- 如果考虑到节能,可以根据数据采集周期进行定时,定时时间到就唤醒BLE。
注意;所有的协议栈demo都要放到Projects/BLE 这个目录下编译运行
术语
1. profile
- 通信协议
- 位于从机中
蓝牙组织规定了一系列的标准Profile,例如HID OVER GATT、防丢器、心率计等
每个Profile中会包含多个Service2. service
- 服务/从机的能力:电量信息服务,系统信息服务
- 每个Service 里又包含多个Characteristic 特征值。
3. characteristic
- 特征值
- 可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
- BLE 主从机的通信均是通过Characteristic 来实现
4. UUID
- 统一识别码
- Service 和Characteristic,都需要一个唯一的UUID来标识。
主从机互相发送数据 资料4.3节
主-》从:GATT_WriteCharValue 函数
从-》主:GATT_Notification 函数
纸尿裤中的例子如下:
从机接收数据
- 从机收到主机发来的数据后,会产生一个GATT Profile Callback 调用,
- 我们在这个callback 中接收主机发送的数据
-
这个callback 在从机初始化时向Profile 注册。
下面的例子同样来自纸尿裤/药盒:
image.png
该回调函数的一个例子:
*********************************************************************
* @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 复制到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);
// 这里可以处理一下数据,比如发命令点灯
// MT 命令处理 函数
simpleBLE_MT_CMD_Handle(newChar6Value,returnBytes);
}
}
break;
default:
// should not reach here!
break;
}
}
GATT 的Service 和 Client
- GATT 有Service 和Client之分
- Central 作为Client, Peripheral 作为Service
- 主机Central 会调用 GATT_WriteCharValue 或者GATT_ReadCharValue 来和从机通信
- 而Peripheral 需要通过notify 的方式,也就是调用GATT_Notification 发起和主机的通信
- 一般来说,Peripheral notify 的方式,速度要比直接读写的速度要慢。
网友评论