Displayanzeige im Snom ändern

falconbbs

Neuer User
Mitglied seit
26 Jun 2009
Beiträge
8
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich möchte zur Laufzeit über Asterisk Extensions.conf, den Anzeigetext im Display des Snom 360 ändern.

Hintergrund: ich möchte dem Snom keine feste Durchwahl verpassen, sondern der User soll sich mit SEINER Druchwahl anmelden. ich Speichere dabei die Durchwahl in der DB und setze die CallerID vor dem Dial um. Genauso umgekehrt wenn ein Anruf reinkommt.
Jetzt möchte ich dem User nur im Display erkenntlich machen, dass bzw. wie er angemeldet ist. Dazu hätte ich gerne die Settings zur Laufzeit geändert.

Ist das möglich? Wenn ja, wie?

Gruß

falconbbs

Asterisk 1.6.1.1, Snom 360 v7.3.14
 
z.B. so:

http://[ip-addresse]/dummy.htm?settings=save&user_idle_text1=XX

Grüße
 
Snom Display

Kann man das im Browser einfach angeben?

Über den Internetexplorer hat das bei mir nicht funktioniert. Wie gebe ich das dann in der extensions.conf an?

Gruß
falconbbs
 
Hallo,

Ich mache das in einem php Script (AGI).

Wie es direkt aus dem Dialplan geht kann ich Dir leider nicht sagen.

Grüße
 
lynx in exten

Ich habe es in der extensions.conf mit folgenden Befehl probiert. Geht aber nicht:
exten => _#1X.,n,System(lynx -auth=snom:snom "http://192.168.1.188/dummy.htm?settings=save&user_idle_text1=123" > /dev/null)

Führe ich lynx auf der kommandozeile aus, geht es.

Hat jemand noch eine Idee?
 
Hat jemand noch eine Idee?
Das ganze sollte auch über eine SIP-Nachricht funktionieren (SipSak). Alternativ kann ich auch einen Patch-Posten mit dem man dann über eine Applikation bzw. über das Manager-Interface eine SIP-Nachricht schicken kann.

Gruß,
Held
 
Sip-Nachricht

Hört sich ja gut an. Wie macht man das? Bin über jede Idee dankbar.

Gruß

falconbbs
 
Alternativ kann ich auch einen Patch-Posten...
hey hey, nur her damit :) am besten so was auch immer gleich bei issues.asterisk.org rein stellen. Patche die nicht upstream wandern, sind auf dauer immer für'n arsch (spricht einer der seit * 0.9x dabei ist)
 
Hi,
hab gesehen das ihr schon asterisk 1.6 einsetzt. Ich bin noch bei 1.2.32 ;-). Meine Patches sind auch für diese Version. Sie sollten sich allerdings leicht für 1.6 anpassen lassen. Im Prinzip hab ich einfach die "sip notify" Funktionen genommen und einfach über das Manager-Interface und über die CLI dynamisch (also mit Parametern) verfügbar gemacht. Bin nicht wirklich ein C Hacker ;) - falls man das so nicht umsetzen sollte wäre ich über einen Hinweis dankbar!

chan_sip.patch
Code:
--- ../asterisk-1.2.32-org/channels/chan_sip.c	2009-04-02 19:02:18.000000000 +0200
+++ channels/chan_sip.c	2009-07-01 09:21:30.000000000 +0200
@@ -13665,8 +13665,86 @@
 	return sip_reload(0, 0, NULL);
 }
 
