SerialNet utveckling

Uppdatering AkazaNet (SerialNet) 28/07/2017

Lång tid har passerat sedan sista inlägget men dags nu.

Har ägnat en del av den lediga tiden till att fortsätta med SerialNet. Några rent praktiska åtgärder som nya hyllor och fram med gamla datorer gör att arbetsplatsen börjar få drag av elektroniklaboratorium. Speciellt efter vårens instats med att få bra stöd för arduino/raspberry-pi baserat arbete.

SerialNet recap: Gör att man kan köra TCP/IP över delade serielänkar så som RS 485 eller open-collector kopplade serieportar. Det öppnar för mer intelligent kommunikation trots att man bara har 2 trådar för kommunikation och att noderna enbart har en serieport. (Tänk microkontroillers, arduinos, etc). Det finns lösningar att även kombinera strömförsörjning där ute så behövs kabeln ändå, så varför inte kommunicera över den? Annars är en 4-tråds RS485 delad buss + strömförsörjning ett rätt billigt alternativ till ethernet med alla dess switchar och kontakter.

Ett av mina testfall sedan tidigare är en ssh inloggning från en dator till en annan så det fungerar fortfarande. Det visar tydligt att TCP/IP går att få över.

Vad har hänt sedan senast? Några större förändringar:

  • TUN/TAP stöds idag native. Så man kan starta applikationen och den ser till att koppla in sig på TCP/IP stacken själv. Inget mer extra pyssel med verktyg som socat el. dyl. Efter start kan man med 'ip' och 'route' sätta sina parametrar på det nya interfacet.
  • Automatkonfiguration av klientadresser. Liknande DHCP men begränsat. En klient som inte har en statisk adress får nu en dynamisk tilldelad. (Detta är fortfarande kraftig alfa, men första klienten får sin adress).
  • Protokollet skiljer nu på 3 olika typer  av datatrafik, tap, tun, raw. Det ger möjlighet att samtidigt ha ett TCP/IP subnät över bussen, samtidigt som olika noder har elaberade raw kanaler där man passar data fram och tillbaka. 
  • Råa kanaler med data mellan noder via pty:s. När man startar serialnet och sätter upp råa kanaler kan den skapa en 'pty'. Det är samma typ av accesspunkt som t.ex. serieportar använder under Linux. Så efter start av Serialnet kan ett annat program anpassat för serieportar öppna en av dessa ptys och arbeta mot den på samma sätt som en serieport. Skillnaden är att Serialnet tar hand om hanteringen av den gemensamma bussen. Kanalen upplevs som en privat kanal mellan 2 olika pty:s på 2 olika noder.

Fått gräva i rätt obsyra delar av POSIX/Linux för pty/tap. Här är man glad att C++ är så nära besläkat med C och att det går att accessa OS på så låg nivå. T.ex. Java med dess JVM hade inte varit roligt att komma åt funktioner för t.ex. pty:s eller ändra ägaren till ett tap interface.

Just stödet för pty:s känns rätt viktigt när man arbetar mycket med microkontrollers. Det finns gott om programvara som kör på en liten enhet och sedan presenterar data över en serieport. På andra sidan sitter ofta ett mottagarprogram som ansluter till serieporten. Med detta kan man lätt återanvända mottagaren men nu köra över en gemensam buss istället.

 Så vad är kommande punkter?

  • Som vanligt, stabilisering, dokumentation testning sker löpande. Användbarheten och dukumentation av pty:s behöver förbättras. Dynamisk allokering av adresser har luckor kvar att fyllas.
  • Finns idag många som kör Arduino. En trevlig sak vore en klient som ett bibliotek för Arduino. Den erbjuder en virtuell serieport mot arduinokoden och kopplar sig mot masterns klient. På den sidan får man då automatiskt upp en pty på mastersidan att prata med. Borde göra det lättare för prototypbygge kring nätverket, Motsvarande drivare för STM32 processorer skulle vara intressant.
  • Nätverksstödet börjar kännas rätt så bra. Har få problem med det idag. Vill dock kunna starta som demon under boot. Ska bara fungera är en trevlig målbild. Annars är IPv6 önkvärt framöver.

Koden hittar man som vanligt på github. Den släpps under GPLv3 så de flesta kan använda den för att prova ut, hobbyprojekt etc. Vill man göra något där licensen är ett problem så kan en kommersiell licensiering diskuteras.

Länk till koden.