【BLE-CC2640】CC2640之主机端获取广播包数据

本篇博文最后修改时间:2016年09月15日,16:33。


一、简介

本篇以SimpleBLECentral工程为例,介绍CC2640作为主机时是如何获取从机广播包数据的


二、实验平台

协议栈版本:ble_cc26xx_2_01_00_44423

编译软件:IAR Embedded Workbench for ARM Version 7.40

硬件平台:两块CC26xxDK开发板

仿真器:XDS100V3(香瓜)


版权声明

博主:甜甜的大香瓜

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

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

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

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

四、 参考资料
1、《CC2640之主机端获取广播包数据》:http://blog.csdn.net/feilusia/article/details/48711803

五、 实验前提
在阅读本文前,请 先实现 本博客的以下博文:
1)《CC2640之按键》:http://blog.csdn.net/feilusia/article/details/52221525

六、实验步骤
1、定义获取广播数据段的相关函数(SimpleBLECentral.c中)
//******************************************************************************            
//name:             GUA_Get_AdtypeData           
//introduce:        获取广播数据或扫描应答数据中adType对应的数据        
//parameter:        adType:数据类型    
//                  pData:广播包或扫描应答包
//                  dataLen:广播包或扫描应答包的数据长度
//return:           TRUE:找到adType类型的数据
//                  FALSE:没找到adType类型的数据  
//author:           甜甜的大香瓜                 
//email:            897503845@qq.com     
//QQ group          香瓜BLE之CC2640(557278427)                  
//changetime:       2016.09.15                     
//******************************************************************************  
static bool GUA_Get_AdtypeData( uint8 adType, uint8 *pData, uint8 dataLen, uint8 *adTypeData_index, uint8 *adTypeData_len)  
{    
  (void)adTypeData_index;                               //防止编译报错  
  (void)adTypeData_len;                                 //防止编译报错  
    
  uint8 adLen;                                          //对应数据段的长度  
  uint8 *pCurrent;                                      //当前位置的指针  
  uint8 *pEnd;                                          //尾指针  
      
  pEnd = pData + dataLen - 1;                           //指向包尾  
      
  pCurrent = pData;                                     //当前指针指向包头  
    
  while ( pCurrent < pEnd )                             //判断当前指针是否还未到包尾  
  {  
    adLen = *pCurrent++;                                //获取本段数据段的长度  
      
    if ( adLen > 0 )  
    {        
      if ( adType == *pCurrent )                        //如果找到了adType  
      {          
        *adTypeData_index = (pCurrent + 1) - pData;     //数据段在数据包中的偏移值  
        *adTypeData_len = adLen - 1;                    //数据段长度  
          
        return TRUE;                                    //返回TRUE  
      }  
      else                                              //没找到adType则指向下一个数据段  
      {  
        pCurrent += adLen;  
      }  
    }  
  }   
    
  return FALSE;         //本数据串中没有找到adType  
}  

//******************************************************************************            
//name:             GUA_HexToStr           
//introduce:        十六进制数转字符串         
//parameter:        pHex:十六进制数    
//return:           转换后的字符串
//author:           甜甜的大香瓜                 
//email:            897503845@qq.com     
//QQ group          香瓜BLE之CC2640(557278427)                  
//changetime:       2016.09.15                     
//******************************************************************************  
static char *GUA_HexToStr(uint8 *pGUA_Hex)  
{     
  char        bGUA_Hex[] = "0123456789ABCDEF";    
  static char bGUA_Str[100];    
  char        *pGUA_Str = bGUA_Str;    
    
  for (uint8 i = 0; i < sizeof(pGUA_Hex); i++)    
  {    
    *pGUA_Str++ = bGUA_Hex[*pGUA_Hex >> 4];    
    *pGUA_Str++ = bGUA_Hex[*pGUA_Hex++ & 0x0F];    
  }    
    
  return bGUA_Str;    
}  
其实GUA_HexToStr函数没用到,但提供函数给大家。方便串口打印时进行数据转换后使用。

2、声明获取广播数据段的相关函数(SimpleBLECentral.c中)
//GUA
static bool GUA_Get_AdtypeData( uint8 adType, uint8 *pData, uint8 dataLen, uint8 *adTypeData_index, uint8 *adTypeData_len); 
static char *GUA_HexToStr(uint8 *pGUA_Hex);
//GUA

3、调用获取广播数据段的函数 (替换SimpleBLECentral.c的SimpleBLECentral_processRoleEvent函数中的GAP_DEVICE_INFO_EVENT段代码)
    case GAP_DEVICE_INFO_EVENT:
      {
        // if filtering device discovery results based on service UUID
        if (DEFAULT_DEV_DISC_BY_SVC_UUID == TRUE)
        {
          if (SimpleBLECentral_findSvcUuid(SIMPLEPROFILE_SERV_UUID,
                                           pEvent->deviceInfo.pEvtData,
                                           pEvent->deviceInfo.dataLen))
          {
            SimpleBLECentral_addDeviceInfo(pEvent->deviceInfo.addr, 
                                           pEvent->deviceInfo.addrType);

            //GUA
            {  
              //读广播包或扫描应答包的某个数据段  
              uint8 adType = GAP_ADTYPE_16BIT_MORE;     //需要扫描的类型数据  
              uint8 adTypeData_index = 0;               //数据段在数据包中的偏移值  
              uint8 adTypeData_len = 0;                 //数据段的长度
              static uint8 GUA_Get_Data[31] = {0};      //数据缓冲区
              uint8 *pGUA_Get_Data = GUA_Get_Data;     //数据缓冲区指针
              bool status = FALSE;  
                
              status = GUA_Get_AdtypeData( adType,   
                                          pEvent->deviceInfo.pEvtData,  
                                          pEvent->deviceInfo.dataLen,  
                                          &adTypeData_index,  
                                          &adTypeData_len);  
              if(status == TRUE)  
              {  
                memcpy(pGUA_Get_Data, (pEvent->deviceInfo.pEvtData + adTypeData_index), adTypeData_len);       //将获取的数据保存在GUA_Get_Data
              }  
            }
            //GUA
          }
        }
      }
      break;
在这里我读取了从机广播数据中的GAP_ADTYPE_16BIT_MORE字段,也就是下图的字段,它的实际有效数据是0xFFF0。


七、实验结果
1、从机上电广播,主机仿真并全速运行。
2、主机按方向键的“UP”键进行扫描,则此时获取到了从机的广播数据段中的数据。
3、暂停主机的全速运行,查看GUA_Get_Data数组,里面即有获取到的数据段的数据。如下图。

可见获取到了0xFFF0,也就是simpleGATTprofile的服务UUID。
因此,实验成功。









  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值