TI CC2540 BLE协议栈 蓝牙相关

《AMOMCU-CC254x开发板快速入门.pdf 》 笔记
阿莫淘宝店: https://amomcu.taobao.com/

什么是协议栈

  • 协议:定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发;
  • 协议栈:是协议的具体实现形式,通俗的理解就是用代码实现的函数库,以便于开发人员调用。

使用BLE 协议栈进行开发的基本思路可以概括为如下三点:

  • 用户对于BLE 无线网络的开发就简化为应用层的C 语言程序开发,用户不需要深入研究复杂的BLE 协议栈;
  • Bluetooth-LE 低功耗蓝牙中数据采集,只需要用户在应用层加入传感器的读取函数即可。
  • 如果考虑到节能,可以根据数据采集周期进行定时,定时时间到就唤醒BLE。
image.png

注意;所有的协议栈demo都要放到Projects/BLE 这个目录下编译运行

术语

1. profile

  • 通信协议
  • 位于从机中
    蓝牙组织规定了一系列的标准Profile,例如HID OVER GATT、防丢器、心率计等
    每个Profile中会包含多个Service

2. 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
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 的方式,速度要比直接读写的速度要慢。

你可能感兴趣的:(TI CC2540 BLE协议栈 蓝牙相关)