本篇博文最后修改时间: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
香瓜单片机之STM8/STM32群:164311667
香瓜单片机之Linux群:512598061
香瓜单片机之职场交流群:450154342
香瓜单片机之职场交流群: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中)
3、调用获取广播数据段的函数 (替换SimpleBLECentral.c的SimpleBLECentral_processRoleEvent函数中的GAP_DEVICE_INFO_EVENT段代码)
//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。
因此,实验成功。