cc2540 bonding
我用开发板作为peripheral,用手机做central。 连接,bonding 过程中有几个问题。
1)如果peripheral之前没有和手机配对成功过。 在手机端会要求输入 密码 来完成认证。我用下面的CB打印 pairing的信息。
static void peripheralPairStateCB(uint16 connHandle, uint8 state, uint8 status)
{
static uint8 bond_status = 0;
if (state == GAPBOND_PAIRING_STATE_STARTED)
{
ComDbgMsg("bond start\n");
}
else if (state == GAPBOND_PAIRING_STATE_COMPLETE)
{
if (status == SUCCESS)
{
ComDbgMsg("Pairing success\n");
}
else
{
ComDbgMsg("Pairing fail\n");
}
}
else if (state == GAPBOND_PAIRING_STATE_BONDED)
{
if (status == SUCCESS)
{
ComDbgMsg("Bonding success\n");
}
}
}
如果手机输入密码正确:先后打印如下信息: bond start
Pairing success.
并没有打印 bonding success , 请问这是为什么呢?
如果手机输入密码错误: 先后打印如下信息: bond start, Pairing fail。我把Pairing fail的status打出来,是 4
错误码:
#define SMP_PAIRING_FAILED_CONFIRM_VALUE 0x04 //!< The confirm value doesn't match the calculated compare value
这个没有什么问题。
2)当下次再用手机和peripheral连接, 手机不再需要输入密码了, peripheral端打印:bonding success, bond start, Pairing fail。 请问这是怎么回事? 我把Pairing fail时的status打印出来,是8,查了一下错误码:
#define SMP_PAIRING_FAILED_UNSPECIFIED 0x08 //!< Pairing failed due to an unspecified reason
那么,这是什么原因导致的Pairing fail呢? 而且手机实际和peripheral是认证成功了的。
杰克,
这个你要空中抓包看看哈,看看配对过程中发生了什么。
关于这个问题,今天抓包试了一下。
1)当ios没有与peripheral配过对。抓包截图如下。
我peripheral的bond设置为wait for request。当ios连上peripheral并且试图读一个属性值时,就弹出输入密码的对话框。
2)当ios与peripheral配过对,将peripheral上的passcode改变,并且擦除peripheral上的所有bond,重复上面操作,当试图读取属性时,并没有弹出输入密码的对话框。抓包如下。
由图可以看到,ios并没有发起配对的流程,而是将自己之前存下来的ltk信息发给peripheral,而peripheral上的ltk信息已经被我擦除了。因此认证失败。
现在我的问题是:如何能够通过peripheral这边的配置,擦除ios上的bond信息。
谢谢解答!
ios与peripheral配过对,复位或重新上电peripheral,就会出现最下图的情况,感觉是peripheral是保存了绑定信息的,但为什么加密不成功?