关于simpleBLEFindSvcUuid() UUUID的过滤的问题
两个板子,一主一从, 一个烧录 SimpleBLECentral 一个烧录SimpleBLEPeripheral 。
static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent ) ==》 case GAP_DEVICE_INFO_EVENT: -》 simpleBLEFindSvcUuid()
static bool simpleBLEFindSvcUuid( uint16 uuid, uint8 *pData, uint8 dataLen )
{
uint8 adLen;
uint8 adType;
uint8 *pEnd;
pEnd = pData + dataLen - 1;while ( pData < pEnd )
{
adLen = *pData++;
if ( adLen > 0 )
{
adType = *pData;
if ( adType == GAP_ADTYPE_16BIT_MORE || adType == GAP_ADTYPE_16BIT_COMPLETE || 1)
{
pData++;
adLen--;
while ( adLen >= 2 && pData < pEnd )
{if ( pData[0] == LO_UINT16(uuid) && pData[1] == HI_UINT16(uuid) )
{
return TRUE;
}
。。。
问题一 : pData 是从机在主机扫描的时候发过来的是吧。uuuid 是simpleBLEFindSvcUuid()传进来的 SIMPLEPROFILE_SERV_UUID
#define SIMPLEPROFILE_SERV_UUID 0xFFF0
simpleBLEFindSvcUuid()里面的 pData[0] == LO_UINT16(uuid) && pData[1] == HI_UINT16(uuid)
就是判断 pData[0] 跟 pData[1] 的值是 0xfff0 才能返回true 不会被过滤掉。
static uint8 advertData[] =
{
0x02, // length of this data
GAP_ADTYPE_FLAGS,
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
0x03, // length of this data
GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all
LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
};
问题二 : simpleBLEFindSvcUuid()里面的pData 是不是就是 从机 里面static uint8 advertData[] ?
问题三 : 如果问题二 成立的话。 pData[0] 跟 pData[1] 对应的是 0x02, GAP_ADTYPE_FLAGS,
也不是LO_UINT16( SIMPLEPROFILE_SERV_UUID ),HI_UINT16( SIMPLEPROFILE_SERV_UUID )呀? 怎么会这样。颠倒了?
问题四: 如果SimpleBLEPeripheral 里面的 SIMPLEPROFILE_SERV_UUID 不是FFF0 , 就是跟主机里面的SIMPLEPROFILE_SERV_UUID 不一样,
那是不是从机就会被过滤掉? 就找不到这个从机了?
字码的有点多。 但是很详细。 希望TI 员工帮我解答。 呼叫 YAN ~~
hainong,
问题一,是的,pData是扫描过来的数据。uuid也是你说的那个宏定义。
问题二, 没错,但也可以是scanData[], 可以通过deviceInfo中的eventType来区分是adv 还是scan response。
问题三, 你可以看一下结构体定义,还有广播包格式定义,0 和 1 的位置分别是长度和类型,后面是内容,结构体里面已经把这些都分好了,所以你得到的pData[]里面就是实际内容,不是长度和类型。
问题四, 没错。会被过滤掉。
Hi Yan:
看了你的回答,我有了几个疑问。如果方便的话还请你解答一下,谢谢啊。
1.
typedef struct
{
osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status
uint8 opcode; //!< GAP_DEVICE_INFO_EVENT
uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES
uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES
uint8 addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP
int8 rssi; //!< Advertisement or SCAN_RSP RSSI
uint8 dataLen; //!< Length (in bytes) of the data field (evtData)
uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP
} gapDeviceInfoEvent_t;
在这个结构体里面当我获取到扫描后的一个设备信息时我可以通过pEvtData获取广播包内容是吧,那请问这个广播包是否已经动态分配内存了,如果是那么用完之后谁来释放这块内存区域。
2.假设我的uuid时128bit我该如何获取,能否简单解释一下,。