# HG changeset patch # User Michiel Broek # Date 1676297480 -3600 # Node ID 32082a19912c52f76bdbc52d49e7ca2570424c7f # Parent 6b31403b06621c6155e9b777cf34d436b3f1df5f Design wifi parameter reporting diff -r 6b31403b0662 -r 32082a19912c thermferm/mqtt.c --- 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 +#include #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);