在contiki中打印mote的ipv6地址的功能

时间:2014-07-28 18:52:36

标签: ipv6 contiki

我写了以下内容,以便在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::相同,但为什么其余部分会出现“乱码”?我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

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

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

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]);
    }
}

答案 1 :(得分: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地址,您可能需要阅读它们:http://tools.ietf.org/html/rfc5952