Software Hoek

Shell Script Zendt SMS Berichten


Ik wilde mijn Linux home server leren hoe hij SMS berichtjes kon versturen om me te attenderen op speciale gebeurtenissen. Zoals gewoonlijk zijn er echter meerdere wegen naar Rome. Hier zijn een paar manieren om dit te bereiken:

  • Gebruik een speciaal SMS modem.
  • Gebruik een oude Nokia telefoon die verbonden is met de COM poot van de server.
  • Gebruik een van de vele Email naar SMS diensten.
  • Gebruik een SMS dienst op het internet.

De eerste 2 opties hebben extra hardware nodig, een extra voeding en een actieve SIM card. Speciaal dat laatste kan een probleem zijn. Je kunt kiezen voor een volledig SMS abonnement, maar dan betaal je elke maand een vast bedrag, ook al verzendt je geen enkele SMS. Of je betaalt de hoofdprijs als je SMSjes buiten je bundel gaat sturen. Een pre-paid SIM is ook een optie, maar die dingen hebben de vervelde eigenschappen om te verlopen na een half jaar. Dus je moet constant in de gaten houden of je kaart niet verlopen is en of er nog genoeg geld op je kaart staat. Voor beide acties moet dan de SIM kaart uit het modem genomen worden en in een echte telefoon gestoken worden. Ook voor het opwaarderen van het beltegoed zal de SIM kaart in een echte telefoon gestoken moeten worden.

Email naar SMS diensten komen en gaan op het internet. Met name de gratis diensten die een aantal jaren geleden nog bestonden zijn allemaal verdwenen. En als ze nog mochten bestaan dan is het aantal SMSjes wat je per dag/week/maand mag versturen drastisch gereduceerd. Verder ondersteunen ze zelden of nooit de volle capaciteit van 160 karakters per bericht.
Betaalde Email naar SMS diensten zijn vaak relatief prijzig of hebben een heel ondoorzichtige prijsstructuur. Zeker als je maar een paar SMSjes per maand hoeft te versturen.

Het ziet er dus naar uit dat we voor de laatste optie moeten gaan. Alles wat je nodig hebt is een klein shell scriptje en een abonnement bij Voipbuster. Dit is ook een pre-paid systeem, maar je tegoed verloopt nooit. En je kunt je tegoed simpel raadplegen en opwaarderen via internet, waar ook ter wereld.

P.S. Als je geen shell toegang hebt op je web server, dan kun je ook gebruik maken van een PHP script.

Aanmelden Bij Voipbuster


Voipbuster signup Voordat je SMSjes kunt gaan versturen moet je je aanmelden bij Voipbuster. Nadat je je hebt aangemeld moet je wat beltegoed aanschaffen. Er zijn talloze manieren waarop je dat kunt doen. Als je het systeem alleen maar even wilt uitproberen kun je een 0900 nummer bellen, dit kost je €1.30 waarna je zo'n 18 SMSjes kunt versturen. Goedkoper is het echter om via iDeal te betalen, dan betaal je wel meer maar je houdt netto meer beltegoed over. Met dat beltegoed kun je SMSjes over zowat de gehele wereld vesturen en dat is nu net wat we wilden. Berichtjes naar Nederlandse nummers kosten ongeveer €0.06 .

Je kunt je aanmelden door de Voipbuster soft phone te installeren (zie download link op www.voipbuster.com), waarin je je aan kunt melden als nieuw of bestaand lid. Met die soft phone kun je overigens ook nog eens 4 maanden gratis bellen naar vaste nummers binnen Nederland en enkele andere landen in Euro na elke opwaardering van €10 .
Linux en Mac mensen hebben niets aan die soft phone maar kunnen een andere link kiezen waarbij ze zich rechtstreeks op de website van Voipbuster kunnen aanmelden.

Het Shell Script


Shell scripting is behoorlijk nieuw voor mij (tenminste toen ik dit schreef), daarom zou het kunnen zijn dat ik soms een erg grote omweg neem om mijn doel te bereiken. Maar het werkt, en dat is toch wat telt, niet waar? Je kunt het script hieronder gewoon met copy/paste overnemen, of je kunt deze tgz file downloaden en uitpakken op jouw systeem.
Alles wat je daarna nog moet doen is even de drie eerste variabelen aanpassen aan jouw eigen Voipbuster account En vergeet niet het script bestand executable te maken met het commando chmod +x sendsms .

