632 sprintf(buf, "%.1f", Config.hum_value / 1000.0); |
632 sprintf(buf, "%.1f", Config.hum_value / 1000.0); |
633 payload = xstrcat(payload, buf); |
633 payload = xstrcat(payload, buf); |
634 } |
634 } |
635 payload = xstrcat(payload, (char *)"}"); |
635 payload = xstrcat(payload, (char *)"}"); |
636 } |
636 } |
|
637 |
|
638 /* |
|
639 * Find our network information |
|
640 */ |
|
641 FILE *f; |
|
642 char line[100], *ifname, *c, ip[NI_MAXHOST]; |
|
643 struct ifaddrs *ifaddr, *ifa; |
|
644 int family, s; |
|
645 |
|
646 if (birth && (f = fopen("/proc/net/route" , "r"))) { |
|
647 while (fgets(line, 100, f)) { |
|
648 ifname = strtok(line , " \t"); |
|
649 c = strtok(NULL , " \t"); |
|
650 |
|
651 // Take the entry with destination '00000000' |
|
652 if (ifname != NULL && c != NULL && (strcmp(c , "00000000") == 0)) { |
|
653 |
|
654 if (getifaddrs(&ifaddr) == -1) { |
|
655 syslog(LOG_NOTICE, "error getifaddrs error %d", errno); |
|
656 goto neterr; |
|
657 } |
|
658 |
|
659 //Walk through linked list, maintaining head pointer so we can free list later |
|
660 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { |
|
661 if (ifa->ifa_addr == NULL) { |
|
662 continue; |
|
663 } |
|
664 |
|
665 family = ifa->ifa_addr->sa_family; |
|
666 |
|
667 if ((strcmp( ifa->ifa_name, ifname) == 0) && (family == AF_INET)) { |
|
668 s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); |
|
669 if (s != 0) { |
|
670 syslog(LOG_NOTICE, "getnameinfo() error=%d for %s", errno, ifname); |
|
671 goto neterr; |
|
672 } |
|
673 payload = xstrcat(payload, (char *)",\"net\":{\"address\":\""); |
|
674 payload = xstrcat(payload, ip); |
|
675 payload = xstrcat(payload, (char *)"\",\"ifname\":\""); |
|
676 payload = xstrcat(payload, ifname); |
|
677 payload = xstrcat(payload, (char *)"\",\"rssi\":0}"); |
|
678 // TODO: get rssi if wlan interface. |
|
679 } |
|
680 } |
|
681 |
|
682 freeifaddrs(ifaddr); |
|
683 } |
|
684 } |
|
685 fclose(f); |
|
686 } |
|
687 neterr: |
|
688 |
637 payload = xstrcat(payload, (char *)"}}"); |
689 payload = xstrcat(payload, (char *)"}}"); |
638 |
|
639 if (birth) |
690 if (birth) |
640 publisher(mosq, topic_base((char *)"NBIRTH"), payload, true); |
691 publisher(mosq, topic_base((char *)"NBIRTH"), payload, true); |
641 else |
692 else |
642 publisher(mosq, topic_base((char *)"NDATA"), payload, false); |
693 publisher(mosq, topic_base((char *)"NDATA"), payload, false); |
643 |
694 |