我在contiki cooja中有一个代码。如图中的1所示,我有2个发送节点和2个接收节点。广播发送者和接收者如下。

#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()不起作用。我可以将此功能用于这项工作吗?我应该怎么用呢?

最佳答案

通常,您具有RDC功能:packet_received。当IT触发时,将使用ptr中的数据调用packet_received。您只需要通过阅读发件人的地址来再次发送即可。

编辑:您可能在网络层上具有相同功能的packet_received。如果不这样做,则应该实现一个。

关于c - 在simple_udp_connection中获得响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37814886/

10-10 14:56