#!/bin/sh

# sendsms
#
# Author: San Bergmans
# www.sbprojects.com / www.oeioei.nl
#
# Sends an SMS to a phone number through Voipbuster.
# Obviously you'll need a Voipbuster account for this to wrok.
# use: sendsms +31612345678 Message to be sent
# Messages longer than 160 are refused by the service. The return message
# will be failure. Therefore the script will truncate your message to 160
# characters for you.
#
# Sending to more than one phone number is not reliable, you'll get a
# success response, you pay for the sent SMSes, but nothing is sent.
# Therefore stick to one phone number at a time.
#
# If you want a Fonera to send an SMS add the option --no-check-certificate
# to the wget command. The fonera doesn't kill the leading tab in the
# result string.

# Change these settings to match your account with www.voipbuster.com

USER="username"
PASS="password"
FROM="from"

guide ()
{
    echo "Usage:   $0 phone_number sms text"
    echo "Example: $0 +31612345678 This text is sent\n"
}

# Parameter $1 is the destination number in international notation
if [ $# -eq 0 ]; then
    echo "No parameters given"
    guide
    exit 1
else
    TO=$1
fi

# The rest of the parameter string is used as SMS text
shift
SMS_TEXT="$*"
SMS_TEXT=`echo $SMS_TEXT|cut -b -160`

if [ "$SMS_TEXT" = "" ]; then
    echo "No text message given"
    guide
    exit 1
fi

# Form the URL, including constants and parameters
URL="https://www.voipbuster.com/myaccount/sendsms.php?username=$USER&password=$PASS&from=$FROM&to=\"$TO\"&text=$SMS_TEXT"

# Send SMS and print the result string from the XML file returned by voipbuster
wget -q "$URL" -O - | grep resultstring | sed -e 's,<resultstring>,,' -e 's,</resultstring>,,' -e 's," ",a,' -e 's,\t,,'

# Example result file from voipbuster
# Indented lines are preseded by a tab

# <?phpxml version "1.0" encoding="utf-8"?>>
# <SmsResponse>
# 	<version>1</version>
#	<result>1</result>
#	<resultstring>success</resultstring>
#	<description></description>
#	<endcause></endcause>
# </SmsResponse>

Nu kun je SMS berichten gaan versturen door het volgende commando in te typen: ./sendsms +31612345678 "Hier komt jouw bericht". Het kan nodig zijn om ./ te vervangen door het pad naar jouw sendsms script. Het telefoonnummer moet in het internationaal formaat gegeven worden, per slot van rekening kun je berichtjes naar de hele wereld sturen. Na het telefoonnummer volgt nog het tekst bericht.
Er gelden een paar simpele regels voor het tekst bericht zelf: Het bericht mag niet langer zijn dan 160 tekens, langere berichten worden afgebroken op 160 tekens. En je mag de tekens *, " en \ niet gebruiken in je tekst. Eigenlijk mag het wel, als je maar weet hoe Linux met die tekens omgaat. Bijvoorbeeld het * teken wordt vervangen door alle bestandsnamen in de huidige directory, wat in dit geval vast niet de bedoeling is.

Voor zover ik heb kunnen zien zijn er twee antwoorden van het programma mogelijk, "success" en "failure". Tot nu toe heb ik nog geen andere resultaten gezien.

Embedded Linux


Je kunt het sendsms script zelfs in sommige embedded Linux versies gebruiken, zoals bijvoorbeeld in de Fonera 2.0N of in de Nokia internet tablets N810 en soortgenoten. Maar hiervoor moet je wel een kleinigheidje aanpassen in het programma. Dat is nodig omdat die embedded Linuxen een aantal beperkingen hebben. Alles wat je moet doen is de optie --no-check-certificate achter het wget commando in het script toe te voegen. Hierdoor negeert het script het beveiligings certificaat. Iets minder veilig, maar het werkt in ieder geval wel.