我试图使用6LoWPAN和Contiki建立一个简单的网格连接。
为了简单起见,我是用Cooja制作的,所以硬件不是这个问题的制约因素。
我的目标是拥有一个根(UDP Server)和多个motes (UDP客户端)。通过Contiki提供的示例,我可以开始与Motes的通信,并与服务器进行对话,但是否有可能以相反的方式进行呢?
我希望根开始发送消息到任何客户端,如果它是链接,则通过网络中的另一个客户端跳转该消息。
你知道这能不能做到吗?或者实现这一目标的任何途径?
更新:到目前为止我尝试过的内容:
到目前为止,我在服务器设备中尝试的是创建两个进程,一个用于启动根进程,另一个用于周期性地检测数据包:
#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套接字,并在接收到数据包的情况下做出响应。
#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。
发布于 2022-05-12 07:21:27
是的,这是可能的。RPL路由协议允许从根方向和向根方向发送数据包。只需使用节点的IP地址作为目标。
一个问题是节点通常有两个IPv6地址:
从local.
UIP_DS6_DEFAULT_PREFIX,默认情况下等于0xfd00。此地址仅在节点加入RPL网络后才会出现。。
到链路本地地址的数据包必须是单跳的,它们不被节点转发.为了更好地利用多跳网格转发,以其他地址作为目标地址.
https://stackoverflow.com/questions/72198083
复制相似问题