Schrijf je een updateprogramma voor apparaten? Overweeg WebUSB!

Onze rekenmachine is en blijft een evolutief apparaat. We werken continu aan nieuwe functionaliteiten en verbeteringen.

Om die verbeteringen daadwerkelijk te kunnen gebruiken, moesten we ervoor zorgen dat de firmware van onze rekenmachine super makkelijk kan worden geüpdate. Omdat er geen sprake is van over-the-air updates, ontstond een interessante zoektocht naar de beste oplossing, en die ervaring delen we graag natuurlijk.

Onze eisen

  1. Het updaten moet werken vanaf zoveel mogelijk computers en besturingssystemen.
  2. Gebruikers hoeven geen specifieke software te installeren om hun rekenmachine te updaten.
  3. We willen zo weinig mogelijk code schrijven. Minder code, minder bugs.

Wat niet werkte

Voordat we een goede oplossing vonden, hebben we verschillende alternatieven geprobeerd. Die hadden echter hun tekortkomingen.

Gebruik van een native toepassing

Dit is veruit de meest gebruikte strategie, maar helaas voldoet deze slechts aan één van de drie eisen.

  • Gebruikers moeten een specifieke app installeren om hun machine te updaten. Dit werkt mogelijk niet voor sommige gebruikers die geen admin-rechten hebben op hun computer.
  • Lastig om te verspreiden. Er zijn zoveel verschillende binaire platformen dat het moeilijk is om ze allemaal te ondersteunen.
  • Platform specifieke code zal nodig zijn. Er zijn al enkele cross-platform oplossingen zoals Qt en libusb, maar je zult toch op elk besturingssysteem moeten testen en debuggen. En zelfs als libusb goed werk levert, zijn de USB-stacks van Linux, macOS en Windows zo verschillend dat je veel platform-specifieke problemen zult hebben.
  • Meta overflow: gebruikers zullen nu het update-programma moeten updaten.

Gebruik van een web-app met een USB-to-HTTP koppeling

Een compromis is het gebruik van een webapplicatie voor de gebruikersinterface en een kleine native component voor de communicatie met de USB aansluiting. Die component legt een HTTP-API bloot die door de webapplicatie kan worden gebruikt. Dit is een optie die we een tijdje hebben gebruikt, maar uiteindelijk toch besloten om er van af te stappen.

  • HTTPS is afgevallen omdat het niet mogelijk is om een geldig certificaat voor localhost te verzenden.
  • Het is nog steeds lastig om te verspreiden, en het kan zijn dat je nog steeds de API moet updaten (zij het minder vaak dan een GUI app).

WebUSB als beste oplossing

WebUSB is een set van functies waarmee je in JavaScript rechtstreeks kan communiceren met een USB aansluiting vanuit een webbrowser. Het voldoet perfect aan al onze eisen:

Een perfecte match…

  1. Het is beschikbaar op een breed scala aan apparaten en besturingssystemen (Android, Windows, macOS en Linux).
  2. Het werkt meteen op de meeste besturingssystemen, zonder installaties.
  3. We hoeven maar één JavaScript-codebase te schrijven voor alle apparaten en besturingssystemen. Eenvoudiger wordt het niet!

…die ook niet magisch is

  • Technisch gezien is WebUSB een open standaard. Maar alleen Chrome implementeert deze specificatie op dit moment, dus het kan zijn dat eindgebruikers van browser moeten wisselen om hun apparaat te updaten.
  • Het vereist een stuurprogramma op Windows. Dit kan voor sommige versies van Windows worden vermeden als je speciale USB-descriptoren op je apparaat kunt toevoegen. Hoe dan ook, het is niet zo’n groot probleem omdat dit een driver zonder code is. Het is eigenlijk een configuratiebestand dat Windows vertelt: “hé, als je een NumWorks-rekenmachine ziet, koppel hem dan gewoon aan WinUSB zodat Chrome er mee kan communiceren”.
  • iOS-apparaten worden niet ondersteund, maar die zijn zo beveiligd dat het sowieso een verloren strijd was.

Bedankt!

WebUSB is opgenomen in Chrome 61 dat in september 2017 beschikbaar is gemaakt. Dit is een zeer nuttige toevoeging aan het web en we willen Reilly Grant en Ken Rockot van Google bedanken voor dit initiatief.

Het voldoet aan al onze eisen en is een perfecte keuze voor ons, en het zou ons niet verbazen als het vrij populair zou worden voor soortgelijke toepassingen. Als je het wilt proberen, kun je naar onze Workshop gaan en hier je rekenmachine direct vanuit je browser updaten!