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.

[参考译文] CC1312R7:多播 CoAP 消息未到达 Wi-SUN 节点(libcoap3、SimpleLink SDK 7.40)

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1421313/cc1312r7-multicast-coap-message-not-reaching-wi-sun-nodes-libcoap3-simplelink-sdk-7-40

器件型号:CC1312R7
Thread 中讨论的其他器件:Wi-SUN

工具与软件:

大家好!

我正在使用开发一个 Linux 应用 libcoap3 4.3.0 边界路由器通过 Wi-SUN 网络发送 CoAP 消息。 边界路由器正在运行 SimpleLink SDK 7.40 是德州仪器(TI)提供的、并且网络接口是使用设置的 很棒 .

当我向特定节点发送单播 CoAP 消息时、它到达该节点没有任何问题。 但是、当我尝试发送时 多播 消息发送到地址ff02::1、则没有节点接收到该消息。 我可以看到使用 Wireshark 离开应用程序的多播消息、但节点似乎没有响应。

有趣的是、如果节点发送多播消息、它将顺利到达所有节点和边界路由器。

是否有人遇到此问题或对从应用程序发送多播消息时可能无法到达节点有任何了解?

this is the program i`m using to test:

#include <coap3/coap.h>
#include <stdio.h>
#include <ctype.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <net/if.h> // Para if_nametoindex



int main(void) {
coap_context_t *ctx = NULL;
coap_session_t *session = NULL;
coap_address_t dst;
coap_uri_t uri;
coap_pdu_t *pdu;
unsigned int if_index; // Índice de la interfaz de red

// Inicializa el URI manualmente con dirección completa de IPv6
memset(&uri, 0, sizeof(coap_uri_t)); // Limpia la estructura
uri.port = COAP_DEFAULT_PORT; // Puerto por defecto de CoAP
uri.path.s = (uint8_t *)"ok"; // El recurso "ok"
uri.path.length = strlen("ok"); // Longitud del recurso "ok"
uri.host.s = (uint8_t *)"ff02::1"; // Dirección multicast IPv6 completa
uri.host.length = strlen("ff02::1");

// Inicializa CoAP
coap_startup();

// Crea el contexto de CoAP
ctx = coap_new_context(NULL);
if (!ctx) {
fprintf(stderr, "Error al crear el contexto de CoAP\n");
return -1;

// Configura la dirección de destino (grupo multicast con IPv6 completo)
coap_address_init(&dst);
dst.addr.sin6.sin6_family = AF_INET6;
dst.addr.sin6.sin6_port = htons(uri.port);
if (inet_pton(AF_INET6, "ff02::1", &dst.addr.sin6.sin6_addr) != 1) {
fprintf(stderr, "Error al establecer la dirección multicast\n");
coap_free_context(ctx);
return -1;
}

// Obtiene el índice de la interfaz de red (por ejemplo, eth0)
if_index = if_nametoindex("wfan0"); // Cambia "eth0" por el nombre de tu interfaz de red
if (if_index == 0) {
perror("if_nametoindex");
coap_free_context(ctx);
return -1;
}

// Especifica la interfaz de red a través del campo sin6_scope_id
dst.addr.sin6.sin6_scope_id = if_index;


// Crea una sesión CoAP (multicast)
session = coap_new_client_session(ctx, NULL, &dst, COAP_PROTO_UDP);
if (!session) {
fprintf(stderr, "Error al crear la sesión de CoAP\n");
coap_free_context(ctx);
return -1;

}

// Crea una nueva solicitud PUT
pdu = coap_pdu_init(COAP_MESSAGE_NON, COAP_REQUEST_PUT, coap_new_message_id(session), coap_session_max_pdu_size(session));
if (!pdu) {
fprintf(stderr, "Error al crear el PDU\n");
coap_session_release(session);
coap_free_context(ctx);
return -1;
}

// Configura la URI con la dirección IPv6 completa para "ok"
coap_add_option(pdu, COAP_OPTION_URI_PATH, uri.path.length, uri.path.s);

// Envía el PDU (el payload está vacío, por lo que no se agregan datos)
if (coap_send(session, pdu) == COAP_INVALID_TID) {
fprintf(stderr, "Error al enviar el mensaje CoAP\n");
coap_session_release(session);
coap_free_context(ctx);
return -1;
}

printf("Solicitud PUT multicast enviada a ff02::01\n");

// Limpieza
coap_session_release(session);
coap_free_context(ctx);
coap_cleanup();

return 0;

}

当我通过应用程序发送多播消息时会发生这种情况。

当我从节点发送多播消息时会发生这种情况

请注意、我预期的多播响应会导致节点向边界路由器发送消息。

非常感谢您提供有关如何解决此问题的任何建议或对可能导致此问题的原因提出意见!

提前感谢!

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

    您好、Nicolas、

    我在不久之前也遇到过同样的情况,并提交了一份错误报告。

    我的"解决方法"如下:

    • 从 ti-pyspinel 生成的多播数据包中提取有效载荷(例如打印所有字节)
    • 打开一个 RAW 套接字、并通过套接字发送这些字节。 (可以通过 C 或 python 实现)

    解决方法是在引号中、因为我们在从 pyspinel 复制有效载荷时缺少序列号增加、所以我认为节点有时会忽略它。

    此致、

    Arthur