【问题标题】:Function to print ipv6 address of a mote in contiki在 contiki 中打印 mote 的 ipv6 地址的功能
【发布时间】:2017-08-18 12:45:58
【问题描述】:

我写了以下内容来打印 contiki 中 mote 的 ipv6 地址-

static void
print_ipv6_addr(const uip_ipaddr_t *ip_addr) {
    int i;
    for (i = 0; i <= 7; i++) {
        printf("%04x ", ip_addr->u16[i]);
    }
}

我的方法打印- aaaa 0000 0000 0000 1202 0174 0100 0101 而 cooja 显示的 IP 地址是-aaaa::212:7401:1:101

我知道0000 0000 0000:: 相同,但为什么其余部分是“乱码”?我在这里做错了什么?

【问题讨论】:

    标签: ipv6 contiki


    【解决方案1】:

    这是一个endianness 问题。 uip_ipaddr_t 类型是使用网络字节顺序(即大端序)存储 IPv6 地址的联合,而您的平台显然是小端序。

    要在每个平台(包括您的平台)上正确打印地址,您应该使用其u8 数据成员访问您的ip_addr 变量,如下所示:

    static void
    print_ipv6_addr(const uip_ipaddr_t *ip_addr) {
        int i;
        for (i = 0; i < 16; i++) {
            printf("%02x", ip_addr->u8[i]);
        }
    }
    

    【讨论】:

      【解决方案2】:

      Contiki 包含 void uip_debug_ipaddr_print(const uip_ipaddr_t *addr); 功能,将为您完成这项工作:

      #include "uip.h"
      #include "uip-debug.h"
      
      ...
      
      uip_ipaddr_t addr;
      uip_ip6addr_u8(&addr,
                     0xaa, 0xaa, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00,
                     0x02, 0x12, 0x74, 0x01,
                     0x00, 0x01, 0x01, 0x01);
      uip_debug_ipaddr_print(&addr);
      putchar('\n');
      

      输出:

      aaaa::212:7401:1:101
      

      在 Contiki 中还有 uiplib_ip6addrconv 函数,它具有反向功能(它从字符串构造 IPv6 地址对象)。

      此外,还有官方指南打印的 IPv6 地址应该是什么样子,您可能需要阅读它们:https://www.rfc-editor.org/rfc/rfc5952

      【讨论】:

        猜你喜欢
        • 2015-04-18
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-22
        • 2022-06-10
        • 2013-10-21
        • 1970-01-01
        相关资源
        最近更新 更多