Warstwa komunikacji dla WebAssembly?

0

Chciałem zrobić jakiś prosty eksperyment Qt WebAssembly gdzie aplikacja WebAssembly wymienia dane z serwerem w obie strony np. prosty interfejs do sterowania piecem centralnego ogrzewania :D

WebAssembly ma spore ograniczenia w komunikacji :(
Jedyne sensowne to websocket

Ktoś moze polecić jakiś sprytny sposób opakowywania danych/metod aby można było to przekazać za pomocą websocket ?
thrift raczej mi nie pomoże, wstępne poszukiwania na github sugerują wampcc https://github.com/darrenjs/wampcc

ale jestem otwarty na inne biblioteki

1

Ciekawie wygląda Websocket++ łatwo kontekst ssl ustawić z wygenerowanego klucza, bindy do eventów, wygląda elegancko jak na C++, dużo examplów żeby szybko się odnaleźć.
https://github.com/jmossberg/websocketpp-examples/blob/master/websocketpp_server.cpp

Ale też nie za dużo powiedziałeś o architekturze.
Chcesz zrobić coś w stylu serwer C++, który serwuje pliki wasm/js/html/css po http/https, a z drugiej strony serwer, który nadsłuchuje na websocketach i robi komunikację z aplikacją w przeglądarce, a potem jakieś połączenie z urządzeniem embedded.

Z weba można bezpośrednio do usb się podpiąć, to można się obejść bez serwera po usb -> uart i na mikrokontrolerze jakiś parser i obsługa komend.
Chyba, że masz z embedded urządzeniem komunikację po tcp/ip bo masz typu IoT, jakieś esp32 lub rpi.

Nie wiem też jak tam z tym QT w wasm, na pewno surowego tcp/ip połączenia nie będą możliwe, ale dalej możesz http jakieś rest POST, GET, DELETE i ewentualnie EventSource.

1

WebAssembly ma spore ograniczenia w komunikacji :(

Przeglądarka ma dostęp do pamięci WebAssembly, więc możesz przekazać ze swojej apki bufor - albo z automatu jeśli masz odpowiednie bindingi, albo po prostu przekazując dwie liczby: pointer i długość bufora i ręcznie utworzyć po stronie JS tablicę typowaną:

// zakładam, że wasm to twoja instancja wasm
const myArray = new Uint8Array(wasm.memory.buffer, pointer, length); // pointer i length musisz pobrać z twojej apki Wasm

i na tym etapie możesz zrobić z tym w JS, co chcesz (np. wysłać przez socket), a w buforze też może być wszystko (mógłbyś nawet do JSON zserializować te dane w C++, odebrać w JS i użyć TextDecoder do zamiany tablicy bajtów na stringa (albo skorzystać z bindingów, które ci same odbiorą te dane z Wasm i zamienią na JSowe obiekty)

Czyli:

  • wystawiasz interfejs dla przeglądarki w C++ (ja robiłem w Rust akurat)
  • przeglądarka odbiera bufor
  • robisz co chcesz po stronie JS
0

Architektura po stronie serwera:

  • urządzenie embedded z systemem operacyjnym Linux
  • aplikacja na urządzeniu napisana w C++, GUI w Qt
  • użytkownik używa ekranu dotykowego i/albo klawiatury membranowej

Co bym chciał uzyskać za pomocą "WebAssembly w Qt":

  • chciałbym dodać dodatkowy interfejs administracyjno/serwisowy dla zaawansowanych użytkowników aby mogli zmienić ukryte opcje
  • wyświetlanie stanu obiektów urządzenia embedded, modyfikacja stanu itp...

Wymagane zmiany po stronie serwera(urządzenia):

1

chciałbym dodać dodatkowy interfejs administracyjno/serwisowy dla zaawansowanych użytkowników aby mogli zmienić ukryte opcje

czyli to WebAssembly by nie było po stronie przeglądarki, tylko po stronie serwera, żeby dodać możliwość bezpiecznego dodawania wtyczek? Użytkownik pisze sobie wtyczkę, kompiluje do Wasm i serwer to odpala?

Czy jeszcze inaczej? W której warstwie systemu chcesz podpiąć tego Wasma?

0

@LukeJL: Aż tak zaawansowanych pomysłów nie mam na tą chwilę , ale co jakiś czas pojawiają sie pomysły klientów aby było SDK do urzedznia i jakieś API dla twardzieli, wiec kto wie jak bedzie wygladac przyszłość projektów , parę lat temu uczelnia chciała połączenie z sharepoint ale to trochę inna technologia bo chyba WSDL to był i bardzo dawno temu :)

W urządzeniu chce dodać serwer HTTP, na tym serwerze umieścić niezbędne pliki aby zadziałał WASM (js,html ...) ,
użytkownik podłącza sie przeglądarka ściąga moj plik WASM i ma dodatkowe okna do sterowania aplikacją tylko że w oknie laptopa/telefonu a nie na ekranie urządzenia. WASM komunikuje sie już za pomocą np. websocket

Jak WebAssembly tak dobrze sobie radzi z Widgetami Qt , to teoretycznie można pojsć dalej i te same okna mogą być używane zarówno przez przeglądarkę jak i na urządzeniu, tylko wtedy trzeba by to wszystko odpowiednio przygotować koncepcyjnie

0

Wymagane zmiany po stronie serwera(urządzenia):

dodanie serwer http np. https://github.com/yhirose/cpp-httplib
przemyśleć jak serializowac/deserializowac dane i potem transmisja

To już nie lepiej po prostu dodać w yocto(a nawet powinien już byc) pythona i do tego flask?
Oczywiście bedziesz po IPC musiał wymieniać z takim flaskiem jakieś dane ale to może lepsze?

1 użytkowników online, w tym zalogowanych: 0, gości: 1