Geschrieben von: Christoph Wille
Kategorie: C#
This printed page brought to you by AlphaSierraPapa
Ein äußerst beliebtes Handyfeature ist heutzutage die SMS, oder in der Langform das Short Message System. Es gibt viele Websites am Netz, von wo aus man seine SMS gratis abschicken kann - meist Werbung mitinkludiert. Heute möchte ich vorstellen, wie man SMS selbst versenden kann, und zwar mit Hilfe verschiedener Framework Klassen.
Auch unter .NET geht es ohne einen Gateway (Internet zu GSM) nicht. Und wenn man einen zuverlässigen haben will, dann muß man dafür bezahlen. Ich habe mich für sms-wap.com entschieden, und wenn man sich anmeldet, bekommt man drei Test-SMS gratis dazu - bevor man irgendetwas zahlen muß. Also probieren kostet im Prinzip nichts.
Es gibt unter SMS Delivery Interfaces die notwendige Dokumentation, wie man das HTTP Application Interface ansprechen kann. Wer es sich durchlesen will, der möge es tun - ich finde es etwas überzogen, für HTTP direkt mit Sockets zu programmieren. Deshalb habe ich für den heutigen Artikel den direkten Weg eingeschlagen: das WebRequest Objekt.
Das gesamte Versenden einer SMS läuft über die Seite http://clients.sms-wap.com/cgi/csend.cgi, der man einige Parameter via POST übergeben muß: klarerweise die eigenen Accountdaten (Benutzername und Passwort), die Zielhandynummer sowie die Nachricht.
Wie gehen wir also vor? Nun, die Grundlagen haben wir bereits im Artikel Scrapen von Webseiten gelernt, allerdings haben wir dort keine (POST) Daten vom Client zum Server geschickt. Um diesen Part müssen wir unsere Implementation erweitern. Weil ich gerade von Implementation rede: es spielt sich alles in der Klasse SMSGateway ab, und obwohl das Beispiel heute eine Kommandozeilenapplikation ist, kann man die Klasse in beliebigen anderen Anwendungstypen verwenden.
Nun zum Code der Klasse, der hauptsächlich in der Methode SendMessage zu finden ist:
class SMSGateway { public string Username; public string Password; public bool SendMessage(string strMessage, string strTelNoTo, out string strResponse) { string strQuery, strPage; strQuery = "N=" + HttpUtility.UrlEncode(strTelNoTo) + "&UID=" + HttpUtility.UrlEncode(Username) + "&PW=" + HttpUtility.UrlEncode(Password) + "&M=|*UTF8|" + HttpUtility.UrlEncode(strMessage); strPage = "http://clients.sms-wap.com/cgi/csend.cgi"; try { WebRequest wrq = WebRequest.Create(strPage); wrq.Method = "POST"; wrq.ContentType = "application/x-www-form-urlencoded"; byte[] bPayload = Encoding.UTF8.GetBytes(strQuery.ToString()); wrq.ContentLength = bPayload.Length; Stream reqStream = wrq.GetRequestStream(); reqStream.Write(bPayload, 0, bPayload.Length); reqStream.Close(); WebResponse wrp = wrq.GetResponse(); StreamReader sr = new StreamReader(wrp.GetResponseStream(), Encoding.UTF8); StringBuilder strBuildContent = new StringBuilder(); while (-1 != sr.Peek()) strBuildContent.Append(sr.ReadLine()); strResponse = strBuildContent.ToString(); if ("01" == strResponse) return true; } catch(Exception e) { strResponse = e.ToString(); return false; } return false; } }
Was sind die wichtigen Parts? Der erste ist das Erzeugen der Variable strQuery, die die POST Daten repräsentiert. GET als auch POST Daten müssen URL-encoded werden, und diese Arbeit geben wir an die HttpUtility.UrlEncode Methode ab (deren Verwendung ist nicht an ASP.NET Anwendungen gebunden). Ebenfalls sehr wichtig ist bei M= der Part |*UTF8| - ohne diese Angabe bekommen wir beim SMS Gateway Probleme mit den Sonderzeichen.
Es folgt der Code zum Senden der Daten an den Server, und das Abholen der Rückgabewerte. Kein Magic, aber notwendig. Ein Rückgabewert von 01 repräsentiert OK, also die SMS wurde korrekt gesendet. Alles andere ist Mißerfolg. Um ganz auf der sicheren Seite zu sein, liefert die Funktion nicht nur true oder false, sondern für alle Fälle auch den vollen (Fehler)Text.
Wie verwendet man nun diese Klasse? Hier der Code einer simplen Consolenanwendung, aber ASP.NET würde genauso funktionieren:
class MainClass { public static void Main(string[] args) { SMSGateway mySMS = new SMSGateway(); mySMS.Username = "username_here"; mySMS.Password = "password_here"; string strResponse; bool bResult = mySMS.SendMessage("Melcome Sir Walcom [Water]", "4369929675231", out strResponse); Console.WriteLine("Sending SMS, status: {0}, response: {1}", bResult, strResponse); } }
Ich habe mir erlaubt, meinen Benutzernamen und Passwort herauszunehmen...
Die Klasse zum Versenden von SMS ist nun fertig. Spätere Artikel werden diese Klasse dann einsetzen, um spezielle Services für Handys anzubieten. Übrigens: den Film Water kann ich nur sehr empfehlen.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010912.zip
Scrapen von Webseiten
http:/www.aspheute.com/artikel/20000824.htm
Wetterbericht per SMS versenden
http:/www.aspheute.com/artikel/20010913.htm
SMS Delivery Interfaces
http://www.sms-wap.com/e/services.html
sms-wap.com
http://www.sms-wap.com/
Water
http://us.imdb.com/Title?0090297
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.