Autor Zpráva
Janotka
Profil
Potřebuji na web dostat nějaká data z zařízeni, které má jen I2C sběrnici. Připojil jsem to k počítači s Linuxem, nahrál na něj Lighttpd webový server a umim v C napsat program komunikující s daným zařízením po i2c.
Teď řeším jak to propojit s "webem".

Jako logické my přišlo program komunikujici s I2C napsat jako FastCGI, který umi i komunikovat s webem.
Celkem bez problémů jsme dokazal vytvořit FastCGI , který se spustí při načtení html a pomocí printf na ní něco zobrazí.
Nicméně dál jsem skončil, protože nemůžu naji žádný komplexnější příklad použití.
Především nevím jak dostat data z webové stránky do FastCGI, jasně asi přes soket, ale i tak bych rád nějaký příklad.
Něco jako, při prvním načtení html pošle data do html FCGI , zobrazi se a když je uživatel upraví a zmáčkne tlačítko pošlou se data z html do FCGI a pak se pravidelně přes AJAX jen načítají data z FCGI.

Poradíte?
N71
Profil *
A je nutné to FastCGI? Existuje ještě obyčejné CGI, kdy Apache jednoduše spustí binárku a komunikuje s ní pomocí standardních streamů stdin/stdout/stderr.
Janotka
Profil
Pokud víte o nějakém komplexnějším příkladu s použitím CGI sem s ním on v tom z hlediska programování až takový rozdál není jen v přípafě Fastcgia sdioi.h nahrzuje fcgi_stdio.h a progrmu se roděli část inicializace a běhu.
ttttttt
Profil *
Janotka:
Především nevím jak dostat data z webové stránky do FastCGI, jasně asi přes soket, ale i tak bych rád nějaký příklad.

Pokud tomu dobře rozumím, umíš zobrazit data ze zařízení, a hledáš způsob, jak modifikovat zařízení z webu.

Do HTML stránky přidej formulář:
  <form>
    <label for="amount">Amount:</label>
    <input type="number" id="amount" name="amount"><br><br>
    
    <label for="size">Size:</label>
    <input type="text" id="size" name="size"><br><br>
    
    <input type="submit" value="Submit">
  </form> 


Po kliknutí na Submit pošle prohlížeč webservru (Lighttpd) následující text:

POST / HTTP/2.0
Host: foo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

amount=100&size=M

tj. záhlaví na prvním řádku, hlavičky, prázdný řádek, tělo s údaji z formuláře. Web server to převezme, spustí skript, předá mu požadavek na STDIN, přečte STDOUT a vrátí prohlížeči. Ve skriptu je tedy potřeba načíst STDIN, najít prázdný řádek a za ním tělo požadavku, tj.

amount=100&size=M

To je potřeba naparsovat (je to zakódované pomocí Percent encoding), přečíst hodnoty, poslat do zařízení, vygenerovat na STDOUT odpověď.

Až tohle bude fungovat, zapoj AJAX. Celé by to šlo dělat i přes Web sockety, bude to složitější, tak spíš nedoporučuju.

Ručně (tj. pomocí CGI) tohle už v podstatě nikdo nedělá, používají se knihovny nebo frameworky, které umí request naparsovat. Pokud to je zařízení, na které bude přistupovat jeden člověk, tak i to CGI dává smysl. Pokud by to mělo být robustnější, poohlédl bych se knihovně nebo frameworku pro C, nebo to spíš napsal v něčem jiném. Vhodně mi přijde Go, viz tinygo.org/docs/concepts/peripherals/i2c a www.digitalocean.com/community/tutorials/how-to-make-an-http-server-in-go#reading-a-request-body
piiiiiiiip
Profil
Pokut chceš dostat data z webu na I2C zařízení a obráceně existuje více možností jak toho docílit. Nejjednodužší by bylo použít ESP32 microcontroller. Na ten jsou i ukázkové programy, které vytvoří webserver s webovou stránkou pomocí které můžeš ovládat jakékoliv zařízení které k němu připojíš. Levnější alternativou je pak ESP8266, ten si už ale vlastní webserver vytvořit nedokáže. Můžeš přes něj ale komunikovat s webovou stránkou hostovanou jinde například pomocí REST API (nebo svého vlastního API), MQTT apod.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0