BLE配对与绑定二(连接)

BLE配对与绑定二(连接)

前言:

用户为了安全一般会在蓝牙连接的时候进行加密的处理,毕竟谁也不希望自己与别人交流的内容被广而告之,谁都可以获取到。这个时候加密的用处就体现出来了。例如,我们在使用手机连接蓝牙耳机时只需要开启配对功能,手机就可以配对绑定。但是有些设备具有保密性,不能谁来连接都可以成功,因此我们会进行设置密码,当主机想要连接时必须输入密码方可建立连接,否则无法与该从机成功建立连接。

前篇博客对配对绑定的流程原理进行了讲解: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;//wait是等待对方发起SM,init是主动发起。HID的demo需要配置为wait等待对方发起。建议等待主机发起。

//有些主机用的APP,是没有主动发起的接口的,这是跟APP有关。

uint8_t mitm = TRUE;

uint8_t bonding = 1;

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 = {

peripheralPasscodeCB, // Passcode callback (not used by application)

peripheralPairStateCB // Pairing / Bonding state Callback (not used by application)

};

然后添加对应的回调函数:

static void peripheralPasscodeCB(uint8_t *deviceAddr, uint16_t connectionHandle,

uint8_t uiInputs, uint8_t uiOutputs)

{

uint32_t passcode;

// Create random passcode

passcode = tmos_rand();

passcode %= 1000000;

//passcode = 234234; //指定固定密码

// Display passcode to user

if(uiOutputs != 0)

{

PRINT("Passcode:%06d\n", (int)passcode);

}

// Send passcode response

GAPBondMgr_PasscodeRsp(connectionHandle, SUCCESS, passcode);

}

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

}

}

}

在输出Pairing fail后我们可以调用函数立马断开连接:GAPRole_TerminateLink(peripheralConnList.connHandle),否则需要再稍等一会才会断开连接。也可以不进行断开,表现的现象就是pairing fail,但是可以建立连接和数据收发。

注意:添加peripheralPasscodeCB回调函数之后,手机弹框输入的密码会出现变化,不再已初始化的密码为准。变化的密码会在手机弹出输入密码框之前打印出来,输入即可正确连接,如下图。

如果需要固定密码,则可以在peripheralPasscodeCB回调函数中指定固定密码。这样每次连接输入固定的密码即可。

二、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,则主从连接会直接通过,因此需要主从两端设置不一样,见协议讲解:

主从设置peripheralPasscodeCB回调函数之后,需要输入密码(不是初始化的密码),如不正确则无法成功配对。

central在输入密码的回调函数中输入密钥。注意:报错0x05,说明密码输入错误。

central例程的centralPasscodeCB回调需要配置为固定的passcode。

三、总结

添加密码配对功能建议先将回调函数填写完整,peripheral的配对回调直接参考central函数。

添加成功后,可以根据需求选择固定密码或者随机密码(默认例程的密码是随机的)。

一般peripheral配置为GAPBOND_IO_CAP_DISPLAY_ONLY,central配置为GAPBOND_IO_CAP_KEYBOARD_ONLY。CH9141的密码功能类似。

四、附录

Central与Peripheral的主从连接源程序可参考

注意:

使用CH58x的HID_Keyboard进行配对绑定时,需要将KBD的广播包修改为非键盘的设备类型(LO_UINT16(GAP_APPEARE_HID_KEYBOARD))。因为正常使用时,键盘是一个可输入设备,具备输入密码的能力;但是在烧录程序在开发板上无输入能力,所以无法进行键值输入,导致流程出问题。

使用加密操作时,建议配置为等待主机发起SM,一般不建议从机主动发起。即使用GAPBOND_PAIRING_MODE_WAIT_FOR_REQ参数。否则有些手机不认从机发起的SM操作,还会打乱手机发起的时序,例如造成手机处于“正在连接”状态无法退出。且如果配置为从机主动发起,跟苹果手机连接时,从机不会进入密码回调。

相关推荐

Twistzz谈为何加入Liquid、及他“一直想打的角色”
bt365注册

Twistzz谈为何加入Liquid、及他“一直想打的角色”

06-28 👁️‍🗨️ 8385
哪个网站买黄金项链比较好
365彩票app下载苹果版

哪个网站买黄金项链比较好

06-27 👁️‍🗨️ 5969
如何用韩语写你好 ▷➡️
线上365bet正网

如何用韩语写你好 ▷➡️

08-25 👁️‍🗨️ 3597
巨颏虎演化研究取得新进展
线上365bet正网

巨颏虎演化研究取得新进展

08-12 👁️‍🗨️ 5383
AI语音包制作指南:轻松打造个性化声音内容
线上365bet正网

AI语音包制作指南:轻松打造个性化声音内容

08-26 👁️‍🗨️ 5467
【观察】中国男篮首秀惨败42分意味着什么?
365彩票app下载苹果版

【观察】中国男篮首秀惨败42分意味着什么?

07-28 👁️‍🗨️ 3658
qq如何定时发表说说?
365彩票app下载苹果版

qq如何定时发表说说?

07-09 👁️‍🗨️ 6641
微信为什么总是要修复(微信频繁修复背后的原因解析,技术迭代与用户需求的碰撞)
英国电源类型及插头标准,如何选择适合自己的电源插头?
365彩票app下载苹果版

英国电源类型及插头标准,如何选择适合自己的电源插头?

08-28 👁️‍🗨️ 6329