+/*! \brief  sip_message: Send SIP notify to peer */
+static int sip_message (int fd, int argc, char *argv[])
+{
+        char *message_body = NULL;
+   	int i;
+
+	if (argc < 2)
+		return RESULT_SHOWUSAGE;
+
+	struct sip_pvt *p;
+	struct sip_request req;
+
+        p = sip_alloc(NULL, NULL, 0, SIP_NOTIFY);
+        if (!p) 
+        {
+	   ast_log(LOG_WARNING, "Unable to build sip pvt data for notify\n");
+	   return RESULT_FAILURE;
+	}
+
+	if (create_addr(p, argv[2]))
+        {
+	/* Maybe they're not registered, etc. */
+	   sip_destroy(p);
+	   ast_cli(fd, "Could not create address for '%s'\n", argv[2]);
+	   return RESULT_FAILURE;
+	}
+
+	initreqprep(&req, p, SIP_NOTIFY);
+   
+        for (i = 3; i < argc ; ++i)
+        {
+            if (strcmp (argv[i], ".") == 0)
+            {
+	       ast_log(LOG_DEBUG, "Body detected\n");
+	       
+	       if (i + 1 < argc)
+		 {
+		    ast_log(LOG_DEBUG, "Body: %s\n", argv[i + 1]);
+		    message_body = argv[i + 1];
+		    break;
+		 }
+	    }
+	   
+	   char *pos = strchr (argv[i], '=');
+	   if (pos != NULL)
+	     {
+		*pos = '\0';
+		ast_log(LOG_DEBUG, "Header: %s : %s\n", argv[i], pos+1);
+		
+		add_header(&req, argv[i], pos+1);
+	     }
+	}
+   
+        if (message_body != NULL) 
+        {
+	   add_header_contentLength(&req, strlen(message_body) + 2);
+	   add_line(&req, message_body);
+	   add_line(&req, "\r\n");
+	}
+        else
+        {
+		add_blank_header(&req);
+	}
+   
+   /* Recalculate our side, and recalculate Call ID */
+        if (ast_sip_ouraddrfor(&p->sa.sin_addr, &p->ourip))
+           memcpy(&p->ourip, &__ourip, sizeof(p->ourip));
+        build_via(p, p->via, sizeof(p->via));
+        build_callid(p->callid, sizeof(p->callid), p->ourip, p->fromdomain);
+	ast_cli(fd, "Sending NOTIFY of type '%s' to '%s'\n", argv[1], argv[2]);
+	transmit_sip_request(p, &req);
+	sip_scheddestroy(p, 15000);
+
+	return RESULT_SUCCESS;
+}
+
+
 static struct ast_cli_entry  my_clis[] = {
 	{ { "sip", "notify", NULL }, sip_notify, "Send a notify packet to a SIP peer", notify_usage, complete_sipnotify },
+	{ { "sip", "message", NULL }, sip_message, "Send a message (notify) packet to a SIP peer", "peer header(s) . body"},
 	{ { "sip", "show", "objects", NULL }, sip_show_objects, "Show all SIP object allocations", show_objects_usage },
 	{ { "sip", "show", "users", NULL }, sip_show_users, "Show defined SIP users", show_users_usage },
 	{ { "sip", "show", "user", NULL }, sip_show_user, "Show details on specific SIP user", show_user_usage, complete_sip_show_user },

app
Code:
/*
 * sip message application
 * 
 * This program is free software, distributed under the terms of
 * the GNU General Public License
 */

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <asterisk/lock.h>
#include <asterisk/file.h>
#include <asterisk/logger.h>
#include <asterisk/channel.h>
#include <asterisk/pbx.h>
#include <asterisk/module.h>
#include <asterisk/astdb.h>
#include <asterisk/utils.h>
#include <asterisk/cli.h>
#include <asterisk/manager.h>
#include <asterisk/devicestate.h>


static char tdesc[] = "Fake application for sip message manager action";

static char app[] = "SipMessage";

static char synopsis[] = "";

static char descrip[] = "\n";

static char mandescr_sipmessage[] = 
"Description: Send a sip message\n";


static int action_sipmessage (struct mansession *s, struct message *m)
{
        char *sipMessage = astman_get_header(m, "Line1");

	if (!strlen(sipMessage)) {
		astman_send_error(s, m, "No sip message specified");
		return 0;
	}

        char *peer = astman_get_header(m, "peer");
        char *headers = astman_get_header(m, "headers");

        char cmd[5000];
	char *pCmd = cmd;
	size_t cmdMaxSize = sizeof(cmd);

        if (!strlen(peer)) {
		astman_send_error(s, m, "No peer specified");
		return 0;
	}

        ast_build_string(&pCmd, &cmdMaxSize, "sip message");
	ast_build_string(&pCmd, &cmdMaxSize, " %s", peer);
	ast_build_string(&pCmd, &cmdMaxSize, " %s", headers);
	ast_build_string(&pCmd, &cmdMaxSize, " . ");

        char headerNameBuf[8];
        int i = 1;
        for (i = 1; i < 80 ; ++i)
        {
	   sprintf (headerNameBuf, "Line%d", i);
	   char *header = astman_get_header(m, headerNameBuf);
	   if (!strlen(header))
	     break;
	   
	   ast_build_string(&pCmd, &cmdMaxSize, "%s", astman_get_header(m, headerNameBuf));
	}
       ast_log(LOG_DEBUG, "Cmd: %s\n", cmd);
	   
       ast_cli_command(s->fd, cmd);
       astman_send_ack(s, m, "Ok");

       return 0;
}

static int sipmessage_exec(struct ast_channel *chan, void *data)
{
   return 0;
}

int load_module(void)
{
    ast_manager_register2( "SipMessage", EVENT_FLAG_CALL, action_sipmessage, "Send a sip message", mandescr_sipmessage );
    return ast_register_application(app, sipmessage_exec, synopsis, descrip);
}

int unload_module(void)
{
    int res = 0;
    ast_manager_unregister( "SipMessage");
    res = ast_unregister_application(app);
    return res;
}

char *description(void)
{
    return tdesc;
}


int usecount(void)
{
    int res = 0;
    return res;
}

char *key()
{
    return ASTERISK_GPL_KEY;
}

Auf der CLI kann man nun z.B. für Aastra-Geräte folgendes schreiben:
Code:
sip message account1003 Event=aastra-xml Content-Type=application/xml . "<AastraIPPhoneStatus Beep=\"yes\"><Session>0</Session><Message index=\"0\">Test</Message></AastraIPPhoneStatus>"
Mit dieser Zeile wird eine kurze Nachricht im Telefon angezeigt. Etwas ähnlches gibt es bestimmt auch für Snom.
Gruß,
Held
 
Lynx Wget Sipsak

Hallo,

jetzt habe ich es geschafft.
Mit Lynx die Displayanzeige für die Anmeldung zu verändern geht nicht, weil lynx in der Browsermodus wechselt. Aber mit wget geht es.

exten => _#1X.,n,System(wget --http-user=snom --http-passwd=snom "http://<IP-Telefon>/dummy.htm?settings=save&user_idle_text1=${EXTEN:2}" > /dev/nul)

Mit Sipsak eine Meldung auf das Telefon schreiben geht auch.
exten => _#1X.,n,System(sipsak -M -O desktop -r 5060 -B "${EXTEN:2} angemeldet" -s sip:202@<IP-Phone> -H <IP-Server>)

Dafür mussen aber einige Parameter im Phone geändert werden.

Jetzt habe ich nur das Problem, dass ich die IP der Phones nicht weiß wegen DHCP. Kann das Asterisk irgendwie ermitteln?
 
mit lynx sollte das aber auch gehen, muss nur der befehl stimmen.
Code:
lynx -dump http://<IP-Telefon>/dummy.htm?settings=save&user_idle_text1=
so sollte das browser problem gelöst sein
 
Wenn man im CLI sip show peers ein gibt, kommen alle Phones mit ihren IP-Adressen. Kann ich die IP's in der Extensions.conf auslesen?
 
Du hast doch schon alle Puzzlesteine in der Hand:

Ein AGI-Skript im Wählplan aufrufen, das Dir wiederum `asterisk -rx 'sip show peers'` aufruft, so auswertet, dass die Adresse der als Parameter übergebenen Nebenstellennummer rauskommt, diese in eine Variable speichern.

In der nächsten Zeile des Wählplans diese Variable auslesen.
 
Ok hört sich gut an. Ich habe leider noch nie was mit AGI Script was gemacht. Ich habe damit keine Erfahrung. Muss mich jetzt erst mal damit beschäftigen. (Googlen)
 
Siehe hier und die folgenden Postings - da hab ich mal ausgebreitet wie wir es inzwischen machen.

Mit meinem Patch kann man das Versenden auch direkt im Asterisk erledigen und muss nicht von Hand UDP-SIP-Packete erzeugen.
 
Zuletzt bearbeitet:
@Heldenhaft: die von mir angegebe Lösung erzeugt alle Nutzinformationen datenbankbasiert für die einzelnen User/Endgeräte automatisiert, steuert die LEDs der snoms an und zeigt Stati der Telefonie des Users (aktive Rufumleitungen/Funktionen, Queue-Informationen, Pickup-Infos uvm.) am Endgerät an, sogar Server-übergreifend bei geclusterten Installationen.

Von daher etwas anderes als Dein Vorschlag.
 
Von daher etwas anderes als Dein Vorschlag.
Mein Patch könnte höchstens ein kleiner Baustein für den Transport sein. Die gesamte Verwaltung der von dir angesprochenen Features muss man natürlich noch programmieren.
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
244,696
Beiträge
2,216,700
Mitglieder
371,316
Neuestes Mitglied
realbluethunder
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.