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.

[参考译文] CC1352P7:使用 Wi-SUN 实现 CoAP 上的 dtls

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1490532/cc1352p7-dtls-over-coap-implementation-using-wi-sun

器件型号:CC1352P7

工具与软件:

您好!

我的 Wi-SUN 网络运行得很好、我正在尝试通过 CoAP 添加 DTLS。 我有一个 CoAP 节点连接到边界路由器、并在 Linux 主机上使用 wfantund。

我需要更改一些头文件下的一些定义、以便能够编译 CoAP 节点项目、从而 mbed 支持 DTLS。 然后、我使用以下命令初始化 CoAP_service:
COAP_SERVICE_INITIALIZE (interface_id、COAPS_port、coAP_service_options_secure、NULL、NULL);
其中 Copas_port 是5684。

然后、我使用 COAP_SERVICE_CERTIFICATE_SET (SERVICE_ID、CERT_LEN、CERT_LEN、PRIVT_KEY、PRIVT_KEY_LEN)设置证书和密钥。

当我看到该器件连接到边界路由器时、我使用以下命令发送 CoAP 请求:
CoAP_SERVICE_Request_send (service_id、CoAP_service_options_secure、root_unicast_addr、COAPS_port、CoAP_MSG_TYPE_Confirmable、 SG_CODE_Request_Get、CoAP_TIMESTAMP_URI、CoAP_CT_TEXT_PLAIN、NULL、0、 CoAP_CLIENT_RESPONSE_TIMESTAMP);

此请求的响应为非零值、因此我知道执行此请求时它不会报告错误。 我还知道 root_unicast_addr 是边界路由器的地址。

尽管有所有这些信息、但我没有看到数据包到达边界路由器一侧(我正在跟踪 wfantund 输出)。

您可以对这个流程进行任何纠正或对这个流程进行调试的任何帮助吗?
谢谢你。

此致、
Eduardo。

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

    Eduardo、您好!

    能否详细介绍一下您如何修改边界路由器和 CoAP 节点项目以支持 DTLS?

    您能否尝试对 PySpinel 执行相同操作、以便我们开发一个最小的示例、从而消除 wfantund 的第一个网络接口层?

    此致、
    等等

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

    尊敬的 Theo:

    当然可以! 我使用的是 Simplelink SDK 8.30.01.01。 以下是我为了编译工程而进行的修改:

    1. ti/ti_wisunfan/apps/udp_nanostack_mesh_tirf/mbedtls_wisun_config.h:  
    - commented #UNDEF MBEDTLS_SSL_SRV_C, line 26;
    - commented #undef MBEDTLS_SSL_PROTO_DTLS,行192;
    - commented #undef MBEDTLS_SSL_DTLS_hello_verify,第193行;

    2. ti/ti_wisunfan/mbed_config/ws_border_router/mbed_config.h
    -未注释#define NS_USE_EXTERNAL_mbed_tls,第67行;

    3. ti/ti_wisunfan/mbed_config/ws_router/mbed_config.h
    -未注释#define NS_USE_EXTERNAL_mbed_tls,第48行。

    然后我将使用前面所述的 CoAP 功能。

    使用 PySpinel、我已经在 spinel-cli.py 上实施了一些修改、我会向您发送一些 snipet、以便您可以看到我所做的修改、但如果您需要更多详细信息、请告诉我:

    COAP_TIMESTAMP_URI = "device_timestamp"
    
    ...
    
    elif option.option_val == str.encode(COAP_TIMESTAMP_URI):
                                            # Handle ev timestamp request CoAP message
                                            # The coap message type is a coap get request.
                                            coap_packet_type = "DEVICE_TIMESTAMP_SEND"
                                            
    
    ...
    
    elif coap_packet_type == "DEVICE_TIMESTAMP_SEND":
                                # Handle ev device data CoAP message
                                if h.code == ipv6.COAP_METHOD_CODE_GET:
                                    print("Device requesting timestamp")
                                    current_timestamp = str(int(time.time()))
                                    print(current_timestamp)
                                    # print("Done at " + t)
                                    if h.type == ipv6.COAP_TYPE_CON:
                                        try:
                                            srcIPAddress = pkt.ipv6_header.destination_address
                                            # Send an acknowledgement to the CoAP Node
                                            coap_req = self.ipv6_factory.build_coap_request(format(srcIPAddress), pkt.ipv6_header.source_address, ipv6.COAP_TYPE_ACK,
                                                ipv6.COAP_RSP_CODE_CONTENT, None, payload=bytes(current_timestamp, encoding="utf-8"), msg_id=(h.msg_id+1), tkl=h.tkl, token=h.token)
                                            print("Send acknowledgement")
                                            self.wpan_api.ip_send(coap_req)
                                        except:
                                            print("Failed to send acknowledgement")
                                            print(traceback.format_exc())

    我仍然没有看到任何打印在 spinel 侧(在这种情况下、我需要"设备请求时间戳"消息)。 我是否需要进行任何其他修改、以便它可以实际接收加密的消息?

    如果您需要更多详细信息、请告诉我。

    此致、
    Eduardo。

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

    Eduardo、您好!

    我会请求研发部门就此主题提供进一步建议。

    您是否可以看到在使用数据包监听器时发送了消息或者消息从未通过无线发送?

    此致、
    等等

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

    尊敬的 Theo:

    消息似乎从未通过无线方式发送、数据包监听器仅检测 PAN 配置和 PAN 广播数据包、而不会再进行检测。

    当您从研发团队得到答案时、请告诉我。

    此致、
    Eduardo。

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

    Eduardo、您好!

    我在内部与我们的专家讨论过它、从理论上讲、您可以尝试通过 CoAP 实施 DTLS、但为此、您需要自己实施。 您所描述的问题似乎与我们的应用程序会话和功能代码之间发生的冲突有关。 您需要确保 DTLS 实现可生成一个独立实例来加密 应用层上的消息负载、同时保持消息格式不变。

    我们计划不实施此功能的原因是、Wi-SUN 网络已经通过安全交换(使用证书)得到完全保护。 这意味着网络中的所有通信都已加密。

    如果在上面添加额外的应用层加密(例如 DTLS)、则基本上是对消息进行加密、然后再由 Wi-SUN 堆栈进行第二次加密、然后再传输。  

    我们强烈建议信任 Wi-SUN 堆栈提供的安全性、因为它正是为该堆栈开发的。 如果确实必须实施额外的加密、请确保应用层上的所有操作都 只修改消息有效载荷、然后再将其传递到堆栈。

    此致、
    等等