TI中文支持网
TI专业的中文技术问题搜集分享网站

LAUNCHXL-CC26X2R1: 我找到了GAPBOND_ERASE_SINGLEBOND用法,但是使用依旧失败

Part Number:LAUNCHXL-CC26X2R1

https://e2echina.ti.com/support/wireless-connectivity/bluetooth/f/bluetooth-forum/790343/launchxl-cc26x2r1-mac-ltk

在gapbondmgr.c文件中GAPBondMgr_SetParameter函数中GAPBOND_ERASE_SINGLEBOND的入参应该是

/**
* Erase a single bonded device (Write-only)
*
* @note In case @ref GAPBOND_ERASE_BOND_IN_CONN is disabled,
* The erase won't happen until there are no active connections.
* In case @ref GAPBOND_ERASE_BOND_IN_CONN is enabled,
* the bond erase can happen also when if there are active connections.
*
* size: uint8_t[B_ADDR_LEN]
*
* range: A one-byte address type followed by a 6 byte address
*/
#define GAPBOND_ERASE_SINGLEBOND 0x410

GAPBondMgr_SetParameter内部实现如下:可知长度和内容应该是1字节的MAC类型+6字节MAC

注意GAPBondMgr_FindAddr中MAC类型只有如下两种:

操作如下:

1、首先成功配对绑定手机,

2、断开后再次连接,在GAP_LINK_ESTABLISHED_EVENT中记录手机MAC和MAC类型

