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;
}
当我通过应用程序发送多播消息时会发生这种情况。

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

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

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