• 1
  • 2
2009-02-23, 18:40
  #1
Medlem
Vad behöver man?
  • -Mobiltelefon
  • -Dator, linux ofc
  • -Modemsladd, se kjell.com -> Telefoni -> Mobiltelefontillbehör -> Datoranslutning
  • -En gnutta kunskap om mysql, linux och php

Mobiltelefonen skall helst vara Nokia, men fungerar med andra märken och telefoner som tar emot AT kommandon.

För att få telefonen och datorn att "prata med varandra" kan vi använda gnokii (http://www.gnokii.org/), och mysql för att spara meddelanden i en databas. I ubuntu installeras detta enklast genom;


MySQL
Kod:
sudo apt-get install mysql-server mysql-client

PHP
Kod:
sudo apt-get install php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-pspell php5-snmp php5-sqlite

Apache & phpmyadmin (valfritt)
Kod:
apt-get install apache2 
apt-get install phpmyadmin

Gnokii
Kod:
sudo apt-get install gnokii gnokii-smsd-mysql

Detta är möjligen en overkill av installerade program och ni kommer troligtvis inte behöva allt detta, men jag rekomenderar att installera ovanstående. Nu när vi har allt som behövs installeras, ska vi bara försöka konfiguera detta...

Gnokii
Kopiera sedan "/etc/gnokiirc" till "/home/anv/.gnokiirc" och gör eventuella ändringar. Eftersom min telefon är inkopplad med seriell usbsladd, och är en sony ericsson som styrs av AT kommandon ser det väsentliga ut såhär i min fil.

Kod:
[global]
port = /dev/ttyUSB0
model = AT
...
connection = serial
...
serial_baudrate = 19200
..

gnokii --identify
gnokii --monitor


Kan nu telefonen identifieras, ska nu telefonen gå att kommunicera med. Annars är det bara att gå tillbaka och testa nya inställningar.

MySQL
Börja med att skapa en speciell användare i mysql för gnokii (så att den inte har privilegier att sabba någonting). Man vet aldrig vem som börjar smsa sql injections... Jag gillar att använda phpmyadmin för att man får bättre översikt över databaserna och användare.
http://[serverIP]/phpmyadmin -> logga in -> Privilegier -> lägg till ny användare + skapa databas till användaren

Klicka sedan på databasen och sedan SQL för att göra alla tabeller i databsen.
taget från "/usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql"

Kod:
CREATE TABLE inbox (
  id int(10) unsigned NOT NULL auto_increment,
  number varchar(20) NOT NULL default '',
  smsdate datetime NOT NULL default '0000-00-00 00:00:00',
  insertdate timestamp(14) NOT NULL,
  text text,
  phone tinyint(4),
  processed tinyint(4) NOT NULL default '0',
  PRIMARY KEY  (id)
);

CREATE TABLE outbox (
  id int(10) unsigned NOT NULL auto_increment,
  number varchar(20) NOT NULL default '',
  processed_date timestamp(14) NOT NULL,
  insertdate timestamp(14) NOT NULL,
  text varchar(160) default NULL,
  phone tinyint(4),
  processed tinyint(4) NOT NULL default '0',
  error tinyint(4) NOT NULL default '-1',
  dreport tinyint(4) NOT NULL default '0',
  not_before time NOT NULL default '00:00:00',
  not_after time  NOT NULL default '23:59:59',
  PRIMARY KEY  (id)
);

CREATE TABLE multipartinbox (
  id int(10) unsigned NOT NULL auto_increment,
  number varchar(20) NOT NULL default '',
  smsdate datetime NOT NULL default '0000-00-00 00:00:00',
  insertdate timestamp(14) NOT NULL,
  text text,
  phone tinyint(4),
  processed tinyint(4) NOT NULL default '0',
  refnum int(8) default NULL,
  maxnum int(8) default NULL,
  curnum int(8) default NULL,
  PRIMARY KEY  (id)
);


Klicka sedan på SQL igen och fyll med detta;
Kod:
CREATE TABLE users (
  id int(10) unsigned NOT NULL auto_increment,
  namn varchar(20) NOT NULL default '',
  number varchar(20) NOT NULL default '',
  priv varchar(20) NOT NULL default '',
  sms int(10) NOT NULL,
  PRIMARY KEY  (id)
);

Detta ska senare bli en vitlista med nummer som vi skickar sms till, priv = privelegier så ditt nummer kan bli admin , och en räknare som ska räkna nedåt så polare kan få tillgång till x antal smsutskick.

Nu ska vi binda samman gnokii och databsen genom smsd,
smsd -u _anv_ -p _lösen_ -d _smsdb_ -c localhost -m mysql -b ME -f /er/plats/för/loggfil
Se `smsd --help` för mer information

Logga sedan in i phpmyadmin och se om databsen fylls med sms, testa skicka sms till telefonen och slutligen gör en entry i outboxen med ditt nummer och ett meddelenade (processed=0, error=-1)och se om du får något sms... Fungerar allt här är det bara att gå vidare, annars blir det att kolla loggar...


Detta är min första guide, och det är möjligt att jag har missat någonting. Skriv om det är någon som har problem så ska jag försöka hjälpa till!
Citera
2009-02-23, 18:40
  #2
Medlem
För att göra detta lite mer intressant, ska vi förstås automatisera det hela. Det gör vi genom att något program/script lägger till entries i databasen, och jag valde php som programmeringsspråk. Genom att köra scriptet i t.ex. screen och låta det gå i en "oändlig while(1) loop" för att kolla efter nya mottagna sms kan vi även få det att agera därefter. Detta är en del av mitt php-script, och några av mina funktioner.

Kod:
<?php
//Mysql connection made here

mysql_connect ("localhost""dbUser""dbPass") or die(mysql_error());
mysql_select_db("DB") or die(mysql_error());


// mitt nummer
$AdminN='+4700000000';

//Useful functions comes here

function filter ($text) {
    return 
mysql_escape_string($text);
}

function 
setMessageProcessed($id) {
    
mysql_query ("UPDATE `inbox` SET `processed` = '1' WHERE `id` = '".filter($id)."'");  //Set processed as 1
    
if (mysql_error()) return false
    return 
true;
}

function 
sendmessage($number$text) {

    
$footer "\n-Server";  //Footer text
    
$text $text.$footer;                         //Remove this line to not add footer text.
    
mysql_query("INSERT INTO `outbox`  (`id` ,`number` ,`processed_date` ,`insertdate` ,`text` ,`phone` ,`processed` ,`error` ,`dreport`, `not_before`, `not_after`) VALUES (NULL , '".filter($number)."', NOW( ) , '0000-00-00 00:00:00', '".filter($text)."', NULL , '0', '-1', '0', '     00:00:00', '23:59:59');");
    
    
//skickar inte meddelande nu...
    
echo "SENDmsg:\n $text \n to $number\n";
    echo 
"\n";
    
decreaseCount($number);
}

function 
decreaseCount ($number) {
    
$details mysql_fetch_array(mysql_query ("SELECT * FROM `numbers` WHERE `number` = '".filter($number)."' ORDER BY `id` LIMIT 0, 1"));
    
$count $details['count'];
    
$id $details['id'];
    
$count--;
    
$query "UPDATE numbers SET count = $count WHERE id='$id'";
    
mysql_query($query);
    
//echo

}

function 
legalNumber($number$request '') {
    
$query "SELECT * FROM `numbers` WHERE number = '".filter($number)."' && allow LIKE '%".filter($request)."%'";
    
$result mysql_query($query);
    
    
$num=mysql_numrows($result);
    echo 
"num= ".$num."\n";
    if (
$num == '1') {
        return 
true;
    } else {
        return 
false;
    }
}
//gets the match content
function get_match($regex,$content)
{
    
preg_match($regex,$content,$matches);
    return 
$matches[1];
}

//gets the data from a URL
function get_data($url)
{
    
$ch curl_init();
    
$timeout 5;
    
curl_setopt($ch,CURLOPT_URL,$url);
    
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
    
$data curl_exec($ch);
    
curl_close($ch);
    return 
$data;
}

function 
countSMS($number) {
    
$details mysql_fetch_array(mysql_query ("SELECT * FROM `numbers` WHERE `number` = '".filter($number)."' ORDER BY `id` LIMIT 0, 1"));
    
//print_r($details);
    
return $details['count'];
}

function 
addUser ($namn,$number,$addCount) {
    
$query "INSERT INTO numbers VALUES ('','".filter($namn)."','".filter($number)."','ping,status','".filter($addCount)."')";
    
mysql_query($query);

}

function 
addSMS ($number,$upCount) {
    
$query="UPDATE numbers SET count='".filter($upCount)."' WHERE number='".filter($number)."'";
    
//echo $query;
    
mysql_query($query);
}


echo 
"init smsserver\n";

while (
1) {
    
sleep(1);  //Check messages every 1 sec
    
$details mysql_fetch_array(mysql_query ("SELECT * FROM `inbox` WHERE `processed` = 0 ORDER BY `id` LIMIT 0, 1"));
    
//svarsSMS vid processed==0
    
if ($details == false) continue;
    
setMessageProcessed($details['id']);
    
$number $details['number'];
    
$text trim($details['text']);
    echo 
"Recmsg:\n $text \n";
    echo 
"number: $number\n";
    
$smsCount countSMS($number);
    
$commands explode(","$text);
    switch (
strtolower($commands[0])) {
        case 
'ping':
            if(!(
legalnumber($number,'ping'))) continue;
            
sendmessage($number,"pong");
            break;    
        case 
'status':
            if(!(
legalnumber($number,'status'))) continue;
            
$msg "Status\nDu har $smsCount sms kvar, ";
            
$query="SELECT * FROM outbox WHERE number = ".filter($number);
            
$result=mysql_query($query);
            
$num=mysql_numrows($result);
            
$msg $msg."och har mottagit ".$num." sms.";
            
sendmessage($number,$msg);
            break;
        case 
'math':
            if(!(
legalnumber($number,'status'))) continue;
            
//skickas i math,4/ln(9)*sin(pi/4)
            
$calc str_replace('+','%2B',$commands[1]);
            
$url 'http://www.google.com/search?hl=en&q='.urlencode($calc).'&btnG=Search';
            
$gmath get_data($url);
            
$result get_match('/<td nowrap dir=ltr><h2 class=r><font size=\+1><b>(.*)<\/b>/isU',$gmath);            
            
$msg "Math\n".$result;
            
sendmessage($number,$msg);
            break;
        case 
'info':
            if(
legalnumber($number,'status') == false) continue;
            
$msg "info SMS\n commands; ping,status,math,uptime,sgup";
            
sendmessage($number,$msg);
            break;
        case 
'uptime':
            if(
legalnumber($number,'status') == false) continue;
            
$msg trim(shell_exec('uptime'));
            
sendmessage($number,$msg);
            break;
        case 
'idag':
            if((!
legalnumber($number,'status'))) continue;
            
$cal = array();
            
$cal explode("\n",shell_exec('calendar -A 0 -f /usr/share/calendar/calendar.sms'));
            
$msg "Today ".date("d/m");
            for (
$i=0$c count($cal); $i<$c$i++) {
                if (
$cal[$i] == '') continue;
                
$msg $msg."\n".($i+1)."-".trim(substr($cal[$i],7));
            }
            
sendmessage($number,$msg);
            break;
        case 
'sgup'// signup
            
if(legalnumber($number)) {
                
//already signed up silly
//                echo "already signed up";
                
$msg "Du är redan en användare!!";
                
sendmessage($number,$msg);
            } else {
                
//request to sign up
                
$msg "req $number\n ".$commands[1];
                
sendmessage($AdminN,$msg);
            }
            break;
    
//ADMIN STUFF
        
case 'adda'//läger till en ny användare
            
if (!(legalnumber($number,'admin'))) continue;
            
//tar alltid formen --> adda,Namn,+467nummer,25
            
addUser($commands[1],$commands[2],$commands[3]);
            
$msg "Välkommen, skicka 'info' för att komma igång, du har nu ".$commands[3]." sms";
            
sendmessage($commands[2],$msg);
            break;
        case 
'asms'//lägger till fler sms
            
if (!(legalnumber($number,'admin'))) continue;
            
//tar alltid formen --> asms,+46nummer,25
            
addSMS($commands[1],$commands[2]);
            break;
    }
}
?>

Detta kan du nu spara som smsserver.php, och starta i konsolen genom `php smsserver.php` i t.ex. screen. Genom få phpscriptet att läsa av filer, eller agera efter andra inputs kan man servern att skicka sms vid t.ex. nedladdadade torrents eller andra händelser!
Citera
2009-02-23, 19:44
  #3
Medlem
Du är min gud! Tack!
Citera
2009-02-25, 20:34
  #4
Medlem
.Kandidatens avatar
Någon kunnig som kan svara på vad allt detta gör?
Citera
2009-02-25, 23:57
  #5
Medlem
Citat:
Ursprungligen postat av .Kandidaten
Någon kunnig som kan svara på vad allt detta gör?
Läs hemmaserver-tråden,
https://www.flashback.org/showthread.php?t=851513
Citera
2009-03-09, 19:19
  #6
Medlem
Hos mig blir kolumnen TextDecoded ur tabellen sentitems blank (MySQL).
Men inte i kolumnen TextDecoded ur tabellen outbox så finns TextDecoded med respektive text. Så mina sms:utåt blir blanka allihop, hur kan jag lösa det här tro?


Python:
Kod:
"""INSERT INTO outbox (DestinationNumber, Text, TextDecoded, CreatorID, SenderID)
VALUES (%s, %s, %s, %s, %s)""",
[
(sender, text, text, cid, sid)
] )

