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:
是的,您的理解是对的。