Táto stránka pre svoju správnu funkčnosť vyžaduje súbory cookies. Slúžia na authentifikáciu návštevníka, analýzu návštevnosti a reklamnú personalizáciu.
logo
Prihlásenie / Registrácia
mobile

Zavrieť
 

Android ako SMS Gateway II - Klientské aplikácie

Pred pár týždňami sme si ukázali, ako premeniť Androidový telefón na SMS bránu. V tomto článku budeme v téme pokračovať a k našej SMS bráne si vytvoríme aj klientské aplikácie.
V minulom článku tejto mini-série (> link <) sme si vytvorili SMS bránu, ktorej funkčnosť sme následne vyskúšali cez telnet. Našou dnešnou úlohou je k SMS bráne urobiť aj klientské aplikácie, ktoré ju budú vedieť používať.

Malá rekapitulácia

Na úvod si trochu pripomenieme, ako prebieha komunikácia s našou SMS bránou.

SMS brána je prístupná pod konkrétnou IP adresou (ideálne statickou) a prijíma pripojenia na konkrétnom porte. Po pripojení klienta čaká na požiadavku, ktorú sa následne pokúsi vykonať a výsledok operácie oznámi číselným kódom a textovým popisom. Text požiadavky aj odpovede je vždy ukončený "odriadkovaním".

Komunikácia tak vyzerá nasledovne:

Zdrojový kód:
codeblog@codeblog-server:~$ telnet 192.168.1.78 1234     //<-- Nadviadzanie pripojenia
Trying 192.168.1.78...
Connected to 192.168.1.78.
Escape character is '^]'.
sms +421900123456 Test SMS brany                                 //<-- Požiadavka
0: Request accepted                                                            //<-- Odpoveď
Connection closed by foreign host.

PHP klient

Prvým klientom bude WEBová aplikácia postavená na PHP. Na komunikáciu použijeme funkcie socket_create, socket_connect, socket_write, socket_read a socket_close.

Funkcia socket_create (viď. > link <) slúži na vytvorenie objektu reprezentujúceho socket, s ktorým budeme následne ďalej pracovať.
Prijíma 3 parametre:
-domain - určujúci "rodinu protokolov", ktorú chceme použiť (AF_INET, AF_INET6, AF_UNIX), v našom prípade použijeme AF_INET ktorá reprezentuje IPv4 protokoly.
-type - určuje typ komunikácie, v našom prípade použijeme SOCK_STREAM
-protocol - definuje konkrétny protokol. V tomto príklade použijeme konštantu SOL_TCP, ktorá reprezentuje TCP protokol.

Druhá v poradí je socket_connect (viď. > link <), ktorou vytvoríme pripojenie SMS k bráne.
Má opäť 3 parametre:
-socket - Referencia na už vytvorený socket.
-address - Adresa servra, kde sa chceme pripojiť
-port - Port, na ktorom server prijíma pripojenia

Nasleduje socket_write (viď. > link <), ktorá zapíše do socketu našu požiadavku.
Jej parametre sú:
-socket - Referencia na už vytvorený socket.
-data - Dáta na zápis (čiže naša požiadavka)
-length - Dĺžka požiadavky (nepovinné)

Predposlednou je socket_read (viď. > link <), ktorou načítame odpoveď zo servra.
Príjima nasledovné parametre:
-socket - Referencia na už vytvorený socket.
-length - Počet znakov na načítanie (v našom prípade nám stačí 1 znak, v ktorom bude kód reprezentujúci výsledok akcie)
-mode - Mód čítania (PHP_BINARY_READ alebo PHP_NORMAL_READ), v našom prípade to bude PHP_NORMAL_READ

A nakoniec je tu socket_close (viď. > link <), ktorou socket uzavrieme.

Samotný kód bude vyzerať nasledovne:

