Ini adalah variasi ketiga pada tema IP KVM, kali ini konsepnya telah sepenuhnya direvisi, mari kita mulai membangun sesuatu yang baru. Akan ada banyak hal menarik, jangan tinggalkan layar. Perangkat lain yang tidak biasa akan muncul, buang hampir semua komponen lama, kembali ke arduino asli Anda dan mainkan sedikit hacker.
Bagi mereka yang baru saja bergabung, ringkasan episode sebelumnya:
- Artikel pertama
Mengumpulkan IP KVM di Arduino dan Raspberry Pi, ternyata mahal dan dengan kualitas video yang buruk. - Artikel kedua
OrangePI dan Atmega16u2, belajar dengan murah, tetapi kualitas gambar masih menjijikkan.
Dan akhirnya, dalam artikel ini, semua kerugian dari yang sebelumnya akan diperbaiki. Penekanan khusus akan ditempatkan pada pengurangan maksimum dalam biaya komponen.
Secara tradisional, kami mempertimbangkan komponen perangkat yang dirakit:1. Teman lama kami Atmega16u2:
Ini adalah satu-satunya komponen yang akan pindah dari artikel sebelumnya.
2. ESP8266 terkenal, dalam hal ini ESP8266-12e:
Anda dapat menggunakan versi lain dari ESP8266, hanya Anda yang perlu mempertimbangkan jumlah dan lokasi port.
3. Dan, pada kenyataannya, pahlawan acara LKV373A

Berkat perangkat ini, menjadi mungkin untuk mengirimkan video melalui jaringan lokal dengan tinggi
resolusi hingga full-HD.
Rencana tindakan adalah sebagai berikut:
- Sembunyikan dan cari: Kami mencari LKV373A tempat ia bersembunyi di jaringan dengan alamat ip apa
- Game peretas: Isi firmware, setel ulang kata sandi, dan konfigurasikan LKV373A
- Mencari teman baru: ESP8266, Arduino IDE, dan gambar lucu
- Bagian akhir perayaan. Kami menghubungkan semua komponen dan mengirimkan penekanan tombol melalui telnet
Latar Belakang LKV373A
Jadi mari kita mulai! LKV373A atau perangkat HDMI Extender untuk mengambil gambar langsung dari port HDMI dan disiarkan ke jaringan lokal, perangkat ini juga disebut exti HDMI. Seperti yang direncanakan oleh pabrikan, satu set perangkat tersebut harus terdiri dari pemancar (pemancar) dan penerima (penerima), masing-masing menunjuk TX dan RX. Mereka harus digunakan, mungkin, untuk membawa keuntungan lebih banyak kepada produsen, hanya berpasangan. Tetapi ada seorang pria, di bawah nama panggilan Danman, di sini ada
tautan ke blog-nya, yang tertarik dengan cara kerjanya. Dia membuka Wireshark, mengendus lalu lintas yang ditransmisikan oleh perangkat TX, apa yang ternyata?
Aliran video ditransmisikan tanpa enkripsi apa pun, dan menggunakan VLC Player, Anda dapat menontonnya tanpa terlalu banyak usaha. Tapi dia tidak berhenti di situ, "merasa": dia menarik antarmuka web, TTL, telnet, dan bahkan menarik firmware dengan programmer. Dia membicarakan hal ini secara rinci di blog-nya. Firmware yang menarik minat kami juga diunggah di sana: IPTV_TX_PKG_v4_0_0_0_20160427.PKG. Dalam firmware ini, antarmuka web dengan pengaturan lanjutan, dan tidak seperti yang standar, hanya memiliki tombol pembaruan. Selain itu, firmware ini memiliki telnet dengan banyak perintah untuk dikonfigurasi. Dengan firmware ini kami mengkonfigurasi ulang HDMI Extender untuk tugas-tugas kami. Saya memposting firmware dan semua yang saya butuhkan di github, ini
tautannya , kita akan membutuhkannya nanti, tetapi untuk sekarang kita selesai dengan teorinya. Mari kita lanjutkan berlatih.
Pemancar
Kami mencari LKV373A di jaringan
Saya jatuh ke tangan orang yang sama dengan Danman (y). Semua yang akan dijelaskan di bawah ini cocok secara khusus untuk HDMI Extender LKV373A versi V3.0!
Kami menghubungkan LKV373A ke jaringan lokal, nyalakan daya. Sekarang mari kita coba untuk memastikan bahwa perangkat terlihat pada jaringan
ping 192.168.1.238
.
192.168.1.238 adalah alamat IP default. Jika extender tidak mengubah alamat firmware lama, terlepas dari apakah ada server DHCP di jaringan atau tidak. Versi firmware yang lebih baru menggunakan IP secara default hanya jika perangkat tidak dapat memperoleh alamat dari DHCP. Jika Anda menerima respons untuk melakukan ping, lanjutkan. Jika tidak, jangan putus asa, coba sambungkan extender langsung ke port LAN komputer dan gunakan sniffer.
Berkedip
HDMI Extender ditemukan, beralih ke firmware.
Ayo buka github dan unduh semua yang ada di sana. Sekarang buka antarmuka web extender melalui browser dan lihat gambar berikut:

Klik "Browse ...", pilih firmware, file yang disebut IPTV_TX_PKG_v4_0_0_0_20160427.PKG, dan klik "Upgrade". Tadam! Firmware selesai, sekarang terhubung ke LKV373A melalui telnet untuk mereset kata sandi.
Perintah untuk terhubung akan terlihat seperti Telnet 192.168.1.238 9999, di mana 9999 adalah port untuk terhubung. CEP memperingatkan: alamat yang diperoleh dari DHCP dapat ditemukan menggunakan pemindai jaringan.
Terhubung melalui telnet
Saat menghubungkan, pesan berikut akan muncul:
============================== ========IPTV TX Server======== ============================== input>
Kami menulis
list
. Sebagai tanggapan, kami mendapatkan daftar perintah:
============================== ========IPTV TX Server======== ============================== input>list set_group_id get_group_id set_dhcp get_dhcp set_uart_baudrate get_uart_baudrate set_static_ip get_static_ip set_mac_address get_mac_address get_lan_status get_hdcp get_video_lock get_ip_config set_session_key set_device_name get_device_name set_video_bitrate get_video_bitrate set_downscale_mode get_downscale_mode set_video_out_mode get_video_out_mode set_streaming_mode get_streaming_mode get_fw_version get_company_id factory_reset reboot list exit
Untuk mengatur ulang semua pengaturan dan kata sandi, gunakan perintah
factory_reset
. Kami menulis perintah, tekan enter dan dapatkan gambar ini:
input>factory_reset Processing factory reset! System will reboot after few seconds! Connection closed by foreign host.
Antarmuka web
Sekarang kita dapat mengkonfigurasi perangkat sesuai kebutuhan. Mari kita pergi ke antarmuka web. Kami menggunakan login standar: kata sandi admin: 123456 dan ini dia, antarmuka web "incaran" dengan pengaturan tambahan:

Meskipun peluang di antarmuka web telah meningkat, tetapi masih belum cukup untuk tujuan kita. Terutama yang kurang adalah pengaturan yang lebih bebas dalam hal streaming, itu adalah kode-keras, jauh dari yang paling nyaman, daftar alamat IP yang dapat Anda streaming. Tentu saja ada multicast, tetapi lebih baik meninggalkannya untuk televisi. Keterbatasan dapat dielakkan, lebih lanjut tentang itu nanti.
Jadi, mereka menemukan perangkat di jaringan, menggulungnya, mereset kata sandi. Pemancar hampir siap untuk pindah ke penerima.
Penerima
Mari kita putuskan perangkat di bawah kendali sistem operasi mana yang akan kita transmit stream. Saya tidak berpikir Anda akan mengalami pergolakan pilihan, hanya ada dua pilihan:
Windows
Untuk Windows, saya mencoba beberapa pemain, tetapi hasilnya begitu-begitu. Saat menangkap dan kemudian memutar streaming video, penundaan muncul, yang terutama tergantung pada pemain yang memainkan streaming. Pada berbagai pemain, penundaan berkisar dari satu detik, hingga lima atau lebih. Yang terbaik dari semuanya, pada Windows, VLC Player terbukti.
Mari kita mulai bisnis. Luncurkan VLC Player, dari atas di menu tarik-turun "Media", pilih "Buka URL ..." di bidang alamat jaringan, tulis
udp://@:5004
, masukkan daw di kotak centang "Tampilkan pengaturan lanjutan" dan masukkan nilai kami di bidang "Caching", parameter ini ditentukan secara individual. Semakin kecil nilainya di bidang ini, semakin rendah penundaannya, tetapi terlalu kecil nilainya dapat menyebabkan "artefak" dan penurunan bingkai, semuanya akan tergantung pada infrastruktur jaringan lokal. Hasil terbaik yang bisa saya capai adalah penundaan sekitar satu detik. Di Linux, hasilnya jauh lebih baik sekitar 200-300 milidetik.
Linux
Sebagai latihan menunjukkan, hasil terbaik diperoleh dengan menggunakan kombinasi program socat dan mplayer. Ubuntu diinstal di komputer saya, jadi perintah untuk menginstal socat akan terlihat seperti ini:
sudo apt-get install socat
Mplayer diinstal dengan cara yang sama:
sudo apt-get install mplayer
Baiklah, dan ikuti saran Danman:
sudo iptables -t raw -A PREROUTING -p udp -m length --length 28 -j DROP
Perintah ini diperlukan untuk menghapus apa yang disebut "Paket UDP Nol Panjang" dari aliran - paket ukuran nol yang "menyumbat" aliran.
Tayangkan!
Penerima siap, Anda dapat memulai siaran! Kami mengetik di konsol komputer penerima
ifconfig
atau
ipconfig
, tergantung pada sistem operasinya, kami ingat alamat IP penerima dan kembali ke antarmuka web pemancar. Kami akan membuka antarmuka web, jika kami sudah menutupnya, masukkan nama pengguna, kata sandi, dan tulis langsung di bilah alamat peramban:
http:
Ganti alamat IP Anda dan tekan enter. Baris ini akan mengonfigurasi HDMI Extender untuk menyiarkan video yang diambil ke ip pilihan Anda dan mematikan multicast.
Kami memulai VLC di Windows. Atau di terminal Linux kami menulis:
socat UDP-RECV:5004 - | mplayer β
Abra Cadabra! Dan inilah desktop hidup kita, atau bukan milik kita.

