主题中讨论的其他器件:SysConfig、
工具与软件:
您好!
我有一个 BLE 外围设备、它将与给定的中央设备配对。 与给定的中央设备配对后、它应拒绝来自任何其他中央设备的连接请求。
当中央设备发送连接请求时、我想查看哪个设备正在发送连接请求。 如果是配对设备以外的其他设备、我将拒绝来自外围设备的连接进程。 请帮助我、因为我无法找到任何相关的方法。
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.
工具与软件:
您好!
我有一个 BLE 外围设备、它将与给定的中央设备配对。 与给定的中央设备配对后、它应拒绝来自任何其他中央设备的连接请求。
当中央设备发送连接请求时、我想查看哪个设备正在发送连接请求。 如果是配对设备以外的其他设备、我将拒绝来自外围设备的连接进程。 请帮助我、因为我无法找到任何相关的方法。
您好、Satakshi、
感谢您的咨询。 我建议查看用户指南的这一部分: 隐私和过滤器接受列表。 因此、以下内容可能会有所帮助:
希望这对您有所帮助。
David。
尊敬的 David:
我的用例略有不同。 首次、外设将接受来自任何中央设备的扫描和连接请求、因此我使用"处理来自所有设备的请求"。 一旦它与给定的中心设备配对、则从下一次开始、它将仅连接到该中心设备、而不连接到任何其他设备、因此我将 仅使用 WL 中设备的处理请求。 那么、如何实现它。 我第一次不知道对等设备的地址。 配对后我才会知道。 配对后、如何获取中央设备的地址、并确保下次仅连接到该地址并拒绝来自任何其他中央设备的连接请求?
您好、Satakshi、
感谢您的澄清! 您可以首先 将过滤器策略设置为 SysConfig 广播参数中的"处理来自所有器件的请求"。 这将允许外设连接到任何中央器件。
要识别中央设备的地址并将其添加到 AL (接受列表)、请转至位于应用文件夹内的 app_connection.c 文件、然后将注意力定向到 Connection_Conn 处理程序函数。 在该函数内部、您将注意到、添加连接后、此示例会自动提取器件的地址。 您只需执行以下操作:
HCI_LE_ClearAcceptListCmd(""); //Ensure the accept list is clear HCI_LE_AddAcceptListCmd (gapEstMsg->devAddrType, gapEstMsg->devAddr); //Add a accept list entry
现在您已经将设备地址添加到接受列表、您只需重新配置广播设置、以便只能连接到该中央设备。 为此、需要暂时停止广播。 这可以使用 BLEAppUtil_advStop (peripheralAdvHandle_1)函数来实现。 广播停止后、您现在可以使用以下代码片段更改广播参数:
uint8_t advPolicy = GAP_ADV_AL_POLICY_AL_ALL_REQ; GapAdv_setParam(peripheralAdvHandle_1, GAP_ADV_PARAM_FITLER_POLICY, &advPolicy);
您可以 在以下位置找到筛选器策略的完整列表: https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/7.40.00.64/exports/docs/ble5stack/ble_user_guide/doxygen/ble/html/group___gap_adv___constants.html#gab808d7d2d87b7ca5f358959986f85112
更改参数后、您现在可以重新启动广播:
status = BLEAppUtil_advStart(peripheralAdvHandle_1, &advSetStartParamsSet_1)
此致、
Tarek
尊敬的 David:
目前我尚未实施配对、但无论您上面建议的任何方法、我都只实施了正常连接(无配对或绑定)。 所以、我的外设首次连接到所有设备。 但在我连接到给定的中央设备后、它会存储该中央设备的设备地址。 但是下次、当中央设备发送连接请求时、我看不到任何通过日志在外设上建立的链路、但中央设备显示已连接的设备、但几秒钟后断开连接状态、如所示 0x3E。 我还使用 TI CC2340R5作为中央器件。
外设的代码:
void Peripheral_GAPConnEventHandler (UINT32事件、BLEAppUtil_msgHdr_t * pMsgData)
{
开关(事件)
{
案例 BLEAPPUTIL_LINK_ESTABED_EVENT:
{
if (firsttime == 0){
static volatile char status = 0xff;
静态易失性 gapEstLinkReqEvent_t * gapEstMsg = NULL;
gapEstMsg =(gapEstLinkReqEvent_t*) pMsgData;
HCI_LE_ClearAcceptListCmd ("");//确保接受列表已清除
STATUS = HCI_LE_AddAcceptListCmd (gapEstMsg->devAddrType、
gapEstMsg->devAddr);//添加接受列表条目
log_printf (LogModule0、Log_info、"%d"、status);
}
log_message (log_info、"device is connected");
休息;
}
案例 BLEAPPUTIL_LINK_ENTERD_EVENT:
{
gapTerminateLinkEvent_t * Term =(gapTerminateLinkEvent_t *) pMsgData;
if (firsttime==0){
BLEAppUtil_advStop (peripheralAdvHandle_1);
uint8_t advPolicy = GAP_ADV_AL_AL_POLICY_AL_AL_AL_ALL_REQ;
GapAdv_setParam (peripheralAdvHandle_1、GAP_ADV_PARAM_FILTER_POLICY、
&advPolicy);
First time = 1;
}
log_printf (LogModule0、Log_error、"disconn reason:%d"、term->reason);
HCI_LE_ReadAcceptListSizeCmd();
BLEAppUtil_advStart (peripheralAdvHandle_1、&advSetStartParamsSet_1);
休息;
}
默认值:
{
休息;
}
}
}
我的中心设备的代码:
案例 BLEAPPUTIL_LINK_ESTABED_EVENT:
{
gapEstLinkReqEvent_t * gapEstMsg =(gapEstLinkReqEvent_t *) pMsgData;
//将连接添加到已连接设备列表
connection_addConnInfo (gapEstMsg->connectionHandle、gapEstMsg->devAddr);
/*! 打印对等地址和连接句柄编号*/
MenuModule_printf (APP_MENU_CONN_EVENT、0、"Conn status:established -"
"已连接到" menu_module_color_yellow "%s" menu_module_color_reset
"connectionHandle =" menu_module_color_yellow "%d" menu_module_color_reset、
BLEAppUtil_convertBdAddr2Str (gapEstMsg->devAddr)、gapEstMsg->connectionHandle);
/*! 打印当前连接数*/
MenuModule_printf (APP_MENU_NUM_CONNS、0、"Connections number:"
menu_module_color_yellow "%d" menu_module_color_reset、
LinkDB_NumActive();
log_printf (频繁 Module_App 1、Log_info、"dev connected");
休息;
}
案例 BLEAPPUTIL_LINK_ENTERD_EVENT:
{
gapTerminateLinkEvent_t * gapTermMsg =(gapTerminateLinkEvent_t *) pMsgData;
//从连接设备列表中删除连接
connection_remoteConnInfo (gapTermMsg->connectionHandle);
/*! 打印对等地址和连接句柄编号*/
MenuModule_printf (APP_MENU_CONN_EVENT、0、"Conn 状态:已终止-"
"connectionHandle =" menu_module_color_yellow "%d" menu_module_color_reset
"原因=" menu_module_color_yellow "%d" menu_module_color_reset、
gapTermMsg->connectionHandle、gapTermMsg->Reason);
/*! 打印当前连接数*/
MenuModule_printf (APP_MENU_NUM_CONNS、0、"Connections number:"
menu_module_color_yellow "%d" menu_module_color_reset、
LinkDB_NumActive();
log_printf (7800 Module_App 1、Log_info、"dev disconnected:%x"、gapTermMsg->Reason);
休息;
}
但是、如果我将筛选器策略用作 GAP_ADV_AL_POLICY_AL_AL_SCAN_REQ、 然后没有发生断开连接、我的外设仍然连接到中央设备。 但我希望我的外设从第二次开始仅从 AL 设备进行扫描和连接。
请帮助我找出出错了吗?
在 SysConfig 中、过滤器策略设置为处理来自所有设备的请求。 仅在首次连接后、我将更改筛选器策略以仅处理来自 AL 的请求。
此外、您能否强调定向广告和筛选政策"仅从 AL 的设备扫描和连接"之间的差异?
尊敬的 Satakshi:
0x3E 错误是一种 "无法建立"错误、如果主器件在发送连接请求后的前6个连接事件内无法从从器件接收数据包、则会发生这种错误。 我们在最后模拟了该项目、它成功了。 以下是我们所做的更改:
设备正在连接但未连接 配对、 因此、设备地址未添加到接受列表。 要解决此问题、请使用手机并使用 SimpleLink 应用连接到器件、然后您只需阅读特征5、其中提示器件与 LaunchPad 配对。 另一种方法是编辑外设的 SysConfig 文件。 如下面的屏幕截图所示、您可以将"Pairing Mode"参数更改为"Initiate a pairing request"、在连接后将设备配对、并检查 David 之前提到的"Sync Acceptlist with Bonded Devices"选项。 您还可以取消选中 MITM protection 以绕过身份验证检查。 在断开外设连接之前、确保外设显示"Bond Saved"(已保存绑定)。
2-为了模拟此提示、我们将对 pairing_pairStateHandler 函数中的 app_pairing.c 文件 所做的更改添加到 BLEAPPUTIL_pairing_State_complete 中。 我在下面附加了一个代码片段。 请确保通过写入:extern uint8 peripheralAdvHandle_1来将外设广播处理程序配置为外部。
// The pairing is completed, so update the entry in connection list // to the ID address instead of the RP address linkDBInfo_t linkInfo; // Get the list of connected devices App_connInfo* connList = Connection_getConnList(); uint8_t advPolicy = GAP_ADV_AL_POLICY_AL_ALL_REQ; GapAdv_setParam(peripheralAdvHandle_1, GAP_ADV_PARAM_FILTER_POLICY, &advPolicy);
您好!
目前我不想实施配对。 我只想通过正常连接进行白名单检查。 但我无法做到。
这是用于我的外设的代码:
void Peripheral_GAPConnEventHandler (UINT32事件、BLEAppUtil_msgHdr_t * pMsgData)
{
开关(事件)
{
案例 BLEAPPUTIL_LINK_ESTABED_EVENT:
{
if (firsttime == 0){
static volatile char status = 0xff;
静态易失性 gapEstLinkReqEvent_t * gapEstMsg = NULL;
gapEstMsg =(gapEstLinkReqEvent_t*) pMsgData;
HCI_LE_ClearAcceptListCmd ("");//确保接受列表已清除
STATUS = HCI_LE_AddAcceptListCmd (gapEstMsg->devAddrType、
gapEstMsg->devAddr);//添加接受列表条目
log_printf (LogModule0、Log_info、"%d"、status);
}
log_message (log_info、"device is connected");
休息;
}
案例 BLEAPPUTIL_LINK_ENTERD_EVENT:
{
gapTerminateLinkEvent_t * Term =(gapTerminateLinkEvent_t *) pMsgData;
if (firsttime==0){
BLEAppUtil_advStop (peripheralAdvHandle_1);
uint8_t advPolicy = GAP_ADV_AL_AL_POLICY_AL_AL_AL_ALL_REQ;
GapAdv_setParam (peripheralAdvHandle_1、GAP_ADV_PARAM_FILTER_POLICY、
&advPolicy);
First time = 1;
}
log_printf (LogModule0、Log_error、"disconn reason:%d"、term->reason);
HCI_LE_ReadAcceptListSizeCmd();
BLEAppUtil_advStart (peripheralAdvHandle_1、&advSetStartParamsSet_1);
休息;
}
默认值:
{
休息;
}
}
}
首先、外设可以连接到任何器件、因为我已将过滤器策略设置为对任何器件的处理请求。
根据 David 的建议、我实施了上述代码。 所以、当我第一次能够连接到指定的中央设备时、我还可以将 MAC ID 存储在 AL 中。 下一次、它不会连接到指定的中心。 问题可能是什么? 这种白名单需要配对来强制实施或如何实施?
当我修改代码中的筛选器策略时、我是否必须使用白名单中心的 MAC ID 修改我的广告参数、或者该怎么办? 请帮帮我
你(们)好
它已取消选中。 请分享具体操作步骤。 我不知道。
在 SysConfig 中、我已禁用配对。 所有其他参数仅为默认参数。 过滤器策略设置为处理来自所有设备的请求、然后我将运行给定的代码。
void Peripheral_GAPConnEventHandler (UINT32事件、BLEAppUtil_msgHdr_t * pMsgData)
{
开关(事件)
{
案例 BLEAPPUTIL_LINK_ESTABED_EVENT:
{
if (firsttime == 0){
static volatile char status = 0xff;
静态易失性 gapEstLinkReqEvent_t * gapEstMsg = NULL;
gapEstMsg =(gapEstLinkReqEvent_t*) pMsgData;
HCI_LE_ClearAcceptListCmd ("");//确保接受列表已清除
STATUS = HCI_LE_AddAcceptListCmd (gapEstMsg->devAddrType、
gapEstMsg->devAddr);//添加接受列表条目
log_printf (LogModule0、Log_info、"%d"、status);
}
log_message (log_info、"device is connected");
休息;
}
案例 BLEAPPUTIL_LINK_ENTERD_EVENT:
{
gapTerminateLinkEvent_t * Term =(gapTerminateLinkEvent_t *) pMsgData;
if (firsttime==0){
BLEAppUtil_advStop (peripheralAdvHandle_1);
uint8_t advPolicy = GAP_ADV_AL_AL_POLICY_AL_AL_AL_ALL_REQ;
GapAdv_setParam (peripheralAdvHandle_1、GAP_ADV_PARAM_FILTER_POLICY、
&advPolicy);
First time = 1;
}
log_printf (LogModule0、Log_error、"disconn reason:%d"、term->reason);
HCI_LE_ReadAcceptListSizeCmd();
BLEAppUtil_advStart (peripheralAdvHandle_1、&advSetStartParamsSet_1);
休息;
}
默认值:
{
休息;
}
}
}
此筛选器策略是否仅在我进行配对时才起作用? 您能帮助我了解这些信息吗
尊敬的 Tarek:
它现在正常工作。
由于我不是使用配对、因此我用粗体注释下面一行。 通过对 gapBondParams 调用进行注释、可以看出它不起作用。 如果我对它取消注释、那么它可以正常工作、
BLE4.12.4510Params_t Util_Peri appMainPeriCentParams =
{
#if defined ( HOST_CONFIG )&&( HOST_CONFIG &( PERIPHERAL_CFG ))
.connParamUpdateDecision = DEFAULT_PARAM_UPDATE_REQ_DECISION
#endif
//.gapBondParams =&gapBondParams
};
您能否解释一下 接受列表筛选器策略是否偶然使用了 gapBondParams 结构中的任何参数? 因此、当我对它进行注释时、它是无效的、而当我对它取消注释时、它可以正常工作
基本上、我想知道初始化的重要性 .gapBondParams =&gapBondParams 甚至在我不使用配对时?