Jadual Kandungan
Takeaways Key
Server
endpoint
pelanggan
template
senarai Wi-Fi
Butiran Wi-Fi terpilih
JavaScript
persediaan
daemons
panggilan Ajax
Mengemas kini papan pemuka
Soalan Lazim (Soalan Lazim) dalam Membina Papan Pemuka Wi-Fi
Apakah prasyarat untuk membina papan pemuka Wi-Fi? Anda juga perlu mempunyai Node.js dan NPM (Pengurus Pakej Node) yang dipasang pada komputer anda. Jika anda tidak memasangnya, anda boleh memuat turunnya dari laman web rasmi Node.js. Di samping itu, anda memerlukan editor teks untuk menulis kod anda. Anda boleh menggunakan mana-mana editor teks pilihan anda, tetapi beberapa yang popular termasuk kod studio visual, atom, dan teks luhur.
Bagaimana saya boleh menyambung ke rangkaian Wi-Fi menggunakan modul node-wifi? Fungsi 'Sambung' yang boleh anda gunakan untuk menyambung ke rangkaian Wi-Fi. Anda perlu lulus objek ke fungsi ini yang mengandungi SSID dan kata laluan rangkaian. Berikut adalah contoh:
console.log ('berjaya disambungkan ke rangkaian');
Bagaimana saya boleh mendapatkan status Wi-Fi semasa?
Rumah hujung hadapan web tutorial js Cara Membina Papan Pemuka Wi-Fi Menggunakan Node.js dan Ractive.js

Cara Membina Papan Pemuka Wi-Fi Menggunakan Node.js dan Ractive.js

Feb 18, 2025 pm 01:05 PM

Cara Membina Papan Pemuka Wi-Fi Menggunakan Node.js dan Ractive.js

Takeaways Key

  • Gunakan node.js untuk membina pelayan yang memanjangkan fungsi sedia ada untuk memasukkan maklumat rangkaian Wi-Fi, menjadikan papan pemuka lebih komprehensif.
  • Melaksanakan ractive.js untuk pihak klien untuk menguruskan kemas kini dan interaksi masa nyata dengan lebih cekap, meningkatkan pengalaman pengguna dengan kemas kini kandungan dinamik.
  • Proses output arahan Wi-Fi pada pelayan untuk mengekstrak dan memaparkan butiran rangkaian yang tersedia, memastikan data berstruktur dan siap untuk kegunaan klien.
  • Reka bentuk dan gunakan templat HTML dengan ractive.js untuk memaparkan data rangkaian Wi-Fi, membolehkan unsur-unsur web interaktif dan responsif yang meningkatkan navigasi dan kebolehgunaan.
  • memperluaskan keupayaan papan pemuka dengan menambahkan titik akhir baru dan mengendalikan panggilan Ajax dengan berkesan, memastikan papan pemuka tetap berskala dan dikekalkan.
Artikel ini dikaji semula oleh Marc Towler. Terima kasih kepada semua pengulas rakan sebaya SitePoint untuk membuat kandungan SitePoint yang terbaik! Dalam beberapa bulan yang lalu, saya telah menerbitkan siri mini mengenai papan pemuka. Dalam artikel pertama bertajuk "Mencipta Bateri Viz Menggunakan Node.js: Bermula dan Pelayan", saya telah menunjukkan cara membuat pelayan Node.js yang memeriksa status bateri pada komputer riba dan mengembalikan beberapa maklumat berguna. Pada yang kedua, tajuknya adalah "Membuat bateri menggunakan Node.js: Client", saya telah menjelaskan cara membina aplikasi web untuk memvisualisasikan maklumat tersebut dengan cara yang lebih baik dan mesra pengguna. Dalam artikel ini, kami akan membina papan pemuka itu dan menambah maklumat mengenai rangkaian Wi-Fi yang ada. Senarai rangkaian yang ada akan ditunjukkan dengan ringkasan butiran yang paling relevan (nama, alamat, dilindungi vs terbuka, dan sebagainya) dan apabila pemilihan, butiran lanjut rangkaian akan muncul di panel lain. Mengintip matlamat kami: Cara Membina Papan Pemuka Wi-Fi Menggunakan Node.js dan Ractive.js Jika anda mahu, anda boleh menganggapnya sebagai titik permulaan. Saya sangat mencadangkan anda untuk menyesuaikannya kerana ini adalah cara terbaik untuk meningkatkan kemahiran anda dengan teknologi yang akan kami gunakan.

