我把SimpleBLEPeripheral这个工程烧进去,然后把pairMode 模式设置为GAPBOND_PAIRING_MODE_INITIATE,自己设置了一个密码,用手机去连,但是无论输什么密码都可以进入,是不是系统默认没有进行密码的验证,要自己写,如果自己写的话,那传来的密码又放哪了??
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.
nick,
配对,鉴权,加密,绑定是个系统的过程,空中并不会传来传去密码,这样并不安全。
配对还有其他设定,看一下你代码里面下面的几个参数是怎么设置的:
uint32 passkey = 0; // passkey "000000"
uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;//GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
uint8 mitm = TRUE;
uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
uint8 bonding = TRUE;
hi,Yan
我现在解决了这个问题,发现是static void ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs)这个密码回调函数的问题
static void ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs)
{
uint32 passcode;
uint8 str[7];
// Create random passcode
LL_Rand( ((uint8 *) &passcode), sizeof( uint32 ));
passcode %= 1000000;
// Send passcode response
GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );
}
发现这样是无论手机端输入什么密码,都可以匹配,然后我改成了这样:
static void ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs)
{
uint32 passcode = 123456;
uint8 str[7];
// Create random passcode
//LL_Rand( ((uint8 *) &passcode), sizeof( uint32 ));
//passcode %= 1000000;
// Send passcode response
GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );
}
发现匹配的密码变成了123456,但是这样会有一个很奇怪的现象,就是IOS端会跳出一个匹配框,然后经过3~5S左右,匹配框自己消失了,再经过3S左右,显示匹配失败,最后我删了这个函数,好像正常了,所以我想问一下,这个函数的功能到底是什么?谢谢。
hi,Yan
这个函数是我自己仿照central写的,后来发现这个函数是不需要,所以去掉了。iOS有跳出输入匹配框,但是过一会儿会消失
比如下面的图:
这显示了配对,要求输入密码,我如果不输入密码,保持在这个界面,过了4S以后,配对请求框消失了,变成了这样
这样再保持不动,过一会儿,就变成下面的断开连接
我的参数是这样配置的
uint32 passkey = 564564; // passkey "000000"
uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;
uint8 mitm = TRUE;
uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
uint8 bonding = TRUE;
GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey );
GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );
GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );
GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );
GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );
麻烦帮我解答一下,谢谢。
尼克,
有几个混乱的地方,
uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE; 你主动请求配对
uint8 mitm = TRUE;
uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; 你告诉iPhone 你的设备有显示功能, 这样iPhone就会弹出窗口等着你输入你在你的设备上显示的pin 码,而你的设备实际上根本没显示功能。。。
我建议,你要不改成pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ, 要不改成ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT。
你好!我的设置是这样的
{
uint32_t passkey = 0; // passkey "000000"
uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;//GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
uint8_t mitm = TRUE;
uint8_t ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;
uint8_t bonding = TRUE;
GAPBondMgr_SetParameter(GAPBOND_DEFAULT_PASSCODE, sizeof(uint32_t),
&passkey);
GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);
GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm);
GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding);
}
这样设置之后,就不会进入以下注册的回调函数里面了
VOID GAPBondMgr_Register(&simpleBLEPeripheral_BondMgrCBs);
// GAP Bond Manager Callbacks
static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
{
App_passcodeCB, //NULL, // Passcode callback (not used by application)
App_pairStateCB //NULL // Pairing / Bonding state Callback (not used by application)
};