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

    [wiregate] GSM-Modem zum SMS-Versenden nutzen

    Moin ich hab mir auf eBay für 20€ nen MC-Technologies TC65 JavaTerminal geschossen.
    Ein GSM-Modem mit dem ich SMS versenden, und zwar nicht übers Internet oder per ISDN, sondern völlig unabhängig übers Handy-Netz.

    Soweit so gut, gesteuert wird das ganze per RS232 über AT-Befehle, und zwar folgendermaßen:

    Man sendet dem Modem folgendes:
    AT+CMGS="+49-handy-nummer",145 <CR>
    dieses Antwortet mit:
    >
    und wenn dieses ">" empfangen wird muss man den Text hinterher senden:
    SMS-Text <CTRL+Z>
    und danach kommt noch ein
    OK
    zurück

    Hat schon jemand sowas ähnliches als Plugin?

    Gruß
    David

    #2
    Für einen einfachen UMTS-Stick hab ich das hier:

    https://knx-user-forum.de/forum/supp...wiregate/21645
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #3
      Naja, das hilft mir eigentlich nicht weiter, ich bin eher auf der Suche nach einer Möglichkeit aus einem Plugin was an die serielle Schnittstelle schicken zu können, das sieht momentan folgendermaßen aus:
      Code:
      my $schnittstelle = '/dev/ttyUSB-1-1';
      
      
      
      #ab hier nichts mehr ändern
      # Zyklischer Aufruf nach restart, empfang GA oder nach einstellung rrd (typisch 300sek).
      $plugin_info{$plugname.'_cycle'}  = 25; 
      
      use Device::SerialPort;
      
      my $serial = Device::SerialPort->new($schnittstelle) || die "can't open $schnittstelle! ($!)\n";
      $serial->baudrate(9600);
      $serial->parity("none");
      $serial->databits(8);
      $serial->stopbits(1);
      
      
      
      
      $serial->write($command); #Befehl an das Modem senden
      Bitte nicht auslachen

      Ich bin mir nur noch nicht sicher wie das Plugin den befehl zum Senden der SMS bekommen soll.
      Ich hatte mir gedacht irgendwie übers Netzwerk, so dass das eine Plugin eine Störmeldung produziert und die irgendwie an das SMS-Plugin weiterleitet, wie genau das gehen soll weiß ich aber nocht nicht.
      Hat da jemand Ideen?

      Kommentar


        #4
        Nur mal kurz geantworteet da im Moment keine Zeit.

        Das geht schon, aber meine bisherigen Erfahrungen mit bidirektionaler Kommunikation mit dem seriellen Port zeigen eigentlich dass man es lassen sollte wenn es auch anders geht. ich würde mir nen billigen UMTS-Stick besorgen (max. 20€) und den oben genannten Weg nehmen.

        Falls Du doch auf Basteln Lust hast dann wäre einer der Threads zur "Zählerabfrage" ganz hilfreich, dort habe ich und andere ein paar Codes gepostet wo bidirektional mit der Schnittstelle kommuniziert wird. Falls ich morgen nochmal Zeit habe kann ich da ein Beispiel posten.

        Das ausführen des Plugins kannst du mir einem plugin_subscribe (Forensuche) machen und durch eine GA auslösen lassen. Was möchtest Du denn über SMS signalisieren lassen?

        Gruß
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          @daviid: Warst du in mienem Plugin spicken

          Naja ehrlich gesagt würde ich versuchen das ganze übereinen Socket zu lösen. Ich weiss nicht warum aber mir scheint es so, als sei seit dem ComfoAir-Plugin die Mode aufgekommen direkt an der seriellen Schnittstelle zu fummeln. Habe in letzter Zeit schon ein paar solche Plugins gesehen. Das würde ich aber in jedem Fall wenn immer möglich vermeiden und einen Socket zwischenschalten.

          Hast du eine Doku zu dem GSM-Modem? Sollte sich doch relativ leicht realisieren lassen
          Gruss Patrik alias swiss

          Kommentar


            #6
            Von mir aus kann man das gerne über einen Socket lösen.

            Gibts da schon ein Plugin in dem ich spicken kann?

            Zu dem biderektionalen, dass mit dem ">" kann man laut Doku auch durch ein kurzes warten von 100ms weg lassen, aber die Bestätigung in Form des "OK"s hätte ich doch gerne, das sollte sich doch eigentlich machen lassen, oder?


            Gesteuert wird über ganz normale AT-Kommandos, die explizite Kommando-Liste gibts hier: http://webs.uvigo.es/jagfernandez/ET...User_guide.pdf


            Gruß
            David

            Kommentar


              #7
              Leider lässt sich nicht alles über Sockets lösen und ein Device::SerialPort ist manchmal einfach einfacher .
              Socat hat da auch noch ein paar böse Fallen auf Lager. Solange Du nicht alle 5 Sekunden ne SMS senden willst kann man es auch ohne Socket machen.

              Ich würde dennoch hier ne Socket-Verbindung in einem qx oder system(socat ...) unterbringen.
              Das macht die Auswertung der Antwort von der seriellen etwas einfacher. Vgl. dazu mal SVN->Tools->IEC60256. Das funktioniert super, der Ansatz kam damals von jemand anderem. Bei den Plugins stellt sich bei mir mittlerweile der Verdacht ein dass Socketverbindungen auch potentielle Speicherlecks sind .. Kann aber auch Zufall sein oder an meiner Vorliebe für etliche verschiedene Subs liegen.
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                #8
                So, hab mal bischen weiter gescripted, raus kam dabei folgendes:

                Code:
                #!/usr/bin/perl -w
                
                use CGI::Carp qw(fatalsToBrowser);
                use CGI;
                use Device::SerialPort;
                
                my $cgi = new CGI;
                
                $r_number=$cgi->param('number');
                $sms_text=$cgi->param('sms_text');
                
                my $schnittstelle = '/dev/ttyUSB-1-1';
                
                
                # HTTP HEADER
                print "content-type: text/html \n\n";
                
                
                #my $s_number = $cnum;
                #my $s_text = $ctext;
                
                #print $s_number;
                
                #print $Name;
                
                #ab hier nichts mehr ändern
                # Zyklischer Aufruf nach restart, empfang GA oder nach einstellung rrd (typisch 300sek).
                #$plugin_info{$plugname.'_cycle'}  = 25; 
                
                
                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>';
                	
                	my $serial = Device::SerialPort->new($schnittstelle) || die "can't open $schnittstelle! ($!)\n";
                	$serial->baudrate(9600);
                	$serial->parity("none");
                	$serial->databits(8);
                	$serial->stopbits(1);
                
                	$serial->write($command_number); #Befehl an das Modem senden
                	select(undef, undef, undef, 0.2);
                	$serial->write($command_text); #Befehl an das Modem senden
                }
                das script liegt jetzt im cgi-bin und die Variablen $r_number und $sms_text werden per get übergeben.

                Was mir jetzt noch fehlt is wie ich die richtige Adresse für die im Wiregate eingebaute serielle Schnittstelle heraus find, bzw wie die heißt.

                Und ob das wie ich das bei $command_number mit dem CR gemacht hab funtioniert?

                Und vor allem wie ich das Ascii Zeichen 26 hinter den SMS-Text hängen kann?


                Gruß
                David



                EDIT:
                Ich hab das Script jetzt mal laufen lassen, dann gibts folgenden Error:
                Software error:
                can't open /dev/tty0! at /usr/lib/cgi-bin/gsm-sms.pl line 42.

                For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.
                An was kann das liegen?

                Kommentar


                  #9
                  das es "/dev/ttyS0" ist vielleicht?
                  Derzeit zwischen Kistenauspacken und Garten anlegen.
                  Baublog im Profil.

                  Kommentar


                    #10
                    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
                    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                    -> Bitte KEINE PNs!

                    Kommentar


                      #11
                      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?

                      Kommentar


                        #12
                        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
                        EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                        -> Bitte KEINE PNs!

                        Kommentar


                          #13
                          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

                          Kommentar


                            #14
                            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
                            Umgezogen? Ja! ... Fertig? Nein!
                            Baustelle 2.0 !

                            Kommentar


                              #15
                              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

                              Kommentar

                              Lädt...
                              X