Jadi, dengan beberapa metode peretas, kami memaksa perangkat untuk melakukan apa yang kami butuhkan.
Dengan transfer video yang diurutkan, buka remote control.
Kontrol transfer
Pemilihan komponen
Karena biaya HDMI Extender rendah, sekitar 1800 rubel, dan juga karena komentar itu, mereka mengatakan, sedikit mahal, saya mengedepankan slogan: "Berikan IP KVM untuk 2000 rubel!". Nilai tukar rubel akan sangat mempengaruhi kesetiaan pernyataan ini, tapi jangan bicara tentang hal-hal yang menyedihkan, saya ingin percaya pada masa depan yang cerah. Untuk mencapai tujuan, kita akan membutuhkan elemen yang sangat murah, pilihan saya jatuh pada ESP8266 sebagai pengontrol, dan semua Atmega (8/16/32) u2 yang sama sebagai aktuator.
Tentu saja Anda dapat mempertimbangkan kandidat lain untuk peran perangkat eksekutif (keyboard). Firmware yang mengemulasi keyboard ditulis di perpustakaan LUFA (semacam). Perpustakaan ini dapat digunakan untuk seluruh keluarga AVR dengan konektivitas USB. Oleh karena itu sebagai emulator keyboard, Anda dapat mengambil, mungkin lebih murah, mikrokontroler. Ini adalah informasi untuk dipertimbangkan, tetapi sekarang kami melanjutkan.
Anda dapat membeli ESP8266 dengan harga sekitar 90 rubel, Atmega (8/16/32) u2 seharga sekitar 100 rubel, dan bahkan lebih murah jika Anda mengambil dalam batch kecil 5, atau lebih banyak potongan. Tentu saja, bahan habis pakai untuk pengikat mikrokontroler akan dibutuhkan, tetapi biayanya sangat kecil, jadi saya tidak akan mempertimbangkannya.
ESP8266
Keajaiban industri Cina ini tidak perlu diperkenalkan, oleh karena itu saya hanya akan mengatakan bahwa dalam proyek ini saya menggunakan versi ESP8266-12e. Tentu saja, Anda dapat menggunakan versi lain, hanya Anda yang perlu mempertimbangkan lokasi port, karena dalam versi ini, salah satu port ESP8266 digunakan untuk menyalakan Atmega (8/16/32) u2, itu akan ditunjukkan dalam diagram di bawah ini.
Firmware
Firmware untuk ESP8266 ditulis dalam lingkungan ArduinoIDE, jadi mari kita unduh versi terbaru dari
situs pengembang . Selanjutnya Anda perlu menambahkan dukungan untuk ESP8266 - cara termudah dapat ditemukan di
tautan ini. Pada halaman yang sama Anda dapat menemukan banyak informasi berguna, misalnya, skema koneksi daya dan TTL. Bagi mereka yang tidak mutakhir, ESP8266 hanya menggunakan
3,3 volt! Jika Anda tidak yakin dengan kemampuan Anda sendiri, lebih baik menggunakan opsi papan yang disesuaikan untuk USB, seperti NodeMCU:

Jika semuanya siap, buka ArduinoIDE dan salin sketsa saya:
Sketsa #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <SoftwareSerial.h> #include <HIDKeyboard.h> #define MAX_SRV_CLIENTS 3 HIDKeyboard keyboard; const char* host = "esp8266"; const char* ssid = ""; const char* pass = ""; int rebootdev = 0; int modeswitch = 0; // , ESP8266 #define Port1 15 #define Port2 14 #define Port3 12 #define Port4 4 #define Port5 5 // String ColorB1; String ColorB2; String ColorB3; String ColorB4; String ColorB5; ESP8266WebServer server(80); WiFiClient serverClients[MAX_SRV_CLIENTS]; const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form><a href='/'>BACK</a>";//Update // void handleRedirect(){ String content = "<html><head><meta http-equiv='refresh' content='0;/'><head></html>"; server.send(200, "text/html", content); } // WI-FI void handleLogin(){ String msg = ""; if (server.hasArg("SSID") && server.hasArg("PASSAP")){ if ((server.arg("SSID") != NULL) && (server.arg("PASSAP") != NULL)){ String header = "HTTP/1.1 301 OK\r\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); String web_ssid = server.arg("SSID"); String web_pass = server.arg("PASSAP"); ssid = web_ssid.c_str();// C pass = web_pass.c_str(); Serial.println(); Serial.print("SSID "); Serial.println(ssid); Serial.print("Pass "); Serial.println(pass); WiFi.begin(ssid, pass); digitalWrite(LED_BUILTIN, LOW); ESP.reset(); return; } msg = "Wrong ssid/password! try again."; Serial.println("Login Failed"); } String content = "<html><body><form action='/' method='POST'>Enter the access point name and password <br>";// SSID content += "Name AP:<input type='text' name='SSID' placeholder='SSID'><br>"; content += "Password:<input type='password' name='PASSAP' placeholder='password'><br><br>"; content += "<input type='submit' name='SUBMIT' value='Connect to WI-FI'></form><b><font color='red'>" + msg + "</font></b><br>"; content += "Firmware update <a href='/upload'>UPDATE</a></body></html>"; server.send(200, "text/html", content); } void handleNotFound(){ String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET)?"GET":"POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i=0; i<server.args(); i++){ message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); } // int controlPin(int UsePin){ if (UsePin > 0){ int StPort; if (digitalRead(UsePin) == 1) {// digitalWrite(UsePin, LOW); StPort = 0; } else { digitalWrite(UsePin, HIGH); StPort = 1; } digitalWrite(LED_BUILTIN, HIGH);// Serial.print("Port "); Serial.print(UsePin); Serial.print("="); Serial.println(StPort); delay(500); digitalWrite(LED_BUILTIN, LOW); return(StPort); } return(-1); } // int clientConnect(int Seconds){ Serial.print("connection "); for (int i=0; i <= Seconds; i++){ WiFi.begin(ssid, pass); digitalWrite(LED_BUILTIN, LOW); delay(250); digitalWrite(LED_BUILTIN, HIGH); delay(250); Serial.print(" "); Serial.print("."); if (WiFi.status() == WL_CONNECTED) return(0); } return(1); Serial.println(); } void setup(void){ Serial.begin(115200); delay(1000); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); //uint8_t i = 0; if (modeswitch == 0) WiFi.mode(WIFI_STA);// modeswitch = 0 Serial.println(); Serial.println(); if (clientConnect(30) != 0) modeswitch = 1;// if (modeswitch == 1){ Serial.println(""); Serial.println("WiFi switch AP mode"); //WiFi.mode(WIFI_AP_STA); + . WiFi.mode(WIFI_AP); WiFi.softAP("TD", "testtest"); Serial.print("AP mode ip adress "); Serial.println(WiFi.softAPIP()); digitalWrite(LED_BUILTIN, LOW); } if (modeswitch != 1){ WiFiServer server(23); Serial.println(); Serial.print("Client mod ip address: "); Serial.println(WiFi.localIP()); digitalWrite(LED_BUILTIN, LOW); } MDNS.begin(host); pinMode(Port1, OUTPUT); pinMode(Port2, OUTPUT); pinMode(Port3, OUTPUT); pinMode(Port4, OUTPUT); pinMode(Port5, OUTPUT); if (modeswitch == 1){ // server.on("/", handleLogin);// (SSID) // server.on("/upload", HTTP_GET, [](){ server.sendHeader("Connection", "close"); server.send(200, "text/html", serverIndex); }); server.on("/update", HTTP_POST, [](){ server.sendHeader("Connection", "close"); int uperror = Update.hasError(); Serial.printf("UPERR %u\nRebooting...\n",Update.hasError()); if (uperror == 0) server.send(200, "text/html", "Firmware update successfully <a href='/'>BACK</a>"); else server.send(200, "text/html", "Update error <a href='/'>BACK</a>"); ESP.restart(); },[](){ HTTPUpload& upload = server.upload(); if(upload.status == UPLOAD_FILE_START){ Serial.setDebugOutput(true); WiFiUDP::stopAll(); Serial.printf("Update: %s\n", upload.filename.c_str()); if (upload.filename == NULL) { Serial.printf("ERROR: zero file size"); server.send(200, "text/html", "<html> zero file size <a href='/upload'>BACK</a></html>"); return(-1); } uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; if(!Update.begin(maxSketchSpace)){//start with max available size Update.printError(Serial); } } else if(upload.status == UPLOAD_FILE_WRITE){ if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){ Update.printError(Serial); } } else if(upload.status == UPLOAD_FILE_END){ if(Update.end(true)){ //true to set the size to the current progress Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); } else { Update.printError(Serial); } Serial.setDebugOutput(false); } yield(); }); // server.on("/PoRt1", [] { controlPin(Port1); handleRedirect();// }); server.on("/PoRt2", [] { controlPin(Port2); handleRedirect(); }); server.on("/PoRt3", [] { controlPin(Port3); handleRedirect(); }); server.on("/PoRt4", [] { controlPin(Port4); handleRedirect(); }); server.on("/PoRt5", [] { controlPin(Port5); handleRedirect(); }); server.on("/reboot", [] { rebootdev = 1;// handleRedirect(); }); server.onNotFound(handleNotFound);// //server.begin(); MDNS.addService("http", "tcp", 80); Serial.println(); Serial.println("HTTP server started"); } server.begin(); } void loop(void){ uint8_t i; if (modeswitch == 1) server.handleClient(); delay(100); if (modeswitch != 1){ if (WiFi.status() != WL_CONNECTED) clientConnect(30); else { digitalWrite(5, HIGH);// ATMEGA16U2 digitalWrite(LED_BUILTIN, LOW); } } WiFiServer server(23); server.setNoDelay(true); server.begin(); keyboard.begin(); while(WiFi.status() == WL_CONNECTED) { if (server.hasClient()){ for(i = 0; i < MAX_SRV_CLIENTS; i++){ //find free/disconnected spot if (!serverClients[i] || !serverClients[i].connected()){ if(serverClients[i]) serverClients[i].stop(); serverClients[i] = server.available(); Serial.println("New client: "); Serial.print(i); continue; } } //no free/disconnected spot so reject WiFiClient serverClient = server.available(); serverClient.stop(); } //check clients for data for(i = 0; i < MAX_SRV_CLIENTS; i++){ if (serverClients[i] && serverClients[i].connected()){ if(serverClients[i].available()){ //get data from the telnet client and push it to the UART String bufkey; while(serverClients[i].available()) bufkey += (serverClients[i].read());// if (bufkey != 0) { bufkey = bufkey.substring(0, 8);// int key = bufkey.toInt();// switch (key){ case 277980: keyboard.pressSpecialKey(F1); break; case 277981: keyboard.pressSpecialKey(F2); break; case 277982: keyboard.pressSpecialKey(F3); break; case 277983: keyboard.pressSpecialKey(F4); break; case 27914953: keyboard.pressSpecialKey(F5); break; case 27914955: keyboard.pressSpecialKey(F6); break; case 27914956: keyboard.pressSpecialKey(F7); break; case 27914957: keyboard.pressSpecialKey(F8); break; case 27915048: keyboard.pressSpecialKey(F9); break; case 27915049: keyboard.pressSpecialKey(F10); break; case 27915051: keyboard.pressSpecialKey(F11); break; case 27915052: keyboard.pressSpecialKey(F12); break; case 1310: keyboard.pressSpecialKey(ENTER); break; case 130: keyboard.pressSpecialKey(ENTER); break; case 27: keyboard.pressSpecialKey(ESCAPE); break; case 8: keyboard.pressSpecialKey(BACKSPACE); break; case 9: keyboard.pressSpecialKey(TAB); break; case 32: keyboard.pressSpecialKey(SPACEBAR); break; case 27915012: keyboard.pressSpecialKey(INSERT); break; case 27914912: keyboard.pressSpecialKey(HOME); break; case 27915312: keyboard.pressSpecialKey(PAGEUP); break; case 27915212: keyboard.pressSpecialKey(END); break; case 27915412: keyboard.pressSpecialKey(PAGEDOWN); break; case 279167: keyboard.pressSpecialKey(RIGHTARROW); break; case 279168: keyboard.pressSpecialKey(LEFTARROW); break; case 279166: keyboard.pressSpecialKey(DOWNARROW); break; case 279165: keyboard.pressSpecialKey(UPARROW); break; case 127: keyboard.pressSpecialKey(DELETE); break; case 27915112: keyboard.pressSpecialKey(DELETE); break; case 4: keyboard.pressSpecialKey((LCTRL | ALT), DELETE); break; //CTRL+ALT+DELETE Ctrl + d case 6: keyboard.pressSpecialKey(ALT, F4); break; //alt+f4 Ctrl + f case 19: keyboard.pressSpecialKey(ALT | SHIFT); break;// Ctrl+s case 2: keyboard.pressSpecialKey(LCTRL | SHIFT); break;// Ctrl+b // case 17: controlPin(Port1); break;//Ctrl+q case 23: controlPin(Port2); break;//Ctrl+w case 5: controlPin(Port3); break;//Ctrl+e case 18: controlPin(Port4); break;//Ctrl+r case 20: controlPin(Port5); break;//Ctrl+t default: keyboard.pressKey(key); break;// } keyboard.releaseKey();// Serial.print(" string: "); Serial.print(key);// Serial.print(" KEY: "); Serial.write(bufkey.toInt()); bufkey = '0';// } } } } //check UART for data if(Serial.available()){ size_t len = Serial.available(); uint8_t sbuf[len]; Serial.readBytes(sbuf, len); //push UART data to all connected telnet clients for(i = 0; i < MAX_SRV_CLIENTS; i++){ if (serverClients[i] && serverClients[i].connected()){ serverClients[i].write(sbuf, len); delay(1); } } } } }
Hubungkan perpustakaan yang diinginkan:
Pilih tab "Sketsa" β "Sambungkan perpustakaan" β "Tambahkan .ZIP perpustakaan". Pilih perpustakaan yang disebut "UNO-HIDKeyboard-Library-master (mod) .zip", yang diunduh dari github. Kami mengkompilasi dan mengisi firmware. Untuk mengunduh firmware, hubungkan ESP8266 TTL, atur port yang diinginkan di ArduinoIDE. Pengaturan akan terlihat seperti ini:

Untuk mengunduh firmware, Anda perlu membuat hubungan pendek port GPIO0 ke ground, dan me-restart mikrokontroler dengan melakukan hubungan pendek pada port Reset ke ground juga. Saya tidak akan melukis secara detail, agar tidak mengembang artikel, Google akan membantu Anda.
Logika dari ESP8266 adalah sebagai berikut: Ketika daya diterapkan, mikrokontroler mencoba untuk terhubung ke titik akses Wi-Fi selama sekitar tiga puluh detik:
Jika koneksi berhasil : membuka port 23, yang dapat dihubungkan menggunakan telnet dan mengirimkan penekanan tombol. Selain tombol, Anda dapat mentransfer kombinasi yang dibuat di atas "tombol Ctrl +" yang akan menekan kombinasi tertentu. Misalnya, jika Anda meneruskan "Ctrl + d", kombinasi CTRL + ALT + DELETE akan ditekan pada komputer yang dikelola.
Ada juga kombinasi untuk mengendalikan port ESP8266, misalnya, Anda dapat menghubungkan relai dan menggunakan kombinasi "Ctrl + q" untuk menghidupkan dan mematikan relai, dengan demikian nyalakan dan matikan komputer yang dikelola dari jarak jauh. Anda dapat melihat kombinasi ini dan lainnya di sumber.
Jika gagal : ESP8266 beralih ke mode titik akses dengan nama "TD", Kata Sandi "testtest" dan membuka antarmuka web kecil, dapat diakses di 192.168.4.1, di mana Anda dapat mengonfigurasi pengaturan untuk menghubungkan melalui WI-FI.

