cnetwork-programmingudpcontiki

Getting response in simple_udp_connection


I have a code in contiki cooja. I have 2 sending nodes and 2 receiving nodes as you can see in the picture1. the broadcast senders and receivers are as follows.

#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();
}
/*---------------------------------------------------------------------------*/

and receivers:

#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();
}
/*---------------------------------------------------------------------------*/

Now the problem is replying to the sender. I want each receiver node reply to the sender which has sent that message to it. I don't know how to do that? simple_udp_sendto() does not work.Can I use this function for this job? How should I use that?


Solution

  • You normally have an RDC function : packet_received. When an IT trigger, packet_received is called with the data in ptr. You just have to send again by reading the address of the sender.

    Edit : you probably have a packet_received on the network layer, with same function. If you don't, you should implements one.