Server

Di sisi pelayan, kami akan menggunakan semula dan memperluaskan apa yang telah kami buat untuk bateri itu. Dalam tutorial ini, kami akan memberi tumpuan kepada Ubuntu tetapi kod pelayan disusun sedemikian rupa sehingga anda perlu menulis hanya beberapa penyesuai untuk menyokong mesin Mac atau Windows.

Bash Command Untuk memulakan, kami melanjutkan kaedah konfigurasi asal dengan menambahkan arahan dan panggilan balik untuk titik akhir baru. Sesetengah penamaan semula telah diperlukan untuk mencegah pertempuran dengan arahan untuk widget bateri.

<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Pemprosesan Output Perintah Cara kami memproses output arahan adalah sama dengan apa yang telah kami lakukan untuk bateri. Kami melalui baris output mengikut baris dan memprosesnya untuk mengekstrak parameter yang bermakna dari bacaan kami. Tetapi dalam kes ini kita mendapat bacaan mengenai senarai item, bukan satu pun! Oleh itu, kita perlu mengenal pasti apabila item baru sebenarnya bermula dalam output, dan buat objek baru untuk setiap item. Kemudian kami akan menapis garisan yang sah, menambah sifat yang kami baca ke item semasa kami.

Sebelum melihat secara terperinci apa yang berlaku di dalam ProcessWifilineForLinux, izinkan saya menyerlahkan beberapa mata:

<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Oleh kerana kami menambah sel ke hash kami hanya apabila keterangan yang akan datang bermula, kami akan terlepas pernyataan akhir jika (untuk menangkap rangkaian terakhir dalam output).
  • Kod di atas mengandaikan bahawa dua sel tidak dapat berkongsi nama yang sama. Ini adalah andaian yang munasabah kerana rangkaian tidak diindeks oleh nama mereka (maklumat itu ditangkap oleh medan Essid). Mereka disenaraikan dan diberikan pengenal progresif
  • "sel 0x"
  • .
  • Perkara terakhir yang kita lakukan sebelum menyimpan sifat adalah panggilan ke MapWifikeySforLinux dan dalam kes ini mereka hanya mengembalikan kunci yang tidak berubah.
Malah fungsi yang memproses setiap baris sangat serupa dengan apa yang telah kami buat untuk bateri: kerana setiap baris memegang nama medan dan nilainya, kami terlebih dahulu memeriksa kes kelebihan yang perlu ditangani dengan cara yang istimewa, dan untuk Baki baris kami hanya memisahkannya dan menyimpan pasangan nilai kunci dengan sewajarnya.
<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Perbincangan ini adalah peluang yang sempurna untuk menunjukkan kepada anda helah yang kemas yang baru -baru ini saya "dipinjam" dari seorang jurutera. Ia akan membolehkan kami menggunakan pernyataan suis dan bukan rantaian IF -Esses.

endpoint

Menambah titik akhir baru ke pelayan kami adalah remeh terima kasih kepada modul HHTP Node dan kaedah penolong yang telah kami buat dalam tutorial sebelumnya. Kami hanya perlu menentukan ekspresi biasa untuk laluan yang ingin kami jawab, dan menambah pernyataan IF ke panggilan balik pelayan, yang dicetuskan pada permintaan masuk:
<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Pada ketika ini semua yang perlu kita lakukan hanyalah membuat panggilan balik yang akan menjalankan arahan, mengubah outputnya dan akhirnya menghantar hasil JSON kepada pelanggan, dibungkus dengan respons HTTP yang disediakan oleh http.createeserver.
<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>
Salin selepas log masuk
Salin selepas log masuk
Untuk langkah terakhir, perhatikan bahawa kami menggunakan semula fungsi onsuccess yang kami telah dengan mudah ditakrifkan untuk titik akhir bateri (perkara yang sama untuk pengendali onerror).

