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).
Rückmeldungen und Verbesserungsvorschläge sind immer willkommen.