thermferm/mqtt.c

changeset 549
ee1bcad035f0
parent 548
2924fe4911d9
child 550
04c942cded91
equal deleted inserted replaced
548:2924fe4911d9 549:ee1bcad035f0
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

mercurial