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 的方式,速度要比直接读写的速度要慢。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、BLE协议栈架构 BLE 协议栈(简称“协议”)由两部分组成: 和 。控制器与主机分离的形式来自标准的蓝牙 B...
    Leung_ManWah阅读 2,992评论 0 3
  • 蓝牙 蓝牙的波段为2400-2483.5MHz(包括防护频带)。这是全球范围内无需取得执照(但定不是无管制的)的工...
    苏永茂阅读 6,621评论 0 11
  • 一、概述 1、BLE蓝牙协议栈结构 协议栈分为两部分:控制器和主机。对于4.0以前的蓝牙,这两部分是分开的。所有p...
    张志中阅读 1,606评论 0 2
  • 这次介绍一下蓝牙协议栈(BLE)的基础知识,蓝牙协议栈组成如下图所示,首先我们说说GAP和GATT 1. G...
    一智半解阅读 7,970评论 0 3
  • 背景 蓝牙历史说到蓝牙,就不得不说下蓝牙技术联盟(Bluetooth SIG),它负责蓝牙规范制定和推广的国际组织...
    徐正峰阅读 13,079评论 6 33

友情链接更多精彩内容