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