mikrocontroller.net

Forum: Projekte & Code Sipdial per ESP8266 an Fritzbox


Autor: Jürgen L. (temp1234)
Datum:
Angehängte Dateien:

Bewertung
2 lesenswert
nicht lesenswert
Christion T. hat neulich im Beitrag:
Beitrag "Türklingel per ESP32 (WLAN, SIP) an Fritzbox"

den Code für seine ESP Klingel veröffentlicht. Das hat mich dazu 
gebracht auch mal wieder etwas in dieser Richtung zu machen. Allerdings 
benötige ich den Code um per Sip die Fritzbox klingeln zu lassen 
ausdrücklich nicht in Verbindung mit dem ESPxxx. Bisher mache ich das 
über einen Asterisk-Server der auf meinem NAS läuft. Nun soll so etwas 
in den Code meines selbst geschriebenen Servers für die Heimautomation. 
Allerdings ist Christians Code zu sehr von der ESP Infrastruktur 
abhängig. Das Anzupassen kommt einer Neuentwicklung gleich. Das habe ich 
dann gemacht. Im angehängten Code ist eine C++ Classe Sip enthalten die 
bis auf die Funktionen Sip::SendUdp(), Sip::Random(), Sip::Millis()und 
Sip::MakeMd5Digest() Plattform unabhängig ist. Entwickelt habe ich das 
als Windows-Konsolen Programm. Das kann ich aber aus lizensrechtlichen 
Gründen nicht veröffentlichen. Deshalb hier das ganze als Arduino ino 
für den Esp8266.
Das ist wohl gemerkt kein fertiges Projekt für ahnungslose Bastler. Es 
ist nur als Demo zu verstehen. Nach dem Reset und Connecten an die 
Fritzbox wählt der ESP die festgelegte Nummer und legt sich dann nach 
15s in den Tiefschlaf.
Wer etwas sinnvolles damit machen will, muss den Rest dann noch selbst 
entwickeln.
Ich selbst nutze die Arduino IDE nicht, sondern eine makefile Umgebung 
wie ich sie heir schon mal beschrieben haben.
Beitrag "Re: ESP32 & ESP8266 etc ohne Arduino?"

Der gesamte Code der Sip-Klasse kommt ohne dynamischen Speicher aus. Es 
wird nur ein char Buffer für das Zusammenbauen der UDP Packete benötigt, 
den ich selbst nicht in der Klasse halte. Zu beachten ist weiterhin, 
dass sich die Klasse die Konfigurationsdaten die in der init-Funktion 
übergeben werden nicht buffert, die Pointer müssen deshalb über die 
Laufzeit gültig bleiben. Bei meiner Fritzbox kommt es oft vor, dass das 
erste UDP-Packet irgendwie verloren geht. Im Gegensatz zu Christians 
Code versuche ich das INVITE zu wiederholen wenn die Fritzbox nicht 
antwortet.

