BLE CC254X 主从机连接过程疑惑
最近,在学校BLE 工程文件 SimpleBLEPeripheral.ewp
有几个问题:
1)连接
主从机连接过程
一个典型的低功耗蓝牙系统同时包含外设和核心(主机),两者的连接过程如下:
外设角色向外发送自己的信息(设备地址、名字等),主机收到外设广播信息后,发送扫描请求(scanrequest)给外设,外设响应主机的请求,连接建立完成。
问题:
连接完成的标志是什么?工程中的代码在哪里体现?外设相应主机的请求,相应的代码在哪里?整个的连接过程是怎样的,比较模糊,代码找了半天没看到?
2)加密处理
利用配对实现,利用密匙来加密授权连接。典型的过程是:外设向主机请求口令一个(passkey)以便进行配对,待主机发送了正确的口令之后,连接通信通过主从机互换密码来校验。
问题:关于 外设向主机请求口令一个(passkey)以便进行配对,相应的代码段在哪里体现? 谢谢!
1: 搜索GAPROLE_CONNECTED事件。
peripheralStateNotificationCB()函数处理各种状态变化。
最开始是simpleBLEPeripheral_HandleKeys() 处理按键操作启动广告。
2:配对操作是由如下回调函数来处理的,由于默认都是NULL,所以请求的密码是000000
static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
{
NULL, // Passcode callback (not used by application)
NULL // Pairing / Bonding state Callback (not used by application)
};
配对鉴权操作是在Gapbondmgr.c中处理的,可以仔细看看
GAPBondMgr_ProcessGAPMsg()的处理
谢谢 TY!
请确认。新的问题可以重新发布
dear TY,
你好!关于添加密码
static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
{
NULL, // Passcode callback (not used by application)
NULL // Pairing / Bonding state Callback (not used by application)
};
有没有参考代码提供?还有就是有哪些要注意的地方?
谢谢@
可以借鉴simplecentral工程 的例子,有passcode callback的处理。
static void simpleBLECentralPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle,
uint8 uiInputs, uint8 uiOutputs )
{
#if (HAL_LCD == TRUE)
uint32 passcode;
uint8 str[7];
// Create random passcode
LL_Rand( ((uint8 *) &passcode), sizeof( uint32 ));
passcode %= 1000000;
// Display passcode to user
if ( uiOutputs != 0 )
{
LCD_WRITE_STRING( "Passcode:", HAL_LCD_LINE_1 );
LCD_WRITE_STRING( (char *) _ltoa(passcode, str, 10), HAL_LCD_LINE_2 );
}
// Send passcode response
GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );
#endif
}
TY,
你好!
simpleBLECentralPasscodeCB( uint8 *deviceAddr, uint16 connectionHandle,
uint8 uiInputs, uint8 uiOutputs );
这个函数是 Central 工程中的吧!BLE作为Central时,发送用函数!
而做为Peripheral的BLE应该是,申请Passcode才对吧?这个函数应该在Peripheral时不能用吧?
我不知道,我的理解对不对?请赐教!
再次谢谢TY的热心帮助!
关于Passcode callback ,simplecentral工程 的例子好像没有提到?
输入输出能力描述非常重要,哪一方显示Passkey,哪一方输入Passkey,由这个选项决定。举几个具体的例子(要求鉴权的情况下)。(1)如果A具备输入能力,B具备输出能力,则B显示Passkey,A输入Passkey。反之亦然。(2)如果A不具备输入输出能力,B也不具备输入输出能力,即使要求鉴权,也将采用Justwork的方式完成配对。3)如果A,B都具备输入输出能力,发起配对请求的一方显示Passkey,另一方输入Passkey。(4)如果双方不满足一端支持输入,一端支持输出,则采用Justwork的方式进行配对。
TY,
如果是连接的时候,想加密码呢? 比如说,central 申请连接外设A,外设A能否要求她发送连接密码,如果连接密码错误,不能连接?
如果可以,那么外设A的代码应该怎么修改呢?
谢谢
这是密码生成函数,如果主机是手机 可以输入可以显示,外设是2540 可以显示 那么这个函数是不是移植到外设工程里
// GAP Bond Manager Callbacks
static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
{
simpleBLECentralPasscodeCB, // Passcode callback (not used by application) 密码回调
NULL // Pairing / Bonding state Callback (not used by application) 绑定 配对 回调
};
是不是这样写? 为何还是在链接过程中外设并没有打印出要配对的密码 配对过程还是不需要密码来协助?
我就是想要一个 能够提供密码的例程和讲解,请IT 员工们回答问题的时候捉重点 ,不要一个回答一点,一个回答一点,
最终还是让读者很难看懂,谢谢!
这也是我的问题,请问您解决了吗,非常重要的一个问题,网上根本搜不到关于这个问题的教程。
请问如果是这种情况,我的设备作为从机要求鉴权(要求主机必须输入我的显示的PASSCODE才能完成配对连接),主机只要配为无输入输出不就可以绕过我的鉴权要求呢? 如果实现这样的功能呢?
学习。
你好:
我是用CC2541裸板进行开发,将handle-key的程序移植到process-cb的GAP_DEVICE_INFO_EVENT事件里,就是无法建立establish-link。我的establish函数建立的条件是:
if( simpleBLEState != BLE_STATE_IDLE )
{ if(simpleBLEScanRes > 0)
{ peerAddr=bdAddr2Str(pEvent->deviceInfo.addr); addrType=pEvent->deviceInfo.addrType; //simpleBLEState = BLE_STATE_CONNECTING;
if (*peerAddr== *NanningGuard) {
GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE, DEFAULT_LINK_WHITE_LIST, addrType, peerAddr );
我想知道,为什么无法建立link,还有,那个simpleBLEState = BLE_STATE_CONNECTING; 是什么意思!
这个应该可以通过配置MITM来实现。MITM要求双方只少有一端具有输入能力,CC2540作为从机没有输入能力,但是启用MITM机制,则会要求对方有输入能力,此时如果想通过将主机设备定为无输入无输出来绕过鉴权,配对应该会失败