新人的问题,请前辈们指点:
我看了simpleperipheral 和 central的例子,他们初始化都是设置的GAPBOND_PAIRING_MODE_WAIT_FOR_REQ等待配对.
那么我的问题是,到底是peripheral发起的配对请求还是central?在什么时候发起的配对请求?
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.
Hi edgar,
好问题!
这样两边其实都没有发起配对.
除非其中一个配置成GAPBOND_PAIRING_MODE_INITIATE, 如果是central的话会发起pairing request, 如果是peripheral的话会发起slave security request, 最终会导致central那端收到 GAP_SLAVE_REQUESTED_SECURITY_EVENT, 这个时候你看代码, 如果central也是出于GAPBOND_PAIRING_MODE_WAIT_FOR_REQ, 那么他还是会发起配对.
所以, 只要其中一个设置成GAPBOND_PAIRING_MODE_INITIATE, 两边就会配对, 如果都是GAPBOND_PAIRING_MODE_WAIT_FOR_REQ, 那么就没有配对过程.
你可以修改其中一个看看哈.
是的, 必须会有密码.
至于是否要手动输入, 根据设备的IO Capability 设置来的. 就是设备的输入输出能力.
你看一下IO Capability的定义.
Hi Yan,
关于绑定我看代码的时候遇到了一些疑问。如下:
例子代码中,每当链接成功事件产生后,会通知绑定管理
// Notify the Bond Manager to the connection
VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, pPkt->connectionHandle, GAP_PROFILE_PERIPHERAL );
这个函数的作用是绑定蓝牙吗?
bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8 *pDevAddr, uint16 connHandle, uint8 role )
{
uint8 idx; // NV Index
uint8 publicAddr[B_ADDR_LEN] // Place to put the public address
= {0, 0, 0, 0, 0, 0};
idx = GAPBondMgr_ResolveAddr( addrType, pDevAddr, publicAddr );
if ( idx < GAP_BONDINGS_MAX )
{
……
}
代码中只有判断 idx < GAP_BONDINGS_MAX ,意思是这个蓝牙地址在绑定列表中?
如果idx > =GAP_BONDINGS_MAX 呢?
我都看蒙了,到底应该如何绑定蓝牙啊?
谢谢!
xie,
GAP_BONDINGS_MAX 是flash 里面允许存储的最多的绑定设备信息的个数.
你不用担心怎么绑定的, 绑定的工作底层自动会把做好的.
你要做的只是在应用层的宏定义里面打开绑定, 设置一下IO capability 就行. 如果你的设备的IO capability 设置成有输入功能, 就会要求输入密码, 如果你是没有输入功能更, 系统会自动产生随机密码.
Yan,
1、当绑定信息个数达到GAP_BONDINGS_MAX的时候,又来了一个要绑定的设备信息,例程是如何处理的?先删除一个最后再添加?还是按FIFO或者其他存储方式呢?谢谢!
2、我试了一下pairing功能,当使能pairing时,主设备和从设备第一次配对的时候使用回调函数会在LCD屏幕上显示pairing start、pairing success的过程;当断开链接,第二次再链接时,屏幕上才会显示Bonds success。不知道为什么第二次链接时才显示 Bonds success。为什么?
3、当pairing success之后,主设备程序不变,把从设备的程序从新下载之后,主设备和从设备都不再执行pairing回调函数了,即LCD不再显示pairing start、pairing success和Bonds success.但是反过来,将主设备的程序从新下载后,从设备程序不变,又能正常执行pairing回调函数,即能在LCD上显示pairing start、pairing success和Bonds success。为什么?
谢谢!
Hi xie,
1. 你可以这样理解, 最多绑定个数理论上, 说的是理论上, 是没有限制的, 无非就是需要一些flash 空间存储些对方设备信息而已. 但是实际中, 你flash 空间毕竟是有限的, 所以只能限定个数. 比如10 个. 如果超出, 代码会去判断前面是否已经有设备 已经解除配对了, 如果有, 就用这个位置存放新的信息. 如果没有, 就不保存了. 实际开发中你可以做个提示, 告诉用户空间已满, 请删除空闲已配对设备, 腾出空间. 你如果仔细想一下的话, 想想手机, 很多手机都是有已配对设备个数限制的(现在的智能手机可能还好点, 空间大, 但肯定也不会放你无限使用), 一旦个数达到极限,肯定会提醒.
2. 不知道你是在哪里加的打印代码?
3. 是因为从设备是 GAPBOND_PAIRING_MODE_WAIT_FOR_REQ 模式吧.
关于默认密码, 请看定义:
// Default passcode
#define DEFAULT_PASSCODE 19655
类似, 密码可以自己设置.
把两边 IO capability 定义都改成如下, 就不需要输入密码, 系统会自动产生密码或者用默认密码, 具体请看一下代码
// Default GAP bonding I/O capabilities
#define DEFAULT_IO_CAPABILITIES GAPBOND_IO_CAP_DISPLAY_ONLY
Hi Yan,
1、关于绑定,我现在开发设计需求是要将绑定信息按FIFO的形式进行存储,即先进先出存储。最大绑定数就按默认10个。但是我看例程代码比较混乱,不知道超过10个时,例程是怎么删除某个绑定信息再存储新的绑定信息的。
2、我是在这里加的打印代码,如下:
simpleBLEcenter例子程序里已经写好了,simpleBLEperipheral程序里回调函数是NULL的,即没有,我自己加上去的。
/*********************************************************************
* @fn pairStateCB
*
* @brief Pairing state callback.
*
* @return none
*/
static void simpleBLECentralPairStateCB( uint16 connHandle, uint8 state, uint8 status )
{
if ( state == GAPBOND_PAIRING_STATE_STARTED )
{
LCD_WRITE_STRING( "Pairing started", HAL_LCD_LINE_4 );
}
else if ( state == GAPBOND_PAIRING_STATE_COMPLETE )
{
if ( status == SUCCESS )
{
LCD_WRITE_STRING( "Pairing success", HAL_LCD_LINE_5 );
}
else
{
LCD_WRITE_STRING_VALUE( "Pairing fail", status, 10, HAL_LCD_LINE_5 );
}
}
else if ( state == GAPBOND_PAIRING_STATE_BONDED )
{
if ( status == SUCCESS )
{
LCD_WRITE_STRING( "Bonding success", HAL_LCD_LINE_6 );
}
}
}
3、我主设备和从设备都设成 uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;还是会出现这种情况。即主设备不变,从设备从新烧写程序后,不再配对绑定。
4、关于密码:我们现在的需求是要有一个默认密码(我们自定的密码),但是需要对方发送,这样做的目的是为了屏蔽没有正确密码的用户(设备)进行连接。但是我们的设备没有输入密码的数字按键。我们设想:每次配对时,对方主动互相发送默认密码。现在我找不到输入密码的接口函数,密码是如何发送给对方,让对方比对密码的?
谢谢!
Hi Yan,
最近一下子问你那么多问题,真的很抱歉,辛苦了!
我看到例子代码中,当认证事件发生后,会执行一个绑定添加函数。如下
static uint8 gapBondMgrAddBond( gapBondRec_t *pBondRec,
gapBondLTK_t *pLocalLTK, gapBondLTK_t *pDevLTK,
uint8 *pIRK, uint8 *pSRK, uint32 signCounter )
{
uint8 idx;
if ( pBondRec == NULL )
{
return ( GAP_BONDINGS_MAX );
}
// First see if we already have an existing bond for this device
idx = gapBondMgrFindAddr( pBondRec->publicAddr );
if ( idx >= GAP_BONDINGS_MAX )
{
idx = gapBondMgrFindEmpty();
}
if ( idx < GAP_BONDINGS_MAX )
{
……//添加设备信息
}
上面函数中有一句: if ( idx >= GAP_BONDINGS_MAX )
{
idx = gapBondMgrFindEmpty();
}
应该是发现一个空绑定位置,按程序的意思,一定可以发现一个空的位置一样?这是为什么?
Hi,xie
关于密码的问题应该怎么配置才能使主从方使用从机定义的默认密码,比如与我在从设备设置 uint32 passkey = 123456; // passkey "000000",那需要怎么设置主从机配对时会使用这个密码?
谢谢!
Yan
1.不管有没有配对,主机和从机都可以进行连接是吧?配对只是记录的一种状态,如果想要实现配对以后才能传输数据就只能根据那个状态来写程序是吗?不能像手机之间的蓝牙那样通过验证以后才能连接吗?
2.我把从机的pairMode 改成 GAPBOND_PAIRING_MODE_INITIATE用BTOOL看的时候是有显示GAP_SlaveRequestedSecurity但是对于BTOOL来说是不是只能自己发送配对请求以后才能输入密码,像这样从机要求配对,密码输不进去是吧
3.从机没有输入也没有输出能力的时候设置ioCap =GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT,那么密钥是自己设置的固定的passkey,主机输入这个passkey以后完成验证,还是底层随机生成passkey呢?