HowTos

Es gibt für beinahe jede Aufgabenstellung eine passende open-source Lösung. Die pure Anwesenheit der Software löst aber leider noch nicht die Aufgaben.

Auch wenn meistens eine sehr ausführliche Dokumentation der Software mitgeliefert wird, sind auch einfache und naheliegende Lösungen für Einsteiger nur schwer zu finden.

Aus diesem Grund entsteht hier eine HowTo Sammlung aus der Praxis.

 

Viel Erfolg beim "Nachbauen"!

 

Asterisk Pickup Info

Das Telefon des Kollegen über einen Knopf am Telefon zu überwachen und den Anruf übernehmen zu können zählt zu den Standardanwendungen jeder Telefonanlage. Die meisten Anlagen bieten zusätzlich noch die Möglichkeit Informationen wie "Wer ruft auf dem anderen Apparat an?" an zu zeigen.

Leider hat diese Funktion noch nicht den Weg in irgend eine stabile Version von Asterisk gefunden. Mit etwas Glück wird in einer der kommenden Asterisk 1.6.X Versionen diese Funktion zur Verfügung stehen.

Wer nicht so lange warten möchte und einen Asterisk 1.4.28 verwendet, kann sich mit diesem Patch selbst helfen:

 

--- ../../asterisk-1.4.28/channels/chan_sip.c   2009-12-07 19:07:38.000000000 +0100
+++ chan_sip.c  2010-02-05 09:47:39.000000000 +0100
@@ -7841,11 +7841,31 @@
case DIALOG_INFO_XML: /* SNOM subscribes in this format */
ast_build_string(&t, &maxbytes, "<?xml version=\"1.0\"?>\n");
ast_build_string(&t, &maxbytes, "<dialog-info xmlns=\"urn:ietf:params:xml:ns:dialog-info\" version=\"%d\" state=\"%s\" entity=\"%s\">\n", p->dialogver++, full ? "full":"partial", mto);
-               if ((state & AST_EXTENSION_RINGING) && global_notifyringing)
-                       ast_build_string(&t, &maxbytes, "<dialog id=\"%s\" direction=\"recipient\">\n", p->exten);
-               else
+               struct sip_pvt *np = NULL;
+               int found=0;
+               if ((state & AST_EXTENSION_RINGING) && global_notifyringing) {
+               char *extenno;
+                       if ((extenno=strstr(hint,"/")))
+                               extenno++;
+                               if (!ast_strlen_zero(extenno)) {
+                                       for (np = iflist; np; np = np->next) {
+                                               if  ((np) && (!strncasecmp(np->username, extenno, strlen(extenno)))) {
+                                                       ast_build_string(&t, &maxbytes, "<dialog id=\"%s\" call-id=\"%s\" direction=\"recipient\">\n", p->exten, np->callid);
+                                                       ast_build_string(&t, &maxbytes, "<state>%s</state>\n", statestring);
+                                                       ast_build_string(&t, &maxbytes, "<local><identity display=\"%s\">%s</identity><target uri=\"%s\"/></local>\n", p->exten, p->exten, mfrom);
+                                                       ast_build_string(&t, &maxbytes, "<remote><identity display=\"%s\">sip:%s@%s</identity><target uri=\"sip:%s@%s\"/></remote>\n", np->fromname, np->fromuser, p->fromdomain, p->exten, p->fromdomain);
+                                                       found=1;
+                                                       break;
+                                                       }
+                                               }
+                                               if (!found)
+                                                       ast_build_string(&t, &maxbytes, "<dialog id=\"%s\" direction=\"recipient\">\n", p->exten);
+                                       } else
+                                               ast_build_string(&t, &maxbytes, "<dialog id=\"%s\" direction=\"recipient\">\n", p->exten);
+               } else
ast_build_string(&t, &maxbytes, "<dialog id=\"%s\">\n", p->exten);
-               ast_build_string(&t, &maxbytes, "<state>%s</state>\n", statestring);
+               if (!found)
+                       ast_build_string(&t, &maxbytes, "<state>%s</state>\n", statestring);
if (state == AST_EXTENSION_ONHOLD) {
ast_build_string(&t, &maxbytes, "<local>\n<target uri=\"%s\">\n"
"<param pname=\"+sip.rendering\" pvalue=\"no\"/>\n"

 

Im Gegensatz zu vielen anderen Patches, verändert dieser Patch nur chan_sip. Es gibt keine mir bekannten Performanceprobleme (Installation mit über 100 Telefonen).

 

Patch für 1.4.28


Rückmeldungen und Verbesserungsvorschläge sind immer willkommen.