UDP komunikace: Raspberry <-> Arduino

rpi_ard

UDP komunikace: Raspberry <-> Arduino
« kdy: 18. 06. 2018, 18:08:05 »
Ahoj,
pro radost realizuju projekt automatizace, mám raspberry (RPI) + Arduino (ARD).
- na RPI běží apache, postgress, web2py framwork + další vlastní skripty
- základní princip komunikace je, že ARD poslouchá na UDP portu, příchozí zprávu parsuje a nějak se zachová
- nějak tak tuším, že UDP není ideální, proto mám "mechanismus" potvrzování zpráv z ARD, případně neúspěchu se příkaz opakuje
- to znamená, že na RPI je také otevřen UDP port pro poslouchání zpráv z ARD

Problém-1: RPI má otevřený port, ten ale občas "spadne", cron se stará o otevření portu pokud není otevřen
Dotaz-1: proč nebo co způsobí, že se port na RPI uzavře?

Dotaz-2: jak byste koncepčně změnili logiku komunikace?

Za jakékoliv další tipy a nasměřování budu rád.



uuuuuuuu

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #1 kdy: 18. 06. 2018, 18:10:21 »
Opendds

rpi_ard

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #2 kdy: 18. 06. 2018, 19:14:03 »
Opendds
díky za tip, nedohledal jsem, zda Opendds lze nasadit na arduino (jednoduše)
- mně jde především o komunikaci RPI + ARD

- porovnání různých protokolů pro komunikace RPI - PC, kdyby někoho zajímalo
http://cgweb1.northumbria.ac.uk/SubjectAreaResources/KF7046/papers/review/iot/ck16.pdf

uuuuuuuu

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #3 kdy: 18. 06. 2018, 19:22:37 »
Jsou i lightweight dds knihovny.

Technik Tom

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #4 kdy: 18. 06. 2018, 21:47:54 »
Tak i pro Arduino existuje třeba MQTT.


SB

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #5 kdy: 19. 06. 2018, 10:06:07 »
Problém-1: RPI má otevřený port, ten ale občas "spadne", cron se stará o otevření portu pokud není otevřen
Dotaz-1: proč nebo co způsobí, že se port na RPI uzavře?

Co znamená "RPI má otevřený port", "ten spadne" a "cron se stará o otevření portu"???! Složí se aplikace otevídající si daný port k poslouchání a cron ji nahazuje? Pak zjišťujte, proč se ona aplikace skládá.

Dan

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #6 kdy: 19. 06. 2018, 10:40:53 »
jak máš na tom arduinu řešeno připojení k sítí? Levné ethernet rozhraní s ENC28j60 a softwarový TCP IP stack, Wiznet w5100 (oficiální ethernet shield) nebo podobný s hardwarovou implementací TCP/IP stacku nebo wifi s ESP8266 nebo něčím podobným co má vlastní procesor a dost výkonu? jde o to kolik prostředků arduina musíš obětovat na komunikaci a tcp/ip. 
Otázka taky je, jak moc realtime tu komunikaci potřebuješ, ale myslím že pro většinu případů by bylo TCP lepší volba. aspoň nemusíš řešit když se nějaký packet ztratí. třeba u ovládání světel je ti celkem jedno jestli světlo se rozsvítí za 50 nebo 100ms od stisku vypínače.
jako protokol vyšší vrstvy, jak navrhoval kolega mqtt je možná varianta, nebo máš vlastní protokol? případně by se dal použít http nebo modbus tcp. ale záleží na návrhu architektury komunikace, jestli je to spíše push dat (ze senzorů, vstupů) na server nebo server se periodicky dotazuje na stav a ovládá výstupy.

rpi_ard

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #7 kdy: 19. 06. 2018, 18:46:40 »
otevřený port = python skript + import socket, v logu mám jen znovu otevření portu, nevím jak zaznamenat ukončení skriptu
- koukám, že to mám asi zbytečně komplikovaně, protože:
1. skript-1 zjistí kolik je zařízení v databázi pro ovládání (nějaké ARD na LAN)
2. skript-1 spoustí přes subprocess nové skripty, co skript to specifický port pro naslouchání UDP
metoda: subprocess.Popen(cmd, shell=True, stdout=None, close_fds=True)
- jak tohle zjednodušit?

