0

i wrote the following to print the ipv6 address of a mote in contiki-

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

My method prints- aaaa 0000 0000 0000 1202 0174 0100 0101 whereas the IP address displayed by cooja is- aaaa::212:7401:1:101.

I understand that 0000 0000 0000 is the same as :: but why is the rest of it 'garbled'? What could i be doing wrong here?

4

2 回答 2

4

这是一个字节顺序问题。该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]);
    }
}
于 2014-07-28T20:03:32.647 回答
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

于 2014-07-29T18:19:43.683 回答