thermferm/mqtt.c

changeset 549
ee1bcad035f0
parent 548
2924fe4911d9
child 550
04c942cded91
--- a/thermferm/mqtt.c	Fri Jul 20 21:37:45 2018 +0200
+++ b/thermferm/mqtt.c	Sat Jul 21 20:40:02 2018 +0200
@@ -634,8 +634,59 @@
 	}
 	payload = xstrcat(payload, (char *)"}");
     }
+
+    /*
+     * Find our network information
+     */
+    FILE		*f;
+    char		line[100], *ifname, *c, ip[NI_MAXHOST];
+    struct ifaddrs	*ifaddr, *ifa;
+    int			family, s;
+
+    if (birth && (f = fopen("/proc/net/route" , "r"))) {
+	while (fgets(line, 100, f)) {
+	    ifname = strtok(line , " \t");
+	    c = strtok(NULL , " \t");
+
+	    // Take the entry with destination '00000000'
+	    if (ifname != NULL && c != NULL && (strcmp(c , "00000000") == 0)) {
+
+		if (getifaddrs(&ifaddr) == -1) {
+		    syslog(LOG_NOTICE, "error getifaddrs error %d", errno);
+		    goto neterr;
+		}
+
+		//Walk through linked list, maintaining head pointer so we can free list later
+		for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
+		    if (ifa->ifa_addr == NULL) {
+			continue;
+		    }
+
+		    family = ifa->ifa_addr->sa_family;
+
+		    if ((strcmp( ifa->ifa_name, ifname) == 0) && (family == AF_INET)) {
+			s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
+			if (s != 0) {
+			    syslog(LOG_NOTICE, "getnameinfo() error=%d for %s", errno, ifname);
+			    goto neterr;
+			}
+			payload = xstrcat(payload, (char *)",\"net\":{\"address\":\"");
+			payload = xstrcat(payload, ip);
+			payload = xstrcat(payload, (char *)"\",\"ifname\":\"");
+			payload = xstrcat(payload, ifname);
+			payload = xstrcat(payload, (char *)"\",\"rssi\":0}");
+			// TODO: get rssi if wlan interface.
+		    }
+		}
+
+		freeifaddrs(ifaddr);
+	    }
+	}
+	fclose(f);
+    }
+neterr:
+
     payload = xstrcat(payload, (char *)"}}");
-
     if (birth)
     	publisher(mosq, topic_base((char *)"NBIRTH"), payload, true);
     else

mercurial