Hauptmenü

Modul 96_SIP

Begonnen von Wzut, 19 Februar 2017, 19:10:09

Vorheriges Thema - Nächstes Thema

knodono

ZitatAlso Türöffner nur mit Anruf auf die Zielrufnr , das lasse ich jetzt mal unkommentiert. Mit Rufnr Prüfung + DTMF Code wäre mir zwar auch noch zu unsicher, aber jeder wie er mag.
:) Na ja, eine Rufnummern-Prüfung ist natürlich drin, das macht schon die Fritzbox. Außerdem ist das bei mir nicht ganz so sicherheitsrelevant. Aber das ist ja nicht das Thema.

Prinzipiell funktioniert dein Vorschlag. Ob ich damit meine bestehende Lösung ablösen möchte, weiß ich noch nicht.
Ideal wäre es, wenn du so was wie ein "set mysip reject" einbauen könntest, mit dem ein eingehender Anruf abgewiesen wird. Sollte eigentlich technisch möglich sein, über Asterisk mache ich genau das.

Jedenfalls vielen Dank für deine Hilfe, mal sehen, was ich draus mache
Otto

plin

Zitat von: knodono am 22 März 2017, 17:54:00
Sollte eigentlich technisch möglich sein, über Asterisk mache ich genau das.

Wenn Net::SIP doch nur so gut dokumentiert wäre wie Asterisk ...
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Olly

Zitat von: Wzut am 22 März 2017, 09:54:30
gut , bei dir geht FQDN Auflösung schief. Ich möchte mein Testsystem nicht unnötig verbiegen und kann daher das nicht nachstellen. Könntest du bitte mal bei dir folgendes versuchen :
1. ändere im Modul die Zeile
use Net::Domain qw( hostfqdn );
in
use Net::Domain qw( hostfqdn hostname);
dann weiter unten (ohne die böse Zeile 109 ) ab my $addr=

my $addr = "0.0.0.0";
unless (exists($attr{$name}{sip_ip}))
  {
   eval { $addr = inet_ntoa(scalar(gethostbyname(hostfqdn()))); };
   if ($@)
   {
    Log3 $name,2,"$name, please check your FQDN hostname -> $@";
    eval { $addr = inet_ntoa(scalar(gethostbyname(hostname()))); };
    Log3 $name,2,"$name, please check your hostname -> ".$@ if ($@);
   }
   $attr{$name}{sip_ip} = $addr;
  }

2. Das vorhande attribut sip_ip löschen
3. fhem save
4. shutdown restart
FHEM sollte starten ohne hängen zu bleiben. Bitte ins Log schauen die die ggf. vorhanden "please check your" hier posten.
So, hab das mal getestet.
Folgendes erscheint im Logfile:

2017.03.22 20:54:34 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/96_SIP.pm line 112.
2017.03.22 20:54:34 2: fhemSIP, please check your FQDN hostname -> Bad arg length for Socket::inet_ntoa, length is 0, should be 4 at ./FHEM/96_SIP.pm line 112.

Ich habe daraufhin mal in meiner /etc/hosts einen entsprechenden Eintrag mit IP-Adresse und FQDN hinterlegt. Aber auch hiermit bleibt die Meldung im Log gleich.
Mit dem erweiterten Code in der 96_SIP.pm wird dann aber richtig meine IP in SIP_IP übernommen.

Gruß

     Olly
BananaPi 1GB;NetCSM 868MHz, miniCUL 433MHz, LaCrosseGateway, 2x SignalESP; FHEM 6.2

Wzut

Zitat von: knodono am 22 März 2017, 17:54:00
Sollte eigentlich technisch möglich sein,
klar schick mir einen Patch und ich baue es ein :)

Zitat von: Olly am 22 März 2017, 21:03:47
Mit dem erweiterten Code in der 96_SIP.pm wird dann aber richtig meine IP in SIP_IP übernommen.
THX fürs testen, dann kommt das so in die nächste Version. Hauptsache FHEM läuft beim Start durch.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Olly



Zitat von: Wzut am 23 März 2017, 07:16:09
THX fürs testen, dann kommt das so in die nächste Version. Hauptsache FHEM läuft beim Start durch.

Ja, FHEM startet damit dann bei mir.

Gruß

    Olly
BananaPi 1GB;NetCSM 868MHz, miniCUL 433MHz, LaCrosseGateway, 2x SignalESP; FHEM 6.2

Wzut

