CH573/CC2541 主机 扫描广播 通过UUID过滤设备 获取AD TYPE 数据
一、说明
我们可以通过一些方法,对广播的数据进行分类,查找到自己想要的设备。在CC2541中,采用的是将服务UUID丢到广播数据中,下面说一下这种方法。
当然,我们可以自己直接通过判断ADTYPE为 GAP_ADTYPE_MANUFACTURER_SPECIFIC 0XFF 的数据来进行过滤
特别对于IOS设备来说,要获取设备的MAC,则必须将MAC放到广播数据中
二、主机修改部分
- 增加查找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;
}
- 在 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 );}
}
- 这里可以额外加一个东西,若想知道现在扫描到的,符合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++;}
}
- 获取其他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 数据相关推荐
- python 计算机网络课程设计(网络主机扫描程序)
我们的运行环境是pycharm 目录 背景 随着网络技术的发展,越来越多的计算机接入互联网上,网络安全逐渐成 为一个潜在的巨大问题,如何保障自身的网络安全,其中一个主要的方法就是 自查自纠,而在这个过 ...
- 【BLE】CC2541之动态广播加密数据
本篇博文最后修改时间:2017年03月30日,16:33. 一.简介 本文以SimpleBLEPeripheral为例,每5S来动态更新广播一次16字节的加密数据,其中有效数据为1个字节的计数值. 二 ...
- nrf52832 学习笔记(四)蓝牙主机扫描
nrf52832 学习笔记(四)蓝牙主机扫描 从机发出广播后就需要主机进行扫描了,主机扫描之前和从机一样,也需要协议栈初始化.GAP初始化.GATT初始化,这些和从机类似,参考 nrf52832 学习 ...
- Nessus基本操作-活跃主机扫描
文章目录 主机发现概念 目的 扫描类型 扫描方式 主机发现---活跃主机扫描 创建流程 主机发现概念 目的 通过对网络进行扫描,找出活动主机.开放端口.操作系统类型 扫描类型 Host enumera ...
- 第5章 批量主机扫描 nmap、ncat
第5章 批量主机扫描 批量主机服务扫描 目的: 1.批量主机存活扫描. 2.针对主机服务扫描 作用: 1.能更方便快捷获取网络中主机的存活状态. 2.更加细致.智能获取主机服务侦査情况. 典型命令:n ...
- 主机扫描、端口扫描、系统扫描、漏洞扫描
主机扫描.端口扫描.系统扫描.漏洞扫描 主机扫描 找出网段内活跃主机. 主机扫描方式: 1.传统 ICMP Ping 扫描 2.ACK Ping 扫描 3.SYN Ping 扫描 4.UDP Ping ...
- 5.2 主机扫描:主机探测
目录 一.预备知识:主机扫描方法 二.实验环境 三.实验步骤 一.预备知识:主机扫描方法 主机扫描(Host Scan)是指通过对目标网络(一般为一个或多个IP网段)中主机IP地址的扫描,以确定目标网 ...
- 网络安全学习之主机扫描和漏洞扫描
主机扫描 主机扫描一般在信息搜集阶段进行,用于了解目标主机上运行的服务以便进一步进行渗透. 用的工具主要是nmap,详细用法自行百度,我就说一下常用的几种组合 1. nmap -sn ip地址(可以是 ...
- linux php使用fping,Linux常用网络工具:fping主机扫描
Linux下有很多强大网络扫描工具,网络扫描工具可以分为:主机扫描.主机服务扫描.路由扫描等. fping是一个主机扫描工具,相比于ping工具可以批量扫描主机. fping官方网站:http://f ...
最新文章
- vue build text html,Vue中v-text / v-HTML使用实例代码详解_放手_前端开发者
- 飞花的糖果_JAVA
- 你知道Java的四种引用类型吗
- txt记录位置 c++,python显示位置
- C#网络编程概述 二
- 怎么用命令启动服务器文件,linux启动服务器命令
- 文件上传学习:(结合upload-labs 01-12):part01
- Windows ×××服务器配置6-启用L2TP方式CA模式访问①
- Parasoft软件测试实践:什么是左移测试?
- 我是 LinkedIn 的 SRE ,我把 LinkedIn 搞挂了
- 20. 为包含指针的关联容器指定比较类型
- Android入门笔记11
- C++中char[]转string
- Android__ListView控件的使用
- win10 桌面残留文件夹或其他应用关闭后的画面
- uc/os-II的内存改进与实现TLSF算法的详解,移植实现(一)
- html a hover css,CSS中的a:hover表示什么
- 《Word中从正文开始设置页码》
- 牛客网第二场I--car(简单图论)
- 上海怎样查询最近三年社保明细