2017-07-30 54 views
0

我正在upd-sink.cudp-sender.ccontiki/examples/ipv6/rpl-collect示例在庫雅的道路。我希望發件人mote將他們的傳感器數據發送到接收器。在udp-sender.c的代碼中,有一個叫做msgstruct,並且這個struct有一個數據字段,稱爲msg,它的類型爲struct collect_view_data_msg類型。我想把我的閱讀傳感器放在味精裏,然後發送到水槽。我該怎麼做?我有一個感測溫度的程序。我想發送s變量作爲按摩到下沉。我想在Cooja中模擬這個網絡。發送閱讀傳感器作爲按摩到匯節點

傳感器方案:

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

功能udp-sender.c程序collect-common-send

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); 
} 

回答

0

您在Cooja使用哪個平臺? (最有可能的sky。)

  1. 的傳感器讀數已經包含在collect視圖消息,如果平臺是sky。如果不是這樣,apps/collect-view/下的收集查看代碼可以很容易地擴展,使用collect-view-template.c作爲基準。
  2. 請勿使用floating point numbers on embedded systems
  3. 如果你真的知道你在做什麼,想用浮點,並希望有ASCII格式的數據,在struct collect_view_data_msg這是一個char陣列,並snprintf創造新的領域的傳感器的值在這一領域。

作爲次要評論,則不需要該代碼:

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

如上所述,sht11_sensor已經在收集視圖應用在該消息中讀出幷包括在內。

+0

我使用天空平臺。你的意思是我在'struct collect-view-data-msg'中添加一個char數組字段,例如'char buf [100]',並且用這種方法把傳感器的值放在它裏面:msg.'mag - > buf = sht11_sensor.value(SHT11_SENSOR_TEMP);'? – sarina

+0

如果這段代碼不需要,我在哪裏激活和停用傳感器? – sarina

+0

在'collect-view/collect-view-sky.c'中查看'collect_view_arch_read_sensors'函數 - 傳感器已經在那裏激活。 – kfx