Zitat von: knodono am 22 März 2017, 09:02:09
Ich möchte gerne einen Anruf erkennen (ringing), ihn dann aber nicht annehmen, sondern abweisen.
Ich möchte auf diesen Punkt nochmal eingehen. Es wird die Tage (spätestens Montag) eine neue Version mit dem neuen Attribut sip_blocking geben. Da dieses Attribut eng mit dem bereits bestehenden Attribut sip_filter zusammen hängt, sind ein paar Grundregeln bei ihrem Einsatz zu beachten :

sip_filter = ich nenne sie jetzt mal die Liste der "Guten" oder Whitelist, definiert man sie muss man unbedingt dafür sorgen das auch wirklich jede mögliche Telefonnummer abgedeckt ist auf die man später reagieren möchte. Ein Joker in der Form .* gibt es nicht , möchte man wirklich alle Rufnummern zulassen so ist sip_filter entweder leer zu lassen oder erst gar nicht zu definieren.

sip_blocking = die Liste der "Bösen" oder Blacklist, hier werden Rufnummern (bzw. deren Teile) definiert, auf die man in der Art reagieren möchte das man sie nicht einfach nur nicht beachtet, sondern aktiv den Ruf quasi "wegdrückt".
D.h. jede Rufnummer die so behandelt werden soll muss zuerst erfolgreich durch sip_filter und kann danach erst aktiv geblockt werden. Die Syntax ist die gleiche wie bei sip_filter, allerdings gibt es hier den Joker .* Ist dieser gesetzt wird jede ankommende Rufnummer geblockt.

Auf meinem Testsystem läuft das z.Z. schon recht gut, ich bin allerdings noch dabei etwas an den caller Stati zu schrauben, da sie mir teilweise noch nicht so recht gefallen.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

franky08

#201
Hallo, habe heute mal, nach längerer Zeit, ein update gemacht und bekomme nun beim Start von fhem:
Messages collected while initializing FHEM:
configfile: mySIP: unknown attribute sip_audiofile. Type 'attr mySIP ?' for a detailed list.


Was hat sich denn da geändert und wie korrigiere ich das wieder?

P.S. erledigt  ;)

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

knodono

Zitat von: Wzut am 24 März 2017, 09:21:13

sip_blocking = die Liste der "Bösen" oder Blacklist, hier werden Rufnummern (bzw. deren Teile) definiert, auf die man in der Art reagieren möchte das man sie nicht einfach nur nicht beachtet, sondern aktiv den Ruf quasi "wegdrückt".

Das klingt gut! Ich  werde es testen, sobald  es verfügbar ist.

Wzut

Verfügbar ist es ab morgen 7:45

plin hatte aber noch eine gute Idee:
Im Modus listen_wfp muss man das nicht unbedingt fix über sip_blocking machen. Bei wfp hat man sowieso schon die waittime um mittels notify/DOIF auf den Anruf zu reagieren. Bisher gab es da nur das Kommando set <name> fetch, ich habe jetzt noch set <name> reject hinzugefügt.
D.h. solange wfp die waittime hochzählt kann man mit set reject den Anruf noch abwieisen.

@knodono , du kannst also entweder waittime klein setzen (1)  und sip_blocking benutzen oder
waittime etwas größer (10) wählen, sip_blocking leer lassen und mit set reject den Anruf innerhalb dieser Zeit abweisen.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

knodono

Hallo Wzut,
irgend etwas hakt bei mir noch:

Folgender Ablauf:

