asterisk in mysql schreiben

Junialter

Mitglied
Mitglied seit
19 Jun 2005
Beiträge
214
Punkte für Reaktionen
0
Punkte
0
Hi,

ich würde gerne anrufe in eine mysql DB schreiben, die auf dem gleichen Rechner läuft.
Hauptsächlich geht es mir darum ausgehende und eingehende Anrufe zu loggen, wenn möglich auch mit einem Status, ob der Anruf entgegengenommen wurde oder nicht.

Wo find ich da nähere Informationen zu? Hab schon nach "asterisk + mysql" gegooglet, finde aber leider nur ziemlich unkonkrete Infos... Die Addons hab ich schon installiert, jetzt weiß ich nicht weiter...

Danke!
 
Code:
exten => _Z.,17,MYSQL(Connect connid IP USER PASSWD TABLE)
exten => _Z.,18,MYSQL(Query resultid ${connid} SELECT\ guest\ FROM\ userauth\ WHERE\ user=${CALLING}\ AND\ guest=${CALLERID(num)})
exten => _Z.,19,MYSQL(Fetch fetchid ${resultid} getting)
exten => _Z.,20,MYSQL(Clear ${resultid})
exten => _Z.,21,MYSQL(Disconnect ${connid})
exten => _Z.,22,NoOP(Fetch: ${fetchid} - getting: ${getting})
exten => _Z.,23,GotoIf(${fetchid} = "1"?24:28)

damit lese ich Infos aus einer Datenbank aus......

theoretisch musst du nur die zeile
Code:
exten => _Z.,18,MYSQL(Query resultid ${connid} SELECT\ guest\ FROM\ userauth\ WHERE\ user=${CALLING}\ AND\ guest=${CALLERID(num)})
in
Code:
exten => _Z.,18,MYSQL(Query resultid ${connid} INSERT DELAYED INTO tabellenname (anrufer, nummer, uhrzeit, etc, etc, etc, etc) VALUES ('Blackmore', '08154711', 'heit', 'was', 'weiss', 'ich', 'noch') )

Aber bedenke:
Es MÜSSEN alle Zellen angegeben werden, es darf nichts ausgelassen werden, und die einzelnen Datensätze müssen im richtigen Format sein, also bei Anrufer nicht als format INT nehmen und text reinschreiben wollen...

Den Rest einfach austesten...


Kleiner Tip am Rande, ich würde des so machen:

1) Anruf wird begonnen
2) Der Anrufversuch wird in die DB geschrieben...
3) verschiedene Daten wie Uhrzeit, Anrufender, Angerufener etc werden gespeichert
4) wenn der Angerufene abnimmt, wird über UPDATE der Datensatz geändert in abgenommen
4) wenn der Angerufene nicht abnimmt, wird über UPDATE der Datensatz geändert in nicht abgenommen, etc...
5) die Daten aus 3) werden auf null gesetzt...


Gruß Blacky
 
Zuletzt bearbeitet:
das was du da machen willst, nennt sich CDR logging (Call Detail Records). im paket "asterisk-addons" der jeweiligen version von asterisk (1.2 oder 1.4) ist ein modul für die asterisk enthalten, das sich "cdr_addon_mysql.so" nennt. welche informationen damit geloggt werden können findest du hier:
http://www.voip-info.org/wiki/view/Asterisk+billing
wie du es einbindest, findest du hier:
http://www.voip-info.org/wiki/view/Asterisk+cdr+mysql

ist das das, was du suchst?

die von Blackmore angesprochene methode basiert übrigens (wie in seinem beispiel ersichlich) auf der "MYSQL" dialplan applikation, die auch im "asterisk-addons" paket enthalten ist.

sollte die cdr methode die gewünschten informationen enthalten, würde ich diese bevorzugen, da benötigst du folgendes SQL für die mysql datenbank + user + tabelle:
(bitte anpassen, wenn du z.b. schon einen user angelegt hast!)
Code:
--
-- Database: `asterisk`, comment out if not needed
--
CREATE DATABASE IF NOT EXISTS `asterisk` DEFAULT CHARACTER SET=utf8 DEFAULT COLLATE=utf8_general_ci;
 
--
-- Adding user `asterisk`, comment out if not needed
--
CREATE USER 'asterisk'@'localhost' IDENTIFIED BY 'asterisk';
GRANT SELECT, INSERT, UPDATE, DELETE ON `asterisk`.* to 'asterisk'@'localhost';
 
