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.

[参考译文] CCS/CC3220S-LAUNCHXL:某些 AP 上出现电桥断开错误

Guru**** 2561930 points
Other Parts Discussed in Thread: CC3220S, UNIFLASH, CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/758855/ccs-cc3220s-launchxl-bridge-disconnection-error-on-some-aps

器件型号:CC3220S-LAUNCHXL
主题中讨论的其他器件:CC3220SUNIFLASHCC3200

工具/软件:Code Composer Studio

您好!

我正在测试 WiFi 锁定演示代码、我仅在某些 AP 上收到网桥断开错误。

出现此错误后、我无法通过 MQTT 连接到器件。 它在 LPDS 运行大约5分钟后发生。

问题是什么? 观察其他线程、似乎 AP 正在断开节点。

为什么节点在出现此错误后不重新尝试连接?为什么它仅存在于某些 AP 中?

我没有以任何方式修改过代码。 我使用 TP Link Archer C20进行了测试。

附加日志:


09:10:24.690:

****起动控制螺纹环****

[bleThread]状态设置为空闲。

[MQTT Thread] MQTT 客户端库已成功初始化

[网络接口]设备以站点模式启动

[Network Thread]正在获取器件 UDID!

[网络接口]设备以站点模式启动

09:10:25.690:

(一

CC3220S Wi-Fi 电子锁演示示例版本:1.1.1

(一

芯片:0x30000018

MAC:2.0.0.0

PHY:2.2.0.6

NWP:3.7.0.1

ROM:0

主机:2.0.1.27

MAC 地址:F0:C7:7f:18:8d:B6

(一

[网络线程]订阅主题1:/cc3220/doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockControl

[网络线程]订阅主题2:/cc3220/doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockStatus

[网络主题]发布主题1:/cc3220/doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockState

[WLAN 事件] STA 连接到 AP:Amiseq、BSSID:52:C7:bf:D4:95:87

09:10:26.735:[NetApp 事件] IP 已获取:IP=192.168.0.105,Gateway=192.168.0.1

[网络接口]连接到 AP 成功

[网络接口] IP 地址为192.168.0.105

[网络线程]将时区设置为 GMT-6 (中心时区)

[网络线程]本地时间= 2018年12月27日21:40:27日

[网络线程]器件时间为:第27天、第12个星期一、2018年、第21小时、最少40分钟、 第26秒

09:10:28.517:[OTA 任务]检查 OTA 的状态

[OTA 任务] isPendingCommit = 0

09:10:30.094:CONNACK:

连接成功

[MQTT Thread]客户端已在/Broker/To/cc32xx/doorLock 上订阅

[MQTT Thread]客户端已在/c3220/Doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockControl 上订阅

[MQTT Thread]客户端已在/c3220/Doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockStatus 上订阅

[MQTT Thread]客户端已在/c3220/Doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockOTA 上订阅

09:15:37.641:电桥断开

[MQTT Thread]板载客户端已断开连接

09:15:39.204:[MQTT Thread]订阅错误

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

    您是否尝试过 Ben 在此主题中列出的调试步骤?
    e2e.ti.com/.../735376
    需要特别尝试的一点是将 wifi_doorlock_app.h 中的 LSI_DURAY_IN_msec 设置为100ms 或更低。 使用较长的睡眠间隔是一种积极的节能方法、某些 AP 无法正常工作。 调整 LSI 是否允许您使用 WiFi 锁定示例中的所有 AP、而不会出现5分钟断开连接问题?

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、
    我检查了该主题、但在几次互动后被锁定。

    我将检查建议的 LSI 更改并更新您。

    以下是当前观察结果。
    适用于 TP Link C50 AC1200
    在 NETGEAR WNR2000上工作
    适用于 Dlink DIR-825、但有时会随机断开
    Xiaomi Mi wifi 路由器:5分钟后断开连接
    TP Link Archer C20:5分钟后断开
    三星 S9移动热点:5分钟后断开连接

    降低 LSI 将导致相当高的待机电流。 问题的解决方案是什么。
    如果出现错误、我们可以进行某种重新连接尝试吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、

    我不熟悉 CCS 和 CC3220开发。 我使用更新的 LSI vaule 编译锁定示例。
    有几个疑问:
    1.在锁定文档中,有一个注释:

    默认情况下、CCS 工程中禁用电源管理器、以让系统保持运行
    调试时连接到 CCS IDE。 通过添加启用电源管理器
    将 USE_POWER_policy 添加到中的预定义符号列表
    WiFi_Doorlock_CC3220S_LAUNCHXL_tirtos_ccs 项目。

    我需要在这里更改任何内容吗?

    构建/编译所有内容后。 如何将其刷写到开发板中、是否有任何相关文档? 用户文件和 Uniflash 工具有点令人困惑。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jitendra、您好!

    每5分钟重新连接到接入点也会消耗大量能量、因此您必须进行实验、看看这是否会因增加空闲电流而节省能源。 也许您可以尝试让您的代码仅在第一次断开连接后调整 LSI、以便您可以利用 LSI 提供的节能功能、但将正常睡眠间隔作为回退。

    如果您想测量 CC3220门锁示例的功率、定义 USE_POWER_policy 非常重要。 这是因为如果没有这一定义、应用 MCU 将永远不会进入睡眠状态。 添加该定义并重新编译后、您可以按照以下教程中的说明将编译的二进制文件存储到 CC3220中:
    dev.ti.com/.../

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

    您好、Michael、
    已尝试您的建议。 LSI 持续时间减少至100、但5分钟后仍断开连接。

    #define LSI_DURAY_IN_msec (100)

    日志:
    10:08:00.906:MSG 接收 按客户端
    主题:/cc3220/门锁/bae1841d23c6b19672c8c92e9e13d5e/LockStatus
    有效载荷:Get
    QoS:1.
    [MQTT Thread] CC3200发布以下消息
    [MQTT 主题]:0h[03][02][02][02][02]
    [MQTT Thread] Data:{"state is:"unlocked"}
    10:13:09.268:电桥断开连接
    [MQTT Thread]板载客户端已断开连接
    10:13:10.851:[MQTT Thread]订阅错误

    日志2:

    10:23:13.364:[MQTT Thread] Client 在/Broker/To/cc32xx/doorLock 上订阅

    [MQTT Thread]客户端已在/c3220/Doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockControl 上订阅

    [MQTT Thread]客户端已在/c3220/Doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockStatus 上订阅

    [MQTT Thread]客户端已在/c3220/Doorlock/bae1841d23c6b19672c8c92e9e13d5e/LockOTA 上订阅

    10:28:20.540:电桥断开

    [MQTT Thread]板载客户端已断开连接

    10:28:22.111:[MQTT Thread]订阅错误

    这种断开恰好在5分钟后发生。 这可以提供任何提示吗?

    如果  有助于、我也可以共享 airpcap Wireshark 日志。

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

    您好、Michael、

    我从我的最后开始做了一些研究

    以下是我的观察结果:

    1. Android MQTT 客户端只能将 MQTT 消息发送到 cc3220约4分钟。 4分钟后、cc3220未收到任何消息、我在终端上验证了该消息。

    2.检查 Wireshark 日志后,我发现恰好在上一个 MQTT 事务处理5分钟后,cc3220尝试发送 TCP keepalive,但没有从服务器获得任何响应。

    3.即使在网桥断开连接消息显示 cc3220仍连接到 AP 后,我也能够 ping 通电路板。

    我认为在大约4分钟后、NAT 条目将在某些 AP 上重置。

    我尝试了不同的 LSI 间隔和不同的 MQTT 代理、但没有帮助。

    是否有办法在4分钟内发送 TCP keepalive?

    我附加 Wireshark 日志以及一些评论。

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

    我已检查 TCP 套接字的默认 TCP 超时为5分钟。
    如何将时间更改为4分钟?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我不确定这是否是您想要的、但如果您需要更改 TCP 保持活动、则可以使用 API SL_SetSockOpt ()和选项 SL_SO_KEEPALIVE (启用/禁用 TCP 保持活动)和 SL_SO_KeepAliveTime (设置保持活动状态输出;默认值为5分钟)。

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

    我无法找到 MQTT 客户端库中创建和设置套接字的位置。 你有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我对 TI MQTT 代码没有经验、但它看起来 socket 是在函数 createSocket ()创建的、在函数 createSocket ()中使用 SlNetSock_create () API。\source\ti\net\mqtt\platform\mqtt_net_func.c。

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

    我尝试添加 socketoption 来修改 MQTT_net_func.c 文件中的保持活动时间。

    Int16_t 状态;
    uint32_t 超时= 60;
    SlNetIfWifi_setSockOpt (SD、sdContext、SLNETSOCK_LVL_Socket、SLNETSOCK_OPSOCK_keepalive_time、(uint8_t *)&timeout、 sizeof (timeout));

    重建了简单链接项目、然后重建了 WiFi_lock 项目。 我检查 DIN Wireshark、但无法查看更改。

    下面是我修改的 MQTT_NET_func.c 中的函数。

    静态 int32_t createSocket (uint32_t nwconnOpts、
    MQTT_SecureConn_t *nwSecurityOpts、const char *服务器地址、bool isServer)

    int32_t socketFd;
    int32_t status;
    uint32_t dummyVal = 1;
    SlNetSockSectrib_t *secAttrib;
    SlNetSockSectib_e attribName;
    //用于创建安全套接字的局部变量
    uint8_t SecurityMethod;
    uint32_t SecurityCypher;

    int8_t i;

    //如果需要 TLS
    if ((nwconnOpts & MQTT_DEV_NETCONN_OPT_SEC)!= 0)

    /*创建安全属性*/
    secAttrib = SlNetSock_secAttribCreate ();

    /*检查函数是否失败*/
    if (NULL ==secAttrib)

    返回 MQTT_PACKE_ERR_ALLOC_FAILED;


    socketFd = SlNetSock_create (SLNETSOCK_AF_iNet、SLNETSOCK_SOCK_STREAM、SLNETSOCK_PROTO_TCP、0、0);
    如果(socketFd < 0)

    SlNetSock_secAttribDelete (secAttrib);
    返回(socketFd);

    //添加了保持活动时间套接字选项
    Int16_t 状态;
    uint32_t 超时= 60;
    SlNetIfWifi_setSockOpt (socketFd、sdContext、SLNETSOCK_LVL_socket、SLNETSOCK_OPSOCK_keepalive_time、(uint8_t *)&timeout、 sizeof (timeout));

    SecurityMethod =*((uint8_t *)(nwSecurityOpts->method));
    SecurityCypher =*((uint32_t *)(nwSecurityOpts->cipher);

    /*域名验证仅适用于 URL 地址
    检查是否已禁用跳过域名验证
    如果地址输入是 URL 地址。 *
    如果((((nwconnOpts & MQTT_DEV_NETCONN_OPT_SKIP_DOMAIN_NAME_VERIFICATION)= 0)&&
    ((nwconnOpts & MQTT_DEV_NETCONN_OPT_URL)!= 0))

    status = SlNetSock_secAttribSet (secAtrib、SLNETSOCK_SEC_ATTRIB_DOMAIN_NAME、(void *) serverAddr、strlen (serverAddr));
    如果(状态< 0)

    SlNetSock_secAttribDelete (secAttrib);
    slNetSock_close (socketFd);
    返回(状态);



    /*检查是否跳过证书目录验证
    使能。 *
    if (((nwconnOpts & MQTT_DEV_NETCONN_OPT_SKIP_CERTIFICATE_catalog_verification)!= 0)

    status = SlNetSock_secAttribSet (secAttrib、SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE、(void *)&dummyVal、sizeof (dummyVal));
    如果(状态< 0)

    SlNetSock_secAttribDelete (secAttrib);
    slNetSock_close (socketFd);
    返回(状态);



    if (nwSecurityOpts->nFile <1|| nwSecurityOpts->nFile > 4)

    SlNetSock_secAttribDelete (secAttrib);
    slNetSock_close (socketFd);
    /*安全文件丢失或安全文件数量错误
    未创建套接字*/
    返回 MQTT_PACKE_ERR_FNPARAM;


    //设置刚才定义的套接字选项
    status = SlNetSock_secAttribSet (secAttrib、SLNETSOCK_SEC_ATTRIB_METHOD、(void *)&(SecurityMethod)、sizeof (SecurityMethod));
    如果(状态< 0)

    SlNetSock_secAttribDelete (secAttrib);
    slNetSock_close (socketFd);
    返回(状态);


    状态= SlNetSock_secAttribSet (secAttrib、SLNETSOCK_SEC_ATTRIB_Ciphers、(void *)&(SecurityCypher)、sizeof (SecurityCypher));
    如果(状态< 0)

    SlNetSock_secAttribDelete (secAttrib);
    slNetSock_close (socketFd);
    返回(状态);


    if (nwSecurityOpts->nFile == 1)(如果(nwSecurityOpts->nFile == 1))

    状态= SlNetSock_secAttribSet (secAttrib、SLNETSOCK_SEC_ATTRIB_PEER_ROOT_CA、
    (void *) nwSecurityOpts->files[0]、strlen (nwSecurityOpts->files[0]);
    如果(状态< 0)

    SlNetSock_secAttribDelete (secAttrib);
    slNetSock_close (socketFd);
    返回(状态);


    其他

    对于(i = 0;i < nwSecurityOpts->nFile;i++)

    if (NULL!= nwSecurityOpts->files[i])

    attribName =(SlNetSockSectrib_e)(SLNETSOCK_SEC_ATTRIB_PRIVE_KEY + I);
    状态= SlNetSock_secAttribSet (secAttrib、attribName、
    (void *) nwSecurityOpts->files[i]、strlen (nwSecurityOpts->files[i]);
    如果(状态< 0)

    SlNetSock_secAttribDelete (secAttrib);
    slNetSock_close (socketFd);
    返回(状态);




    状态= SlNetSock_startSec (socketFd、secAttrib、isServer?
    (SLNETSOCK_SEC_BIND_CONFILE_ONLY | SLNETSOCK_SEC_IS_SERVER):
    SLNETSOCK_SEC_BIND_CONFILE_ONLY);
    如果(状态< 0)

    SlNetSock_secAttribDelete (secAttrib);
    slNetSock_close (socketFd);
    返回(状态);

    SlNetSock_secAttribDelete (secAttrib);


    //如果不需要 TLS
    其他

    //选中以创建 UDP 或 TCP 套接字
    if ((nwconnOpts & MQTT_DEV_NETCONN_OPT_UDP)!= 0)

    SOCKETFd = SlNetSock_create (SLNETSOCK_AF_iNet、SLNETSOCK_SOCK_DGRAM、SLNETSOCK_PROTO_UDP、0、0);

    else //用于 TCP 的套接字

    socketFd = SlNetSock_create (SLNETSOCK_AF_iNet、SLNETSOCK_SOCK_STREAM、
    SLNETSOCK_PROTO_TCP、0、0);//考虑将0代替 SLNETSOCK_PROTO_TCP



    返回(socketFd);

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

    如果使用安全套接字、我认为您将 SlNetIfWifi_setSockOpt ()添加到正确的行中。 您应该读取返回代码以确定 API 是否成功执行。

    说实话、我不相信您的问题与 TCP 保持活动期相关。 但更多信息可以为您提供 TI 工程师、因为 MQTT 是他们的代码。

    1月
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Jan 的投入。
    我将尝试并检查。
    TI 的任何人、请在此处提供输入。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对此进行了任何更新?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    将 MQTT 保持活动状态更改为200秒有助于解决此问题?
    但我们无法确定确切的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我将 MQTT 保持活动时间更新为2分钟、并尝试使用不同的 LSI 设置。
    现在、节点在5分钟后未断开连接、但在30-40分钟后会随机断开。
    Michael 请在此处提供一些意见。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如 Jan 所述、MQTT 保持活动期间不应成为问题的原因。

    您是否曾尝试将 CC3220电源策略设置为正常模式并查看该策略是否解决了您遇到的问题? 您可以运行此命令以使器件返回正常模式:

    RetVal =
    SL_WlanPolicySet (sl_WLAN_policy_PM、sl_WLAN_normal_policy、NULL、0); 

    此致、

    Michael

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

    您好!

    我可以尝试一下。 但它会导致高功耗。 我们需要一些始终保持连接的低功耗器件。

    您将如何解释将 MQTT 更改为保持活动状态到4分钟以内的任何时间都可以在很大程度上解决该问题?

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

    我不清楚为什么更改 MQTT 保持活动时间会降低 MQTT 断开连接的频率。
    您正在使用什么 MQTT 代理? 如果您使用的是默认值、则可能需要考虑更改您的其他云服务器或您自己的 MQTT 服务器、因为提供的免费代理不是最可靠的。

    此外、请尝试更新2.40.00.05 SDK 版本中的最新服务攻击。 已有一些修复措施改善了 AP 互操作性。 如果您的问题仅出现在某些 AP 上、这可能会帮助您解决问题。

    此致、
    Michael