Heim >Web-Frontend >js-Tutorial >So erstellen Sie ein Wi-Fi-Dashboard mit node.js und ractive.js
<span>function switchConfigForCurrentOS () { </span> <span>switch(process.platform) { </span> <span>case 'linux': </span> <span>return { </span> <span>batteryCommand: 'upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -E "state|time to empty|to full|percentage"', </span> <span>batteryProcessFunction: processBatteryStdoutForLinux, </span> <span>wifiCommand: 'iwlist wlan0 scanning | egrep "Cell |Address|Channel|Frequency|Encryption|Quality|Signal level|Last beacon|Mode|Group Cipher|Pairwise Ciphers|Authentication Suites|ESSID"', </span> <span>wifiProcessFunction: processWifiStdoutForLinux </span> <span>}; </span> <span>case 'darwin': //MAc OsX </span> <span>... </span> <span>} </span> <span>}</span>
<span>function processWifiStdoutForLinux(stdout) { </span> <span>var networks = {}; </span> <span>var net_cell = ""; </span> <span>var cell = {}; </span> stdout<span>.split('\n').map(trimParam).forEach(function (line) { </span> <span>if (line.length > 0) { </span> <span>//check if the line starts a new cell </span> <span>if (stringStartsWith(line, NET_CELL_PREFIX)) { </span> <span>if (net_cell.length > 0) { </span> networks<span>[net_cell] = mapWifiKeysForLinux(cell); </span> <span>} </span> cell <span>= {}; </span> line <span>= line.split("-"); </span> net_cell <span>= line[0].trim(); </span> line <span>= line[1]; </span> <span>} </span> <span>//Either way, now we are sure we have a non empty line with (at least one) key-value pair </span> <span>// and that cell has been properly initialized </span> <span>processWifiLineForLinux(cell, line); </span> <span>} </span> <span>}); </span> <span>if (net_cell.length > 0) { </span> networks<span>[net_cell] = mapWifiKeysForLinux(cell); </span> <span>} </span> <span>return networks; </span> <span>}</span>Bevor Sie detailliert sehen, was im Inneren processWifilinLinux passiert, lassen Sie mich einige Punkte hervorheben:
<span>function switchConfigForCurrentOS () { </span> <span>switch(process.platform) { </span> <span>case 'linux': </span> <span>return { </span> <span>batteryCommand: 'upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -E "state|time to empty|to full|percentage"', </span> <span>batteryProcessFunction: processBatteryStdoutForLinux, </span> <span>wifiCommand: 'iwlist wlan0 scanning | egrep "Cell |Address|Channel|Frequency|Encryption|Quality|Signal level|Last beacon|Mode|Group Cipher|Pairwise Ciphers|Authentication Suites|ESSID"', </span> <span>wifiProcessFunction: processWifiStdoutForLinux </span> <span>}; </span> <span>case 'darwin': //MAc OsX </span> <span>... </span> <span>} </span> <span>}</span>Diese Diskussion ist die perfekte Chance, Ihnen einen ordentlichen Trick zu zeigen, den ich kürzlich von einem anderen Ingenieur "ausgeliehen" habe. Dadurch können wir eine Switch -Anweisung anstelle einer Kette von If -Elsen verwenden.
<span>function processWifiStdoutForLinux(stdout) { </span> <span>var networks = {}; </span> <span>var net_cell = ""; </span> <span>var cell = {}; </span> stdout<span>.split('\n').map(trimParam).forEach(function (line) { </span> <span>if (line.length > 0) { </span> <span>//check if the line starts a new cell </span> <span>if (stringStartsWith(line, NET_CELL_PREFIX)) { </span> <span>if (net_cell.length > 0) { </span> networks<span>[net_cell] = mapWifiKeysForLinux(cell); </span> <span>} </span> cell <span>= {}; </span> line <span>= line.split("-"); </span> net_cell <span>= line[0].trim(); </span> line <span>= line[1]; </span> <span>} </span> <span>//Either way, now we are sure we have a non empty line with (at least one) key-value pair </span> <span>// and that cell has been properly initialized </span> <span>processWifiLineForLinux(cell, line); </span> <span>} </span> <span>}); </span> <span>if (net_cell.length > 0) { </span> networks<span>[net_cell] = mapWifiKeysForLinux(cell); </span> <span>} </span> <span>return networks; </span> <span>}</span>Zu diesem Zeitpunkt müssen wir nur einen Rückruf erstellen, der den Befehl ausführt, seine Ausgabe transformiert und schließlich das JSON -Ergebnis an den Client sendet, der in die von HTTP.CreateServer bereitgestellte HTTP -Antwort eingewickelt ist.
<span>function processWifiLineForLinux(cell<span>, line</span>) { </span> <span>var key; </span> <span>var val; </span> line <span>= line.trim(); </span> <span>if (line.length > 0) { </span> <span>switch (true) { </span> <span>case stringStartsWith(line, NET_ADDRESS_PREFIX): </span> line <span>= line.split(':'); </span> line<span>.splice(0, 1); </span> <span>//INVARIANT: Address in the format Address: DC:0B:1A:47:BA:07 </span> <span>if (line.length > 0) { </span> cell<span>[NET_ADDRESS_PREFIX] = line.join(":"); </span> <span>} </span> <span>break; </span> <span>case stringStartsWith(line, NET_QUALITY_PREFIX): </span> <span>//INVARIANT: this line must have a similar format: Quality=41/70 Signal level=-69 dBm </span> line <span>= line.split(NET_SIGNAL_PREFIX); </span> cell<span>[NET_QUALITY_PREFIX] = line[0].split("=")[1].trim(); </span> <span>if (line.length > 1) { </span> cell<span>[NET_SIGNAL_PREFIX] = line[1].split("=")[1].trim(); </span> <span>} </span> <span>break; </span> <span>case stringStartsWith(line, NET_EXTRA_PREFIX): </span> <span>//INVARIANT: this line must have a similar format: Extra: Last beacon: 1020ms ago </span> line <span>= line.split(":"); </span> <span>//we can ignore the prefix of the string </span> <span>if (line.length > 2) { </span> cell<span>[line[1].trim()] = line[2].trim(); </span> <span>} </span> <span>break; </span> <span>default: </span> <span>//INVARIANT: the field must be formatted as "key : value" </span> line <span>= line.split(":"); </span> <span>if (line.length > 1) { </span> <span>//Just stores the key-value association, so that coupling with client is reduced to the min: </span> <span>//values will be examined only on the client side </span> cell<span>[line[0].trim()] = line[1].trim(); </span> <span>} </span> <span>} </span> <span>} </span> <span>return cell; </span> <span>}</span>Beachten Sie für den letzten Schritt, dass wir die Onsuccess -Funktion wiederverwendet haben, die wir für den Batterieendpunkt bequem definiert hatten (gleiche Sache für den Onerror -Handler).
<span>var server = http.createServer(function (request<span>, response</span>) { </span> <span>var requestUrl = request.url; </span> <span>var filePath = BASE_URL + requestUrl; </span> <span>if (requestUrl === '/' || requestUrl === '') { </span> response<span>.writeHead(301, </span> <span>{ </span> <span>Location: BASE_URL + 'public/demo.html' </span> <span>}); </span> response<span>.end(); </span> <span>} else if (RE_BATTERY.test(requestUrl)) { </span> <span>getBatteryStatus(response, onBatteryInfo, onError); </span> <span>} else if (RE_NETWORKS.test(requestUrl)) { </span> <span>getWifiStatus(response, onWifiInfo, onError); </span> <span>} </span> <span>... </span> <span>}</span>Der Doppelstache {{}}, wie in Schnurrbart und Lenker, Marker für dynamisch injizierte Inhalte. Ractive.js ermöglicht es uns, Ausdrücke zu verwenden und Funktionen in den Klammern auszuführen, solange diese Funktionen und die verwendeten Daten global verfügbar sind (z. Vorlage. Das Ergebnis des Ausdrucks in den Klammern wird entkommen, daher wird es einfacher Text sein. Aber manchmal müssen Sie möglicherweise nur wenige HTML -Zeilen zu Ihren Elementen hinzufügen. Es gibt eine alternative Möglichkeit, dies zu tun, aber wenn Sie wirklich glauben, dass Sie es brauchen, können Sie den Triple-Stache {{{}}} verwenden. Die Verwendung von Triple-Stache ist sicher, da die Skripte entkommen und nicht ausgeführt werden, aber langsamer als Doppelstachen. Sie sollten also versuchen, es so weit wie möglich zu vermeiden.
<span>function switchConfigForCurrentOS () { </span> <span>switch(process.platform) { </span> <span>case 'linux': </span> <span>return { </span> <span>batteryCommand: 'upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -E "state|time to empty|to full|percentage"', </span> <span>batteryProcessFunction: processBatteryStdoutForLinux, </span> <span>wifiCommand: 'iwlist wlan0 scanning | egrep "Cell |Address|Channel|Frequency|Encryption|Quality|Signal level|Last beacon|Mode|Group Cipher|Pairwise Ciphers|Authentication Suites|ESSID"', </span> <span>wifiProcessFunction: processWifiStdoutForLinux </span> <span>}; </span> <span>case 'darwin': //MAc OsX </span> <span>... </span> <span>} </span> <span>}</span>Das Öffnen ist ein If -Tag, dessen Zustand eine Funktion ist, die es seltsam machen würde, es im Schluss noch einmal zu laufen. So können wir eine aussagekräftige Nachricht verwenden, um die beiden Tags zu kombinieren, nur um Willens willen.
<span>function processWifiStdoutForLinux(stdout) { </span> <span>var networks = {}; </span> <span>var net_cell = ""; </span> <span>var cell = {}; </span> stdout<span>.split('\n').map(trimParam).forEach(function (line) { </span> <span>if (line.length > 0) { </span> <span>//check if the line starts a new cell </span> <span>if (stringStartsWith(line, NET_CELL_PREFIX)) { </span> <span>if (net_cell.length > 0) { </span> networks<span>[net_cell] = mapWifiKeysForLinux(cell); </span> <span>} </span> cell <span>= {}; </span> line <span>= line.split("-"); </span> net_cell <span>= line[0].trim(); </span> line <span>= line[1]; </span> <span>} </span> <span>//Either way, now we are sure we have a non empty line with (at least one) key-value pair </span> <span>// and that cell has been properly initialized </span> <span>processWifiLineForLinux(cell, line); </span> <span>} </span> <span>}); </span> <span>if (net_cell.length > 0) { </span> networks<span>[net_cell] = mapWifiKeysForLinux(cell); </span> <span>} </span> <span>return networks; </span> <span>}</span>Das Panel für die Details des Netzwerks ist recht einfach: Wir zeigen es nur, wenn wir dem Feld SelectedNetwork in unserem raktiven Objekt einen Wert zugewiesen haben. Anschließend zeigen wir den Namen des Netzwerks (das ESSID-Feld) und alle Schlüsselwertpaare, die wir vom Server erhalten haben. Dies soll die niedrigstmögliche Kopplung erhalten, aber Sie können sie natürlich ändern, um einige Informationen hervorzuheben oder sie auf sinnvollere Weise anzuzeigen.
<span>function processWifiLineForLinux(cell<span>, line</span>) { </span> <span>var key; </span> <span>var val; </span> line <span>= line.trim(); </span> <span>if (line.length > 0) { </span> <span>switch (true) { </span> <span>case stringStartsWith(line, NET_ADDRESS_PREFIX): </span> line <span>= line.split(':'); </span> line<span>.splice(0, 1); </span> <span>//INVARIANT: Address in the format Address: DC:0B:1A:47:BA:07 </span> <span>if (line.length > 0) { </span> cell<span>[NET_ADDRESS_PREFIX] = line.join(":"); </span> <span>} </span> <span>break; </span> <span>case stringStartsWith(line, NET_QUALITY_PREFIX): </span> <span>//INVARIANT: this line must have a similar format: Quality=41/70 Signal level=-69 dBm </span> line <span>= line.split(NET_SIGNAL_PREFIX); </span> cell<span>[NET_QUALITY_PREFIX] = line[0].split("=")[1].trim(); </span> <span>if (line.length > 1) { </span> cell<span>[NET_SIGNAL_PREFIX] = line[1].split("=")[1].trim(); </span> <span>} </span> <span>break; </span> <span>case stringStartsWith(line, NET_EXTRA_PREFIX): </span> <span>//INVARIANT: this line must have a similar format: Extra: Last beacon: 1020ms ago </span> line <span>= line.split(":"); </span> <span>//we can ignore the prefix of the string </span> <span>if (line.length > 2) { </span> cell<span>[line[1].trim()] = line[2].trim(); </span> <span>} </span> <span>break; </span> <span>default: </span> <span>//INVARIANT: the field must be formatted as "key : value" </span> line <span>= line.split(":"); </span> <span>if (line.length > 1) { </span> <span>//Just stores the key-value association, so that coupling with client is reduced to the min: </span> <span>//values will be examined only on the client side </span> cell<span>[line[0].trim()] = line[1].trim(); </span> <span>} </span> <span>} </span> <span>} </span> <span>return cell; </span> <span>}</span>
<span>var server = http.createServer(function (request<span>, response</span>) { </span> <span>var requestUrl = request.url; </span> <span>var filePath = BASE_URL + requestUrl; </span> <span>if (requestUrl === '/' || requestUrl === '') { </span> response<span>.writeHead(301, </span> <span>{ </span> <span>Location: BASE_URL + 'public/demo.html' </span> <span>}); </span> response<span>.end(); </span> <span>} else if (RE_BATTERY.test(requestUrl)) { </span> <span>getBatteryStatus(response, onBatteryInfo, onError); </span> <span>} else if (RE_NETWORKS.test(requestUrl)) { </span> <span>getWifiStatus(response, onWifiInfo, onError); </span> <span>} </span> <span>... </span> <span>}</span>Wir sollten auch überprüfen, ob die von uns erhaltene JSON -Datei gut formatiert ist. Wir müssen uns keine Sorgen um die Skriptinjektion machen, da Ractive.js bereits den Feldwerten entgeht, bevor sie sie zum DOM hinzufügen. Es ist erwähnenswert, dass die oben verwendete JQuery.getJson () -Methode, die eine Abkürzung für die $ .ajax () -Methode wäre, sicher ist, solange: 1. Sie geben nicht die Zeichenfolge 'Callback =' in Ihre URL ein (die es ermöglichen würde, dass der JSON -Code ausgeführt wird).
<span>function switchConfigForCurrentOS () { </span> <span>switch(process.platform) { </span> <span>case 'linux': </span> <span>return { </span> <span>batteryCommand: 'upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -E "state|time to empty|to full|percentage"', </span> <span>batteryProcessFunction: processBatteryStdoutForLinux, </span> <span>wifiCommand: 'iwlist wlan0 scanning | egrep "Cell |Address|Channel|Frequency|Encryption|Quality|Signal level|Last beacon|Mode|Group Cipher|Pairwise Ciphers|Authentication Suites|ESSID"', </span> <span>wifiProcessFunction: processWifiStdoutForLinux </span> <span>}; </span> <span>case 'darwin': //MAc OsX </span> <span>... </span> <span>} </span> <span>}</span>Zu diesem Zweck definieren wir einen ad-hoc -Event-Handler. Wie oben erwähnt, wird es aufgerufen, wenn wir auf einen beliebigen Listeneintrag klicken, und dann wird das mit dem Klick zugeordnete Ereignis Informationen über das ausgewählte Netzwerk selbst enthält. Wenn wir nun nicht ractive.js verwenden würden, müssen wir nur JQuery verwenden, wir müssten: rufen Sie eine Methode auf, die die ID des ausgewählten Netzwerks annehmen würde.
Wie kann ich das Knoten-WiFi-Modul installieren? Das Node-Wifi-Modul mit NPM, der ein Paketmanager für node.js. Öffnen Sie Ihr Terminal oder die Eingabeaufforderung und navigieren Sie zum Verzeichnis, in dem Sie das Modul installieren möchten. Führen Sie dann den Befehl „NPM an, Knoten-WiFi“ aus. Dadurch wird das Knoten-WIFI-Modul in Ihrem aktuellen Verzeichnis heruntergeladen und installiert. Eine "Verbindungs" -Funktion, mit der Sie eine Verbindung zu einem Wi-Fi-Netzwerk herstellen können. Sie müssen ein Objekt an diese Funktion übergeben, das die SSID und das Kennwort des Netzwerks enthält. Hier ist ein Beispiel:
if (err) {
console.log (err);
var wifi = require ('node-wifi'); (err);
}
console.log (netzwerke); Das WiFi-Modul bietet eine "Trennung" -Funktion, mit der Sie die Verbindung von einem Wi-Fi-Netzwerk trennen können. Sie müssen keine Argumente an diese Funktion übergeben. Hier ist ein Beispiel:
var wifi = require ('node-wifi'); );
var wifi = require ('node-wifi'); (err); -WIFI -Modul folgt dem Standard -Node.js -Fehlerbehandlungsmuster. Alle Funktionen nehmen einen Rückruf als das letzte Argument ab. Dieser Rückruf ist eine Funktion, die zwei Argumente nimmt: ein Fehlerobjekt und das Ergebnis. Wenn ein Fehler auftritt, enthält das Fehlerobjekt Informationen über den Fehler. Andernfalls ist das Fehlerobjekt null und das Ergebnis enthält das Ergebnis des Vorgangs. Das Knoten-WiFi-Modul ist so konzipiert, dass sie unter Windows, MacOS und Linux funktionieren. Die Funktionalität kann jedoch zwischen verschiedenen Betriebssystemen aufgrund von Unterschieden in der Verwaltung von Wi-Fi-Netzwerken geringfügig variieren. Ja, Sie können das Node-WiFi-Modul mit anderen Node.js-Modulen verwenden. Sie können es beispielsweise mit dem Express-Modul verwenden, um einen Webserver zu erstellen, auf dem die verfügbaren Wi-Fi-Netzwerke angezeigt werden. -WIFI-Modul ist ein Open-Source-Projekt, und Beiträge sind willkommen. Sie können einen Beitrag leisten, indem Sie Fehler melden, neue Funktionen vorschlagen, die Dokumentation verbessern oder Code schreiben. Um einen Beitrag zu leisten, können Sie das Projekt auf GitHub aufgeben, Ihre Änderungen vornehmen und dann eine Pull -Anfrage einreichen.
Das obige ist der detaillierte Inhalt vonSo erstellen Sie ein Wi-Fi-Dashboard mit node.js und ractive.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!