一、说明

我们可以通过一些方法,对广播的数据进行分类,查找到自己想要的设备。在CC2541中,采用的是将服务UUID丢到广播数据中,下面说一下这种方法。
当然,我们可以自己直接通过判断ADTYPE为 GAP_ADTYPE_MANUFACTURER_SPECIFIC 0XFF 的数据来进行过滤
特别对于IOS设备来说,要获取设备的MAC,则必须将MAC放到广播数据中


二、主机修改部分

  1. 增加查找ADTYPE为服务UUID的函数
//看一下具体的ADTYPE
//#define GAP_ADTYPE_16BIT_COMPLETE               0x03 //!< Service: Complete list of 16-bit UUIDs
//#define GAP_ADTYPE_16BIT_MORE                   0x02 //!< Service: More 16-bit UUIDs availablestatic bool simpleBLEFindSvcUuid( uint16 uuid, uint8 *pData, uint8 dataLen )
{uint8 adLen;uint8 adType;uint8 *pEnd;pEnd = pData + dataLen - 1;// While end of data not reachedwhile ( pData < pEnd ){// Get length of next AD itemadLen = *pData++;if ( adLen > 0 ){adType = *pData;// If AD type is for 16-bit service UUIDif ( adType == GAP_ADTYPE_16BIT_MORE || adType == GAP_ADTYPE_16BIT_COMPLETE ){pData++;adLen--;// For each UUID in listwhile ( adLen >= 2 && pData < pEnd ){// Check for matchif ( pData[0] == LO_UINT16(uuid) && pData[1] == HI_UINT16(uuid) ){// Match foundreturn TRUE;}// Go to nextpData += 2;adLen -= 2;}// Handle possible erroneous extra byte in UUID listif ( adLen == 1 ){pData++;}}else{// Go to next itempData += adLen;}}}// Match not foundreturn FALSE;
}
  1. 在 GAP的 EVENT 中,增加判断
