Author |
Post |
|
#1 Sat Dec 11, 2010 01:53, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
|
Operating system name and version: Ubuntu 10.10 Version of smsd: 3.1.14 Name and model of a modem / phone: Option ICON 322 Unlocked Interface: USB
I got my modem sending and receiving messages without a problem, but now I'd like to do something with those incoming and outgoing messages. I've searched on the forums and have messed around with the eventhandler function but cannot get it to work.
My goal is to receive a message, have the eventhandler extract all the data from the text and turn it into variables (from_number, date, message, etc.) and then have the shell script execute the php files that I have in /var/www/sms/sms.php so that when the php files are executed they run through a series of checks and update my SQL database.
So i guess i would like an example of the shell script that would be called and then what would the smsd.conf file look like with the eventhandler called?
I've also messed around with a popular program called "NowSMS" for windows and they allow to post the incoming messages to HTTP with a bunch of GET variables but I don't know if this linux program could do something like this.
Thanks in advanced!! Chad
|
|
#2 Sat Dec 11, 2010 15:25, 173 months ago.
|
Administrator
Registered: May 2009
Location: Jyväskylä, Finland
|
This sample shows how data can be extracted using a shell script: Sample eventhandler to store messages into SQL database. This sample is also a shell script and it calls PHP script: [answered] SMS to execute a script howto. As your PHP script will do the checks and update the DB, you probably could use the PHP only, without any shell scripts. In this case the definition in smsd.conf will be: eventhandler = /var/www/sms/sms.phpIn this case more correct place for the script could be /usr/local/bin, not /var/www. The sms.php should be executable for smsd and look like: #!/usr/bin/php <?php
$sms_type = $argv[1]; $sms_file = $argv[2];
// Your code here...
?> 'php' Syntax Highlight powered by GeSHi Here is how to extract headers and message body from the SMS file: #!/usr/bin/php <?php
$sms_type = $argv[1]; $sms_file = $argv[2];
$sms_file_content = file_get_contents($sms_file); $i = strpos($sms_file_content, "\n\n"); $sms_headers_part = substr($sms_file_content, 0, $i); $sms_message_body = substr($sms_file_content, $i + 2); $sms_header_lines = split("\n", $sms_headers_part); $sms_headers = array();
foreach ($sms_header_lines as $header) { $i = strpos($header, ":"); if ($i !== false) $sms_headers[substr($header, 0, $i)] = substr($header, $i + 2); }
// Your code here...
?> 'php' Syntax Highlight powered by GeSHi You can then do with headers and message body whatever is needed, like store to the DB, forward, or anything. This sample stores some data to file: if ($sms_type == "RECEIVED") { $data = "Got SMS from " .$sms_headers['From'] ."\n" ."Message:\n" .$sms_message_body;
file_put_contents("/tmp/sms_test", $data); } 'php' Syntax Highlight powered by GeSHi Incoming messages can be forwarded to HTTP using wget and PHP's exec function, for example: if ($sms_type == "RECEIVED") { $to_exec = "wget -q \"http://host/script.php" ."?from=" .$sms_headers['From'] ."&message=" .urlencode($sms_message_body) ."\" -O /dev/null";
exec($to_exec); } 'php' Syntax Highlight powered by GeSHi
|
|
#3 Sun Dec 12, 2010 19:09, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
Topic owner
|
Thanks for the response! This is what I have so far: smsd.conf index.php file that is called from eventhandler When I send a text message it seems to not go to my apache server with the GET variables to run my script. I've restarted the service multiple times with no errors and all my files & folders are executable. Do I have something wrong?
|
|
#4 Sun Dec 12, 2010 19:30, 173 months ago.
|
Administrator
Registered: May 2009
Location: Jyväskylä, Finland
|
Does the log of apache show that the script sms/sms.php is called properly?
If it does, you could show the sms/sms.php script here.
If it does not, can you verify that you have wget available (# which wget)?
|
|
#5 Sun Dec 12, 2010 20:29, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
Topic owner
|
Apache did not log anything for the script to be called. And yes wget is installed as i have Ubuntu 10.10
|
|
#6 Mon Dec 13, 2010 11:04, 173 months ago.
|
Administrator
Registered: May 2009
Location: Jyväskylä, Finland
|
You could test your eventhandler manually. To see how wget works, remove -q and -O /dev/null. Check what is your latest incoming message file: ls -ltr /var/spool/sms/incoming. Run: /usr/local/bin/sms/index.php RECEIVED /var/spool/sms/incoming/GSM1.<random>
What is the result?
|
|
#7 Mon Dec 13, 2010 23:54, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
Topic owner
|
|
|
#8 Tue Dec 14, 2010 06:53, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
Topic owner
|
I got it to work! Thanks for your help! The problem was that the index.php file that was being called from the eventhandler was orginally created in windows so I did some research and used dos2unix command to convert it and then it worked and now not only does the wget command work in terminal, it also works when I send a text to the modem from my phone!!  One more thing! lol Sorry :/ Since I am running the PHP script from localhost how might I post back a message to the the same GSM modem that recieved the message for example: Text sent to GMS1 "Hello" Runs through PHP scripts Updates sql database Then at the end of the script it automatically replies back to the number that sent it GSM1 replies: "Thanks for texting me" Is that done through another eventhandler or is it done through PHP on the Apache side?
|
|
#9 Tue Dec 14, 2010 11:09, 173 months ago.
|
Administrator
Registered: May 2009
Location: Jyväskylä, Finland
|
chadpriddle wrote Since I am running the PHP script from localhost how might I post back a message to the the same GSM modem that recieved the message for example:
Text sent to GMS1 "Hello" Runs through PHP scripts Updates sql database Then at the end of the script it automatically replies back to the number that sent it GSM1 replies: "Thanks for texting me"
Is that done through another eventhandler or is it done through PHP on the Apache side?
I assume that you have SMSTools3, PHP and SQL running on the same server, and Apache on the another server. After SQL database is updated successfully, you can simply create an answer SMS file which contains appropriate message and is sent to $sms_headers['From'] number. On how to create SMS files with PHP, see these samples: smstest.php, Multiple recipients in single SMS file. This site is also useful: http://www.php.net/.
|
|
#10 Tue Dec 14, 2010 11:40, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
Topic owner
|
I know this is really basic: I'm sure I'm going to have to so some string conversion to make sure everything pass through correctly. Everything works perfectly tho! I'm so stoked 
|
|
#11 Tue Dec 14, 2010 11:50, 173 months ago.
|
Administrator
Registered: May 2009
Location: Jyväskylä, Finland
|
You should write to the "*.LOCK" file as those samples do. If smsd sees incomplete file (which is not locked) in the outgoing directory, bad things may happen.
And on Linux do not use carriage return ("\r").
|
|
#12 Tue Dec 14, 2010 12:27, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
Topic owner
|
So the files in the outgoing folder should have ".LOCK" at the end? Example: "sms_send_581204.LOCK"
I modified my script and now the files won't send out, they just stay in the outgoing folder. Could you please clarify?
|
|
#13 Tue Dec 14, 2010 12:30, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
Topic owner
|
Do you mean I should add the LOCK and then when the file is done being created then I should rename it after is is complete?! Because that makes sense to me
|
|
#14 Tue Dec 14, 2010 12:43, 173 months ago.
|
Administrator
Registered: May 2009
Location: Jyväskylä, Finland
|
chadpriddle wrote Do you mean I should add the LOCK and then when the file is done being created then I should rename it after is is complete?! Because that makes sense to me
Yes. Like the sample does: $application = "web_sendsms"; $outgoing = "/var/spool/sms/outgoing"; $error = 0; ...
//$filename = $outgoing ."/". $application ."-" .mt_rand(1, 99999); $filename = $outgoing ."/". $application ."-" .str_replace(".", "", uniqid(mt_rand(), true)); if (($handle = fopen($filename .".LOCK", "w")) != false) { fwrite($handle, "To: " .trim($dest) ."\n"); fwrite($handle, "\n"); fwrite($handle, $message); fclose($handle); if (rename($filename .".LOCK", $filename) != true) $error = 3; } else $error = 2;
... 'php' Syntax Highlight powered by GeSHi EDIT: I also have changed the way how random filename is generated. The new one is better. « Last edit by keke on Tue Dec 14, 2010 12:48, 173 months ago. »
|
|
#15 Tue Dec 14, 2010 20:19, 173 months ago.
|
Member
Registered: Dec 2010
Location: United States of America
Topic owner
|
This is software is amazing! Thanks for everything FYI I have Ubuntu server running SMS Server Tools 3, PHP and Apache with my scripts to tell what the incoming/outgoing texts should do. My business website with the SQL database is hosted separately. I'm looking into hosting everything all on one server or at lease on the same local network. « Last edit by chadpriddle on Tue Dec 14, 2010 20:23, 173 months ago. »
|