【BLE】CC2541之主机端获取notify数据

本篇博文最后修改时间:2017年01月06日,11:06。


一、简介

本文以SimpleBLECentral工程和SimpleBLEPeripheral工程为例,介绍CC2541作为主机时是如何获取从机char4通道的notify数据。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

硬件平台:Smart RF开发板(主芯片CC2541)*2


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
1)《CC2541之notify通知》:http://blog.csdn.net/feilusia/article/details/47020073
2)《CC2541之indicate指示》:http://blog.csdn.net/feilusia/article/details/48917625

2、在进行本文步骤前,请先 实现以下博文:
暂无


五、基础知识

暂无


六、实验步骤

1、添加宏定义(SimpleBLECentral.c中)

//GUA
#define GATT_CLIENT_CFG_NOTIFY                  0x0001 //打开notify开关的数值
#define GATT_CLIENT_CFG_INDICATE                0x0002 //打开indicate开关的数值

#define GUA_CHAR4_Hdl                           0x2E //char4的句柄 
#define GUA_CHAR4_CCC_Hdl                       0x2F //char4的CCC的句柄  
//GUA

2、修改UP按键部分代码(SimpleBLECentral.c的simpleBLECentral_HandleKeys函数

  if ( keys & HAL_KEY_UP )
  {
    // Start or stop discovery
    if ( simpleBLEState != BLE_STATE_CONNECTED )
    {
      if ( !simpleBLEScanning )
      {
        simpleBLEScanning = TRUE;
        simpleBLEScanRes = 0;
        
        LCD_WRITE_STRING( "Discovering...", HAL_LCD_LINE_1 );
        LCD_WRITE_STRING( "", HAL_LCD_LINE_2 );
        
        GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,
                                       DEFAULT_DISCOVERY_ACTIVE_SCAN,
                                       DEFAULT_DISCOVERY_WHITE_LIST );      
      }
      else
      {
        GAPCentralRole_CancelDiscovery();
      }
    }
    else if ( simpleBLEState == BLE_STATE_CONNECTED &&
              simpleBLECharHdl != 0 &&
              simpleBLEProcedureInProgress == FALSE )
    {
//香瓜
      //开启notify的CCC
      attWriteReq_t req;
        
      req.handle = GUA_CHAR4_CCC_Hdl;                   //char4的CCC的特征值句柄,这里写死0x2F,可通过btool获取到
      req.len = 2;
      req.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY); //0x0001为开notify
      req.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);        
      req.sig = 0;
      req.cmd = 0;
      GATT_WriteCharValue( 0, &req, simpleBLETaskId );  
 
      /*
      uint8 status;
      
      // Do a read or write as long as no other read or write is in progress
      if ( simpleBLEDoWrite )
      {
        // Do a write
        attWriteReq_t req;
        
        req.handle = simpleBLECharHdl;
        req.len = 1;
        req.value[0] = simpleBLECharVal;
        req.sig = 0;
        req.cmd = 0;
        status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );         
      }
      else
      {
        // Do a read
        attReadReq_t req;
        
        req.handle = simpleBLECharHdl;
        status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );
      }
      
      if ( status == SUCCESS )
      {
        simpleBLEProcedureInProgress = TRUE;
        simpleBLEDoWrite = !simpleBLEDoWrite;
      }*/
//香瓜     
    }    
  }

用“//香瓜”包含起来的部分为主要修改部分。也就是在连接时,按UP键能打开char4的notify开关。


3、添加接收通知数据的处理部分代码(SimpleBLECentral.c的simpleBLECentralProcessGATTMsg函数末尾

  //香瓜
  else if ( ( pMsg->method == ATT_HANDLE_VALUE_NOTI ) )   //通知
  {
    if( pMsg->msg.handleValueNoti.handle == GUA_CHAR4_Hdl)     //CHAR6的通知  串口打印
    {
        char str[32] = {0};
        osal_memcpy(str, pMsg->msg.handleValueNoti.value, pMsg->msg.handleValueNoti.len );
    }
  }
  //香瓜 


七、注意事项

暂无


八、实验结果

在连接状态时,按UP键会打开char4的notify开关。在5S内会接收到来自从机的1个字节数据(0x03)。

设置断点在如下图的地方,可以在代码中查看到结果:



主机成功地读取到了从机的notify数据。

因此,实验成功。


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值