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

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

    Kommentar


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

      Kommentar


        #18
        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.
        Derzeit zwischen Kistenauspacken und Garten anlegen.
        Baublog im Profil.

        Kommentar


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

          Kommentar


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

            Kommentar


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

              Kommentar


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

                Kommentar


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

                  Kommentar


                    #24
                    Muss ich im packerl prüfen, die paranoia nervt manmal..
                    Bei mir läuft der als root, wenn ich sowas vorschlage hauen mich aber 10 Leute
                    Kurzfristig dürfte ein
                    Code:
                    chmod -R a+rw /var/spool/sms
                    helfen..

                    Makki

                    P.S.: Baudrate ist aber sicher nicht = 9200
                    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                    -> Bitte KEINE PNs!

                    Kommentar


                      #25
                      OK, grad ausprobiert, hat nix geholfen, genauso wenig wie noch ein chmod 777 -R /var/spool/sms hinterher zu schicken.

                      Fehler:
                      Code:
                      2012-11-01 21:41:56,2, smsd: Smsd v3.1.11 started.
                      2012-11-01 21:41:56,2, smsd: Running as smsd:dialout.
                      2012-11-01 21:41:56,4, smsd: File mode creation mask: 022 (0644, rw-r--r--).
                      2012-11-01 21:41:57,2, smsd: Conflict with .LOCK file in the spooler: /var/spool/sms/outgoing/sms2 /var/spool/sms/checked
                      2012-11-01 21:41:57,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:41:57,2, smsd: Smsd mainprocess terminated abnormally. PID: 21551.
                      Die Baudrate hab ich inzwischen korrigiert

                      Bin ich eigentlich der einzige bei dem sowas nich einfach mal laufen kann?!

                      Kommentar


                        #26
                        .LOCK gelöscht überall?
                        Derzeit zwischen Kistenauspacken und Garten anlegen.
                        Baublog im Profil.

                        Kommentar


                          #27
                          Guter Hinweiß mit dem .LOCK

                          Inzwischen bin ich schon so weit:
                          2012-11-01 22:37:41,2, smsd: Smsd v3.1.11 started.
                          2012-11-01 22:37:41,2, smsd: Running as smsd:dialout.
                          2012-11-01 22:37:41,7, smsd: Running startup_check (shell): /tmp/smsd_script.Y9wWCI /tmp/smsd_data.UsBELo
                          2012-11-01 22:37:41,7, smsd: Done: startup_check (shell), execution time 0 sec., status: 0 (0)
                          2012-11-01 22:37:41,4, smsd: File mode creation mask: 022 (0644, rw-r--r--).
                          2012-11-01 22:37:41,5, smsd: Outgoing file checker has started. PID: 25122.
                          2012-11-01 22:37:41,5, GSM1: Modem handler 0 has started. PID: 25123.
                          2012-11-01 22:37:41,5, GSM1: Using check_memory_method 1: CPMS is used.
                          2012-11-01 22:37:41,6, GSM1: Checking device for incoming SMS
                          2012-11-01 22:37:41,6, GSM1: Checking if modem is ready
                          2012-11-01 22:37:41,7, GSM1: -> AT
                          2012-11-01 22:38:02,5, smsd: Moved file /var/spool/sms/outgoing/sms2 to /var/spool/sms/checked
                          Die SMS hängt dann also im checked Ordner fest.

                          Ich hab mich jetzt mal mittem PC mit Nullmodemkabel ans Wiregate gehängt, smsd gestoppt, wieder gestartet, aber da kommt einfach nix.
                          Socket hab ich deaktiviert, also den den ich vorhin für mein eigenes Plugin erstellt hab.

                          Gibts denn ne Möglichkeit auf ttyS0 "mitzuhören" softwareseitig?
                          Ohne an das Hardwaremäßig machen zu müssen?

                          Kommentar


                            #28
                            screen /dev/ttyS0 könnte gehen.
                            Derzeit zwischen Kistenauspacken und Garten anlegen.
                            Baublog im Profil.

                            Kommentar


                              #29
                              Gut das geht, das Modem schickt ab und zu mal ein SYSSTART, scheint sich wohl ab und zu mal neu zu starten oder was auch immer.

                              Aber weder beim smsd starten noch nachdem ich eine Datei mit dem SMS-Inhalt und Nummer in outgoing geschoben hab tut sich da irgendwas, also scheint es wohl an meine Konfiguration zu liegen.

                              Hab mal die komplette Datei kopiert:
                              root@wiregate402:/var/log/smstools# cat /etc/smsd.conf
                              #
                              # /etc/smsd.conf
                              #
                              # Description: Main configuration file for the smsd
                              #

                              devices = GSM1
                              outgoing = /var/spool/sms/outgoing
                              checked = /var/spool/sms/checked
                              incoming = /var/spool/sms/incoming
                              logfile = /var/log/smstools/smsd.log
                              infofile = /var/run/smstools/smsd.working
                              pidfile = /var/run/smstools/smsd.pid
                              outgoing = /var/spool/sms/outgoing
                              checked = /var/spool/sms/checked
                              failed = /var/spool/sms/failed
                              incoming = /var/spool/sms/incoming
                              sent = /var/spool/sms/sent
                              stats = /var/log/smstools/smsd_stats
                              loglevel = 7
                              #delaytime = 10
                              #errorsleeptime = 10
                              #blocktime = 3600
                              #stats = /var/log/smsd_stats
                              #stats_interval = 3600
                              #stats_no_zeroes = no
                              #checkhandler = /usr/local/bin/smscheck
                              receive_before_send = no
                              # autosplit 0=no 1=yes 2=with text numbers 3=concatenated
                              autosplit = 3
                              # store_received_pdu 0=no, 1=unsupported, 2=unsupported and 8bit, 3=all
                              #store_received_pdu = 1
                              #validity = 255
                              #decode_unicode_text = no
                              #internal_combine = no
                              # You can specify here an external program that is started whenever an alarm occurs.
                              # alarmhandler = /path/to/an/alarmhandler/script
                              # Specifies what levels start an alarmhandler. You can use value between 2 and 5.
                              # alarmlevel = 4
                              # eventhandler = @EVENTHANDLER@
                              #blacklist = /etc/smstools/blacklist
                              #whitelist = /etc/smstools/whitelist

                              #[queues]
                              # Commented lines are examples for germany
                              # D1 = /var/spool/sms/D1
                              # D2 = /var/spool/sms/D2
                              # O2 = /var/spool/sms/O2
                              # EPLUS = /var/spool/sms/EPLUS
                              # QUAM = /var/sppol/sms/QUAM
                              # MOBILCOM = /var/spool/sms/MOBILCOM
                              #OTHER = /var/spool/sms/OTHER

                              #[provider]
                              # Commented lines are examples for germany
                              # D1 = 49160, 49170, 49171, 49175, 49151
                              # D2 = 491520, 49162, 49172, 49173, 49174
                              # O2 = 49176, 49179, 49159
                              # EPLUS = 49163, 49177, 49178, 49157
                              # QUAM = 49150
                              # MOBILCOM = 49156
                              #OTHER = 0,1,2,3,4,5,6,7,8,9

                              #[GSM1]
                              # init = ATE0+CPMS="SM"+CNMI=2,0,0,2,1
                              # # Windows: /dev/com1, Solaris: /dev/cua/a, Linux /dev/ttyS0
                              # device = /dev/ttyS0
                              # incoming = yes
                              # queues = OTHER
                              # You don't need a PIN for mobile phones
                              # pin = 1111
                              # mode = new
                              # smsc = 491722270000
                              # baudrate = 19200
                              # rtscts = yes
                              # cs_convert = yes
                              # report = no
                              # memory_start = 1
                              # primary_memory = memory name
                              # secondary_memory = memory name
                              # secondary_memory_max = number
                              # pdu_from_file = /var/spool/sms/GSM1-PDU
                              # sending_disabled = no
                              # decode_unicode_text = no
                              # internal_combine = no
                              #
                              #[GSM2]
                              #init = ATE0
                              # Windows: /dev/com2, Solaris: /dev/cua/b, Linux /dev/ttyS1
                              #device = /dev/ttyS1
                              #incoming = yes
                              #queues = OTHER
                              #You don't need a PIN for mobile phones
                              #pin = 2222
                              #mode = new
                              #smsc = 491710760000
                              #baudrate = 19200
                              #rtscts = yes
                              #cs_convert = yes
                              #report = no
                              #memory_start = 1
                              #primary_memory = memory name
                              #secondary_memory = memory name
                              #secondary_memory_max = number
                              #pdu_from_file = /var/spool/sms/GSM2-PDU
                              #sending_disabled = no
                              #decode_unicode_text = no
                              #internal_combine = no
                              #[GSM1]
                              #init =
                              #device = /dev/ttyS0
                              #incoming = yes
                              #pin =
                              #baudrate = 19200




                              [GSM1]
                              init=ATZ
                              device = /dev/ttyS0
                              incoming = yes
                              pin = 12345
                              baudrate = 19200
                              cs_convert=yes
                              report=yes
                              Vlt könnt ihr euere ja auch mal rein kopieren?

                              Gibt es denn irgendwo eine genaue Beschreibung der Parameter? Vor allem init interessiert mich sehr.

                              Kommentar


                                #30
                                Ich würd mal langsam anfangen.

                                screen /dev/ttyS0

                                was passiert bei
                                ATZ
                                ATI
                                AT+CPIN=abcs (PIN)
                                ?
                                Das geht schonmal alles?
                                Derzeit zwischen Kistenauspacken und Garten anlegen.
                                Baublog im Profil.

                                Kommentar

                                Lädt...
                                X