Två RPi3 ska komm via Eth. Hur?

Permalänk

Två RPi3 ska komm via Eth. Hur?

Hej,
Är ny här på Sweclockers och har pysslat mkt med embedded men behöver hjälp. Jag är inte alls van Linux/RPi utan är newbee på det och är ganska ovan nätverkande också. Jag har precis dragit igång en webserver (Apache2) och kan komm med en RPi via PHP och en websida men "thats it". (Bakomliggande C-program handskas jag med).
Nu ska jag dra igång en komm mellan två eller fler RPi:er via Ethernet. Jag vet. Frågan kan tyckas enkel men jag behöver lixom starthjälp. Normalt sett hade jag skött det via SPI eller nåt men nu går det inte i detta fall. RPi:erna ska anslutas till en switch(?) och var och en ska kunna komm. med den andre. Hur börjar man? Finns färdiga funktioner i C? Var kan jag börja läsa om detta?

Senare ska den ena RPi:n ha Wifi också och lotsa data vidare...men det är en annat "byggblock". Var sak har sin tid.

Tacksam för (start)hjälp.

Permalänk
Hedersmedlem

Ger ett kort svar nu bara, något sånt här?

http://cs.smith.edu/dftwiki/index.php/Tutorial:_Client/Server...

socketprogrammering är nog vad du vill pyssla med iaf.

Permalänk
Skrivet av Shimonu:

Ger ett kort svar nu bara, något sånt här?

http://cs.smith.edu/dftwiki/index.php/Tutorial:_Client/Server...

socketprogrammering är nog vad du vill pyssla med iaf.

Hej! Tack! Ja, nu kan jag komma igång! Det är exakt nåt sånt där jag tänkt mig. I exemplet är en laptop klienten. I min applikation finns en "master" och ett antal slavar - samtliga RPi3. Mastern frågar slavarna om information med jämna mellanrum. Vid fel så ska slavarna kunna skicka ett "larm" till mastern och denne reagera på det. HUR detta ska lösas med ipadresser och portar har jag inte en susning om. Där brister tyvärr mina kunskaper - än. I min fantasi använder jag olika portar.
BTW, Det nätverk som byggs upp är som ett hemmanätverk. Utifrån kommande begäran går enbart till Mastern via port-forwarding och där väntar ett PHP-script som i första versionen skyfflar upp data från en fil.
Det jobbiga för mig är uppbyggnaden av detta. Är jag på rätt spår?

"Tvång och sena kvällar är bästa läromästaren"

Permalänk
Hedersmedlem

Socketprogrammering är något som tar en stund att lära sig. Det kommer innebära lite trådhantering för den som agerar server.

Om dina enheter utgör ett eget litet nätverk utan någon DHCP får du själv sätta dina IP-adresser som du vill. Här hoppas jag du vet hur man sätter upp ett nätverk. Sen behöver du välja en port på servern som den lyssnar på efter inkommande connections, den porten kommer även klienterna att connecta mot. Du får även välja om du ska skicka med TCP eller UDP, spelar kanske mindre roll för ditt projekt dock. Det låter som du är på rätt väg.

Själva kommunikationen är såklart helt upp till dig hur du väljer att göra, med larm osv.

Svårt att ge mer konkreta tips utan att veta vilken nivå du ligger på och sen när du väl kodar blir det väl lättare att se vad man behöver förklara.

Börja klura och ställ frågor när du stöter på trubbel!

Permalänk

@Shimonu: "Trådhanteringen" vet jag inte betydelsen av då jag programmerat mkt Ansi-C i gammeldags DOS-miljö samt i Embedded och hårdvarunära. Har aldrig varit o prog C/C++ i Windowsmiljö då jag aldrig har haft det behovet. I Win har jag skrivit mkt i Visual Basic och Labview. "Målet helgar medlen".
Vad en tråd är *tror* jag är helt enkelt kopior på processer som är lika men går i separata minnesareor. Men det är som sagt bara en teori jag har om trådar.
Det stämmer att det är statiska IP adresser. Det jag har lite svårt att svälja är hur "Servern" (Mastern) hanterar samtidiga sändningar från slavarna. Mastern (en RPi som kan kallas server?) har ett antal lika RPi:er men som har rollen slav. Samtliga är kopplade mot en switch(?). (Där blir det konfig av switchen (eller är det en router?) kan tänka.)

Jag brukar ta små steg om nåt är okänt. För mig blir det att koppla ihop 2 st RPi3 och sen testa eth0 porten och den koden du gav exempel på. Sen skicka block av data mellan dem. Det är steg 1. Nästa steg är att koppla in dessa mot en switch och se att det fungerar.
Tredje steget är att komma åt mastern via en HTTP-begäran och där exekvera PHP som i sin tur enbart hämtar datat som Mastern tidigare har samlat ihop och skickar det vidare till user som en fil. (Här vet jag att shared mem är lite knöligt mellan PHP och C...så jag tror jag går via en fil till att börja med)

Låter inte det som ett nätt litet projekt? Jovisstja, glömde av att Master/slavar ska ju ha kod också som GÖR nåt. Inte bara skickar data hit o dit!!
Men jag hör av mig om jag stöter på problem. Tack. Som sagt, jag är mest fundersam över nu om jag är på rätt spår och om det är möjligt.

Permalänk

Designen är löst. Det blir CAN mellan RPi:erna samt ethernet in till en webserver som tillhandahåller html+php. En daemon jobbar mot CAN och som bara läser CAN. Små program, som anropas från PHP, utför operationer på filerna samt mot CAN gör jobbet.
Hade en snubbe som var hajj på UNIX och nätverk på besök igår. Vi redde ut funktionerna och vilka verktyg som behövdes. Lite nytänk för mig som skriver stora program som löser "allt"...men ska bli intressant att lösa detta.

Permalänk
Hedersmedlem

Intressant med CAN. Finns det någon speciell anledning för varför det blev så?

Permalänk

@Shimonu: Vi har redan CAN-stöd fullt ut i RPi-erna till mkt annat. Att vi skulle använda Ethernetporten var mer att den fanns tillgänglig och det skulle bli en "snygg" lösning. Men efter att vi talat ut så insåg vi att det är lika enkelt att skyffla datat mellan RPi:erna via CAN.
Istället blir det en RPi som använder Ethernetporten till en router och den RPin får ha en webserver snurrandes. Fast IP.

Det var också snack om att använda RPi:n inbyggda(?) Wifi. Men för att konc allt närmare routern kan vi tänka oss en inbyggd Wifi i routern. Då följer vi regeln att lyfta ut "grejer" ur RPi:erna...det är ont om tid o labba o krångla.
Jag vill ha det "keep it simple".

Permalänk

Tillägg:
Det svåra för mig nu (som inte är hajj på varesig Linux eller SPI/CAN) är att få fatt i vettiga C-exempel som är tolkningsbara till det BCM2835-lib jag har. Har hittat en hel del kod som hanterar både SPI:n och CAN:n men de är i CPP och svåra att konvertera ner i lite enklare moduler. I eftermiddags hittade jag ett gäng SPI.C och CAN.C som har klara funktioner som kan moddas lite. Det ska fungera...menar jag. Men det tar jag mig an på måndag. Då ska jag skicka en CAN_reset()!