HW: jeden ethernet shield je Wiznet w5100, ten vykazuje nejstabilnější chování, ostatní teď nevím, ale dopíšu
- realtime odezvu opravdu nepotřebuju, 1000ms je v pohodě
- vlastní protokoly nemám: snažím se použít jednotlivé komponenty a poskládat je dohromady, ale zase nechci použít celý projekt

Logika komunikace
- přes web na RPI je zadán požadavek: třeba rozsviť, RPI pošle data do ARD, který čeká na zprávu, ARD zprávu parsuje, nastaví třeba high na pinu 6 a odpoví = potvrdí, že zprávu dostal ... a tak dokola
- data nyní žádná nesbírám


Z komentářů mi vychází
- použít ethernet shield s HW podporou TCP/IP
- použít TCP protokol




Technik_Tom

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #8 kdy: 19. 06. 2018, 20:34:18 »
Tak až si to nebudete dělat pro radost, ale aby to fungovalo, zkuste naskočit na nějaký běžící proces, kde tohle všechno už mají vyřešené.
Ono mít všechna arduina domácí automatizace na ethernetu asi není to pravé řešení.
Většinou se použije jiný přenos a k tomu gateway do ethernetu nebo na seriový port.
Mrkněte třeba na Domoticz.com jako centrální server a s ním kompatibilní síť sensorů Mysesnsors.org či ESPeasy.
S touhle kombinaci jsem třeba zhruba za víkend udělal autonomní regulátory el. podlahového topení se vzdáleným nastavením regulované teploty, typu regulované veličiny ( podlaha, místnost ), případně časové  schema průběhu těchto teplot.
Se zpětným reportem spotřeby jednotlivých místností a průběhem teplot.

Dan

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #9 kdy: 20. 06. 2018, 00:23:18 »
Pokud tam máš wiznet tak TCP není nejmenší problém. Nejlíp mi z toho vychází použít na arduinu http server. jsou na to knihovny není potřeba nic složitého vymýšlet. Na straně rPi to bude triviální, wget pošleš request na arduino, které HTTP 200 potvrdí vykonání příkazu, případně může vrátit aktuální stav výstupů po provedení příkazů.

pokud tech arduin je víc a je mezi nimi složitější logika, pak bych možná zauvažoval nad nasazením MQTT.

Dan

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #10 kdy: 20. 06. 2018, 00:30:10 »
i s enc28j60 a softwarovým TCP/IP stackem se dá udělat funkční http server, ale nezbude ti potom moc volné RAM paměti pro zbytek aplikace, tam už opravdu budeš počítat každých pár bytů. ukázka třeba tady http://www.tuxgraphics.org/electronics/200611/embedded-webserver.shtml

Vaclav

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #11 kdy: 20. 06. 2018, 07:42:10 »
Z komentářů mi vychází
- použít ethernet shield s HW podporou TCP/IP
- použít TCP protokol
To je, obávám se, zcela chybný závěr. UDP má v embedded prostředí mnoho výhod oproti TCP, zvlášť při pravidelné výměně malého množství dat mezi subsystémy, které jsou nezávislé a mohou se např. často náhodně resetovat (napájení, SW chyba a vyvolání RST watchdogem, ...).

To, že ti to nefunguje, není problém UDP, ale tvého řešení.

Vaclav

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #12 kdy: 20. 06. 2018, 07:57:54 »
Z komentářů mi vychází
- použít ethernet shield s HW podporou TCP/IP
- použít TCP protokol
To je, obávám se, zcela chybný závěr. UDP má v embedded prostředí mnoho výhod oproti TCP, zvlášť při pravidelné výměně malého množství dat mezi subsystémy, které jsou nezávislé a mohou se např. často náhodně resetovat (napájení, SW chyba a vyvolání RST watchdogem, ...).

To, že ti to nefunguje, není problém UDP, ale tvého řešení.

A ještě jedna výhoda - důležitá hlavněš u systémů s omezenými zdroji - UDP stack není vůbec náročný paměťově, atd všechny související věci.

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #13 kdy: 20. 06. 2018, 09:03:19 »
Čau, s domácími sensory si hraju už několik let a částečně mě to živí, takže už jsem si vyzkoušel všelijaké slepé i neslepé cesty :) Kvituju záměr si hrát právě s tímhle, protože je to fakt zábava a člověk si vyzkouší širokou paletu technologií (od hw a komunikace přes backend sw až k webu).

