static PT_THREAD(generate_sensor(struct httpd_state *s)) { static uip_ipaddr_t ipaddr; static node_info_t * node_info = NULL; PSOCK_BEGIN(&s->sout); if(s->query && strncmp(s->query, "ip=", 3) == 0 && uiplib_ipaddrconv(s->query + 3, &ipaddr) != 0) { node_info = node_info_lookup(&ipaddr); if(node_info) { add("<h2>Info</h2>"); #if CETIC_NODE_CONFIG_HAS_NAME if ( node_config_loaded ) { add("Name: %s<br />", node_config_get_name(node_config_find_by_ip(&ipaddr))); } #endif add("IP: "); ipaddr_add(&ipaddr); add("<br />"); add("Model: -<br />"); add("Parent: "); #if CETIC_NODE_CONFIG_HAS_NAME if (node_config_loaded) { add("%s (", node_config_get_name(node_config_find_by_ip(&node_info->ip_parent))); ipaddr_add(&node_info->ip_parent); add(")</a>"); } else #endif { ipaddr_add(&node_info->ip_parent); add("</a>"); } add("<br />"); add("Downward route: %s<br />", node_info_flags_text(node_info->flags & NODE_INFO_HAS_ROUTE) != 0 ? "Yes" : "No"); SEND_STRING(&s->sout, buf); reset_buf(); add("<br /><h2>Statistics</h2>"); add("Since : %d s<br />", (clock_time() - node_info->stats_start) / CLOCK_SECOND); add("Last seen : %d s<br />", (clock_time() - node_info->last_seen) / CLOCK_SECOND); add("Hop count: %d<br />", node_info->hop_count); add("Parent switch: %d<br />", node_info->parent_switch); add("<br /><h3>Upstream</h3>"); add("Last sequence number: %d<br />", node_info->last_up_sequence); add("Messages sent: %d<br />", node_info->messages_sent); add("Messages lost: %d<br />", node_info->up_messages_lost); if(node_info->messages_sent > 0) { add("PRR: %.1f%%<br />", 100.0 * (node_info->messages_sent - node_info->up_messages_lost)/node_info->messages_sent); } else { add("PRR: n/a<br />"); } add("<br /><h3>Downstream</h3>"); add("Last sequence number: %d<br />", node_info->last_down_sequence); add("Messages sent: %d<br />", node_info->replies_sent); add("Messages lost: %d<br />", node_info->down_messages_lost); if(node_info->replies_sent > 0) { add("PRR: %.1f%%<br />", 100.0 * (node_info->replies_sent - node_info->down_messages_lost)/node_info->replies_sent); } else { add("PRR: n/a<br />"); } SEND_STRING(&s->sout, buf); reset_buf(); add("<br /><h2>Actions</h2>"); add("<form action=\"reset-stats\" method=\"get\">"); add("<input type=\"hidden\" name=\"ip\" value=\""); ipaddr_add(&node_info->ipaddr); add("\"/>"); add("<input type=\"submit\" value=\"Reset statistics\"/></form><br />"); add("<form action=\"rm-node\" method=\"get\">"); add("<input type=\"hidden\" name=\"ip\" value=\""); ipaddr_add(&node_info->ipaddr); add("\"/>"); add("<input type=\"submit\" value=\"Delete node\"/></form><br />"); } else { add("Sensor address unknown"); } } else { add("Sensor address missing"); } SEND_STRING(&s->sout, buf); reset_buf(); PSOCK_END(&s->sout); }
static PT_THREAD(generate_sensors_info(struct httpd_state *s)) { static int i; PSOCK_BEGIN(&s->sout); add("<br /><h2>Sensors list</h2>"); add ("<table>" "<theader><tr class=\"row_first\"><td>Node</td><td>Type</td><td>Web</td><td>Coap</td><td>Parent</td><td>Up PRR</td><td>Down PRR</td><td>Last seen</td><td>Status</td></tr></theader>" "<tbody>"); SEND_STRING(&s->sout, buf); reset_buf(); for(i = 0; i < UIP_DS6_ROUTE_NB; i++) { if(node_info_table[i].isused) { add("<tr><td>"); add("<a href=\"sensor?ip="); ipaddr_add(&node_info_table[i].ipaddr); #if CETIC_NODE_CONFIG_HAS_NAME if ( node_config_loaded ) { add("\">%s (", node_config_get_name(node_config_find_by_ip(&node_info_table[i].ipaddr))); ipaddr_add(&node_info_table[i].ipaddr); add(")</a></td>"); } else #endif { add("\">"); ipaddr_add(&node_info_table[i].ipaddr); add("</a></td>"); } if(0) { } else if(node_info_table[i].ipaddr.u8[8] == 0x02 && node_info_table[i].ipaddr.u8[9] == 0x12 && (node_info_table[i].ipaddr.u8[10] == 0x74 || node_info_table[i].ipaddr.u8[10] == 0x75)) { add("<td>Moteiv Telos</td>"); } else if(node_info_table[i].ipaddr.u8[8] == 0x02 && node_info_table[i].ipaddr.u8[9] == 0x1A && node_info_table[i].ipaddr.u8[10] == 0x4C) { add("<td>Crossbow Sky</td>"); } else if(node_info_table[i].ipaddr.u8[8] == 0xC3 && node_info_table[i].ipaddr.u8[9] == 0x0C && node_info_table[i].ipaddr.u8[10] == 0x00) { add("<td>Zolertia Z1</td>"); } else if(node_info_table[i].ipaddr.u8[8] == 0x02 && node_info_table[i].ipaddr.u8[9] == 0x80 && node_info_table[i].ipaddr.u8[10] == 0xE1) { add("<td>STMicro</td>"); } else if(node_info_table[i].ipaddr.u8[8] == 0x02 && node_info_table[i].ipaddr.u8[9] == 0x12 && node_info_table[i].ipaddr.u8[10] == 0x4B) { add("<td>TI</td>"); } else if(node_info_table[i].ipaddr.u8[8] == 0x02 && node_info_table[i].ipaddr.u8[9] == 0x50 && node_info_table[i].ipaddr.u8[10] == 0xC2 && node_info_table[i].ipaddr.u8[11] == 0xA8 && (node_info_table[i].ipaddr.u8[12] & 0XF0) == 0xC0) { add("<td>Redwire Econotag I</td>"); } else if(node_info_table[i].ipaddr.u8[8] == 0x02 && node_info_table[i].ipaddr.u8[9] == 0x05 && node_info_table[i].ipaddr.u8[10] == 0x0C && node_info_table[i].ipaddr.u8[11] == 0x2A && node_info_table[i].ipaddr.u8[12] == 0x8C) { add("<td>Redwire Econotag I</td>"); } else if(node_info_table[i].ipaddr.u8[8] == 0xEE && node_info_table[i].ipaddr.u8[9] == 0x47 && node_info_table[i].ipaddr.u8[10] == 0x3C) { if(node_info_table[i].ipaddr.u8[11] == 0x4D && node_info_table[i].ipaddr.u8[12] == 0x12) { add("<td>Redwire M12</td>"); } else { add("<td>Redwire Unknown</td>"); } } else if((node_info_table[i].ipaddr.u8[8] & 0x02) == 0) { add("<td>User defined</td>"); } else { add("<td>Unknown</td>"); } SEND_STRING(&s->sout, buf); reset_buf(); #if CETIC_6LBR_IP64 && CETIC_NODE_CONFIG if(ip64_addr_is_ip64(&UIP_IP_BUF->srcipaddr)) { node_config_t * config = node_config_find_by_ip(&node_info_table[i].ipaddr); if(config && (nvm_data.eth_ip64_flags & CETIC_6LBR_IP64_SPECIAL_PORTS) != 0) { add("<td><a href=\"http://"); ip4addr_add(ip64_get_hostaddr()); add(":%d/\">web</a></td>", config->http_port); add("<td><a href=\"coap://"); ip4addr_add(ip64_get_hostaddr()); add(":%d/\">coap</a></td>", config->coap_port); } else { add("<td></td><td></td>"); } } else #endif { add("<td><a href=\"http://["); ipaddr_add(&node_info_table[i].ipaddr); add("]/\">web</a></td>"); add("<td><a href=\"coap://["); ipaddr_add(&node_info_table[i].ipaddr); add("]:5683/\">coap</a></td>"); } if(node_info_table[i].messages_received > 0) { add("<td>"); if((node_info_table[i].flags & NODE_INFO_PARENT_VALID) != 0) { #if CETIC_NODE_CONFIG_HAS_NAME if (node_config_loaded) { add("%s (", node_config_get_name(node_config_find_by_ip(&node_info_table[i].ip_parent))); ipaddr_add(&node_info_table[i].ip_parent); add(")"); } else { ipaddr_add(&node_info_table[i].ip_parent); } #else ipaddr_add(&node_info_table[i].ip_parent); #endif } add("</td>"); if((node_info_table[i].flags & NODE_INFO_UPSTREAM_VALID) != 0) { add("<td>%.1f%%</td>", 100.0 * (node_info_table[i].messages_sent - node_info_table[i].up_messages_lost)/node_info_table[i].messages_sent); } else { add("<td></td>"); } if((node_info_table[i].flags & NODE_INFO_DOWNSTREAM_VALID) != 0) { add("<td>%.1f%%</td>", 100.0 * (node_info_table[i].messages_sent - node_info_table[i].down_messages_lost)/node_info_table[i].messages_sent); } else { add("<td></td>"); } } else { add("<td></td><td></td><td></td>"); } add("<td>%d</td>", (clock_time() - node_info_table[i].last_seen) / CLOCK_SECOND); add("<td>%s</td>", node_info_flags_text(node_info_table[i].flags)); add("</tr>"); SEND_STRING(&s->sout, buf); reset_buf(); } } add("</tbody></table><br />"); add("<br /><h2>Actions</h2>"); add("<form action=\"reset-stats-all\" method=\"get\">"); add("<input type=\"submit\" value=\"Reset all statistics\"/></form><br />"); SEND_STRING(&s->sout, buf); reset_buf(); PSOCK_END(&s->sout); }