Ankündigung

Einklappen
Keine Ankündigung bisher.

GSM-Modem zum SMS-Versenden nutzen

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • daviid
    antwortet
    OK, dann schau ich nochmal.

    Aber ich hab mich auch nochmal zu smstools schlau gemacht, das kann ja mit quasi allem was AT-Kommandos frisst umgehen hab gedacht das geht nur mit so USB-Surfsticks, aber falsch gedacht, gut dass ihr mich "penetrant" drauf hingewießen habt :P

    Hab also smstools installiert, in die smsd.conf folgendes geschrieben:

    [GSM1]
    init=ATZ
    device = /dev/ttyS0
    incoming = yes
    pin = 12345
    baudrate = 9200
    cs_convert=yes
    report=no
    Dann dann setz ich in /var/spool/sms/outgoing
    ne Datei namens sms2 mit folgendem Inahlt:
    Code:
    To: 4917*****
    
     Text der SMS
    in smsd.log steht folgendes:
    2012-11-01 21:04:29,2, smsd: Smsd v3.1.11 started.
    2012-11-01 21:04:29,2, smsd: Running as smsd:dialout.
    2012-11-01 21:04:29,4, smsd: File mode creation mask: 022 (0644, rw-r--r--).
    2012-11-01 21:05:30,2, smsd: Conflict with .LOCK file in the spooler: /var/spool/sms/outgoing/sms2 /var/spool/sms/checked
    2012-11-01 21:05:30,2, smsd: Fatal error: Cannot move /var/spool/sms/outgoing/sms2 to /var/spool/sms/checked. Check file and dir permissions.
    2012-11-01 21:05:30,2, smsd: Smsd mainprocess terminated abnormally. PID: 7998.
    Irgendwas stimmt mit den Dateirechten nich, nur was nicht?

    Einen Kommentar schreiben:


  • makki
    antwortet
    Doku ist notleidend, wie immer..

    Man sollte aber in den vorhandenen Plugins sehen können wies läuft, ein paar Beispiele:
    SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/Atmolight.pl
    SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/DMX-Plugin.pl
    Etwas komplexer aber mit allem, lesen/schreiben vom KNX etc:
    SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/cul868

    Das mit dem Textfile meine ich so, das man im Plugin nur das schreiben muss (siehe o.g. Plugin von JuMi) und sich der smsd um den blutigen Rest kümmert..

    Makki

    Einen Kommentar schreiben:


  • daviid
    antwortet
    Dass das nicht die feine englische Art ist ist mir auch klar, aber mit meinen wenigen Programmierkenntnissen war dass das einfachste auf was ich gekommen bin

    a) plugin_socket_subscribe/socksel ist mit select() exakt dafür da, das das Plugin nur aufgerufen wird, wenn auch Daten anliegen. Also schreiben, zurücklehnen, wenn was kommt wird das plugin wieder aufgerufen (und wenns 20ms sind)
    Genau danach hab ich gesucht, aber es gibt leider (noch?) keine Doku zu den ganzen WG spezifischen Befehlen, oder kenn ich die nur nicht?


    Wie meinst du das mit dem Textfile Michael?

    Einen Kommentar schreiben:


  • makki
    antwortet
    Du bist trotzdem in zweifacher Hinsicht leicht aufm Holzweg IMHO..

    a) plugin_socket_subscribe/socksel ist mit select() exakt dafür da, das das Plugin nur aufgerufen wird, wenn auch Daten anliegen. Also schreiben, zurücklehnen, wenn was kommt wird das plugin wieder aufgerufen (und wenns 20ms sind) .. das ist effizienter als das ganze nachzuprogrammieren und mit recv() wertvolle Zeit zu verdüdeln.. (oder wenn, erst mit select nachschauen ob daten da sind und dann recv)
    b) macht man sowas nicht selber sondern überlässt es IMHO spezialisierten Tools (resend bei Problemen, PIN, ...) -> Wurde schon geschrieben: https://knx-user-forum.de/wiregate/1...gateway.html#5
    und ein Plugin von JuMi: https://knx-user-forum.de/wiregate/1...eway-2.html#11

    Einfach ein Textfile schreiben, fertig..

    Makki

    Einen Kommentar schreiben:


  • daviid
    antwortet
    Ganz einfach: weils einfach ist.

    Ich habs jetzt auch hinbekommen:
    Code:
    #!/usr/bin/perl -w
    #use strict;
    
    use CGI::Carp qw(fatalsToBrowser);
    use CGI;
    use Device::SerialPort;
    use IO::Socket::INET;
    my $cgi = new CGI;
    
    # HTTP HEADER
    print "content-type: text/html \n\n";
    
    
    $plugin_info{$plugname.'_cycle'} = 3600;
    my $socknum = 118; # Eindeutige Nummer des Sockets +1
    
    
    #Diese Einstellungen können normalerweise so belassen werden!
    my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $send_port = "50111"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
    my $recv_port = "50110"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
    
    
    my @actionGA;
    push @actionGA, { name => "Alarmanlage", sms_number => '+4917...', sms_text => "Alarmanlage hat um $hour:$min ausgelöst.", trigger_ga => "8/2/0", value => 1 };
    
    #######################
    ### ENDE DEFINITION ###
    #######################
    my ($sec,$min,$hour,$day,$month,$yr19,@rest) = localtime(time);
    my $ctrlz = chr(26);
    
    
    if (!$socket[$socknum]) { # socket erstellen
            $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                      Proto => "udp",
                                      LocalAddr => $recv_ip,
                                      PeerPort  => $send_port,
                                      PeerAddr  => $send_ip,
                                      ReuseAddr => 1
                                       )
    	or return ("open of $recv_ip : $recv_port failed: $!");
    
    	$socksel->add($socket[$socknum]); # add socket to select
    
    	$plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
    	return "opened Socket $socknum";
    } 
    
    
    
    
    
    foreach my $element (@actionGA) {
    	my $sms_number = $element->{sms_number};
    	my $sms_text = $element->{sms_text};
    	my $trigger_ga = $element->{trigger_ga};
    	my $value = $element->{value};
    
    	$plugin_subscribe{$trigger_ga}{$plugname} = 1;
    
    	if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $trigger_ga && defined $msg{'value'} && $msg{'value'} == "$value" ) {		
    		
    
    	#syswrite($socket[$socknum], "test");
    	
    	#return "ok";	
    	
    	my $sms_number2 = 'AT+CMGS="' . $sms_number . '"';
    	
    	
    	syswrite($socket[$socknum], $sms_number2 . "\r");
    	usleep(200000);
    	syswrite($socket[$socknum], $sms_text . $ctrlz);
    
    	return "ok";	
    	#syswrite($socket[$socknum], decimal(26));		
    	
    	
    	}	
    }
    quick and dirty ...

    Aber das ist aber sogar mir noch nen Stück zu dirty :P

    Ich würde doch gern auf das ">" warten bevor der Text gesendet wird, bzw. den Text senden wenn kein "error" zurück kommt, und außerdem kommt nachdem senden noch ein "OK", das würd ich gern auchnoch auswerten.

    JuMi2006 hat oben ja schon nen code dafür gepostet, allerdings ist mir das etwas zu heiß, denn wenn doch keine Antwort kommt hab ich nen Problem ...
    Hat jemand zu dem recv schonmal nen timeout dazu gebastellt, oder gibts da andere Befehle?

    Dann könnte ich nämlich auch gefahrlos so Späße realisieren wie SMS lesen, oder die Signalstärke ausgeben usw.


    Gruß und vielen vielen Dank für die wie immer hervorragende Hilfe!
    David

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Warum muss das eigentlich unbedingt in ein Plugin?
    Wenns Extern wäre, könnte jedes andere Plugin das aufrufen mit Nr. und Text zum senden...
    Also smslink beispielsweise implementiert einen Server, dem man dann lustig Sachen schicken kann oder wo man Sachen abholen kann.

    Einen Kommentar schreiben:


  • daviid
    antwortet
    OK, vielen Dank für den Code.
    Man müsste dort wohl nurnoch was einbauen was nach 1-2s ohne Antwort das ganze abbricht.

    Mein einfaches Script ist jetzt aber fast fertig, nur eins fehlt noch, nach dem Senden des Textes der SMS erwartet das Modem ein <CTRL-Z>, als Dec-zeichen ist das eine 26.

    CR sende ich so:
    Code:
    	syswrite($socket[$socknum], $sms_number . "\r");
    nur wie zur Hölle sende ich ein <CTRL-Z>, bzw das Dec-Zeichen 26?

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Ungetestet in etwa so was aber ein wenig gefährlich ist da sich das Plugin aufhängen kann wenn keine Daten reinkommen.

    Code:
    syswrite($socket[$socknum], $command1);  #erster Befehl
    my $sync = 0; 
    while ($sync < 1)
            {
            my $buf;
            recv($socket[$socknum],$buf,1,0); # unbuffered read from socket -> DANGER
            if ($buf eq ">")    #  SYNC ... hier warten wir jetzt auf das SYNC Zeichen und senden dann
               {
                 $sync++;
                 syswrite($socket[$socknum], $command2);
                }
                else
                {redo;}
    }

    Einen Kommentar schreiben:


  • daviid
    antwortet
    Zitat von JuMi2006 Beitrag anzeigen
    Fest im Plugin verankert ... Für jede Nachricht eine GA und dann mit dem Wert aus verschiedenen vordefinierten Rufnummern auswählen.
    Stimmt das ist eine Lösung, so mach ich das im Moment ja auch bei meinem Email-Plugin.


    Also SMS-Empfang? Nicht sooo schwer aber hat genug tücken ... da kann man aber nur was zu sagen wenn man weiß wieviele Daten in welchem Format reinkommen.
    Nicht unbedingt SMS-Empfang, aber einfach auf das ">" Zeichen warten nachdem die Nummer gesendet wurde, denn erst dann darf der Text kommen

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Zitat von daviid Beitrag anzeigen
    Nur wie übergebe ich dem Plugin am einfachsten die Daten?
    Also Nummer an die die SMS gehen soll und Nachricht?
    Fest im Plugin verankert ... Für jede Nachricht eine GA und dann mit dem Wert aus verschiedenen vordefinierten Rufnummern auswählen. Oder eben wie Szenen ... 1=Haus brennt, 2=Feuerwehr ist da, 3=Feuerwehr hat gelöscht usw..

    Zitat von daviid Beitrag anzeigen
    Und noch ne Frage, mit dem Socket kann ich das Plugin ja auf den entsprechenden Socket subscriben, und wenn dann was auf der seriellen reinkommt weiter verarbeiten, wie macht man das?
    Also SMS-Empfang? Nicht sooo schwer aber hat genug tücken ... da kann man aber nur was zu sagen wenn man weiß wieviele Daten in welchem Format reinkommen.

    Grüße

    Einen Kommentar schreiben:


  • daviid
    antwortet
    OK, nach bischen rumsuchen usw. hab ich das mit dem socket einigermaßen kapiert.

    Habs auch hinbekommen dass darpber was gesendet wird:
    Code:
    #!/usr/bin/perl -w
    #use strict;
    
    use CGI::Carp qw(fatalsToBrowser);
    use CGI;
    use Device::SerialPort;
    use IO::Socket::INET;
    
    my $cgi = new CGI;
    
    #$r_number=$cgi->param('number');
    #$sms_text=$cgi->param('sms_text');
    
    
    
    # HTTP HEADER
    print "content-type: text/html \n\n";
    
    
    
    my $socknum = 118; # Eindeutige Nummer des Sockets +1
    my $test_command;
    
    #Diese Einstellungen können normalerweise so belassen werden!
    my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $send_port = "50111"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
    my $recv_port = "50110"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
    
    
    if (!$socket[$socknum]) { # socket erstellen
            $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                      Proto => "udp",
                                      LocalAddr => $recv_ip,
                                      PeerPort  => $send_port,
                                      PeerAddr  => $send_ip,
                                      ReuseAddr => 1
                                       )
    	or return ("open of $recv_ip : $recv_port failed: $!");
    
    	$socksel->add($socket[$socknum]); # add socket to select
    
    	$plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
    	return "opened Socket $socknum";
    } 
    
    
    
    $test_command = "test 123 ^M";
    
    #syswrite($socket[$socknum], $test_command);
    
    
    
    #if( length($r_number) > 0 && length($sms_text) >0 )
    #{
    	#print 'receiver number: ' .$r_number;
    	#print '<br/><br/>';
    	#print 'SMS-Text: ' .$sms_text;
    	
    	#$command_number = 'AT+CMGS="' .$r_number .'" \r';
    	#$command_text = $sms_text .'<CTRL-Z>';
    
    
    	$test_command = "test 123":
    
    	#syswrite($socket[$socknum], $test_command);
    	#syswrite($socket[$socknum], $command_number);
    	#sleep(1);
    	#syswrite($socket[$socknum], $command_text);
    #}
    Nur wie übergebe ich dem Plugin am einfachsten die Daten?
    Also Nummer an die die SMS gehen soll und Nachricht?
    Habt ihr da Ideen?
    Man könnte das natürlich übern KNX jagen, Bandbreite dazu is ja da, aber irgendwie gefällt mir das nicht.


    Und noch ne Frage, mit dem Socket kann ich das Plugin ja auf den entsprechenden Socket subscriben, und wenn dann was auf der seriellen reinkommt weiter verarbeiten, wie macht man das?


    Gruß
    David

    Einen Kommentar schreiben:


  • makki
    antwortet
    Das ist mit Perl bzw. den Plugins eher blutig, da sind 100ms reaktionszeit völlig unrealistisch..
    Deshalb geht der Weg bei fast allem immer Plugin<->socat<->Serieller Port.

    socat kann man unter "Seriell/LAN/Socketverbindungen" im Webif eintragen, Beispiele im Anhang, von dort gehts dann per UDP/TCP ins Plugin, das spart ne Menge details..

    Makki
    Angehängte Dateien

    Einen Kommentar schreiben:


  • daviid
    antwortet
    Es geht mir ja nicht darum wie ich die SMS versende mit den AT-Kommandos.

    Sondern einfach nur wie ich die eingebaute serielle Schnittstelle vom Wiregate nutze, da ist alles, kann mir da niemand weiter helfen?

    Einen Kommentar schreiben:


  • makki
    antwortet
    Also bis ich das alles gelesen habe, schenke ich dir einen UMTS-Stick für max. 20.- EUR

    smstools drauf, sms in eine Datei schreiben, fertig..

    Makki

    Einen Kommentar schreiben:


  • greentux
    antwortet
    das es "/dev/ttyS0" ist vielleicht?

    Einen Kommentar schreiben:

Lädt...
X