K tvýmu dotazu: na tyhle otázky nebývá jedna správná odpověď, protože záleží na tom, 1) o co ti vlastně jde (s čím si chceš primárně hrát a s čím spíš nechceš ztrácet čas) 2) jak máš ten systém rozmyšlený, co všechno má umět a jaké má mít parametry, např. spolehlivost.

Jenom takových pár podnětů, jak to vidím já. Nic z toho není dogma, všechno si zaslouží diskusi:

  • drátové připojení tě dřív nebo později začne limitovat a prudit - zvlášť pokud je to ethernet (zaváděj si doma strukturku pro dvacet sensorů po celým baráku... nechceš). Ethernet je nejkomplikovanější a nejdražší. Když už drát, tak existují lepší alternativy (RS485, onewire, ...)
  • možností bezdrátového spojení je hodně - od nejjednoduššího 433MHz/ASK až po wifi
  • různé způsoby komunikace mají různé limity, ale u žádného z nich (kromě wifi) nechceš používat IP. Bezdrát vždycky znamená nějak chytře zakódovat zprávu do několika málo bajtů
  • další obrovskou limitací je baterka (problematika low power je příběh sám o sobě)
  • nakonec teda pravděpodobně skončíš u nějaké gatewaye, která umí víc způsobů komunikace, nějak ji sjednocuje a jednotně zpracovává
  • pokud tě to v téhle fázi už nezajímá (chceš si hrát jenom s hw), tak je fakt dobrý použít existující věci, třeba ten Domoticz, Openenergymonitor, ... je jich docela hodně
  • pokud tě zajímá i tohle, tak na téhle úrovni bych hodně doporučoval stack mqtt+NodeRed+InfluxDB+{Chronograf|Grafana} - rozjede se to snadno, funguje to skvěle, dává ti to velkou volnost a je to uživatelsky velice příjemný řešení
  • velice dobře si rozmysli strukturu dat (atributy, číselníky, sémantiku) - to je naprosto klíčová věc, rozlezlá po celém systému a když ji navrhneš blbě, dá hodně (otravné) práce ji pak změnit. Na první pokus, bez zkušenosti, se to prakticky nedá navrhnout dobře. Pokud chceš, můžu krátce napsat nějaký zkušenosti.

ehmmm

Re:UDP komunikace: Raspberry <-> Arduino
« Odpověď #14 kdy: 20. 06. 2018, 09:50:35 »
To je, obávám se, zcela chybný závěr. UDP má v embedded prostředí mnoho výhod oproti TCP, zvlášť při pravidelné výměně malého množství dat mezi subsystémy, které jsou nezávislé a mohou se např. často náhodně resetovat (napájení, SW chyba a vyvolání RST watchdogem, ...).

To, že ti to nefunguje, není problém UDP, ale tvého řešení.

A ještě jedna výhoda - důležitá hlavněš u systémů s omezenými zdroji - UDP stack není vůbec náročný paměťově, atd všechny související věci.

Souhlas. Nevim, jak presne funguje ethernet shield u Arduina, ale z principu bych se drzel UDP. TCP je oproti tomu ukrutny monstrum.

Muze se ale stat, ze samotny shield vypocetne prevysuje Arduino (neco jako GSM moduly SIM800L za cca 100 Kc, ktere jsou o nekolik trid chytrejsi nez samotne Arduino za 40 Kc) a pak by asi slo o TCP uvazovat.

Ale na TCP v techto aplikacich mi jeste vadi, ze je clovek vic zavisly na knihovne, nez kdyz pouzije "hole" UDP. TCP ti sice zaruci, ze kdyz uz data dojdou, tak dojdou ve spravnem poradi. Ale uz se hur zjistuje, jestli uz to dorazilo, jestli to vubec jeste dorazi, kdy to dorazi, kdy bude dalsi pokus, hromady paketu proleti jenom kvuli navazani spojeni. Tohle vsechno si dokazu sam pomerne snadno osetrit v UDP, nez spolehat na nejakou knihovnu. Preci jenom vime, jak to s knihovnami pro Arduino je.