case GAP_DEVICE_INFO_EVENT:
{if ( simpleBLEFindSvcUuid( SIMPLEPROFILE_SERV_UUID,pEvent->deviceInfo.pEvtData,pEvent->deviceInfo.dataLen ) ){//向设备发现列表中添加一个设备simpleBLEAddDeviceInfo( pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType );}
}
  1. 这里可以额外加一个东西,若想知道现在扫描到的,符合uuid是对应第几个设备,可以在 simpleBLEAddDeviceInfo中加逻辑判断,其中per_index 就是。
/*********************************************************************1. @fn      simpleBLEAddDeviceInfo2.  3. @brief   Add a device to the device discovery result list4.  5. @return  none*/
static void simpleBLEAddDeviceInfo( uint8 *pAddr, uint8 addrType )
{uint8 i;// If result count not at maxif ( simpleBLEScanRes < DEFAULT_MAX_SCAN_RES ){// Check if device is already in scan resultsfor ( i = 0; i < simpleBLEScanRes; i++ ){if ( osal_memcmp( pAddr, simpleBLEDevList[i].addr , B_ADDR_LEN ) ){per_index = i+1;return;}}// Add addr to scan result listosal_memcpy( simpleBLEDevList[simpleBLEScanRes].addr, pAddr, B_ADDR_LEN );simpleBLEDevList[simpleBLEScanRes].addrType = addrType;// Increment scan result countsimpleBLEScanRes++;}
}
  1. 获取其他AD TYPE的数据 ,注意,我在这里是借用了GAP_ADTYPE_16BIT_MORE,直接增加其长度 后面加数据了,正常我们要用 GAP_ADTYPE_MANUFACTURER_SPECIFIC 也就是 0xFF 来进行处理
//******************************************************************************
//name:             Get_Adtype_Data//introduce:            获取广播数据或扫描应答数据中adType对应的数据//input parameter:      adType:数据类型
//                      pData:广播包或扫描应答包
//                      dataLen:广播包或扫描应答包的数据长度//output parameter:     adTypeData_index:对应的adType类型数据的偏移值
//                      adTypeData_len:对应的adType类型数据的长度//return:            TRUE:找到adType类型的数据
//                      FALSE:没找到adType类型的数据
//******************************************************************************
static bool Get_Adtype_Data( 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:         Hex_To_Str
//input:        十六进制进制转字符串
//return:       修改后的字符串
//**************************************************
char* Hex_To_Str( uint8 *pHex )
{   char        hex[] = "0123456789ABCDEF";  static char str[100];  char        *pStr = str;  for ( uint8 i = 0; i < sizeof(pHex); i++ )  {  *pStr++ = hex[*pHex >> 4];  *pStr++ = hex[*pHex++ & 0x0F];  }  return str;
}

在 GAP_DEVICE_INFO_EVENT

     #if 0{//读广播包或扫描应答包的某个数据段uint8 adType = GAP_ADTYPE_FLAGS;  //需要扫描的类型数据uint8 adTypeData_index = 0;       //数据段在数据包中的偏移值uint8 adTypeData_len = 0;         //数据段的长度bool status = FALSE;status = Get_Adtype_Data( adType, pEvent->deviceInfo.pEvtData,pEvent->deviceInfo.dataLen,&adTypeData_index,&adTypeData_len);if(status == TRUE){NPI_PrintString("GAP_ADTYPE_FLAGS:");   NPI_WriteTransport((uint8 *)(Hex_To_Str(pEvent->deviceInfo.pEvtData + adTypeData_index)),adTypeData_len*2);         NPI_PrintString("\r\n");            NPI_PrintValue("size:", adTypeData_len, 10);            NPI_PrintString("\r\n");}} #else//读广播包或扫描应答包的某个数据段uint8 adType = GAP_ADTYPE_16BIT_MORE;  //需要扫描的类型数据uint8 adTypeData_index = 0;       //数据段在数据包中的偏移值uint8 adTypeData_len = 0;         //数据段的长度bool status = FALSE;status = Get_Adtype_Data( adType, pEvent->deviceInfo.pEvtData,pEvent->deviceInfo.dataLen,&adTypeData_index,&adTypeData_len);if(status == TRUE){char str[20];g_SensorValue[per_index-1][0] = *(pEvent->deviceInfo.pEvtData + adTypeData_index+2);g_SensorValue[per_index-1][1] = *(pEvent->deviceInfo.pEvtData + adTypeData_index+3);g_SensorValue[per_index-1][2] = *(pEvent->deviceInfo.pEvtData + adTypeData_index+4);g_SensorValue[per_index-1][3] = *(pEvent->deviceInfo.pEvtData + adTypeData_index+5);g_adc[per_index-1] = 256* (*(pEvent->deviceInfo.pEvtData + adTypeData_index+6)) + *(pEvent->deviceInfo.pEvtData + adTypeData_index+7);sprintf(str, "[%d]:%d.%d,%d.%d,%d",per_index,g_SensorValue[per_index-1][0], g_SensorValue[per_index-1][1],g_SensorValue[per_index-1][2], g_SensorValue[per_index-1][3],g_adc[per_index-1]);NPI_PrintString(str);NPI_PrintString("\r\n");LCD_WRITE_STRING( str, HAL_LCD_LINE_1+per_index );}#endif

三、从机修改

注意看一下广播数据的格式:

长度 ADTYPE 数据

// GAP - Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertisting)
static uint8 advertData[] =
{// Flags; this sets the device to use limited discoverable// mode (advertises for 30 seconds at a time) instead of general// discoverable mode (advertises indefinitely)0x02,   // length of this dataGAP_ADTYPE_FLAGS,DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,// service UUID, to notify central devices what services are included// in this peripheral0x09,   // length of this dataGAP_ADTYPE_16BIT_MORE,      // some of the UUID's, but not allLO_UINT16( SIMPLEPROFILE_SERV_UUID ),HI_UINT16( SIMPLEPROFILE_SERV_UUID ),0,0,0,0,0,0,};

CH573/CC2541 主机 扫描广播 通过UUID过滤设备 获取AD TYPE 数据相关推荐

  1. python 计算机网络课程设计(网络主机扫描程序)

    我们的运行环境是pycharm 目录 背景 随着网络技术的发展,越来越多的计算机接入互联网上,网络安全逐渐成 为一个潜在的巨大问题,如何保障自身的网络安全,其中一个主要的方法就是 自查自纠,而在这个过 ...

  2. 【BLE】CC2541之动态广播加密数据

    本篇博文最后修改时间:2017年03月30日,16:33. 一.简介 本文以SimpleBLEPeripheral为例,每5S来动态更新广播一次16字节的加密数据,其中有效数据为1个字节的计数值. 二 ...

  3. nrf52832 学习笔记(四)蓝牙主机扫描

    nrf52832 学习笔记(四)蓝牙主机扫描 从机发出广播后就需要主机进行扫描了,主机扫描之前和从机一样,也需要协议栈初始化.GAP初始化.GATT初始化,这些和从机类似,参考 nrf52832 学习 ...

  4. Nessus基本操作-活跃主机扫描

    文章目录 主机发现概念 目的 扫描类型 扫描方式 主机发现---活跃主机扫描 创建流程 主机发现概念 目的 通过对网络进行扫描,找出活动主机.开放端口.操作系统类型 扫描类型 Host enumera ...

  5. 第5章 批量主机扫描 nmap、ncat

    第5章 批量主机扫描 批量主机服务扫描 目的: 1.批量主机存活扫描. 2.针对主机服务扫描 作用: 1.能更方便快捷获取网络中主机的存活状态. 2.更加细致.智能获取主机服务侦査情况. 典型命令:n ...

  6. 主机扫描、端口扫描、系统扫描、漏洞扫描

    主机扫描.端口扫描.系统扫描.漏洞扫描 主机扫描 找出网段内活跃主机. 主机扫描方式: 1.传统 ICMP Ping 扫描 2.ACK Ping 扫描 3.SYN Ping 扫描 4.UDP Ping ...

  7. 5.2 主机扫描:主机探测

    目录 一.预备知识:主机扫描方法 二.实验环境 三.实验步骤 一.预备知识:主机扫描方法 主机扫描(Host Scan)是指通过对目标网络(一般为一个或多个IP网段)中主机IP地址的扫描,以确定目标网 ...

  8. 网络安全学习之主机扫描和漏洞扫描

    主机扫描 主机扫描一般在信息搜集阶段进行,用于了解目标主机上运行的服务以便进一步进行渗透. 用的工具主要是nmap,详细用法自行百度,我就说一下常用的几种组合 1. nmap -sn ip地址(可以是 ...

  9. linux php使用fping,Linux常用网络工具:fping主机扫描

    Linux下有很多强大网络扫描工具,网络扫描工具可以分为:主机扫描.主机服务扫描.路由扫描等. fping是一个主机扫描工具,相比于ping工具可以批量扫描主机. fping官方网站:http://f ...

最新文章

  1. vue build text html,Vue中v-text / v-HTML使用实例代码详解_放手_前端开发者
  2. 飞花的糖果_JAVA
  3. 你知道Java的四种引用类型吗
  4. txt记录位置 c++,python显示位置
  5. C#网络编程概述 二
  6. 怎么用命令启动服务器文件,linux启动服务器命令
  7. 文件上传学习:(结合upload-labs 01-12):part01
  8. Windows ×××服务器配置6-启用L2TP方式CA模式访问①
  9. Parasoft软件测试实践:什么是左移测试?
  10. 我是 LinkedIn 的 SRE ,我把 LinkedIn 搞挂了
  11. 20. 为包含指针的关联容器指定比较类型
  12. Android入门笔记11
  13. C++中char[]转string
  14. Android__ListView控件的使用
  15. win10 桌面残留文件夹或其他应用关闭后的画面
  16. uc/os-II的内存改进与实现TLSF算法的详解,移植实现(一)
  17. html a hover css,CSS中的a:hover表示什么
  18. 《Word中从正文开始设置页码》
  19. 牛客网第二场I--car(简单图论)
  20. 上海怎样查询最近三年社保明细

热门文章

  1. Sqlserver对时间转换格式汇总
  2. border英文缩写_CSS 编码规范
  3. java创建文件夹和文件
  4. Android — 使用recyclerview+FlexboxLayoutManager实现Tag标签
  5. 《数据结构》—— 哈夫曼树
  6. 计算机基础--网络详解
  7. CSS什么情况引起回流,css的回流和重绘
  8. E-R模型和E-R图
  9. git报错Connection reset by 140.82.113.4 port 22
  10. SolidWorks Motion学习笔记1