WebElektronika

TCP csomagok küldése a felhőbe C# nyelv segítségével

person access_time 2016.10.04.
Folytatjuk az Internet of Things (IoT) sorozatunkat, most elkészítjük azt az alkalmazást, amelynek segítségével el tudjuk tárolni azokat az adatokat, amelyek TCP protokoll segítségével érkeznek a felhőbe. Fontosnak tartjuk megjegyezni, hogy sok Olvasónknak nincs Quectel (vagy egyéb GSM-es fejlesztőeszköze), ezért az adatot küldő érzékelőt egy C# nyelven megírt klienssel helyettesítjük a szimuláció során.


Nem mindenki rendelkezik olyan eszközzel (pl.: Quectel, M66), amelynek segítségével adatok továbbíthatók (pl.: TCP segítségével) a felhőbe, azaz egy szerveren lévő adatbázisba.
Ezért először megnézzük azt is, hogy hogyan tudjuk helyettesíteni ezt az eszközt egy C# nyelven megírt alkalmazással. Ha nincs olyan fejlesztő panelunk, amelynek segítségével TCP csomagokat tudunk küldeni a felhőbe (a felhőben lévő C# nyelven írt szerverhez), akkor ezt a panelt egy C# nyelven írt klienssel is kiválthatjuk most (1. ábra).

kep
1. ábra   Az elkészíteni kívánt architektúra modell


Cikkünk végén megadjuk azt a linket is természetesen, hogy valamilyen fejlesztőeszköz birtokában milyen "kliens programot" kell írnunk. A cikk írásakor mi a C# nyelven írt klienst használtuk fel.

Indítsuk el a Visual Studio 2015 Community-t, és töltsük be a korábban létrehozott projektünket (ConsoleIoTPelda).

A ConsoleIotPelda (al)projektünkhöz, amely a szerver funkciót valósítja meg, adjunk hozzá egy "LINQ to SQL Classes" típusú új item-et (2. ábra). Ennek segítségével egy proxyosztályt adunk a szerver(al)projekthez.

kep
2. ábra   Proxyosztály (paldeDataContext) hozzáadása a szerver alprojekthez
 

Ha ezt hozzáadtuk a projektünkhöz (3. ábra), akkor megjelenik egy grafikus tervezőnézet.

kep

3. ábra   A projektünkhöz hozzáadott proxyosztály (pelda.dbml)
 

Az automatikusan megjelenő grafikus tervezőnézetbe tegyük be a Server Explorer ablakból az "Eredmeny" nevű adattáblánkat a "Felho" adatbázisból (4. ábra). Ezután mentsük el a pelda.dbml file-t.

kep
4. ábra   Az Eredmeny nevű adattábla
 

Ezekkel a műveletekkel elértük azt, hogy az adatbázisunk (amely egy állandó IP címmel rendelkező VPS-en van) kényelmesen elérhető C# programsorokkal, tehát nem szükséges connection string-et, illetve SQL parancsokat írnunk.

Akár használunk fejlesztőpanelt, akár "modellezzük" azt egy C# kliens alkalmazással, szükségünk van egy szerverre, amely fogadja a TCP csomagokat, és azokat eltárolja egy adatbázisban (MSSQL). 
Készítsük el most először a szervert, amely "összeköti" tehát az érzékelőnket / klienst az adatbázissal!

A kliens modellünk véletlenszámokat állít elő 0-tól 255-ig terjedő tartományban. A feladatunk az, hogy ezeket a véletlenszámokat átküldjük TCP protokollal a szerverhez. A szerver ezeket a kapott számokat a fogadás dátumával együtt elmenti az "Eredmeny" nevű adattáblába.

A projektünkben található ConsolIoTPelda (3. ábra) alprojektben található Program.cs file-t nyissuk meg és másoljuk be a következő kódot :

 

class Program
    {
        public static void Main()
        {
            int portszam = 8080;
            int fogadott = 0;
            try
            {
                peldaDataContext pdc = new peldaDataContext();

                IPAddress ipAd = IPAddress.Parse("127.0.0.1");
                TcpListener weListener = new TcpListener(ipAd, portszam);
                weListener.Start();
                Console.WriteLine("Működik ezen a porton : " + portszam);
                Console.WriteLine("Végpont : " + weListener.LocalEndpoint);
                while (true)
                {
                    Socket sck = weListener.AcceptSocket();

                    byte[] tomb = new byte[10];
                    int darab = sck.Receive(tomb);
                    string str = System.Text.Encoding.UTF8.GetString(tomb, 0, darab);
                    fogadott = int.Parse(str);
                    DateTime dt = DateTime.Now;

                    Console.Write("Fogadott : {0}",str);
                    Console.WriteLine(",   ekkor : {0}",dt.ToLongTimeString());

                    Eredmeny ujErtek = new Eredmeny()
                    {
                        Ertek = fogadott,
                        Datum = dt
                    };

                    pdc.Eredmenies.InsertOnSubmit(ujErtek);
                    pdc.SubmitChanges();

                    sck.Close();
                }
                weListener.Stop();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            Console.ReadLine();
        }
    }

 

Ez a kód nagyon hasonlít a korábban közölt TCP szerverhez, ezért részletesen nem mutatjuk be, csak pár sort emelnénk ki.

  1. Példányosítjuk a proxyosztályt, ezután a "pdc" példány segítségével könnyen elérjük az adattáblánkat, illetve az adattáblába történő beírás kényelmessé válik 
    "peldaDataContext pdc = new peldaDataContext();"
  2. A klienstől érkező adatok byte-okban (nem char!) érkeznek, nekünk a byte-okból kell string-et létrehoznunk. Fontos az átalakításnál a fogadott adatok száma, ez határozza meg a létrehozandó string hosszát. Erre szolgál a
    "string str = System.Text.Encoding.UTF8.GetString(tomb, 0, darab);"
  3. Az adattáblánkba egész számot tudunk elmenteni a string helyett, ezért parsolnunk kell
    fogadott = int.Parse(str);
  4. Az Eredmeny osztályból létrehozott "ujErtek" példány tulajdonságai értéket kapnak, majd ezt beírjuk az adattáblába.
    pdc.Eredmenies.InsertOnSubmit(ujErtek);
  5. Hiába írjuk be az adattáblába a TCP-n kapott véletlen számot és a fogadás dátumát, a beírást véglegesítenünk kell
    pdc.SubmitChanges();

 

Ha nincs fejlesztőpanelünk, akkor valósítsuk meg most a klienst is. A ConsoleIoTPeldaKliens nevű alprojektben található Program.cs-t nyissuk meg és másoljuk bele a következő kódrészletet :


Ha érdeklődik a cikk teljes tartalma után, kérjük, lépjen be a WebElektronika oldalára.

     Köszönjük.