首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Contiki-NG中与UDP进行向下连接

如何在Contiki-NG中与UDP进行向下连接
EN

Stack Overflow用户
提问于 2022-05-11 08:49:35
回答 1查看 144关注 0票数 0

我试图使用6LoWPAN和Contiki建立一个简单的网格连接。

为了简单起见,我是用Cooja制作的,所以硬件不是这个问题的制约因素。

我的目标是拥有一个根(UDP Server)和多个motes (UDP客户端)。通过Contiki提供的示例,我可以开始与Motes的通信,并与服务器进行对话,但是否有可能以相反的方式进行呢?

我希望根开始发送消息到任何客户端,如果它是链接,则通过网络中的另一个客户端跳转该消息。

你知道这能不能做到吗?或者实现这一目标的任何途径?

更新:到目前为止我尝试过的内容:

到目前为止,我在服务器设备中尝试的是创建两个进程,一个用于启动根进程,另一个用于周期性地检测数据包:

代码语言:javascript
复制
#include "contiki.h"
#include <stdlib.h>
#include "net/routing/routing.h"
#include "random.h"
#include "net/netstack.h"
#include "net/ipv6/simple-udp.h"
#include "sys/log.h"

#define LOG_MODULE "App"
#define LOG_LEVEL LOG_LEVEL_DBG

#define UDP_CLIENT_PORT 8765
#define UDP_SERVER_PORT 5678

#define SEND_INTERVAL         (5 * CLOCK_SECOND)

static struct simple_udp_connection udp_conn;
static struct etimer periodic_timer;

PROCESS(udp_server_process, "UDP server");
PROCESS(send_msg_process, "UDP server");
AUTOSTART_PROCESSES(&udp_server_process, &send_msg_process);


static void
udp_rx_callback(struct simple_udp_connection *c,
         const uip_ipaddr_t *sender_addr,
         uint16_t sender_port,
         const uip_ipaddr_t *receiver_addr,
         uint16_t receiver_port,
         const uint8_t *data,
         uint16_t datalen)
{
  LOG_INFO("Received response '%.*s' from ", datalen, (char *) data);
  LOG_INFO_6ADDR(sender_addr);
  LOG_INFO_("\n");
}




PROCESS_THREAD(udp_server_process, ev, data)
{
  PROCESS_BEGIN();

  /* Initialize DAG root */
  NETSTACK_ROUTING.root_start();

  /* Initialize UDP connection */
  simple_udp_register(&udp_conn, UDP_SERVER_PORT, NULL,
                      UDP_CLIENT_PORT, udp_rx_callback);

  PROCESS_END();
}


PROCESS_THREAD(send_msg_process, ev, data)
{
  
  static unsigned count;
  static char str[32];
  uip_ipaddr_t dest_ipaddr;
  LOG_INFO("%u", count);
  PROCESS_BEGIN();

  while(1) {
      etimer_set(&periodic_timer, CLOCK_SECOND);
      PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&periodic_timer));
        uip_ip6addr(&dest_ipaddr,0xfe80,0,0,0,0x207,0x7,0x7,0x7);
        LOG_INFO("Sending request %u to ", count);
        LOG_INFO_6ADDR(&dest_ipaddr);
        LOG_INFO_("\n");
        snprintf(str, sizeof(str), "hello %d", count);
        simple_udp_sendto(&udp_conn, str, strlen(str), &dest_ipaddr);
        count++;
  }
  PROCESS_END();
}

在客户端,代码只是基于侦听UDP套接字,并在接收到数据包的情况下做出响应。

代码语言:javascript
复制
#include "contiki.h"
#include "net/routing/routing.h"
#include "random.h"
#include "net/netstack.h"
#include "net/ipv6/simple-udp.h"

#include "sys/log.h"
#define LOG_MODULE "App"
#define LOG_LEVEL LOG_LEVEL_DBG

#define WITH_SERVER_REPLY  1
#define UDP_CLIENT_PORT 8765
#define UDP_SERVER_PORT 5678

#define SEND_INTERVAL         (5 * CLOCK_SECOND)

static struct simple_udp_connection udp_conn;

/*---------------------------------------------------------------------------*/
PROCESS(udp_client_process, "UDP client");
AUTOSTART_PROCESSES(&udp_client_process);
/*---------------------------------------------------------------------------*/
static void
udp_rx_callback(struct simple_udp_connection *c,
         const uip_ipaddr_t *sender_addr,
         uint16_t sender_port,
         const uip_ipaddr_t *receiver_addr,
         uint16_t receiver_port,
         const uint8_t *data,
         uint16_t datalen)
{

  LOG_INFO("Received request '%.*s' from ", datalen, (char *) data);
  LOG_INFO_6ADDR(sender_addr);

  LOG_INFO("Sending response.\n");
  simple_udp_sendto(&udp_conn, data, datalen, sender_addr);

  LOG_INFO_("\n");

}

PROCESS_THREAD(udp_client_process, ev, data)
{
  PROCESS_BEGIN();
  simple_udp_register(&udp_conn, UDP_CLIENT_PORT, NULL,
                      UDP_SERVER_PORT, udp_rx_callback);
  PROCESS_END();
}

如您所见,服务器代码定期向ipv6方向发送数据包:0xfe80:0:0:0x207:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0x7:0

我得到的结果是,当根(A)和客户端( B )直接连接在一起时,它们之间的对话是完美的,但是当我将它们分开,试图通过另一个客户端(C)从根(A)连接到客户机(B)时,消息就不会从A到B。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-12 07:21:27

是的,这是可能的。RPL路由协议允许从根方向和向根方向发送数据包。只需使用节点的IP地址作为目标。

一个问题是节点通常有两个IPv6地址:

从local.

  • Addresses开始的
  • 地址是以网络前缀开始的--在OS配置中定义为UIP_DS6_DEFAULT_PREFIX,默认情况下等于0xfd00。此地址仅在节点加入RPL网络后才会出现。

到链路本地地址的数据包必须是单跳的,它们不被节点转发.为了更好地利用多跳网格转发,以其他地址作为目标地址.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72198083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档