--
-- Table structure for table `ast_cdr`
--
CREATE TABLE IF NOT EXISTS `asterisk`.`ast_cdr` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `uniqueid` varchar(32) collate utf8_general_ci default NULL,
  `userfield` varchar(255) collate utf8_general_ci default NULL,
  `accountcode` varchar(20) collate utf8_general_ci default NULL,
  `src` varchar(80) collate utf8_general_ci default NULL,
  `dst` varchar(80) collate utf8_general_ci default NULL,
  `dcontext` varchar(80) collate utf8_general_ci default NULL,
  `clid` varchar(80) collate utf8_general_ci default NULL,
  `channel` varchar(80) collate utf8_general_ci default NULL,
  `dstchannel` varchar(80) collate utf8_general_ci default NULL,
  `lastapp` varchar(80) collate utf8_general_ci default NULL,
  `lastdata` varchar(80) collate utf8_general_ci default NULL,
  `calldate` datetime NOT NULL default '0000-00-00 00:00:00',
  `duration` int(10) unsigned NOT NULL default '0',
  `billsec` int(10) unsigned NOT NULL default '0',
  `disposition` varchar(45) collate utf8_general_ci default NULL,
  `amaflags` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `calldate` (`calldate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
die konfigurationsdaten für den zugriff auf die datenbank findest du in der datei "/etc/asterisk/cdr_mysql.conf", die (für obiges SQL) folgendermassen aussehen muss:
Code:
[global]
hostname = localhost
dbname = asterisk
table = ast_cdr
user = asterisk
password = asterisk
port = 3306
;sock = /var/run/mysqld/mysqld.sock
userfield = 1

es gibt auch die möglichkeit, in das tabellenfeld "uniqueid" die eindeutige id des anrufes zu speichern, dazu muss aber die kompiler option "MYSQL_LOGUNIQUEID" gesetzt sein. wie man diese setzt, findest du im cdr_mysql artikel auf der voip-info.org seite (link weiter oben).

zusätzliche daten können über die dialplan funktion "CDR" im tabellenfeld "userfield" abgelegt werden. Beispiel:
Code:
...
; wert in userfield setzen:
exten = _X.,1,Set(CDR(userfield)=foo)
...

; wert im userfield erweitern:
exten = _X.,2,Set(CDR(userfield)=${CDR(userfield)}+bar)
...
danach befindet sich im tabellenfeld "userfield" der wert "foo+bar".

[EDIT]beachten sollte man, dass der datensatz erst beim hangup des calls in die datenbank geschrieben wird. das ist von interesse, wenn man mit DeadAGI scripts arbeitet, die auf diese daten zugreifen wollen. in der version 1.2.x von asterisk wird der datensatz erst nach dem vollständigen abarbeiten des dialplans in die cdr tabelle geschrieben, bei version 1.4.x wird der datensatz VOR der priorität "h" im dialplan geschrieben.[/EDIT]

grüße,
laureen
 
Zuletzt bearbeitet:
Klar, das der CDR im Normalfall ausreicht und auch die verlangten Daten schreibt...
ich benutze selbst den CDR, für mich las sich die Anfrage so, das der CDR nicht ganz das bringt, was gewünscht ist...

deswegen hab ich diese Methode gewählt...

Der CDR ist eh besser - was ich da geschrieben hab ist wahrscheinlich etwas zu rechenlastig, wenn es um größere Systeme geht... - aber es geht... grins
 
deswegen hab ich ja auch geschrieben:
...sollte die cdr methode die gewünschten informationen enthalten, würde ich diese bevorzugen,...

was mich an der methode mit der "MYSQL" dialplan applikation eigentlich am meisten stört, ist dass mit jedem anruf eine neue datenbank verbindung geöffnet wird, sie funktioniert aber dennoch auch gut, und solange man sich auf localhost oder den mysql socket verbindet, dürfte es damit nur bei sehr vielen (also wirklich vielen) gleichzeitigen anrufen probleme geben. hat eigentlich schon mal jemand versucht, die "connid" in eine globale variable zu pinseln und wiederzuverwenden?

grüße,
laureen
 
hat eigentlich schon mal jemand versucht, die "connid" in eine globale variable zu pinseln und wiederzuverwenden?

vorsicht, blöde idee: im source code wird kein reconnect abgehandelt, wie bei der cdr_mysql, wenn der mysql server die connection aufgrund eines timeouts schliesst!

grüße,
laureen
 
Kostenlos!

Statistik des Forums

Themen
248,887
Beiträge
2,303,985
Mitglieder
378,568
Neuestes Mitglied
me2k