Dengan demikian, perangkat dapat dengan mudah dihubungkan ke jalur akses lain. Ya, lalat di salep disembunyikan di sini, untuk pengoperasian IP KVM kami, kami akan membutuhkan kabel LAN dan Wi-Fi. Itu akan menjadi biaya untuk murahnya perangkat.
Kami berurusan dengan ESP8266, dengan Atmega16u2 semuanya seperti pada artikel sebelumnya, kami menginstal program Flip, firmware ada di arsip yang diunduh dari github.
Koneksi Komponen
Untuk koneksi komponen yang benar, saya pasang sirkuit. Perlu diingat, ini adalah skema kondisional, ini berfungsi untuk kejelasan dan tidak mengklaim sebagai ideal. Setiap orang bebas untuk "melengkapinya" sesuka hatinya.

Izinkan saya menjelaskan beberapa hal: Transistor dalam diagram diperlukan untuk mengaktifkan Atmega16u2 setelah memuat ESP8266, karena ketika Anda menghidupkan ESP8266, informasi debug ditransmisikan ke semua port TX, dan jika Atmega16u2 dihidupkan dan terhubung ke komputer, aliran data dengan volume yang ditransmisikan pengemudi tidak bisa mengatasinya. Tidak diketahui pasti apa yang terjadi pada saat ini, buffer driver agaknya meluap, efeknya sangat tidak menyenangkan: ratusan tombol ditekan, jika editor teks dibuka, ia mengeluarkan banyak omong kosong, dan semua kunci layanan macet dan akibatnya, bekerja dengan keyboard menjadi tidak mungkin . Untuk menghindari hal ini, Atmega16u2 perlu dinyalakan setelah memuat ESP8266. Dalam firmware, momen ini diperhitungkan.
Tentu saja, ada alternatif untuk skema ini, tetapi ini adalah opsi untuk yang kaya, atau yang malas. Dan omong-omong, opsi ini tidak membatalkan yang di atas:

