Как отправить широковещательный пакет на уровне RDC в Contiki?

Я пытаюсь закодировать свой собственный уровень RDC в contiki с протоколом PW-MAC. Мне было интересно, как отправить широковещательную рассылку на этом уровне, потому что там не будет сети и транспортного уровня. Функция, которую я должен использовать, будет:

NETSTACK_RDC.send(mac_callback_t sent, void *ptr)

Но я действительно не знаю, что такое mac_callback_t и ptr... Примеры в источниках используют udp для широковещательной передачи, поэтому будет очень неприятно, если мне придется реализовать транспортный уровень.

Спасибо за ваши ответы


person Vincent    schedule 14.06.2016    source источник
comment
Ты выглядишь довольно растерянным. Вы знаете, как отправить одноадресный пакет, и хотите изменить свой код для отправки широковещательного пакета, или вы просто хотите отправить любой пакет? Для уровня RDC наличие широковещательных и одноадресных пакетов может не иметь большого значения.   -  person kfx    schedule 15.06.2016


Ответы (2)


Вы должны немного проверить документ и код, это может вам очень помочь. ptr — это указатель данных (void*). Так что это ваши данные для отправки. mac_call_back_t ясно: вызвать обратный вызов на уровень Mac. (указатель функции)
Чтобы отправить широковещательную рассылку, просто отправьте на адрес FFF. (вы должны изменить адрес с помощью packagebuf, проверьте документ packagebuf. (хорошая ссылка для package_buf: http://anrg.usc.edu/contiki/index.php/Packetbuffer_Basics)
Проверьте broadcast_conn в Rime, чтобы понять, как осуществляется трансляция, и получить пример.

person Ludovic Guerra    schedule 15.06.2016
comment
ptr определенно не данные для отправки. - person kfx; 15.06.2016
comment
@kfx Тогда какова цель ptr? Все мои приложения на contiki работают с ptr в качестве данных. Может я ошибаюсь, но тогда скажите, какая первоначальная цель. - person Ludovic Guerra; 16.06.2016
comment
Я нашел код Contiki для этого. Похоже, он используется только Rime для указания канала: github.com/contiki-os/contiki/blob/master/core/net/rime/ Другой код отправки просто передает NULL как ptr. - person kfx; 20.06.2016

RDC означает «рабочий цикл радиосвязи». Уровень RDC напрямую использует функции радиосвязи, поэтому отправка пакета может быть такой же простой, как вызов NETSTACK_RADIO.send(packetbuf_hdrptr(), packetbuf_totlen()).

Сетевой стек Contiki имеет следующую многоуровневую структуру:

NETWORK layer -> MAC layer -> RDC layer -> RADIO layer.

(В последних версиях есть дополнительный уровень LLSEC между уровнями NETWORK и MAC.)

Таким образом, реализация API уровня RDC использует API уровня RADIO и вызывается / сообщает API уровня MAC. Вы можете посмотреть core/net/mac/nullrdc.c, чтобы узнать, как реализовать простой драйвер RDC.

Как вы заметили, NETSTACK_RDC.send(mac_callback_t sent, void *ptr) принимает два параметра. Первый тип обратного вызова, который нужно вызывать после завершения отправки, второй — пользовательские данные, которые необходимо передать в обратный вызов.

Обратный вызов typedef в net/mac/mac.h как:

typedef void (* mac_callback_t)(void *ptr, int status, int transmissions);
  • ptr — указатель пользовательских данных, переданный NETSTACK_RDC.send;
  • status — код состояния MAC, например, MAC_TX_OK — результат передачи;
  • transmissions — количество передач.
person kfx    schedule 15.06.2016