f.ö fin tråd.
__________________
Senast redigerad av Fnima 2009-03-09 kl. 20:02.
Citera
2009-03-09, 19:59
  #7
Medlem
GhosteNs avatar
Snyggt jobbat du! Tummar upp!
Citera
2009-03-10, 09:59
  #8
Medlem
Jag hade glömt sätta 'Coding'-kolumnen för tabellen därför fungerade inte mina sms. Nu funkar allt.
Citera
2009-03-10, 10:40
  #9
Medlem
Jag tror att jag hade skrivit om en av decreaseCount($number) till:
Kod:
function decreaseCount ($number) {
    
$query "UPDATE numbers SET count = count-1 WHERE `number` = '".filter($number)."'";
    
mysql_query($query);
    
//echo


Ju mindre bös att hålla ordning på, desto mindre fel Dessutom så slipper man en fråga till databasen - inte för jag tror den är den mest överbelastade...

Dessutom, i stället för att köra screen borde du väl kunna starta scriptet typ
php smsserver.php & > /var/log/smsserver.log (för att spara outputen i en loggfil) alternativt
php smsserver.php & > /dev/null (för att kasta all output).
Vad vet jag, jag tror att jag hade gjort något av de senare i alla fall. Om det är bättre vet jag inte.

Observera att allt är otestat, men jag har för mig att man ska göra så.
Citera
2009-03-10, 20:05
  #10
Medlem
Fail @*min sista kommentar; ska ska vara kan, inget annat. Jag skyller på brist på koffein.
Citera
2009-03-10, 20:41
  #11
Medlem
LiquiSoles avatar
jag är ganska så noob på det hära, men hur får man reda på om telefonen tar AT kommandon?
Citera
2009-03-10, 20:43
  #12
Medlem
De flesta telefoner gör det; koppla in den till datorn via USB-, Serieport eller bluetooth och använd någon typ av terminal som kan kommunicera med densamme (ex HyperTerminal i Fönster). Koppla upp med lämpliga inställningar och skicka ATAT tror jag det är. Fattar din telefon ska den svara OK.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in