Dalam gambar, Arduino UNO tanpa chip Atmega328p terhubung ke mitra Cina NodeMCU. Garis 3,3 volt terhubung ke saluran dengan level tegangan yang sama pada Arduino, serta ground dan pin GPIO2 (ESP8266) terhubung ke pin TX pada Arduino.
Pemeriksaan terakhir
Kami terhubung melalui telnet ke port 23 dan memeriksa kinerjanya. Anda dapat melakukan ini: Di ββWindows dengan perintah
telnet [ip- ESP8266]
.
Di Linux akan sedikit lebih rumit:
Perintah
telnet [ip- ESP8266]
maka Anda perlu menekan karakter kontrol, standarnya adalah "Ctrl +]", telnet harus masuk ke mode perintah, kemudian tekan "l" dan "Enter". Dengan tindakan ini, kami akan mengalihkan telnet ke mode simbol.
$ telnet 192.168.***.*** Trying 192.168.***.***... Connected to 192.168.***.***. Escape character is '^]'. ^] telnet> l
Semuanya siap, kita bisa mengecek operasi perangkat yang kita buat. Biarkan saya mengingatkan Anda kemungkinan kombinasi untuk menekan "Alt + Tab", "Ctrl + Alt + Del" dan lain-lain bisa lihat di sketsa. Itu saja, inkarnasi IP KVM DIY ketiga sudah siap.
Untuk meringkas
Pro:
- Mungkin plus yang paling penting adalah harganya, ternyata muat dalam 2000 rubel
- Seharusnya tidak ada keluhan tentang kualitas video, Anda dapat melakukan streaming hingga Full HD tanpa masalah
- Kemampuan untuk memperluas fungsionalitas dengan menambahkan hingga empat relay atau aktuator lainnya.
Cons:
- Perlu terhubung melalui Wi-Fi dan kabel Lan
- Saat digunakan dengan VGA, diperlukan adaptor, yang tentu saja akan memengaruhi biaya
Secara umum, perangkat ini ternyata layak mendapat perhatian, tentu saja, itu bukan pesaing untuk IP KVM serial dengan semua "barang" mereka, tetapi memenangkan banyak harga. Dan untuk penggunaan di rumah, dan mungkin tidak hanya itu, sangat cocok.Saya ingin mengambil kesempatan ini untuk mengucapkan terima kasih kepada pengguna DaylightIsBurning ! Lelaki baik ini menyarankan arah yang tepat untuk menggali.Terima kasih atas perhatian anda
Sampai ketemu lagi!