Получение ответа в simple_udp_connection

У меня есть код в contiki cooja. У меня есть 2 узла-отправителя и 2 узла-получателя, как показано на рисунке1. широковещательные отправители и получатели следующие.

#include "contiki.h"
#include "lib/random.h"
#include "sys/etimer.h"
#include "net/ip/uip.h"
#include "net/ipv6/uip-ds6.h"
#include "net/ip/uip-debug.h"


#include "simple-udp.h"


#include <stdio.h>
#include <string.h>



#define SEND_INTERVAL       (20 * CLOCK_SECOND)
#define SEND_TIME       (random_rand() % (SEND_INTERVAL))

static struct simple_udp_connection broadcast_connection;


/*---------------------------------------------------------------------------*/
PROCESS(broadcast_example_process, "UDP broadcast example process");
AUTOSTART_PROCESSES(&broadcast_example_process);
/*---------------------------------------------------------------------------*/
static void
receiver(struct simple_udp_connection *c,
         const uip_ipaddr_t *sender_addr,
         uint16_t sender_port,
         const uip_ipaddr_t *receiver_addr,
         uint16_t receiver_port,
         const uint8_t *data,
         uint16_t datalen)
{
 printf("Data received from ");
  uip_debug_ipaddr_print(sender_addr);
  printf(" on port %d from port %d with length %d:  %s \n",
         receiver_port, sender_port, datalen, data);

}
/*---------------------------------------------------------------------------*/

PROCESS_THREAD(broadcast_example_process, ev, data)
{



  static struct etimer periodic_timer;
  static struct etimer send_timer;
  uip_ipaddr_t addr;
  char message[20];
  sprintf(message," hello ");

  PROCESS_BEGIN();

  simple_udp_register(&broadcast_connection, 1234,
                      NULL, 1900,
                      receiver);
  etimer_set(&periodic_timer, SEND_INTERVAL);
  while(1) {



    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&periodic_timer));
    etimer_reset(&periodic_timer);
    etimer_set(&send_timer, SEND_TIME);

    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&send_timer));

    printf("Sending broadcast\n");
    uip_create_linklocal_allnodes_mcast(&addr);
    simple_udp_sendto(&broadcast_connection, message , strlen(message) , &addr);

  }

  PROCESS_END();
}
/*---------------------------------------------------------------------------*/

и приемники:

#include "contiki.h"
#include "lib/random.h"
#include "sys/ctimer.h"
#include "sys/etimer.h"
#include "net/ip/uip.h"
#include "net/ipv6/uip-ds6.h"

#include "simple-udp.h"
#include "net/ip/uip-debug.h"

#include <stdio.h>
#include <string.h>

#define UDP_PORT 1900



static struct simple_udp_connection broadcast_connection;


/*---------------------------------------------------------------------------*/
PROCESS(broadcast_example_process, "UDP broadcast example process");
AUTOSTART_PROCESSES(&broadcast_example_process);
/*---------------------------------------------------------------------------*/
static void
receiver(struct simple_udp_connection *c,
         const uip_ipaddr_t *sender_addr,
         uint16_t sender_port,
         const uip_ipaddr_t *receiver_addr,
         uint16_t receiver_port,
         const uint8_t *data,
         uint16_t datalen)
{
  printf("Data received from ");
  uip_debug_ipaddr_print(sender_addr);
  printf(" on port %d from port %d with length %d: %s \n",
         receiver_port, sender_port, datalen, data);
 /* this line should work,right?*/
   simple_udp_sendto(&broadcast_connection, "hello",5, sender_addr);

}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(broadcast_example_process, ev, data)
{


  PROCESS_BEGIN();
  simple_udp_register(&broadcast_connection, 1900,
                      NULL, 1234,
                      receiver);


  while(1) {
    PROCESS_WAIT_EVENT();




  }

  PROCESS_END();
}
/*---------------------------------------------------------------------------*/

Теперь проблема заключается в ответе отправителю. Я хочу, чтобы каждый узел-получатель ответил отправителю, который отправил ему это сообщение. Я не знаю, как это сделать? simple_udp_sendto() не работает. Могу ли я использовать эту функцию для этой работы? Как мне это использовать?


person rurilifree    schedule 14.06.2016    source источник


Ответы (1)


Обычно у вас есть функция RDC: package_received. При ИТ-триггере вызывается package_received с данными в ptr. Вам просто нужно отправить еще раз, прочитав адрес отправителя.

Изменить: у вас, вероятно, есть package_received на сетевом уровне с той же функцией. Если вы этого не сделаете, вы должны его реализовать.

person Ludovic Guerra    schedule 15.06.2016
comment
printf для отладки. За исключением случаев, когда у вас есть карта с JTAG. Иначе напечатайте переменную. Сделайте тест и проверьте, действительно ли вы получаете. Что именно не работает? Вы просто сказали, что это не работает, но почему это не так? Объясните подробнее вашу проблему. - person Ludovic Guerra; 16.06.2016