Как получить доступ к списку IP-адресов в contiki?

У меня есть UDP-сервер и клиентское соединение. Стек 802.15.4, ТЩ, 6lowpan, IPv6. Я считаю, что в contiki есть функция, которая перечисляет IP-адреса клиентов, когда они связаны с сервером. Я хотел бы знать, какую функцию я могу использовать для доступа к этому списку, сохранения в этом списке и получения сохраненных IP-адресов из этого списка.


person Yaant3y    schedule 02.04.2015    source источник


Ответы (1)


Независимо от того, используете ли вы RPL или нет, на сервере contiki (устройство, получающее сообщения DIO в случае RPL и сообщения RS в случае NDP) вы можете получить доступ к списку клиентов, просмотрев соседний кэш. Этот кеш находится в таблице 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);
}
person Darko P.    schedule 08.04.2015
comment
На стороне UDP я хочу собрать IP-адреса, скажем, 4 клиентов перед отправкой пользовательских данных. Таким образом, сервер UDP должен иметь возможность сравнивать любые входящие IP-адреса с уже сохраненными IP-адресами. Это возможно? - person Yaant3y; 08.04.2015
comment
Да, конечно, посмотрите здесь: senstools.gforge.inria.fr /doku.php?id=contiki:examples в примере связи IPv6 UDP и вдохновитесь функцией tcpip_handler(). Используйте &UDP_IP_BUF->srcipaddr для поиска входящих IP-адресов. Сравните это с уже сохраненными адресами из кеша соседей, как я показал вам выше. - person Darko P.; 08.04.2015
comment
Когда сервер получает данные, я могу получить доступ к исходному IP-адресу, используя &UDP_IP_BUF-›srcipaddr, как вы сказали. После этого я должен сравнить с соседним кешем. Обновляется ли этот кеш соседей автоматически без добавления IP-адреса вручную. Есть ли пример внутри contiki, который использует этот процесс кэширования? - person Yaant3y; 09.04.2015
comment
Этот соседний кеш является частью протокола (либо NDP, либо RPL), поэтому вам нечего делать. Система автоматически добавляет в этот список IP-адрес всякий раз, когда есть связь с устройством поблизости. Для этой цели используется функция uip_ds6_nbr_add(). Сервер может использовать этот кэш для создания списка подключенных устройств. Но в зависимости от того, что вы хотите, вам, возможно, придется создать свой собственный список и полагаться на этот последний для сравнения. - person Darko P.; 09.04.2015
comment
Я нашел этот пример: 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_ipaddr_cmp(addr1, addr2) в uip.h для сравнения IP-адресов. - person Yaant3y; 09.04.2015
comment
Да, используйте uip_ipaddr_cmp() для сравнения двух 128-битных IPv6-адресов. - person Darko P.; 09.04.2015