Zdrojový kód:
<!DOCTYPE html>
<html xml:lang="sk" lang="sk">
    <head>
        <meta http-equiv="Content-type" content="Text/html;charset=UTF-8" />
    </head>
    <body>
        <?php
        $host = "[IP NASEJ BRANY]";
        $port = [PORT];

        $ok = false;
        $number = filter_input(INPUT_POST, "number");
        $message = filter_input(INPUT_POST, "message");
        if ($number != "" && $message != "") {

            $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            if ($socket) {
                if (socket_connect($socket, $host, $port)) {

                    //Zapis requestu
                    $request = "sms $number $message\n";
                    socket_write($socket, $request, strlen($request));

                    $result = socket_read($socket, 1, PHP_NORMAL_READ);
                    $ok = ($result == "0");
                }
                
                socket_close($socket);
            }

            if ($ok) {
                print("Akcia prebehla úspešne.<p />");
            } else {
                print("Došlo k chybe :( <p />");
            }
        }
        ?>
        <form method="post" action="">
            Adresár: <input type="text" name="number" value="" /><p />
            Text SMS správy:<br />
            <textarea name="message" maxlength="160" rows="2" cols="30" ></textarea><p />
            <input type="submit">
        </form>
    </body>
</html>


Kód pozostáva z jednoduchého HTML formulára, ktorým sa zadá telefónne číslo a požadovaný text správy.
Kód je k dispozícii aj ako súbor > link <.

C# Klient

Formulár C# klienta
Jednoduchého WEBového klienta sme si vytvorili, pokračujeme vytvorením klienta v C#.

V prostredí .NET máme na tento účel k dispozícii triedy TcpClient a NetworkStream, ktoré nájdeme v namespace System.Net.Sockets. Okrem nich si prizveme na pomoc StreamReader a StreamWriter z namespace System.IO.

Cez objekt typu TcpClient získame referenciu na NetworkStream, do ktorého zapíšeme cez StreamWriter našu požiadavku a pomocou StreamReader získame odpoveď.

Vytvoríme si teda métodu SendSMS, ktorá bude obsahovať samotný výkonný kód.

Zdrojový kód:
public bool SendSMS(string PhoneNum, string Message)
{
    bool Ret = false;
    TcpClient Client = null;
    NetworkStream NetStream = null;

    try
    {
        string Request = String.Format("sms {0} {1}\n", PhoneNum, Message);

        Client = new TcpClient("[IP NASEJ BRANY]", [PORT]);
        NetStream = Client.GetStream();
        StreamWriter writer = new StreamWriter(NetStream);
        writer.WriteLine(Request);
        writer.Flush();

        StreamReader reader = new StreamReader(NetStream);
        string Response = reader.ReadLine();
        if (Response.Length > 0)
            Ret = (Response[0] == '0');
    }
    finally
    {
        if (NetStream != null)
            NetStream.Close();

        if (Client != null)
            Client.Close();
    }

    return Ret;
}

Výkonný kód máme vytvorený, urobíme si ešte formulár na zadávanie dát.
Bude obsahovať dva TextBoxy, ktoré budú pomenované tb_phone a tb_message, popisky a tlačidlo (btn_ok) na odoslanie formulára.

Kód udalosti Click na tlačidlo bude nasledovný:

Zdrojový kód:
private void btn_ok_Click(object sender, EventArgs e)
{
    string Phone = tb_phone.Text;
    string Msg = tb_message.Text;

    if (Phone != "" && Msg != "")
    {
        if (SendSMS(Phone, Msg))
        {
            MessageBox.Show("OK");
        }
        else
        {
            MessageBox.Show("Došlo k chybe");
        }
    }
    else
    {
        MessageBox.Show("Nie sú vyplnené všetky polia");
    }
}

Zdrojový kód je k dispozícii > link <.

Použité zdroje

Socket Programming in PHP - codeproject.com > link <
TcpClient Class - docs.microsoft.com > link <

Codeblog
Ostatné texty v seriály

Android ako SMS Gateway 0
Android ako SMS Gateway II - Klientské aplikácie 0
Diskusia

Žiadne príspevky v diskusii.

Nový príspevok

Na prispievanie do diskusie musíte byť prihlásený.