//输出扫描结果 if(pEvent->discCmpl.numDevs > 0) { int i, j; // Increment index of current result (with wraparound) for(j = 0; j < pEvent->discCmpl.numDevs; j++) { PRINT("Device %d : ", j); for(i = 0; i < 6; i++) { PRINT("%x ", pEvent->discCmpl.pDevList[j].addr[i]); } PRINT("\n"); PRINT("Data %d : ", j); for(i = 0; i < pEvent->deviceInfo.dataLen; i++) { PRINT("%x ", pEvent->deviceInfo.pEvtData[i]); } PRINT("\n"); } }
可以参考一下截图里的代码
不能理解怎样的模仿,我下的包里的例程ObserverAddDeviceInfo函数只有这两个参数uint8_t *pAddr, uint8_t addrType。
以下是我的模仿,并不能正确获取广播内容,还请给个明确的回复。
typedef struct { uint8_t eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES uint8_t addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES uint8_t addr[B_ADDR_LEN]; //!< Device's Address uint8_t dataLen; //!< Length (in bytes) of the data field (evtData) uint8_t *pEvtData; //!< Data field of advertisement or SCAN_RSP } gapDevRec_t;
static void ObserverAddDeviceInfo(uint8_t *pAddr, uint8_t addrType,uint8_t *pData) { uint8_t i; // If result count not at max if(ObserverScanRes < DEFAULT_MAX_SCAN_RES) { // Check if device is already in scan results for(i = 0; i < ObserverScanRes; i++) { if(tmos_memcmp(pAddr, ObserverDevList[i].addr, B_ADDR_LEN)) { return; } } // Add addr to scan result list tmos_memcpy(ObserverDevList[ObserverScanRes].addr, pAddr, B_ADDR_LEN); tmos_memcpy(ObserverDevList[ObserverScanRes].pEvtData, pData, sizeof(pData)); ObserverDevList[ObserverScanRes].addrType = addrType; ObserverDevList[ObserverScanRes].dataLen = sizeof(pData); // Increment scan result count ObserverScanRes++; } }
case GAP_DEVICE_INFO_EVENT: { ObserverAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType,pEvent->deviceInfo.pEvtData); } break; case GAP_DEVICE_DISCOVERY_EVENT: { PRINT("Discovery over...\n"); //输出扫描结果 if(pEvent->discCmpl.numDevs > 0) { int i, j; // Increment index of current result (with wraparound) for(j = 0; j < pEvent->discCmpl.numDevs; j++) { PRINT("Device %d : ", j); for(i = 0; i < 6; i++) { PRINT("%x ", pEvent->discCmpl.pDevList[j].addr[i]); } PRINT("\n"); PRINT("Data len : %d", pEvent->discCmpl.pDevList[j].dataLen); PRINT("Data %d : ", j); for(i = 0; i < pEvent->discCmpl.pDevList[j].dataLen; i++) { PRINT("%x ", pEvent->discCmpl.pDevList[j].pEvtData[i]); } PRINT("\n"); } } GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE, DEFAULT_DISCOVERY_ACTIVE_SCAN, DEFAULT_DISCOVERY_WHITE_LIST); PRINT("Discovering...\n "); } break;
我修改的部分在case GAP_DEVICE_INFO_EVENT:这个case语句中,在发现过程中对你需要的数据进行枚举。
可以尝试根据我提供的截图进行修改。您修改的部分是在 case GAP_DEVICE_DISCOVERY_EVENT:这时已将是扫描结束了,罗列出扫描到的数据。
重复说一下? ? ??我下的包里的例程ObserverAddDeviceInfo函数只有这两个参数uint8_t *pAddr, uint8_t addrType。?
我没法参考你截图里 使用 ObserverAddDeviceInfo函数 ,?ObserverAddDeviceInfo函数复制下了广播数据中的地址,你截图里有传入广播包内容的数据,我没办法模仿。
不清楚各种数据结构体的用途,唯一知道是广播的数据在case GAP_DEVICE_INFO_EVENT:进行复制,没有解释扫描结束输出的结构体数据,头文件里的是有结构体数据的定义但都是用来干嘛的,每次扫描都产生了什么数据,用户层能用到什么数据?
目前我只能设置扫描白名单来获取指定地址设置的广播数据,当扫描到多个设备的广播数据这怎么区分?
首先ObserverAddDeviceInfo里面的参数可以自行修改如static void ObserverAddDeviceInfo(uint8_t *pAddr, uint8_t addrType,uint8_t *pEvtData);按照截图修改case GAP_DEVICE_INFO_EVENT:的程序;后面相应的语句再进行修改就可以了。结构体的对应的注释都可以在ch58xble_lib.h里面看到。扫描到多个设备通过MAC地址来区分。
上面改的没看?不是我不想修改。不要再继续扯皮了,没对扫描数据说明我怎么保存下我想要的数据,请给出扫描数据的说明。
你留个邮箱我把修改后的的工程发给你。扫描到的数据是广播包,可以看这篇博客的讲解BLE 蓝牙广播包结构分享 - debugdabiaoge - 博客园 (cnblogs.com)
这篇我看过了,这跟我需要知道TMOS广播扫描到的数据怎么使用没有半毛钱关系,你一直理解不了我想问什么可以换个人来解答,正在考虑要不要换其他家蓝牙单片机做广播扫描了,太难用了。邮箱:个人信息保护,已隐藏
获取广播包和扫描应答包在结构体中已包含了:
uint8_t *pEvtData;? ? ? ? ? ? ? ? //!< Data field of advertisement or SCAN_RSP
直接根据长度打印出来即可:
解决了,一眼难尽。从ObserverEventCB回调函数的switch分支GAP_DEVICE_INFO_EVENT里存下每次发现的设备信息,在扫描结束的时候打印出来,程序如下。
typedef struct { uint8_t eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES uint8_t addrType; //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES uint8_t addr[B_ADDR_LEN]; //广播的设备地址 int8_t rssi; //RSSI值 uint8_t dataLen; //广播的数据长度 uint8_t advertisingData[31];//广播的数据 } scanDevRec_t; static scanDevRec_t ObserverDevList[DEFAULT_MAX_SCAN_RES]; static uint8_t cnt;//扫描发现设备 计数 static void ObserverEventCB(gapRoleEvent_t *pEvent) { switch(pEvent->gap.opcode) { case GAP_DEVICE_INIT_DONE_EVENT: { GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE, DEFAULT_DISCOVERY_ACTIVE_SCAN, DEFAULT_DISCOVERY_WHITE_LIST); PRINT("Discovering...\n"); } break; case GAP_DEVICE_INFO_EVENT: { // 从发现的设备里保存下设备地址 广播的数据内容 ObserverDevList[cnt].addrType = pEvent->deviceInfo.addrType; ObserverDevList[cnt].rssi = pEvent->deviceInfo.rssi; ObserverDevList[cnt].dataLen = pEvent->deviceInfo.dataLen; tmos_memcpy(ObserverDevList[cnt].addr, pEvent->deviceInfo.addr, B_ADDR_LEN); tmos_memcpy(ObserverDevList[cnt].advertisingData, pEvent->deviceInfo.pEvtData, pEvent->deviceInfo.dataLen); cnt++; } break; case GAP_DEVICE_DISCOVERY_EVENT: { PRINT("Discovery over...\n"); //打印扫描结果 if (cnt > 0) { unsigned char i, j; for (i = 0; i < cnt; i++) { PRINT("Device %d addr:", i); for(j = 0; j < 6; j++) { PRINT("%x ", ObserverDevList[i].addr[j]); } PRINT("\n"); PRINT("Device %d advertising data:", i); for(j = 0; j < ObserverDevList[i].dataLen; j++) { PRINT("%x ", ObserverDevList[i].advertisingData[j]); } PRINT("\n"); } } else { PRINT("No device found.\n"); } cnt = 0; PRINT("---------------------------------------------------------------------------\n"); GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE, DEFAULT_DISCOVERY_ACTIVE_SCAN, DEFAULT_DISCOVERY_WHITE_LIST); PRINT("Discovering...\n "); } break; default: break; } }
广播扫描数据的结构体gapRoleEvent_t里的gapEventHdr_t gap;里存了在扫描过程中发现设备的事件,对gapEventHdr_t opcode值判断来执行想要的动作。
楼主你贴的第二次代码思路已经对了,可是打印的时候选错数组了~