// Collect data function. Identical to the collect-view-data process, but a function. void collect_data(struct shell_command *c) { struct collect_view_data_msg msg; struct collect_neighbor *n; uint16_t parent_etx; uint16_t num_neighbors; uint16_t beacon_interval; n = collect_neighbor_list_find(&shell_collect_conn.neighbor_list, &shell_collect_conn.parent); if(n != NULL) { parent_etx = collect_neighbor_link_estimate(n); } else { parent_etx = 0; } num_neighbors = collect_neighbor_list_num(&shell_collect_conn.neighbor_list); beacon_interval = broadcast_announcement_beacon_interval() / CLOCK_SECOND; collect_view_construct_message(&msg, &shell_collect_conn.parent, parent_etx, shell_collect_conn.rtmetric, num_neighbors, beacon_interval); shell_output(c, &msg, sizeof(msg), "", 0); }
/*-----------------------------------------------------------------------*/ void collect_common_send(void) { static uint8_t seqno; struct { uint8_t seqno; uint8_t for_alignment; struct collect_view_data_msg msg; uint8_t hop_count; uint8_t lifetime; uint16_t data[72]; } msg; uint16_t parent_etx; uint16_t rtmetric; uint16_t num_neighbors; uint16_t beacon_interval; rpl_parent_t *preferred_parent; rimeaddr_t parent; rpl_dag_t *dag; if(sender_conn == NULL) { return; } memset(&msg, 0, sizeof(msg)); seqno++; if(seqno == 0) { seqno = 128; /* Wrap to 128 to identify restarts */ } msg.seqno = seqno; rimeaddr_copy(&parent, &rimeaddr_null); parent_etx = 0; /* Let's suppose we have only one instance. */ dag = rpl_get_any_dag(); if(dag != NULL) { preferred_parent = dag->preferred_parent; if(preferred_parent != NULL) { uip_ds6_nbr_t *nbr; nbr = uip_ds6_nbr_lookup(&preferred_parent->addr); if(nbr != NULL) { /* Use parts of the IPv6 address as the parent address, * in reversed byte order. */ parent.u8[RIMEADDR_SIZE - 1] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 2]; parent.u8[RIMEADDR_SIZE - 2] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 1]; parent_etx = neighbor_info_get_metric((rimeaddr_t *)&nbr->lladdr)/2; } } rtmetric = dag->rank; beacon_interval = (uint16_t) ((2L << dag->instance->dio_intcurrent) / 1000); num_neighbors = RPL_PARENT_COUNT(dag); } else { rtmetric = 0; beacon_interval = 0; num_neighbors = 0; } collect_view_construct_message(&msg.msg, &parent, parent_etx, rtmetric, num_neighbors, beacon_interval); memset(msg.data, 12, sizeof(msg.data)); // PRINTF("The size of the packet is: %d\n", sizeof(msg)); PRINTF("DATA send NO %d to %d\n", seqno, sink_ipaddr.u8[sizeof(sink_ipaddr.u8) - 1]); // printf("Send a message: %u \n", seqno); uip_udp_packet_sendto(sender_conn, &msg, sizeof(msg), &sink_ipaddr, UIP_HTONS(UDP_SINK_PORT)); // PRINTF("The size of the packet is: %u\n", sizeof(msg)); }
/*---------------------------------------------------------------------------*/ void collect_common_send(void) { static uint8_t seqno; struct { uint8_t seqno; uint8_t for_alignment; struct collect_view_data_msg msg; } msg; /* struct collect_neighbor *n; */ uint16_t parent_etx; uint16_t rtmetric; uint16_t num_neighbors; uint16_t beacon_interval; rpl_parent_t *preferred_parent; rimeaddr_t parent; rpl_dag_t *dag; if(client_conn == NULL) { /* Not setup yet */ return; } memset(&msg, 0, sizeof(msg)); seqno++; if(seqno == 0) { /* Wrap to 128 to identify restarts */ seqno = 128; } msg.seqno = seqno; rimeaddr_copy(&parent, &rimeaddr_null); parent_etx = 0; dag = rpl_get_dag(RPL_DEFAULT_INSTANCE); if(dag != NULL) { preferred_parent = dag->preferred_parent; if(preferred_parent != NULL) { uip_ds6_nbr_t *nbr; nbr = uip_ds6_nbr_lookup(&preferred_parent->addr); if(nbr != NULL) { /* Use parts of the IPv6 address as the parent address, in reversed byte order. */ parent.u8[RIMEADDR_SIZE - 1] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 2]; parent.u8[RIMEADDR_SIZE - 2] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 1]; parent_etx = neighbor_info_get_metric((rimeaddr_t *) &nbr->lladdr) / 2; } } rtmetric = dag->rank; beacon_interval = (uint16_t) ((2L << dag->dio_intcurrent) / 1000); num_neighbors = RPL_PARENT_COUNT(dag); } else { rtmetric = 0; beacon_interval = 0; num_neighbors = 0; } /* num_neighbors = collect_neighbor_list_num(&tc.neighbor_list); */ collect_view_construct_message(&msg.msg, &parent, parent_etx, rtmetric, num_neighbors, beacon_interval); uip_udp_packet_sendto(client_conn, &msg, sizeof(msg), &server_ipaddr, UIP_HTONS(UDP_SERVER_PORT)); }
/*---------------------------------------------------------------------------*/ void collect_common_send(void) { /*For send regular packets*/ static uint8_t seqno; struct { /*Changed*/ uint8_t instance_id; //RPL_SECOND_INSTANCE uint8_t for_alignment; uint8_t seqno; uint8_t for_alignment1; struct collect_view_data_msg msg; } msg; /* struct collect_neighbor *n; */ uint16_t parent_etx; uint16_t rtmetric; uint16_t num_neighbors; uint16_t beacon_interval; rpl_parent_t *preferred_parent; rimeaddr_t parent; rpl_instance_t *instance; //changed rpl_dag_t *dag; if(client_conn == NULL) { /* Not setup yet */ return; } memset(&msg, 0, sizeof(msg)); seqno++; if(seqno == 0) { /* Wrap to 128 to identify restarts */ seqno = 128; } msg.instance_id = RPL_SECOND_INSTANCE ; msg.seqno = seqno; rimeaddr_copy(&parent, &rimeaddr_null); parent_etx = 0; /* Let's suppose we have only one instance */ /*Changed*/ instance = rpl_get_instance(RPL_DEFAULT_INSTANCE); dag = instance->current_dag; if(dag != NULL) { preferred_parent = dag->preferred_parent; if(preferred_parent != NULL) { uip_ds6_nbr_t *nbr; nbr = uip_ds6_nbr_lookup(rpl_get_parent_ipaddr(preferred_parent)); if(nbr != NULL) { /* Use parts of the IPv6 address as the parent address, in reversed byte order. */ parent.u8[RIMEADDR_SIZE - 1] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 2]; parent.u8[RIMEADDR_SIZE - 2] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 1]; parent_etx = rpl_get_parent_rank((rimeaddr_t *) uip_ds6_nbr_get_ll(nbr)) / 2; } } rtmetric = dag->rank; beacon_interval = (uint16_t) ((2L << dag->instance->dio_intcurrent) / 1000); num_neighbors = RPL_PARENT_COUNT(dag); } else { rtmetric = 0; beacon_interval = 0; num_neighbors = 0; } /* num_neighbors = collect_neighbor_list_num(&tc.neighbor_list); */ collect_view_construct_message(&msg.msg, &parent, parent_etx, rtmetric, num_neighbors, beacon_interval); printf ("msg send, %d, %d\n", msg.instance_id, msg.seqno); uip_udp_packet_sendto(client_conn, &msg, sizeof(msg), &server_ipaddr, UIP_HTONS(UDP_SERVER_PORT)); }