【问题标题】:How to access the IP address list in contiki?如何访问 Contiki 中的 IP 地址列表?
【发布时间】:2015-04-02 15:53:37
【问题描述】:

我有一个 UDP 服务器和客户端连接。堆栈是 802.15.4、TSCH、6lowpan、IPv6。我相信 contiki 中有一个功能可以列出与服务器关联的客户端的 IP 地址。我想知道我可以使用哪个函数来访问这个列表、保存到这个列表并从这个列表中获取存储的 IP。

【问题讨论】:

    标签: contiki iot


    【解决方案1】:

    无论您是否使用 RPL,在 contiki 服务器(设备在 RPL 的情况下接收 DIO 消息,在 NDP 的情况下接收 RS 消息)中,您都可以通过查看邻居缓存来访问客户端列表。此缓存位于ds6_neighbors 表中。

    我会尝试这样的:

    #include "uip-ds6-nbr.h"
    #include "nbr-table.h"
    
    uip_ds6_nbr_t *nbr = nbr_table_head(ds6_neighbors);
    while(nbr != NULL) {
        // do something with the neighbor here
        // its IP address is nbr->ipaddr
        // ...
        nbr = nbr_table_next(ds6_neighbors, nbr);
    }
    

    【讨论】:

    • 在 UDP 端,我想在发送用户数据之前收集 4 个客户端的 IP 地址。因此,UDP 服务器应该能够将任何传入的 IP 地址与已存储的 IP 地址进行比较。这可能吗?
    • 是的,当然,请看这里:senstools.gforge.inria.fr/doku.php?id=contiki:examples 在“IPv6 UDP 通信”示例中并从 tcpip_handler() 函数中获得灵感。使用&UDP_IP_BUF->srcipaddr 查找传入的IP 地址。将其与我在上面向您展示的邻居缓存中已经存储的地址进行比较。
    • 当服务器接收到数据时,我可以像你说的那样使用&UDP_IP_BUF->srcipaddr访问源IP。之后,我应该与邻居缓存进行比较。这个邻居缓存是否会自动更新而无需我手动添加 IP 地址。 contiki 内部是否有使用此缓存过程的示例?
    • 此邻居缓存是协议的一部分(NDP 或 RPL),因此您无事可做。只要与附近的设备通信,系统就会自动将 IP 地址添加到此列表中。用于该目的的函数是uip_ds6_nbr_add()。服务器可以使用此缓存来创建已连接设备的列表。但取决于您想要什么,您可能必须创建自己的列表并依靠后者进行比较。
    • 我找到了这个例子:github.com/adamdunkels/contiki-fork/blob/master/examples/rime/…。它似乎正是我想做的事情。但是,使用的比较函数是linkaddr_cmp。在该示例中,邻居类型是 linkaddr_t。但是如果我使用 &UDP_IP_BUF->srcipaddr 那么地址类型是 uip_ipaddr_t,对吧?那么是否有一个函数来比较 uip_ipaddr_t 与 linkaddr_cmp() 函数相同的方式。你能在 uip.h 中使用 uip_ipaddr_cmp(addr1, addr2) 来比较 IP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2011-03-17
    相关资源
    最近更新 更多