This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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编译成库且去除了符号表

  • 您好,

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

    1. 您是否成功将实际位于绑定表中的地址传递到 GAPBondMgr_SetParameter() 函数中 ?
    2. 只有在不破坏 BLE 连接的方式执行此操作时,才会擦除绑定。这意味着必须首先终止活动连接。
    //这里是设置允许连接时删除
    bStatus_t tResult = GAPBondMgr_SetParameter(GAPBOND_ERASE_BOND_IN_CONN, sizeof(uint8_t), &u8Flag);
    uart_print("bong1: %d", tResult);

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

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

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

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

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

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

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

    /// Address types used for identifying peer address type
    typedef 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;

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

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

  • 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 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;

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

    包含 Random择选PEER_ADDRTYPE_RANDOM_OR_RANDOM_ID

    我这样理解对吧?

  • 是的,您的理解是对的。