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ť.
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 pripojeniaNasleduje 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_READA nakoniec je tu socket_close (viď. > link <), ktorou socket uzavrieme.Samotný kód bude vyzerať nasledovne:
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 <. 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.
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ý:
TcpClient Class - docs.microsoft.com > link <
Ostatné texty v seriály
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.
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 pripojeniaNasleduje 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_READA 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>
<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
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.{
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;
}
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 <.{
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");
}
}
Použité zdroje
Socket Programming in PHP - codeproject.com > link <TcpClient Class - docs.microsoft.com > link <
Android ako SMS Gateway | 0 |
Android ako SMS Gateway II - Klientské aplikácie | 0 |
Žiadne príspevky v diskusii.
Na prispievanie do diskusie musíte byť prihlásený.