2017-07-30 6 views
0

Je travaille dans upd-sink.c et udp-sender.c exemples de contiki/examples/ipv6/rpl-collect chemin dans Cooja. Je veux que le mote émetteur envoie ses données de capteur à couler. Dans le code udp-sender.c, il y a un struct appelé msg et ce struct a un champ de données appelé msg qui est de type struct collect_view_data_msg. Je veux mettre mon capteur de lecture dans msg et envoyer à couler. Comment est-ce que je fais ceci? J'ai un programme pour détecter la température. Je veux envoyer s variable comme massage pour couler. Je veux juste simuler ce réseau à Cooja.Envoi capteur de lecture en tant que massage pour évier noeud

Le programme du capteur:

PROCESS(sensor_acq_process,"Sensor Acquisition"); 
AUTOSTART_PROCESSES(&sensor_acq_process); 
PROCESS_THREAD(sensor_acq_process,ev,data) 
{ 
    static struct etimer et; 
    static int val; 
    static float s = 0; 
    static int dec; 
    static float frac; 

    PROCESS_BEGIN(); 

    printf("Starting Sensor Example.\n"); 

    while(1) 
    { 
    etimer_set(&et, CLOCK_SECOND * 2); 
    SENSORS_ACTIVATE(sht11_sensor); 

    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 

    val = sht11_sensor.value(SHT11_SENSOR_TEMP); 
    if(val != -1) 
    { 
    s = ((0.01*val) - 39.60); 
    dec = s; 
    frac = s - dec; 
    printf("\nTemperature=%d.%02u C (%d)\n", dec, (unsigned int)(frac * 100),val);    
    }  

    etimer_reset(&et); 
    SENSORS_DEACTIVATE(light_sensor); 
    SENSORS_DEACTIVATE(sht11_sensor); 
    } //end of while 

    PROCESS_END(); 
} 

Fonction collect-common-send de udp-sender.c programme:

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; 
    linkaddr_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; 

    linkaddr_copy(&parent, &linkaddr_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(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[LINKADDR_SIZE - 1] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 2]; 
     parent.u8[LINKADDR_SIZE - 2] = nbr->ipaddr.u8[sizeof(uip_ipaddr_t) - 1]; 
     parent_etx = rpl_get_parent_rank((uip_lladdr_t *) uip_ds6_nbr_get_ll(nbr))/2; 
     } 
    } 
    rtmetric = dag->rank; 
    beacon_interval = (uint16_t) ((2L << dag->instance->dio_intcurrent)/1000); 
    num_neighbors = uip_ds6_nbr_num(); 
    } 
    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); 
    //i add this code but it led to an error:invalid type argument 
    //of'->'(have 'struct collect_view_data_msg') 

    SENSORS_ACTIVATE(sht11_sensor); 
    msg.msg->sensors[TEMP_SENSOR] = sht11_sensor.value(SHT11_SENSOR_TEMP); 
    //end added 

    uip_udp_packet_sendto(client_conn, &msg, sizeof(msg), 
     &server_ipaddr, UIP_HTONS(UDP_SERVER_PORT)); 

    SENSORS_DEACTIVATE(sht11_sensor); 
} 

Répondre

0

Quelle plate-forme pour que vous utilisez dans Cooja? (Très probablement sky.)

  1. Les lectures du capteur sont déjà inclus dans le message de vue Collect si la plate-forme est sky. Si ce n'est pas le cas, le code de collecte sous apps/collect-view/ peut être facilement étendu faire cela en utilisant collect-view-template.c comme base.
  2. N'utilisez pas floating point numbers on embedded systems.
  3. Si vous savez vraiment ce que vous faites, voulez utiliser le point flottant, et que vous voulez avoir des données au format ASCII, créez un nouveau champ dans le struct collect_view_data_msg qui est un tableau char, et snprintf la valeur du capteur dans ce champ .

Comme un commentaire mineur, ce code n'est pas nécessaire:

SENSORS_ACTIVATE(sht11_sensor); 
msg.msg->sensors[TEMP_SENSOR] = sht11_sensor.value(SHT11_SENSOR_TEMP); 
... 
SENSORS_DEACTIVATE(sht11_sensor); 

Comme mentionné précédemment, le sht11_sensor est déjà lu et inclus dans le message dans l'application de vue Collect.

+0

J'utilise une plate-forme sky.Vous voulez dire que j'ajoute un champ de tableau char dans 'struct collect-view-data-msg' par exemple' char buf [100] 'et y place la valeur du capteur: msg.'mag -> buf = sht11_sensor.value (SHT11_SENSOR_TEMP); '? – sarina

+0

Et si ce code pièce n'est pas nécessaire, où j'active et désactive le capteur? – sarina

+0

Voir la fonction 'collect_view_arch_read_sensors' dans' collect-view/collect-view-sky.c' - le capteur y est déjà activé. – kfx