Versie 0.8.2. Node NBIRTH payload heeft nu netwerk informatie.

Sat, 21 Jul 2018 20:40:02 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 21 Jul 2018 20:40:02 +0200
changeset 549
ee1bcad035f0
parent 548
2924fe4911d9
child 550
04c942cded91

Versie 0.8.2. Node NBIRTH payload heeft nu netwerk informatie.

configure file | annotate | diff | comparison | revisions
configure.ac file | annotate | diff | comparison | revisions
thermferm/mqtt.c file | annotate | diff | comparison | revisions
thermferm/thermferm.h file | annotate | diff | comparison | revisions
--- a/configure	Fri Jul 20 21:37:45 2018 +0200
+++ b/configure	Sat Jul 21 20:40:02 2018 +0200
@@ -2035,7 +2035,7 @@
 
 
 PACKAGE="mbsePi-apps"
-VERSION="0.8.1"
+VERSION="0.8.2"
 COPYRIGHT="Copyright (C) 2014-2018 Michiel Broek, All Rights Reserved"
 CYEARS="2014-2018"
 
--- a/configure.ac	Fri Jul 20 21:37:45 2018 +0200
+++ b/configure.ac	Sat Jul 21 20:40:02 2018 +0200
@@ -8,7 +8,7 @@
 dnl General settings
 dnl After changeing the version number, run autoconf!
 PACKAGE="mbsePi-apps"
-VERSION="0.8.1"
+VERSION="0.8.2"
 COPYRIGHT="Copyright (C) 2014-2018 Michiel Broek, All Rights Reserved"
 CYEARS="2014-2018"
 AC_SUBST(PACKAGE)
--- 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
--- a/thermferm/thermferm.h	Fri Jul 20 21:37:45 2018 +0200
+++ b/thermferm/thermferm.h	Sat Jul 21 20:40:02 2018 +0200
@@ -20,6 +20,7 @@
 #include <sys/time.h>
 #include <sys/un.h>
 #include <sys/utsname.h>
+#include <ifaddrs.h>
 #include <time.h>
 #include <fcntl.h>
 #include <syslog.h>

mercurial