pelanggan

Sekarang, izinkan saya memperkenalkan anda bahagian paling lucu dari contoh ini. Kami akan menggunakan secara besar -besaran ractive.js untuk klien web. Ia adalah rangka kerja yang ringan dan kuat yang menggabungkan pengikatan dua hala (gaya AngularJS) dengan templat HTML (seperti misai atau hendal). Tekanan pada templat (bahkan lebih daripada angularjs, cara lebih daripada bertindak balas), sememangnya salah satu ciri -ciri raktif.js, bersama -sama dengan prestasi yang pantas, hasil daripada enjin pintar yang selalu mengira unsur -unsur dom yang paling kecil disegarkan apabila data berubah. Kami akan menambah dua panel ke papan pemuka kami:
  • satu untuk senarai rangkaian di persekitaran kami (menunjukkan ringkasan ringkas untuk setiap item).
  • Satu lagi yang hanya muncul sekali rangkaian dipilih dan memaparkan maklumat terperinci untuk sambungan Wi-Fi itu.

template

Mari kita mulakan dengan membincangkan templat HTML untuk memaparkan data kami, dan kemudian kita akan melihat bagaimana untuk mengikat data pelayan kepada mereka.

senarai Wi-Fi

Templat yang paling kompleks yang kita perlukan adalah yang menunjukkan senarai rangkaian yang ada. Dozen garis pertama hanya menentukan panel kontena, dan gunakan pengikatan ractive.js untuk menunjukkan peringatan ikon mengenai kesilapan pelayan, dan butang untuk menjeda/menyambung semula pengundian pelayan:
<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>
Salin selepas log masuk
Salin selepas log masuk
The double-stache {{}}, seperti dalam misai dan hendal, adalah penanda untuk kandungan yang disuntik secara dinamik. Ractive.js membolehkan kami menggunakan ekspresi dan menjalankan fungsi di dalam kurungan, selagi fungsi -fungsi tersebut dan data yang digunakan secara global tersedia (math.round, contohnya) atau telah ditambah ke medan data objek JavaScript yang terikat pada templat. Hasil ekspresi di dalam kurungan akan melarikan diri, jadi ia akan menjadi teks biasa. Tetapi kadang -kadang anda mungkin perlu menambah beberapa baris HTML ke unsur -unsur anda. Terdapat cara alternatif untuk melakukannya, tetapi jika anda benar-benar fikir anda memerlukannya, anda boleh menggunakan triple-stache {{{}}}. Menggunakan triple-stache adalah selamat kerana skrip akan melarikan diri dan tidak dilaksanakan, tetapi ia lebih perlahan daripada sisa dua kali, jadi anda harus cuba mengelakkannya sebanyak mungkin.
Bahagian kedua templat adalah lebih menarik. Kami melangkah melalui senarai rangkaian dengan {{#wifinetworks: num}}, menangkap indeks setiap item dalam pembolehubah NUM. Untuk setiap item dalam senarai, kami menambah klik pengendalian panggilan balik (lihat di bawah) dan tunjukkan ringkasan nilainya. Perhatikan bagaimana tag penutup tidak perlu dipadankan dengan tag pembukaan Teks:
<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Pembukaan adalah jika tag yang keadaannya adalah fungsi, yang akan menjadikannya pelik berlari lagi dalam penutupan. Oleh itu, kita boleh menggunakan mesej yang bermakna untuk memasangkan kedua -dua tag, hanya untuk penyelenggaraan.

Butiran Wi-Fi terpilih

<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Panel untuk butiran rangkaian agak mudah: kami hanya menunjukkannya jika kami telah memberikan nilai kepada medan terpilihNetwork dalam objek Ractive kami. Kemudian kami menunjukkan nama rangkaian (medan Essid), dan memaparkan semua pasangan nilai utama yang kami terima dari pelayan. Ini bertujuan untuk mendapatkan gandingan yang paling rendah, tetapi sudah tentu anda boleh mengubahnya untuk menyerlahkan beberapa maklumat atau memaparkannya dengan cara yang lebih bermakna.

JavaScript

Kami akan menyiapkan daemon mengundi yang secara asynchronously menanyakan pelayan pada selang waktu yang diberikan. Setiap panggilan AJAX akan menyediakan senarai rangkaian Wi-Fi yang dikemas kini. Apa yang perlu kita lakukan apabila kami menerima respons JSON dari pelayan, adalah untuk mengakui kami menerima respons yang berjaya dan mengemas kini medan di mana kami menyimpan senarai rangkaian di dalam objek RACTIVE.

persediaan

Seperti yang telah kami tunjukkan dalam artikel sebelumnya, untuk mengikat template ke beberapa data, kita hanya perlu membuat objek raktif baru, mengikatnya dengan id templat (#MetervizTemplate di bawah), dan elemen sasaran, iaitu nod itu akan menjadi ibu bapa templat di pokok dom (panel di bawah). Kemudian kita hanya perlu menambah semua objek atau nilai yang kita mahu gunakan dalam templat sebagai medan ractive.data. Ini boleh dilakukan pada permulaan (seperti di bawah) atau kemudian, menggunakan ractive.set ().
<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>
Salin selepas log masuk
Salin selepas log masuk

daemons

Kami akan menggunakan mekanisme yang sama untuk daemon dan untuk menjeda/memulakan semula pertanyaan pelayan seperti yang kami lakukan untuk bateri. Demi keringkasan kita tidak akan mengulanginya di sini, tetapi jika anda ingin memperdalam topik ini, anda boleh melihat artikel ini atau repositori GitHub.

panggilan Ajax

Satu -satunya perkara yang dilakukan oleh daemon baru kami, adalah membuat panggilan Ajax dan kemudian mengemas kini data kami dalam hal kejayaan atau masalah rangkaian isyarat medan, dalam hal kesilapan.
<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>
Salin selepas log masuk
Salin selepas log masuk
Kami juga harus memeriksa bahawa fail JSON yang kami dapati diformat dengan baik. Kami tidak perlu bimbang tentang suntikan skrip, kerana ractive.js sudah melepaskan nilai medan sebelum menambahkannya ke DOM. Perlu diingat bahawa kaedah jQuery.getjson (), yang akan menjadi jalan pintas untuk kaedah $ .ajax () yang digunakan di atas, selamat selama: 1. Anda tidak memasukkan 'callback =' rentetan dalam URL anda (yang membolehkan kod JSON dilaksanakan).
2. Anda boleh mempercayai pelayan yang anda panggil. Oleh kerana kami tidak menggunakan pengguna yang disediakan kandungan untuk URL, seseorang akan berfikir bahawa ia tidak sepatutnya menjadi kebimbangan. Walau bagaimanapun, jika pelayan kami dikompromikan, maka kami tidak akan mempunyai halangan untuk melindungi kami daripada kod yang disuntik. Jika tajuk 'Datatype' yang jelas tidak ditetapkan, maka JQuery akan cuba meneka kandungan dari respons, dan respons dari pelayan yang berniat jahat mungkin mengandungi kod JavaScript. Walaupun kemungkinan ini tidak begitu biasa, kita tidak dapat memerintah sepenuhnya. Atas sebab ini, ia bukan idea yang buruk menambah lapisan perlindungan tambahan pada harga sedikit lebih menaip.

Mengemas kini papan pemuka

Tambahan yang paling relevan untuk langkah ini ialah kami bertindak balas terhadap klik pada senarai dan tunjukkan butiran untuk rangkaian yang dipilih:
<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>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Untuk melakukan ini, kami mentakrifkan pengendali acara hoc . Seperti yang disebutkan di atas, ia akan dipanggil apabila kita mengklik mana -mana entri senarai, dan kemudian acara yang berkaitan dengan klik akan membawa maklumat mengenai rangkaian yang dipilih itu sendiri. Sekarang, jika kita tidak menggunakan ractive.js, katakan kita hanya menggunakan jQuery, kita perlu:
    panggil kaedah yang akan mengambil ID rangkaian yang dipilih;
  • Gunakannya untuk mencari objek rangkaian untuk ID itu (mungkin disimpan dalam kamus);
  • Cari elemen DOM untuk "Panel Rangkaian yang Dipilih";
  • Keluarkan pokok dom lama di dalam panel dan secara berulang buat senarai baru yang memaparkan persatuan nilai utama, mencampurkan banyak rentetan HTML di dalam kod JavaScript kami.
  • Ractive.js akan menjaga semua ini untuk kita, dan ia akan melakukannya dengan lebih baik daripada yang kita akan (secara purata), mengubah subtree DOM yang paling kecil sahaja. Pertama, objek acara yang dihantar ke pengendali klik pada klik akan mempunyai medan konteks yang mengandungi data yang terikat pada elemen DOM. Dengan kata lain, kami mendapat objek data rangkaian "secara percuma". Sebaik sahaja kita mempunyai itu, satu -satunya perkara yang perlu kita lakukan ialah menggunakannya untuk mengemas kini objek Raktif kita, sudah terikat pada templat. Enjin ractive.js akan melakukan yang lain, mengemas kini DOM dan memaparkan perubahan.
KESIMPULAN Selesai! Kami mempunyai papan pemuka kami "pimped". Seperti yang saya katakan dalam pengenalan, ini hanya titik permulaan.

Sekiranya anda telah mengikuti, anda kini dapat memaparkan senarai item kompleks dengan mudah, mengendalikan pemilihan item, dan berkomunikasi dengan selamat ke pelayan. Anda boleh menggunakan kemahiran ini untuk beberapa tugas lain, tidak semestinya melibatkan paparan statistik untuk komputer riba anda. Dari menunjukkan senarai restoran di sekitar pengguna untuk menghitung peralatan rumah, anda boleh mengawal semua melalui antara muka web atau telefon bimbit anda. Pilihannya adalah milik anda, dan tidak ada had. Sekiranya anda ingin memperdalam topik yang diliputi dalam artikel ini, saya cadangkan anda melihat sumber -sumber yang baik ini:


Membuat bateri menggunakan node.js: Bermula dan pelayan
  • tutorial interaktif mengenai ractive.js
  • jQuery $ .getjson method
  • Perbincangan mengenai StackOverflow mengenai kaedah jQuery.get ()

Soalan Lazim (Soalan Lazim) dalam Membina Papan Pemuka Wi-Fi

Bagaimana saya boleh memasang modul node-wifi? Modul node-wifi menggunakan NPM, yang merupakan pengurus pakej untuk Node.js. Buka terminal anda atau command prompt dan navigasi ke direktori di mana anda ingin memasang modul. Kemudian, jalankan perintah 'NPM Pasang Node-Wifi'. Ini akan memuat turun dan memasang modul nod-wifi dalam direktori semasa anda.

Bagaimana saya boleh menyambung ke rangkaian Wi-Fi menggunakan modul node-wifi? Fungsi 'Sambung' yang boleh anda gunakan untuk menyambung ke rangkaian Wi-Fi. Anda perlu lulus objek ke fungsi ini yang mengandungi SSID dan kata laluan rangkaian. Berikut adalah contoh:

var wifi = memerlukan ('node-wifi');

wifi.connect ({ssid: 'nama rangkaian anda', kata laluan: 'kata laluan anda', fungsi (err) { if (err) { console.log (err); }

console.log ('berjaya disambungkan ke rangkaian');

});


Bagaimanakah saya boleh mengimbas rangkaian Wi-Fi yang tersedia? Fungsi ini mengembalikan pelbagai rangkaian. Setiap rangkaian adalah objek yang mengandungi maklumat seperti SSID, kekuatan isyarat, dan jenis keselamatan. Berikut adalah contoh:

var wifi = memerlukan ('node-wifi');
wifi.scan (fungsi (err, rangkaian) { if (err) { console.log (err);
}
console.log (rangkaian);
var wifi = memerlukan ('node-wifi');

wifi.disconnect (fungsi (err) { if (err) { console.log (err ); } console.log ('berjaya diputuskan dari rangkaian'); });

Bagaimana saya boleh mendapatkan status Wi-Fi semasa?

Modul Node-WiFi menyediakan fungsi 'getCurrentConnections' yang boleh anda gunakan untuk mendapatkan status Wi-Fi semasa. Fungsi ini mengembalikan pelbagai rangkaian bahawa komputer sedang disambungkan ke. Berikut adalah contoh:


var wifi = memerlukan ('node-wifi');
wifi.getCurrentConnections (fungsi (err, currentConnections) { if (err) {
console.log (err);
console.log (currentConnections);
); -Wifi Modul mengikuti corak pengendalian ralat Node.js standard. Semua fungsi mengambil panggilan balik sebagai hujah terakhir. Panggilan balik ini adalah fungsi yang mengambil dua argumen: objek ralat dan hasilnya. Jika ralat berlaku, objek ralat akan mengandungi maklumat mengenai ralat. Jika tidak, objek ralat akan menjadi batal dan hasilnya akan mengandungi hasil operasi. Modul nod-wifi direka untuk berfungsi pada Windows, MacOS, dan Linux. Walau bagaimanapun, fungsi mungkin berbeza-beza antara sistem operasi yang berbeza kerana perbezaan dalam cara mereka menguruskan rangkaian Wi-Fi. Ya, anda boleh menggunakan modul nod-wifi dengan modul Node.js lain. Sebagai contoh, anda boleh menggunakannya dengan modul Express untuk membuat pelayan web yang memaparkan rangkaian Wi-Fi yang tersedia. -Wifi Modul adalah projek sumber terbuka, dan sumbangan adalah dialu-alukan. Anda boleh menyumbang dengan melaporkan pepijat, mencadangkan ciri -ciri baru, meningkatkan dokumentasi, atau kod menulis. Untuk menyumbang, anda boleh menjalin projek di GitHub, membuat perubahan anda, dan kemudian mengemukakan permintaan tarik.

Atas ialah kandungan terperinci Cara Membina Papan Pemuka Wi-Fi Menggunakan Node.js dan Ractive.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1662
14
Tutorial PHP
1262
29
Tutorial C#
1235
24
Demystifying JavaScript: Apa yang berlaku dan mengapa penting Demystifying JavaScript: Apa yang berlaku dan mengapa penting Apr 09, 2025 am 12:07 AM

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Evolusi JavaScript: Trend Semasa dan Prospek Masa Depan Evolusi JavaScript: Trend Semasa dan Prospek Masa Depan Apr 10, 2025 am 09:33 AM

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

Enjin JavaScript: Membandingkan Pelaksanaan Enjin JavaScript: Membandingkan Pelaksanaan Apr 13, 2025 am 12:05 AM

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

JavaScript: meneroka serba boleh bahasa web JavaScript: meneroka serba boleh bahasa web Apr 11, 2025 am 12:01 AM

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Python vs JavaScript: Keluk Pembelajaran dan Kemudahan Penggunaan Python vs JavaScript: Keluk Pembelajaran dan Kemudahan Penggunaan Apr 16, 2025 am 12:12 AM

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend) Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend) Apr 11, 2025 am 08:22 AM

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

Dari C/C ke JavaScript: Bagaimana semuanya berfungsi Dari C/C ke JavaScript: Bagaimana semuanya berfungsi Apr 14, 2025 am 12:05 AM

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend) Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend) Apr 11, 2025 am 08:23 AM

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

See all articles