前言:
前篇博客对配对绑定的流程原理进行了讲解:BLE配对与绑定一(原理)
接下来进行针对CH582芯片的加密操作、手机连接Peripherl、Central连接Peripherl进行讲解。
一、手机连接Peripheral加密处理
用户为了安全一般会在蓝牙连接的时候进行加密的处理,毕竟谁也不希望自己与别人交流的内容被广而告之,谁都可以获取到。这个时候加密的用处就体现出来了。例如,我们在使用手机连接蓝牙耳机时只需要开启配对功能,手机就可以配对绑定。但是有些设备具有保密性,不能谁来连接都可以成功,因此我们会进行设置密码,当主机想要连接时必须输入密码方可建立连接,否则无法与该从机成功建立连接。
使用手机连接Peripheral时,Peripheral需要如下修改:
// Setup the GAP Bond Manager
{
uint32_t passkey = 234234; // passkey "000000"
uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;
uint8_t mitm = TRUE;
uint8_t bonding = 0;
uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
GAPBondMgr_SetParameter(GAPBOND_PERI_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey);
GAPBondMgr_SetParameter(GAPBOND_PERI_PAIRING_MODE, sizeof(uint8_t), &pairMode);
GAPBondMgr_SetParameter(GAPBOND_PERI_MITM_PROTECTION, sizeof(uint8_t), &mitm);
GAPBondMgr_SetParameter(GAPBOND_PERI_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
GAPBondMgr_SetParameter(GAPBOND_PERI_BONDING_ENABLED, sizeof(uint8_t), &bonding);
}
如上修改可实现后,手机建立连接时一定会弹出配对框提供输入密码,输入不正确则无法连接。
- 参数的pairmode是默认发起配对请求或从属安全请求;
- bonding填写为0的含义是在本次建立连接后,下一次仍然需要配对绑定的操作;
- ioCap填写参数的含义是仅显示设备,接下来使用Central与Peripheral建立连接时,Central的参数填写需要与Peripheral不一样,会在第二点进行说明。
笔者建议在Peripheral的例程添加一个回调函数,先修改如下:
static gapBondCBs_t Peripheral_BondMgrCBs = {
NULL, // Passcode callback (not used by application)
peripheralPairStateCB // Pairing / Bonding state Callback (not used by application)
}
然后添加对应的回调函数:
static void peripheralPairStateCB(uint16_t connHandle, uint8_t state, uint8_t status)
{
if(state == GAPBOND_PAIRING_STATE_STARTED)
{
PRINT("Pairing started:%d\n", status);
}
else if(state == GAPBOND_PAIRING_STATE_COMPLETE)
{
if(status == SUCCESS)
{
PRINT("Pairing success\n");
}
else
{
PRINT("Pairing fail\n");
}
}
else if(state == GAPBOND_PAIRING_STATE_BONDED)
{
if(status == SUCCESS)
{
PRINT("Bonding success\n");
}
}
else if(state == GAPBOND_PAIRING_STATE_BOND_SAVED)
{
if(status == SUCCESS)
{
PRINT("Bond save success\n");
}
else
{
PRINT("Bond save failed: %d\n", status);
}
}
}
这里添加后,手机APP在与Peripheral连接后,会根据相应的配对输入执行不同的操作,通过peripheral的日志可以更直观的观察。
如我们正确建立连接,日志如下:
如输入密码错误,日志如下:
在输出Pairing fail后我们可以调用函数立马断开连接:GAPRole_TerminateLink(peripheralConnList.connHandle),否则需要再稍等一会才会断开连接,这是提供一个技巧,具体是否操作取决于实际的需求。
二、Central连接Peripheral需要Passkey
主机端需要做如下修改:
// Setup the GAP Bond Manager
{
uint32_t passkey = 234234;
uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;
uint8_t mitm = 1;
uint8_t ioCap = GAPBOND_IO_CAP_KEYBOARD_ONLY;
uint8_t bonding = 0;
GAPBondMgr_SetParameter(GAPBOND_CENT_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey);
GAPBondMgr_SetParameter(GAPBOND_CENT_PAIRING_MODE, sizeof(uint8_t), &pairMode);
GAPBondMgr_SetParameter(GAPBOND_CENT_MITM_PROTECTION, sizeof(uint8_t), &mitm);
GAPBondMgr_SetParameter(GAPBOND_CENT_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
GAPBondMgr_SetParameter(GAPBOND_CENT_BONDING_ENABLED, sizeof(uint8_t), &bonding);
}
主机的ioCap需要设置为跟从机的不一样,如从机设置的是Display Only Device,则主机设置为Keyboard Only。如果两边都设置只支持Display或Keyboard,则主从连接会直接通过,因此需要主从两端设置不一样,见协议讲解:
主从设置好后且密码正确则可以正确建立连接,主机日志如下:
测试将Central和Peripheral的密码修改不一样,发现无法连接,日志如下:
三、附录
主从连接的源程序可参考
注意:
- 使用CH58x的HID_Keyboard进行配对绑定时,需要将KBD的广播包修改为非键盘的设备类型(LO_UINT16(GAP_APPEARE_HID_KEYBOARD))。因为正常使用时,键盘是一个可输入设备,具备输入密码的能力;但是在烧录程序在开发板上无输入能力,所以无法进行键值输入,导致流程出问题。