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.

[参考译文] CC3220S-LAUNCHXL:STA 模式自动重新连接

Guru**** 2577385 points
Other Parts Discussed in Thread: CC3200

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/731447/cc3220s-launchxl-sta-mode-automatic-re-connect

器件型号:CC3220S-LAUNCHXL
Thread 中讨论的其他器件:CC3200

尊敬的论坛:

我的器件以 STA 模式运行、并且已成功连接到网络。 路由器突然关闭、然后在一段时间后重新打开。 在关闭期间、cc3220断开连接、当路由器恢复到 cc3220时、不会自动重新连接。 有哪些方法使 cc3220尝试自动重新连接到路由器?

我尝试在 SimpleLinkWlanEventHandler 函数中输入以下代码:

void SimpleLinkWlanEventHandler (slWlanEvent_t *参数)
{
_i16状态;

switch (pargs->ID){
案例 SL_WLAN_EVENT_CONNECT:
deviceConnected = true;
中断;

案例 SL_WLAN_EVENT_DISCONNECT:
deviceConnected = false;
UART_PRINT ("[SimpleLinkWlanEventHandler] WLAN 已断开连接!!!\n\n");

//检查是否有任何存储的配置文件,如果没有存储的配置文件,则切换到 AP 模式,但如果有存储的配置文件,则尝试定期重新连接
status = checkProfiles();
如果(状态< 0)
{
status = setAPmode();
UART_PRINT ("[SimpleLinkWlanEventHandler]设置 AP 模式状态为%d\n\r\n、状态);
}
否则(状态>=0)
while (deviceConnected!= true)
{

//设置自动连接策略
状态= sl_WlanPolicySet (sl_WLAN_policy_connection、sl_WLAN_connection_policy (1、0、0、0)、 空,0);
如果(状态< 0){
UART_PRINT ("[SimpleLinkWlanEventHandler]错误%d 无法将连接策略设置为自动连接\n\r\n、状态);
while (1);
}

//启用 DHCP 客户端
状态= sl_NetCfgSet (sl_netcfg_IPv4_STA_ADDR_MODE、sl_netcfg_ADDR_DHCP、0、0);
如果(状态< 0){
UART_PRINT ("[SimpleLinkWlanEventHandler]错误%d 无法启用 DHCP 客户端\n\r"、状态);
while (1);
}

//重新启动网络处理器
sl_Stop (200);

状态= sl_Start (0、0、0);
UART_PRINT ("[SimpleLinkWlanEventHandler] sl_Start 代码为%d\n\r"、状态);

usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
usleep(500000);
}
中断;

默认值:
中断;
}
}

当路由器关闭时、器件会定期以 STA 模式重新启动、我的假设是、它应该尝试连接到存储的配置文件。 但这似乎没有发生。 你能提出建议吗?

谢谢、

David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    您如何执行与 AP 的初始连接? 如果您只是使用 sl_WlanConnect(),则只执行一次性连接,而不会将永久连接数据保存到 CC3220。

    要使用的正确 API 是 sl_WlanProfileAdd()。 除了永久添加 WLAN 配置文件外,您还可以使用 sl_WlanPolicySet() API 设置 CC3220的 WLAN 自动连接设置。

    CC3200的以下代码概括了您可以遵循的流程、以作为持续设置该流程的一种方法:
    e2e.ti.com/.../1380220

    CC3200和 CC3220之间的 API 略有不同、但流程相同。 如果您设置了配置文件和 WLAN 策略、CC3220应在 AP 恢复联机后自动重新连接。 SimpleLinkWlanEventHandler 中不需要您拥有的代码。 实际上,在中断处理程序中执行所有这些 usleep()调用并不是一个好的做法,您还应该避免从中断上下文中调用任何 sl_*() API 调用。

    如果您在设置配置文件和 WLAN 策略后仍遇到此问题、或者您有任何其他问题、请告诉我。

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、

    最初、我将器件置于 AP 模式、然后打开本地页面、其中我有一种简单的发送凭据形式。 当用户按照编程人员指南第8.4.4节的说明将表单 I do http post 提交到/api/1/wlan/profile_add 时。 我还通过常规 http POST 发送凭据、并将这些凭据记录在器件中"ap_username_in"和"ap_password_in"变量下。 然后我使用 sl_WlanProfileAdd()。 以下是我的用法:

    SecParams.Type = SL_WLAN_SEC_TYPE_WPA_WPA2;
    SecParams.Key =(signed char *) ap_password_in;
    SecParams.KeyLen = strlen ((const char *) SecParams.Key);
    index = sl_WlanProfileAdd((signed char*) ap_username_in、strlen((const char*) ap_username_in)、macaddr、&SecParams、NULL、 7、0);
    UART_PRINT ("[Link Local Task] STA 配置文件已添加、状态为%d \n\r\n、索引);

    配置文件已成功添加、器件在复位时能够连接。 只有当路由器端的连接突然中断时,问题才会出现。 在这种情况下、器件不会重新连接。 设备启动时的 I DP 策略设置:

    //设置自动连接策略
    状态= sl_WlanPolicySet (sl_WLAN_policy_connection、sl_WLAN_connection_policy (1、0、0、0)、 空,0);
    如果(状态< 0){
    UART_PRINT ("[setSTACMODE]错误%d 未能将连接策略设置为自动连接\n\r\n、状态);
    while (1);


    //启用 DHCP 客户端
    状态= sl_NetCfgSet (sl_netcfg_IPv4_STA_ADDR_MODE、sl_netcfg_ADDR_DHCP、0、0);
    如果(状态< 0){
    UART_PRINT ("[setSTACMODE]错误%d 无法启用 DHCP 客户机\n\r"、状态);
    while (1);


    我在发布时仔细检查 SimpleLinkWlanEventHandler 中是否存在配置文件。 这确实不是我在处理程序中的最佳做法、感谢您的建议。

    您能否帮助了解配置文件存在时为什么不进行重新连接? 可能有某种超时? 重新连接超时的设置位于何处、我找不到?

    谢谢、
    David
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    浏览您的代码,最重要的是如何在 sl_WlanProfileAdd()调用中传入 macaddr。 macaddr 是 AP 的 BSSID、允许您指定要连接的特定 AP、以防该区域中有多个 AP 在同一 SSID 上广播、并且您希望连接到特定 AP。

    如果您的情况相同、但传入0而不是 macaddr、会发生什么情况?

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、

    我对 macaddr 使用了以下命令:
    _u8 macaddr[]={0xAA、0xBB、0xCC、0xDD、0xEE、0xFF};

    在我的测试中、路由器 SSID 名称是唯一的。

    您是否认为上述问题可能会导致重新连接问题?

    谢谢、
    David
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    如果提供的 MAC 地址与您的 AP 的 BSSID 不匹配、您的配置文件应该无法连接。 如果 BSSID 错误、我不确定您的设备是如何成功连接的。 请在 sl_WlanProfileAdd()调用中将 macaddr 更改为0、看看这是否有用。

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael、

    感谢你的帮助。 我尝试了您的建议、WLAN 连接工作正常。 但我的问题似乎完全不同。 这里是...

    供参考、我将 SHADOK_SAMPLE 应用程序用作基础。 在示例的顶部、我基本上添加了链路本地功能、以便能够将 SSID 凭据从手机传递到 CC3220器件。 同样、当我拔下 CC3220器件、然后重新插回器件时、重新连接工作正常。 CC3220能够加载配置文件并连接到我的网络。 当我突然重新启动路由器时出现了问题。 下面是一个描述过程的日志-绿色部分表示设备连接期间、红色部分表示路由器重新启动期间:


    ===================================================================================================

    在设备上:窗口状态为 false
    更新阴影:{"状态":{"报告":{"温度":25.50000、"打开窗口":false}、"客户令牌":"mydevice_unique -0"}

    ===================================================================================================

    已接受更新!!
    Delta -窗口状态更改为1

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"报告":{"温度":26.000000、"窗口打开":true}、"客户令牌":"mydevice_unique -1"}

    ===================================================================================================

    已接受更新!!

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"报告":{"温度":26.50000、"窗口打开":true}、"客户令牌":"mydevice_unique–2"}

    ===================================================================================================

    已接受更新!!

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"已报告":{"温度":27.000000、"窗口打开":true}、"客户令牌":"mydevice_unique -3"}

    ===================================================================================================

    已接受更新!!

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"已报告":{"温度":27.50000、"窗口打开":true}、"客户令牌":"mydevice_unique -4"}

    ===================================================================================================

    已接受更新!!

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"已报告":{"温度":28.000000、"窗口打开":true}、"客户令牌":"mydevice_unique -5"}

    ===================================================================================================


    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"报告":{"温度":28.50000、"窗口打开":true}、"客户令牌":"mydevice_unique -6"}

    ===================================================================================================


    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"已报告":{"温度":29.000000、"窗口打开":true}、"客户令牌":"mydevice_unique -7"}

    ===================================================================================================

    更新超时--

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"报告":{"温度":29.50000、"窗口打开":true}、"客户令牌":"mydevice_unique -8"}

    ===================================================================================================

    [SimpleLinkWlanEventHandler] WLAN 已断开连接!!!
    更新超时--

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"报告":{"温度":30.000000、"窗口打开":true}、"客户令牌":"mydevice_unique -9"}

    ===================================================================================================

    更新超时--

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"报告":{"温度":30.50000、"窗口打开":true}、"客户令牌":"mydevice_unique - 10"}

    ===================================================================================================

    更新超时--
    更新超时--
    更新超时--
    [SimpleLinkWlanEventHandler] WLAN 现已连接!!!

    ===================================================================================================

    在设备上:窗口状态为 true
    更新阴影:{"状态":{"报告":{"温度":31.000000、"窗口打开":true}、"客户令牌":"mydevice_unique -11"}

    ===================================================================================================

    错误:runAWSClient L#212循环-26中发生错误
    正在断开连接
    错误:runAWSClient L#219 Disconnect 错误-13

    以上消息是最后一条消息、此后不会发生任何情况。

    但是、红色文本中有一条小绿线、我丢失了。 它说: [SimpleLinkWlanEventHandler] WLAN 现已连接!!

    因此、当路由器在重启后重新启动时、WLAN 实际上会连接、但运行的 AWSClient 无法重新连接。 我应该如何解决这个问题? 不建议从 SimpleLinkWlanEventHandler 函数重新启动 runAWSClient、对吧? 建议采用哪种方法?

    非常感谢您的建议!

    David

    ================================================================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    我对 shadow_sample_example 示例不太熟悉、但在我看来、AWS 连接未正确重新启动。

    我有自己的项目使用 AWS 插件+器件阴影、当我检测到断开连接时、我执行 AWS IoT 影子_DISCONNECT (&客户端)、然后执行 AWS IoT 影子_FREE (&客户端)、然后通过通常的 AWS IoT 影子_INIT ()重新启动 AWS 影子连接、然后执行 AWS IoT 影子_CONNECT()步骤。

    尝试执行断开并释放、然后尝试重新连接、看看这是否有用。

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael、

    谢谢、它发挥了作用。

    谢谢、
    David