case GAP_LINK_ESTABLISHED_EVENT:
{
gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg;

memset(gMobleMac, 0x00, B_ADDR_LEN);
memcpy(gMobleMac, pPkt->devAddr, B_ADDR_LEN);
gMacType = pPkt->devAddrType;

我在这个地方打印gMacType,的值时0x02, 但是在上面find addr中MAC类型只有两种,对不上

3、触发GAPBOND_ERASE_SINGLEBOND调用

我的调用方式如下:

uint8_t mac[B_ADDR_LEN + 1] = {0};
uint8_t Tmpmac[B_ADDR_LEN] = {0};
uint8_t u8Flag = TRUE;
mac[0] = gMacType; 

//这里是设置允许连接时删除
bStatus_t tResult = GAPBondMgr_SetParameter(GAPBOND_ERASE_BOND_IN_CONN, sizeof(uint8_t), &u8Flag);
uart_print("bong1: %d", tResult);

//正序查找手机MAC

memcpy(mac+1, gMobleMac, B_ADDR_LEN);
tResult = GAPBondMgr_SetParameter(GAPBOND_ERASE_SINGLEBOND, B_ADDR_LEN + sizeof(uint8_t), mac);
uart_print("1: %02X-%02X-%02X-%02X-%02X-%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
uart_print("erase1: %d", tResult);

//这里是因为我怕记录的MAC大小端问题,这里转了下MAC
for (int i = 0; i < B_ADDR_LEN; i++)
{
Tmpmac[i] = gMobleMac[B_ADDR_LEN-1-i];
}
memcpy(mac+1, Tmpmac, B_ADDR_LEN);
tResult = GAPBondMgr_SetParameter(GAPBOND_ERASE_SINGLEBOND, B_ADDR_LEN + sizeof(uint8_t), mac);
uart_print("2: %02X-%02X-%02X-%02X-%02X-%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
uart_print("erase2: %d", tResult);

两次tResult结果都是0x34(#define bleGAPNotFound                  0x34  //!< No handle / buffer found)

我还试了下将存储MAC类型的mac[0]赋值为0x00(PEER_ADDRTYPE_PUBLIC_OR_PUBLIC_ID)和0x01(PEER_ADDRTYPE_RANDOM_OR_RANDOM_ID)结果依旧是0x34。

而且GAPBondMgr_SetParameter里面不能debug,应该是TI编译成库且去除了符号表

Yolande Wang:

您好,

希望能帮我回答以下两个问题:

您是否成功将实际位于绑定表中的地址传递到 GAPBondMgr_SetParameter() 函数中 ?
只有在不破坏 BLE 连接的方式执行此操作时,才会擦除绑定。这意味着必须首先终止活动连接。

壮壮 说://这里是设置允许连接时删除 bStatus_t tResult = GAPBondMgr_SetParameter(GAPBOND_ERASE_BOND_IN_CONN, sizeof(uint8_t), &u8Flag); uart_print("bong1: %d", tResult);

可以试试终止连接的情况下进行删除绑定操作。

,

壮壮:

Yolande Wang 说:您是否成功将实际位于绑定表中的地址传递到 GAPBondMgr_SetParameter() 函数中 ?

我传入的MAC是再次连接时GAP_LINK_ESTABLISHED_EVENT中的pPkt->devAddr

Yolande Wang 说:只有在不破坏 BLE 连接的方式执行此操作时,才会擦除绑定。这意味着必须首先终止活动连接。

我可以试下断开连接后删除

,

壮壮:

可以成功删除了,但是我有个问题

在建立连接(GAP_LINK_ESTABLISHED_EVENT)MAC类型有如下:

/// Address types used for identifying peer address typetypedef enum{ ADDRTYPE_PUBLIC = 0x00, //!< Public Device Address ADDRTYPE_RANDOM = 0x01, //!< Random Device Address /// Public Identity Address (corresponds to peer's RPA) ADDRTYPE_PUBLIC_ID = 0x02, /// Random (static) Identity Address (corresponds to peer's RPA) ADDRTYPE_RANDOM_ID = 0x03, /// Random Device Address (controller unable to resolve) ADDRTYPE_RANDOM_NR = 0xFE, ADDRTYPE_NONE = 0xFF //!< No address provided} GAP_Addr_Types_t;

但是删除的入参中,mac类型只有如下两种,我该如何将建立连接时的GAP_Addr_Types_t MAC与下面删除GAP_Peer_Addr_Types_t MAC类型对应?

typedef enum{ PEER_ADDRTYPE_PUBLIC_OR_PUBLIC_ID = 0x00, //!< Public or Public ID Address PEER_ADDRTYPE_RANDOM_OR_RANDOM_ID = 0x01 //!< Random or Random ID Address} GAP_Peer_Addr_Types_t;

,

Yolande Wang:

连接的时候如果用的是 ADDRTYPE_PUBLIC 或 ADDRTYPE_PUBLIC_ID ,那删除的时候就应该是 PEER_ADDRTYPE_PUBLIC_OR_PUBLIC_ID 。

同理,使用了 ADDRTYPE_RANDOM 或 ADDRTYPE_RANDOM_ID ,那就删除 PEER_ADDRTYPE_RANDOM_OR_RANDOM_ID。

,

Yolande Wang:

壮壮 说:

1、首先成功配对绑定手机,

2、断开后再次连接,在GAP_LINK_ESTABLISHED_EVENT中记录手机MAC和MAC类型

这里就拿到了绑定时的 mac 类型,ADDRTYPE_PUBLIC_ID(0x02),那么传入的时候应该是 PEER_ADDRTYPE_PUBLIC_OR_PUBLIC_ID(0x00)。

删除的入参是建立时候的参数来决定的。

连接成功之后,可以以 mac 地址位 key ,type 为 value 做一个键值对,删除的时候就拿出这个 mac 地址对应的 type 作为删除的入参。

(把键值对保存在设备端本地,在进行删除操作的时候,拿到了 mac 地址,可以通过地址取到对应的连接参数,就可以用相应的参数去做删除的操作了)

,

壮壮:

typedef enum{ADDRTYPE_PUBLIC = 0x00, //!< Public Device AddressADDRTYPE_RANDOM = 0x01, //!< Random Device Address/// Public Identity Address (corresponds to peer's RPA)ADDRTYPE_PUBLIC_ID = 0x02,/// Random (static) Identity Address (corresponds to peer's RPA)ADDRTYPE_RANDOM_ID = 0x03,/// Random Device Address (controller unable to resolve)ADDRTYPE_RANDOM_NR = 0xFE,ADDRTYPE_NONE = 0xFF //!< No address provided} GAP_Addr_Types_t;

建立时类型包含PUBLIC关键字,删除时就选 PEER_ADDRTYPE_PUBLIC_OR_PUBLIC_ID

包含 Random择选PEER_ADDRTYPE_RANDOM_OR_RANDOM_ID

我这样理解对吧?

,

Yolande Wang:

是的,您的理解是对的。

赞(0)
未经允许不得转载:TI中文支持网 » LAUNCHXL-CC26X2R1: 我找到了GAPBOND_ERASE_SINGLEBOND用法,但是使用依旧失败
分享到: 更多 (0)