Preskoči na sadržaj
Tirkizni crtež na tamnoj mreži: dva prazna okvira lijevo spajaju se u jedan veći, blago ispunjen okvir; iz njega jedna vodoravna linija ide udesno, prolazi kroz malu tačku sa nišanskim krstom i završava kod tri uske trake složene jedna na drugu.

„Most je cijeli posao.“

Čipovi pasoša i platni terminali, iz React Nativea

Dva angažmana, dvije vrste hardvera, jedan pristup: napiši protokol nativno, izloži ga jednom, i pusti JavaScript da ostane neupućen u oboje.

Kontaktirajte nas
Dva angažmana · njemačka finansijska institucija, 2020 · prekogranične uplate, 2022 · oba preko agencije
2 → 1
platforme, jedna implementacija protokola
100+
terminala ažurirano preko mreže
5 min
ponovni pokušaj kad ažuriranje padne
Ukratko

Dvaput smo morali natjerati React Native da razgovara sa hardverom za koji nije postojala biblioteka vrijedna upotrebe: NFC čip u njemačkom pasošu, i kineski platni terminal na Androidu.

Oba puta odgovor je imao isti oblik — implementiraj protokol u jeziku platforme, izloži uzak sloj JavaScriptu, i ne daj detalju platforme da se prelije naviše. Razlikuje se ono što je hardver zahtijevao.

Problem

React Native je izvrstan dok ti ne zatreba nešto što platforma radi a JavaScript ne vidi. Čitanje e-pasoša nije poziv API-ja nego protokol — ICAO 9303, sa autentikacijskim rukovanjem prije nego čip bilo šta izgovori — a 2020. nije postojala upotrebljiva biblioteka za to.

Ograničenje

Terminal je bio teži: kineski uređaj čija je SDK dokumentacija bila oskudna i napisana na španskom, pa smo je prevodili da bismo uopšte mogli raditi. U oba slučaja most je cijeli posao — pogriješiš li sloj, svaka buduća funkcija to plaća.

Šta smo uradili

  1. Protokol čipa u Javi, isti u Swiftu

    Implementiran za Android, pa prenesen na iOS i izložen React Nativeu kroz Turbo Module — tada još eksperimentalni dio nove arhitekture, sa ručnom registracijom i tankom dokumentacijom.

    Jedan protokol, dvije platforme
  2. Port je važniji od implementacije

    Dvije nezavisne implementacije takvog protokola se razilaze: počnu različito tretirati granične slučajeve, i onda isti pasoš prođe na jednom telefonu a padne na drugom. U verifikaciji identiteta to nije kozmetička nekonzistentnost — to je nejednako postupanje prema osobi koja drži dokument.

    Isti pasoš, isti ishod
  3. Terminal izložen, pa zaključan

    Kartica, štampač i hardver izloženi kroz Turbo Module u Javi. Onda launcher u Kotlinu koji je zamijenio Android početni ekran i zaključao uređaj na jednu aplikaciju. Na uređaju koji isplaćuje novac to je odluka o kontroli, ne o izgledu: osoba za šalterom ne smije moći otvoriti pregledač, instalirati nešto ili promijeniti postavku.

    Jedna aplikacija, bez izlaza
  4. Isplatilo se dvaput — ažuriranje preko mreže

    Uređaj zaključan na aplikaciju koju kontrolišete može se ažurirati na daljinu. Preko sto terminala ažurirano je bez ijednog izlaska na terensku lokaciju — aplikacija provjeri objektno skladište za novu verziju, a ako ažuriranje padne ne dogodi se ništa: nastavi raditi i ponovi pokušaj svakih pet minuta dok ne uspije. Svaki terminal je registrovan u admin ploči koja prikazuje njegovu aktivnost od trenutka povezivanja do toga ko je izdao koji kupon.

    100+ terminala, nula izlazaka
  5. Termalni ispis: štampač ne zna za slike

    Štampač računa ne zna za slike, fontove ni raspored — prima tačke. Logo mora postati bitmapa i biti pozicioniran ručno, u jedinicama papira, bez ikakvog pregleda. Zvuči trivijalno dok ne probaš, i može se odraditi samo štampanjem i mjerenjem.

    Štampaj i mjeri
DVIJE VRSTE HARDVERA, TRI ZAHTJEVA
Pasoš protokol, ne API

ICAO 9303 sa autentikacijskim rukovanjem prije nego čip bilo šta izgovori. Implementiran u Javi, prenesen u Swift, izložen kroz Turbo Module. Dekodiranje pročitanih podataka radio je vanjski servis — naše je bilo čitanje sa čipa.

Isti oblik rješenja svaki put: protokol u jeziku platforme, uzak sloj prema JavaScriptu, detalj koji se ne prelijeva naviše.

Rezultat

  • Kriptografski potpisani podaci pasoša pročitani sa čipa, na obje platforme, iz jedne implementacije protokola
  • Preko 100 platnih terminala zaključanih na jednu aplikaciju i ažuriranih preko mreže
  • Neuspjelo ažuriranje ne košta ništa: terminal nastavlja raditi i ponavlja pokušaj

Šta bismo uradili drugačije

Java implementaciju smo na Swift prenijeli ručno i provjerili testiranjem. Ono što je trebalo napraviti jesu dijeljeni testni vektori protokola — poznati ulazi i očekivani izlazi — pušteni protiv obje implementacije. Testirati da se ponašaju isto nije isto što i testirati da su ispravne, a mi smo uradili prvo vjerujući da smo uradili drugo.

Srodno
Verifikacija identiteta za njemačke finansijeGdje pročitani čip postaje dokaz o osobi.Pet problema i sistem koji ih rješavaIsti princip: split platforme živi ispod mjesta poziva.
Svih 18 projekata
  • Java
  • Kotlin
  • Swift
  • Turbo Modules
  • React Native
  • Android
  • NFC / ICAO 9303

Imate hardver koji JavaScript ne vidi?

Kontaktirajte nas

Sistemi koji ne smiju stati — od arhitekture do produkcije.

© 2026 Micro Tech, Sarajevo