Autor: Marc G. (marcm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

nachdem auskommentieren/einkommentieren des return-werts in der 
Sip::Random() Funktion wegen folgendem Fehler :
sipdial.ino: In member function 'uint32_t Sip::Random()':

sipdial:471: error: 'secureRandom' was not declared in this scope

   return secureRandom(0x3fffffff);


exit status 1
'secureRandom' was not declared in this scope

funktioniert dein Aduino-Sketch auf meiner NodeMCU. Auch wenn ich noch 
hier drüber gestolpert bin und der Fehler anscheinend im Fritz!OS 6.83 
meiner 7390 immernoch nicht behoben ist... :
https://www.heise.de/forum/heise-online/News-Komme...

Grüße
Marc

Autor: Jürgen L. (temp1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marc G. schrieb:
> nachdem auskommentieren/einkommentieren des return-werts in der
> Sip::Random() Funktion wegen folgendem Fehler :

Du solltest mal deine Entwicklungsumgebung aktualisieren. Aktuell ist 
Arduino ESP bei 2.4. Die Funktion war auch in 2.3 schon drin.

Du solltes aber besser nicht das auskommentierte Standard rand() 
verwenden ohne einen srand() mit einem zufälligen Wert. Anderenfalls 
erzeugt die rand() Funktion nach jedem Reset die gleichen Zahlen, was 
bei dieser Anwendung nicht besonders gut ist. Hier die Funktion wie sie 
in neueren Esp-Arduinos enthalten ist und die Hardware des ESP8266 
nutzt:
#define RANDOM_REG32  ESP8266_DREG(0x20E44) 
long secureRandom(long howbig) {
    if(howbig == 0) {
        return 0;
    }
    return RANDOM_REG32 % howbig;
} 

Marc G. schrieb:
> Auch wenn ich noch
> hier drüber gestolpert bin und der Fehler anscheinend im Fritz!OS 6.83
> meiner 7390 immernoch nicht behoben ist... :

Damit hat mich AVM auch schon zur Weißglut gebracht. Erst gingen kurze 
Passwörter nicht mehr, in aktuellen Firmware-Versionen auch keine kurzen 
Usernamen mehr. Es gab mal einen Stand, da musste man alle! 
Telefongeräte löschen, danach die Fritzbox zwingend neu starten und erst 
danach konnte man sie wieder einrichten. Das war bei mir zu Hause und 
bei beiden Fritzboxen in der Firma nachvollziehbar.

Autor: Marc G. (marcm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen L. schrieb:
> Du solltest mal deine Entwicklungsumgebung aktualisieren. Aktuell ist
> Arduino ESP bei 2.4. Die Funktion war auch in 2.3 schon drin.

Ja das ist bestimmt der Grund. Es war eine alte Arduino 1.6.8 IDE mit 
der ESP 2.0 Bibliothek im Einsatz

Danke schön

Marc

: Bearbeitet durch User
Autor: Harald P. (haraldp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für das schön schlanke Programm. Bei mir hat es - nach 
Anpassen auf meine Umgebung - sofort funktioniert. Ich wußte gar nicht, 
daß man das SIP-Protokoll auch mit Udp machen kann. Damit geht es m.E. 
viel einfacher als mit Tcp.
Harald

Autor: Jürgen L. (temp1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich ist bei Sip UDP Standard. Das macht es auch immer etwas 
komplizier wenn Router dazwischen sind.
Das Programm ist deshalb relativ schlank, weil ich nicht versucht habe 
das Protokoll komplett zu implementieren. Es ist auch nicht angedacht 
irgendwelche Audio-Daten zu verarbeiten. Allerdings kann man immerhin 
die Tastencodes des angerufenen Telefons abgreifen wenn man das will.

Autor: Obi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Demo,  es funktioniert bei mir wie geplant. Ich bin 
relativ unerfahren in der Progarmmierung in C, deswegen bitte ich etwas 
um Verständnis für mein "Unverständnis"

Ich möchte ich einen Sip-Dial bei einem Druck eines Tasters auslösen, 
der ESP8266 soll anschließend nicht in den DeepSleep fallen sondern auf 
die nächste Betätigung warten.

Hat jemand einen Tipp für mich an welcher Stelle ich die Aktion auf die 
Tasterbetätigung einfüge? Das ganze muss ja auch im loop funktionieren 
so dass ständig der Pin abgefragt wird.

Obi

Autor: Nicki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ,

Ich finde die sip Türklingel echt gut
habe aber Probleme , vielleicht kann mir jemand helfen ?.

ich würde gerne den klingel Aufruf per void aufrufen
beispiel : wenn Taster gedrückt dann 3 Sekunden klingeln.

ich hab es versucht zu machen , hab es aber nicht hinbekommen.

wenn ich den loop in einen Unterprogramm packe , klingelt es unendlich.
leider verstehe ich das Programm nicht.

Bitte um Hilfe !

Danke.

Autor: Nicki (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Endlich !

Hab ich es hinbekommen ,
ich habe alle seriellen Debug ausgaben entfernt.
abfrage zwei taste , wenn taste gedrückt ---> meldung
Kein Deep Standby


viel Spass damit

Grüße Nicki

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.