Design wifi parameter reporting

Mon, 13 Feb 2023 15:11:20 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 13 Feb 2023 15:11:20 +0100
changeset 628
32082a19912c
parent 627
6b31403b0662
child 629
dab1a7450a42

Design wifi parameter reporting

thermferm/mqtt.c file | annotate | diff | comparison | revisions
--- a/thermferm/mqtt.c	Sat Oct 01 16:16:36 2022 +0200
+++ b/thermferm/mqtt.c	Mon Feb 13 15:11:20 2023 +0100
@@ -21,6 +21,8 @@
  *****************************************************************************/
 
 #include "thermferm.h"
+#include <sys/ioctl.h>
+#include <linux/wireless.h>
 #include "rdconfig.h"
 #include "devices.h"
 #include "xutil.h"
@@ -1476,9 +1478,12 @@
     FILE		*f;
     char		line[100], *ifname, *c, ip[NI_MAXHOST];
     struct ifaddrs	*ifaddr, *ifa;
-    int			family, s;
+    int			family, s, sock, rssi;
+    struct iwreq	wrq;
+    struct iw_statistics	iwstats;
+    char		essid[IW_ESSID_MAX_SIZE+1];
 
-    if (/*birth && */(f = fopen("/proc/net/route" , "r"))) {
+    if ((f = fopen("/proc/net/route" , "r"))) {
 	while (fgets(line, 100, f)) {
 	    ifname = strtok(line , " \t");
 	    c = strtok(NULL , " \t");
@@ -1509,8 +1514,57 @@
 			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.
+			payload = xstrcat(payload, (char *)"\"");
+
+			/*
+			 * Now detect WiFi on this interface.
+			 */
+			strncpy(wrq.ifr_name, ifa->ifa_name, IFNAMSIZ-1);
+
+			if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+			    syslog(LOG_NOTICE, "Error %d opening INET socket", errno);
+			} else {
+			    if (ioctl(sock, SIOCGIWNAME, &wrq) == 0) {
+				syslog(LOG_NOTICE, "IF: %s", wrq.ifr_name);
+			    }
+
+			    wrq.u.essid.pointer = essid;
+			    if (ioctl(sock, SIOCGIWESSID, &wrq) == -1) {
+				syslog(LOG_NOTICE, "Can't open socket to obtain essid");
+			    } else {
+			    	payload = xstrcat(payload, (char *)",\"ssid\":\"");
+			    	payload = xstrcat(payload, wrq.u.essid.pointer);
+			    	payload = xstrcat(payload, (char *)"\"");
+			    }
+
+			    memset(&iwstats, 0, sizeof(iwstats));
+			    wrq.u.data.pointer = &iwstats;
+			    wrq.u.data.length = sizeof(struct iw_statistics);
+			    wrq.u.data.flags = 1;
+			    if (ioctl(sock, SIOCGIWSTATS, &wrq) == -1) {
+				syslog(LOG_NOTICE, "Can't open socket to obtain iwstats");
+			    } else {
+				syslog(LOG_NOTICE, "Signal level is %d %d %d", iwstats.qual.updated & IW_QUAL_DBM, iwstats.qual.level, iwstats.qual.noise);
+				if ((iwstats.qual.updated & (IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID)) == 0) {
+				    /* iwstats.qual.level is __u8 */
+				    if (iwstats.qual.updated & IW_QUAL_DBM) {
+					rssi = (iwstats.qual.level > 63) ?  iwstats.qual.level - 0x100 : iwstats.qual.level;
+				    } else {
+					/* level seems 0..100% */
+					if (iwstats.qual.level > 90)
+					    rssi = -10;
+					else
+					    rssi = (iwstats.qual.level - 100);
+				    }
+				    payload = xstrcat(payload, (char *)",\"rssi\":");
+				    sprintf(buf, "%d", rssi);
+				    payload = xstrcat(payload, buf);
+				} else {
+				    syslog(LOG_NOTICE, "Signal level is invalid");
+				}
+			    }
+			}
+			payload = xstrcat(payload, (char *)"}");
 		    }
 		}
 
@@ -1522,6 +1576,7 @@
 neterr:
 
     payload = xstrcat(payload, (char *)"}}");
+syslog(LOG_NOTICE, payload);
     if (birth) {
 	topic = topic_base((char *)"NBIRTH");
     	publisher(mosq, topic, payload, true);

mercurial