DOIF ([sip1:caller_state] eq "ringing_1")
   (set sip1 reject)
   (set sip1 call **621 30 ---#9)
zwischen den einzelnen Kommandos sind 5s Pause  eingestellt.

Erster Versuch:
Anruf geht ein,  wird abgewiesen, Ruf geht raus, alles gut. Fritzbox meldet "Declined (603)" wie es sein  soll.

Zweiter Versuch: Anruf geht ein, fhem sagt, er wird abgewiesen, aber Fritzbox merkt es nicht,  ruft weiter. fhem sagt, Ruf geht raus, scheint manchmal auch zu klappen, aber nicht zuverlässig.
Ab diesem Zeitpunkt ignoriert die Fritzbox ein "set call reject" dauerhaft. Erst ein Neustart der Fritzbox (7490, OS 6.83) behebt das Problem.
Hier das Logfile:



############## 1. Versuch

2017.03.25 15:57:06 5: sip1[13662], SIP_filter : a:"Otto Büro" <sip:**2@fritz.box>;tag=7EC41FA09BB483FD | b:Net::SIP::Request=HASH(0x33ada18)
2017.03.25 15:57:06 5: sip1[13662], telnet : set sip1 caller Otto Büro sip:**2@fritz.box
exit

2017.03.25 15:57:06 4: sip1[13662], SIP_invite -> ringing 1
2017.03.25 15:57:06 5: sip1[13662], telnet : set sip1 caller_state ringing_1
exit

2017.03.25 15:57:07 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:57:07 4: sip1[13662], SIP_invite -> ringing 2
2017.03.25 15:57:07 5: sip1[13662], telnet : set sip1 caller_state ringing_2
exit

2017.03.25 15:57:08 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:57:08 4: sip1[13662], SIP_invite -> ringing 3
2017.03.25 15:57:08 5: sip1[13662], telnet : set sip1 caller_state ringing_3
exit

2017.03.25 15:57:09 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:57:09 4: sip1[13662], SIP_invite -> ringing 4
2017.03.25 15:57:09 5: sip1[13662], telnet : set sip1 caller_state ringing_4
exit

2017.03.25 15:57:10 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:57:10 4: sip1[13662], SIP_invite -> ringing 5
2017.03.25 15:57:10 5: sip1[13662], telnet : set sip1 caller_state ringing_5
exit

2017.03.25 15:57:11 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:57:11 4: sip1[13662], SIP_invite block !
2017.03.25 15:57:11 5: sip1[13662], telnet : set sip1 caller_state rejected
exit

2017.03.25 15:57:16 4: sip1, message DTMF = ---#9
2017.03.25 15:57:16 5: sip1, call has pid 13671
2017.03.25 15:57:17 5: sip1[13671], my parent is 13546
2017.03.25 15:57:17 4: sip1[13671], register new expire : Sat Mar 25 16:02:17 2017
2017.03.25 15:57:17 5: sip1[13671], telnet : set sip1 state calling
exit

2017.03.25 15:57:18 4: sip1, CallStart DTMF : --#9
2017.03.25 15:57:18 5: sip1[13671], telnet : set sip1 call_state calling **621
exit

2017.03.25 15:57:18 4: sip1[13671], calling : **621
2017.03.25 15:57:21 5: sip1[13671], RTP done : OK
2017.03.25 15:57:21 5: sip1[13671], Stopvar : HASH(0x2bc1188)
2017.03.25 15:57:21 4: sip1, CALLDone -> sip1|1|ok|
2017.03.25 15:57:29 5: sip1, listen prozess 13662 found

######### 2. Versuch

2017.03.25 15:58:10 5: sip1[13662], SIP_filter : a:"Otto Büro" <sip:**2@fritz.box>;tag=6E459BBC290F6066 | b:Net::SIP::Request=HASH(0x334ffc0)
2017.03.25 15:58:10 5: sip1[13662], telnet : set sip1 caller Otto Büro sip:**2@fritz.box
exit

2017.03.25 15:58:10 4: sip1[13662], SIP_invite -> ringing 1
2017.03.25 15:58:10 5: sip1[13662], telnet : set sip1 caller_state ringing_1
exit

2017.03.25 15:58:11 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:58:11 4: sip1[13662], SIP_invite -> ringing 2
2017.03.25 15:58:11 5: sip1[13662], telnet : set sip1 caller_state ringing_2
exit

2017.03.25 15:58:12 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:58:12 4: sip1[13662], SIP_invite -> ringing 3
2017.03.25 15:58:12 5: sip1[13662], telnet : set sip1 caller_state ringing_3
exit

2017.03.25 15:58:13 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:58:13 4: sip1[13662], SIP_invite -> ringing 4
2017.03.25 15:58:13 5: sip1[13662], telnet : set sip1 caller_state ringing_4
exit

2017.03.25 15:58:14 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:58:14 4: sip1[13662], SIP_invite -> ringing 5
2017.03.25 15:58:14 5: sip1[13662], telnet : set sip1 caller_state ringing_5
exit

2017.03.25 15:58:15 5: sip1[13662], telnet : get sip1 caller

2017.03.25 15:58:15 4: sip1[13662], SIP_invite block !
2017.03.25 15:58:15 5: sip1[13662], telnet : set sip1 caller_state rejected
exit

2017.03.25 15:58:20 4: sip1, message DTMF = ---#9
2017.03.25 15:58:20 5: sip1, call has pid 13683
2017.03.25 15:58:21 5: sip1[13683], my parent is 13546
2017.03.25 15:58:21 4: sip1[13683], register new expire : Sat Mar 25 16:03:21 2017
2017.03.25 15:58:21 5: sip1[13683], telnet : set sip1 state calling
exit

2017.03.25 15:58:21 4: sip1, CallStart DTMF : --#9
2017.03.25 15:58:21 5: sip1[13683], telnet : set sip1 call_state calling **621
exit

2017.03.25 15:58:21 4: sip1[13683], calling : **621
2017.03.25 15:58:25 5: sip1[13683], RTP done : OK
2017.03.25 15:58:25 5: sip1[13683], Stopvar : HASH(0x2bc1188)
2017.03.25 15:58:25 4: sip1, CALLDone -> sip1|1|ok|
2017.03.25 15:58:29 5: sip1, listen prozess 13662 found
2017.03.25 15:59:00 5: sip1[13662], my parent is 13546
2017.03.25 15:59:00 4: sip1[13662], register new expire : Sat Mar 25 16:04:00 2017
2017.03.25 15:59:00 5: sip1[13662], telnet : set sip1 state listen_wfp
exit

2017.03.25 15:59:11 4: sip1, Listen Kill PID : 13662
2017.03.25 15:59:11 1: Timeout for SIP_ListenStart reached, terminated process 13662
2017.03.25 15:59:11 4: sip1, Reset Listen done
2017.03.25 15:59:11 4: sip1, Listen new PID : 13700
2017.03.25 15:59:11 3: sip1[13700], my parent is 13546
2017.03.25 15:59:12 5: sip1[13700], my parent is 13546
2017.03.25 15:59:12 4: sip1[13700], register new expire : Sat Mar 25 16:04:12 2017
2017.03.25 15:59:12 5: sip1[13700], telnet : set sip1 state listen_wfp
exit


Die Variante mit sip_blocking funktioniert, die Rufe werden abgewiesen. Allerdings weiß ich nicht, auf was ich triggern könnte, denn caller_state bleibt nach dem ersten geblockten  Anruf beständig auf dem Wert "blocking".

Gruß und schönes Wochenende noch!
Otto

Wzut

Das mit dem FB Reset tut mir leid, meine hat sich da nicht so zickig benommen. Aber OK schieben wir das mal etwas nach hinten.
Das bei der Varinate 2 der caller_state nicht wechselt ist meine Schuld, ich habe da gestern ne Kleinigkeit vergessen :(
Wenn du es dir zutraust, such mal nach der Zeile 910 die sollte so aussehen :
SIP_telnet($hash, "set $name caller none\nset $name caller_state waiting\nexit\n") if ($i>$waittime);
ändere sie in
SIP_telnet($hash, "set $name caller none\nset $name caller_state waiting\nexit\n") if (($i>$waittime) || $block_it);
damit bekommst du sehr schnell einen Wechsel von blocking zu waiting.
Ich check heute noch ein Update ein, ich schrieb gestern das wenn du über sip_blocking gehst du sip_waittime recht klein machen kannst.
Die Version morgen früh wird sip_waittime als Verzögerungstimer zwichen dem caller_state blockiing und waiting nutzen.
D.h. wenn die Varinate oben zu schnell ist kannst du dann das Tempo des Wechsels selbst bestimmen.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

knodono

#206
Hallo,
also die Zeile habe ich geändert, das funktioniert. caller_state ändert sich und wird vom DOIF zuverlässig erkannt.
Das Problem mit der Fritzbox zeigt sich aber auch hier:
Der erste Anruf funktioniert wie erwartet, der Ruf wird abgewiesen, Fritzbox sagt "Declined (603).
Ab dem zweiten Anruf wird der von fhem zwar auch erkannt, DOIF wird getriggert und der Ruf geht raus. Das anrufende Telefon bleibt aber stumm, kein Rufzeichen, kein "besetzt" oder "abgewiesen", nichts. Im Log der Fritzbox steht auch nichts.

Gruß Otto

Nachtrag: nach einer längeren Wartezeit (auf jeden Fall mehrere Minuten) scheint die FB auch ohne Reboot wieder normal zu funktionieren.

Wzut

Da stimmt aber bei noch etwas anderes nicht. 603 gibt es nur wenn manuell mit set <name> reject der Anruf abgewiesen wird.
Wenn sip_blocking den richtigen Abschnitt deiner Quellruf Nr hat sollte es 487 sein
Auch das Log mit verbose 4 sollte den Blocking Vorgang zeigen ala blocking NR found on xxx
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

plin

Schon die 701, 486 oder 487 probiert?
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

knodono

Zitat von: Wzut am 25 März 2017, 19:22:12
Da stimmt aber bei noch etwas anderes nicht. 603 gibt es nur wenn manuell mit set <name> reject der Anruf abgewiesen wird.
Wenn sip_blocking den richtigen Abschnitt deiner Quellruf Nr hat sollte es 487 sein
Auch das Log mit verbose 4 sollte den Blocking Vorgang zeigen ala blocking NR found on xxx

Das mit dem 603 kann ich nicht reproduzieren, da habe ich anscheinend was verwechselt. Im Log der FB steht gar nichts.
Das fhem Logfile mit verbose 5 sieht so aus (wieder 2 Versuche, der erste verhält sich wie er sollte, beim zweiten bleibt das anrufende Telefon stumm):


2017.03.26 07:57:09 5: sip1[23504], SIP_filter : a:"Otto Büro" <sip:**2@fritz.box>;tag=8A6D54CF8E32B7FF | b:Net::SIP::Request=HASH(0x2d45310)
2017.03.26 07:57:09 5: sip1[23504], telnet : set sip1 caller Otto Büro sip:**2@fritz.box
exit

2017.03.26 07:57:09 5: sip1[23504], telnet : set sip1 caller_state blocking
exit

2017.03.26 07:57:09 4: sip1[23504], blocking Otto Büro sip:**2 found on .*
2017.03.26 07:57:09 5: sip1[23504], telnet : set sip1 caller none
set sip1 caller_state waiting
exit

2017.03.26 07:57:14 4: sip1, message DTMF = ---#9
2017.03.26 07:57:14 5: sip1, call has pid 23513
2017.03.26 07:57:15 5: sip1[23513], my parent is 23405
2017.03.26 07:57:15 4: sip1[23513], register new expire : Sun Mar 26 08:02:15 2017
2017.03.26 07:57:15 5: sip1[23513], telnet : set sip1 state calling
exit

2017.03.26 07:57:16 4: sip1, CallStart DTMF : --#9
2017.03.26 07:57:16 5: sip1[23513], telnet : set sip1 call_state calling **621
exit

2017.03.26 07:57:16 4: sip1[23513], calling : **621
2017.03.26 07:57:19 5: sip1, listen prozess 23504 found
2017.03.26 07:57:19 5: sip1[23513], RTP done : OK
2017.03.26 07:57:19 5: sip1[23513], Stopvar : HASH(0x256ac30)
2017.03.26 07:57:19 4: sip1, CALLDone -> sip1|1|ok|
2017.03.26 07:57:31 5: sip1[23504], SIP_filter : a:"Otto Büro" <sip:**2@fritz.box>;tag=7396D24776AA9D8B | b:Net::SIP::Request=HASH(0x2d4a4f8)
2017.03.26 07:57:31 5: sip1[23504], telnet : set sip1 caller Otto Büro sip:**2@fritz.box
exit

2017.03.26 07:57:31 5: sip1[23504], telnet : set sip1 caller_state blocking
exit

2017.03.26 07:57:31 4: sip1[23504], blocking Otto Büro sip:**2 found on .*
2017.03.26 07:57:31 5: sip1[23504], telnet : set sip1 caller none
set sip1 caller_state waiting
exit

2017.03.26 07:57:36 4: sip1, message DTMF = ---#9
2017.03.26 07:57:36 5: sip1, call has pid 23520
2017.03.26 07:57:37 5: sip1[23520], my parent is 23405
2017.03.26 07:57:37 4: sip1[23520], register new expire : Sun Mar 26 08:02:37 2017
2017.03.26 07:57:37 5: sip1[23520], telnet : set sip1 state calling
exit

2017.03.26 07:57:37 4: sip1, CallStart DTMF : --#9
2017.03.26 07:57:38 5: sip1[23520], telnet : set sip1 call_state calling **621
exit

2017.03.26 07:57:38 4: sip1[23520], calling : **621
2017.03.26 07:57:41 5: sip1[23520], RTP done : OK
2017.03.26 07:57:41 5: sip1[23520], Stopvar : HASH(0x256ac30)
2017.03.26 07:57:41 4: sip1, CALLDone -> sip1|1|ok|