LogicSoft.com.pl - systemy informatyczne

Wysyłanie SMS w C#

Uwaga, otwiera nowe okno. PDFDrukujEmail

Ciekawym rozwiązaniem podczas tworzenia systemów do raportowania lub odbierania raportów może okazać się usługa sms. W dzisiejszych czasach prawie każda osoba posiada telefon komórkowy i potrafi z niego wysyłać wiadomości tekstowe. Z tego właśnie powodu programista, lub osoba projektująca może pokusić się o skorzystanie z tej usługi i wdrożyć ją do takiego systemu. Celem tego artykułu jest opisanie jak w łatwy sposób, praktycznie od zera stworzyć aplikacje do wysyłania wiadomości sms przy pomocy telefonu i komputera.

Pierwszym krokiem jest odpowiednie podłączenie telefonu z komputerem. W moim przypadku telefon (Sony Ericsson K810i) został podłączony do komputera za pomoca przewodu USB, jednak system Windows 7 nie poradził sobie ze znalezieniem odpowiedniego oprogramowania i nie zostało nawiązane połączenie z telefonem. Z pomocą przyszedł program Sony Ericsson PC Suite, który posiada wbudowane sterowniki do wszystkich telefonów tego producenta. Dla telefonów pozostałych producentów zalecam przeszukanie internetu (m.in. Nokia PC Suite). Celem tego kroku jest określenie portu COM, dzięki któremu aplikacja będzie miała dostęp do funkcji telefonu. W Menadżerze Urządzeń powinno znaleźć się połączenie na odpowiednim porcie COM (w moim przypadku COM10).

Następnie w właściwościach połączenia portu COM należy sprawdzić jego parametry (w moim przypadku prędkość 115200).

Pozostało już tylko napisanie programu obsługującego telefon komórkowy z poziomu komputera. Do komunikacji z telefonem służą komendy AT (np: AT+CPIN="****" - do wpisania kodu PIN) i otrzymamy odpowiedź (np: +CPIN: READY - gdy się on zgadza). Jednak w przypadku C# posłużę się gotowym zbiorem bibliotek - GSMComm for .NET oferującym nie tylko obsługe wysyłania i odbierania sms, ale także inne ważne właściwości, jakie telefony komórkowe posiadają.

W Visual Studio 2008 tworzę projekt Windows Forms Application i nazywam go SMS. Dodaje referencje do używanych bibliotek - GSMCommunication oraz PDUConverter. Następnie w trybie Designer dodaje odpowiednie kontrolki - dwa pola TextBox do pobierania numeru telefonu (nazwa: tbNumber) i wiadomości (tbText), oraz dwa przyciski Button w celu nawiązania/rozwiązania połączenia z telefonem (bConnect), oraz do wysyłania wiadomości (bSend). Całość powinna wyglądać jak na załączonym zrzucie ekranu.

Na początku kodu należy zadeklarować używanie dołączonych bibliotek.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GsmComm.GsmCommunication;
using GsmComm.PduConverter;

Następnie należy zadeklarować zmienne globalne.

private GsmCommMain gsm = new GsmCommMain(10, 115200, 300);
private delegate void sendMSG(string text);

Obiekt GsmCommMain służy do nawiązania połączenia z telefonem komórkowym. Dlatego w jego konstruktorze podaję parametry połączenia COM (numer portu, ilość bitów na sekundę oraz maksymalny czas nadejścia odpowiedzi). Druga zmienna typu delegate posłuży do asynchronicznego wywoływania funkcji odpowiedzialnej za wysyłanie sms.

Kolejnymi ważnymi elementami są funkcje zdarzeń odpowiedzialnych za naciśnięcie przycisków bConnect i bSend. Ich kod został przedstawiony poniżej.

private void bConnect_Click(object sender, EventArgs e)
{
if (!gsm.IsOpen())
{
gsm.Open();
bConnect.Text = string.Format("Disconnect");
}
else
{
gsm.Close();
bConnect.Text = string.Format("Connect");
}
}

private void bSend_Click(object sender, EventArgs e)
{
sendMSG sm = new sendMSG(SendSMS);
string s = tbText.Text;
sm.BeginInvoke(s, null, null);
}

Pierwsze zdarzenie odpowiedzialne jest za nawiązanie/rozwiązanie połączenia z komputerem. W tym celu sprawdzana jest funkcja IsOpen(), która w wyniku zwraca wartość bool - czyli połączenie lub jego brak. W razie braku połączenie zostaje ono nawiązane i zmieniany jest wyświetlany tekst na przycisku na "Disconnect", w przeciwnym wypadku połączenie jest zakańczane i także zmieniany jest napis na przycisku na "Connect".
Drugie zdarzenie odpowiedzialne jest za naciśnięcie przycisku Send, którego zadaniem jest przypisanie funkcji obsługującej wysyłanie sms do delegata oraz przypisanie zawartości pola tbText, w którym powinna znajdować się wiadomość do zmiennej typu string. Następnie funkcja ta, która została opisana poniżej zostaje asynchronicznie wywołana.

private void SendSMS(string msg)
{
if (gsm.IsOpen() && gsm.IsConnected())
{
SmsSubmitPdu pdu = new SmsSubmitPdu(msg, tbNumber.Text);
gsm.SendMessage(pdu);
}
}

Zadaniem tej fukcji jest sprawdzenie, czy telefon jest podłączony i czy zostało nawiązane z nim połaczenie. Jeżeli oba te warunki są spełnione, to w konstruktorze nowej zmiennej typu SmsSubmitPdu jako parametry podawana jest wiadomość do wysłania, oraz numer docelowy. Następnie wywoływana jest funkcja wysyłająca sms.
Ważnym jest także, aby po każdorazowym zakończeniu działania programu zamknąć otwarte połączenie z telefonem, ponieważ jego brak może skutkować zawieszeniem się systemu. W tym przypadku zostanie użyte zdarzenie odpowiedzialne za zamykanie okna aplikacji.

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (gsm.IsOpen()) gsm.Close();
}

W ten o to łatwy i szybki sposób powstała niewielka aplikacja służąca do wysyłania sms z poziomu komputera. Może mieć ona wiele zastosowań, nie tylko do szybkiego pisania sms do znajomych, ale także do tworzenia systemów raportowania, potwierdzania haseł sms i wiele innych. Aby usprawnić jej działanie i ograniczyć liczbę pojawiających się wyjątków, należałoby dodać troche kodu, jednak aplikacja ta służy tylko i wyłącznie do przedstawienia zagadnienia wysyłania sms z komputera w technologii .NET.

W razie jakichkolwiek pytań, zapraszam do działu kontakt.