Callfile php + Abrechnungsfehler?

Fredjam

Mitglied
Mitglied seit
7 Mai 2006
Beiträge
362
Punkte für Reaktionen
0
Punkte
0
Hallo ich versuche schon seit 2 Wochen eine richtige Abrechnung hinzubekommen aber irgend wie will das nicht und ich weiß nicht woran das liegt.

Also ich habe ein callphp Datei wo ich eine Nummer reinschreiben kann und wo durch bestätiegung des Anruf butten die Person angerufen wird.
Dieser Person wird dann was mit geteilt, und zum Schluss wird noch ein record gemacht.

Hier ein Code schnipsel aus der php
Code:
               $timeout = 10; 
               $asterisk_ip = "127.0.0.1"; 
               $socket = fsockopen($asterisk_ip,"5038", $errno, $errstr, $timeout); 
               fputs($socket, "Action: Login\r\n"); 
               fputs($socket, "UserName: admin\r\n"); 
               fputs($socket, "Secret: passwort\r\n\r\n"); 
               $wrets=fgets($socket,128); 
               fputs($socket, "Action: Originate\r\n" );
	        fputs($socket, "Channel: local/$num@autocall\r\n");
               fputs($socket, "Exten: 355\r\n" ); 
               fputs($socket, "Context: menu-test1\r\n" ); 
               fputs($socket, "Priority: 1\r\n" ); 
               fputs($socket, "Callerid: 355\r\n" ); 
               fputs($socket, "Async: no\r\n\r\n" ); 
               $wrets=fgets($socket,128);

Code:
[menu-test1]

exten => 355,1,Wait(1)
exten => 355,2,SIPdtmfMode(auto)
exten => 355,3,DigitTimeout,5
exten => 355,4,ResponseTimeout,8
exten => 355,n,Playback(anrufmitteilung)
exten => 355,n,Record(/tmp/${CALLERIDNUM}antwort.wav,2,8,s)
exten => 355,n,Playback(aufwiederhoern)
exten => 355,n,Hangup 


exten => h,1,Hangup

Code:
[autocall]
exten => _0[2-9].,1,Dial(SIP/49${EXTEN:1}@arcor,60,r)
exten => _0[2-9].,n,Congestion

exten => h,1,Hangup

Das Problem hier bei ist das egal wie lange der anruf dauert bei mir in der Datenbank drinne steht das der anruf 0 secunden gedauert hat und jeder anruf wird 2 mal eingetragen.

Code:
Datum  	Rufnummer  	Destination  	Status  	Dauer/Sek.  	Provider
2007-08-15 21:43:47 	355 	355 	Angenommen 	0 	ank. / int. / unbek.
2007-08-15 21:43:36 	355 	0211223456 	Angenommen 	0 	ank. / int. / unbek.


Und so sieht das in der Console aus

Code:
  == Parsing '/etc/asterisk/manager.conf': Found
  == Manager 'admin' logged on from 193.111.112.2
  == Manager 'admin' logged off from 193.111.112.2
    -- Executing Dial("Local/0211223456@autocall-2105,2", "SIP/[email protected]|60|r") in new stack
    -- Called [email protected]
    -- SIP/217.111.166.222-355-083c5470 is ringing
    -- SIP/217.111.166.222-355-083c5470 answered Local/02112602768@autocall-2105,2
       > Channel Local/02112602768@autocall-2105,1 was answered.
    -- Executing Wait("Local/0211223456@autocall-2105,1", "1") in new stack
  == Spawn extension (autocall, 02112602768, 1) exited non-zero on 'Local/0211223456@autocall-2105,2'
    -- Executing Hangup("Local/0211223456@autocall-2105,2", "") in new stack
  == Spawn extension (autocall, h, 1) exited non-zero on 'Local/02112602768@autocall-2105,2'
    -- Executing SIPDtmfMode("SIP/217.111.166.222-355-083c5470", "auto") in new stack
Aug 15 21:43:48 WARNING[5383]: chan_sip.c:13057 sip_dtmfmode: I don't know about this dtmf mode: auto
    -- Executing DigitTimeout("SIP/217.111.166.222-355-083c5470", "5") in new stack
    -- Set Digit Timeout to 5
    -- Executing ResponseTimeout("SIP/217.111.166.222-355-083c5470", "8") in new stack
    -- Set Response Timeout to 8
    -- Executing Playback("SIP/217.111.166.222-355-083c5470", "anrufmitteilung") in new stack
    -- Playing 'telekotext' (language 'en')
    -- Executing Record("SIP/217.111.166.222-355-083c5470", "/tmp/0211223456antwort.wav|2|8|s") in new stack
    -- Playing 'beep' (language 'en')
    -- Executing Hangup("SIP/217.111.166.222-355-083c5470", "") in new stack
  == Spawn extension (menu-test1, h, 1) exited non-zero on 'SIP/217.111.166.222-355-083c5470'


Warum macht der jetzt aus einem call 2 calls und warum steht da immer secunden hat ein anruf gendauert?

Kann mir da jemand weiter helfen ?
 
MMM kann mir hier wirklich keiner weiter helfen oder vielleicht nen Tip geben woran es vielleicht liegen könnte ?
 
Die Anrufdauer steht Dir ja erst nach dem Anruf zur Verfügung. Daher solltest Du einfach nach Anrufende Deine Abrechnung schreiben. So sieht das bei mir aus:
Code:
exten => h,n,TrySystem(echo "${calltime}\;${accountcode}\;${exten}\;${ANSWEREDTIME}\;${charge}\;${Area}\;${provider}" >> /var/log/asterisk/billing/${STRFTIME(||%y-%m)}/Billing.csv)
Das Thema Abrechnung wurde hier schon oft genug behandelt.

MfG Mathias
 
Da ich voiponcd nutzt habe ich ja schon ein fertieges abrechnungs System
nur komischer weise macht es aus einem call also 2 und das jeweils mit 0 sec egal wie lange es braucht.

ach ja und ich hohle mir die daten aus der mysql Datebank
 
Zuletzt bearbeitet:
Wenn Du Callfiles nutzt hast Du ja auch aus Sicht des * 2 ausgehende Rufe, denn er muss ja sowohl den "Anrufer", als auch den Zielteilnehmer rufen.

Die vom * z.B. im CDR erfassten Zeiten sind teilweise falsch. Daher ist es zuverlässiger diese im Dialplan in der Prio h zu erfassen bzw. in Datenbanken zu schreiben. Mit ${ANSWEREDTIME} hat man da schon eine verlässlichere Angabe.

Wichtig: Da ${EXTEN} jetzt h ist musst Du dir das Ziel zuvor in einer Speichervariable merken ( Set(exten=${EXTEN}) ).
 
Mathias-R schrieb:
Die vom * z.B. im CDR erfassten Zeiten sind teilweise falsch.

Mathias,

die Differenzen zwischen Telefonrechnung und unserer Kontrollabrechnung auf Basis der CDR-Daten sind bei uns minimal, allerdings kommt es durchaus zu Unterschieden. Ich habe aber noch keine Gesetzmäßigkeit herausfinden können - war seither aber auch zu faul, den Einzelgesprächsnachweis mit unseren CDR-Einträgen abzugleichen :)

Wann sind die CDR-Zeiten denn falsch? Kannst Du da etwas mehr ins Detail gehen?

Ralph
 
Zuletzt bearbeitet:
meine CDR daten werden ja auch in die Mysql daten bank geschrieben wo ich sie ja durch eine php auslesen lassen kann.
Das ist mir schon alles schön vorgegeben von Voiponcd...
Nun habe ich aber das problem und ich nicht weiß wie ich mit dem System befehl nach dem h
die daten in die mysql db schreiben kann.

habe dort diese felder
unter astcc/cdrs/
id cardnum callerid callednum trunk disposition billseconds billcost callstart

mit welchen befehl kann ich jetzt am besten die paramenter dort übergeben ?


Übergibt Asterisk die daten erst in die .csv und darüber in die mysql DB oder direckt in die mySQL db ?

weil dann müste ich wenn es direckt in die db geschrieben wird denn system befehlt für mysql herrausfinden

exten => h,n,TrySystem(echo "${calltime}\;${accountcode}\;${exten}\;${ANSWEREDTIME}\;${charge}\;${Area}\;${provider}" >> /var/log/asterisk/billing/${STRFTIME(||%y-%m)}/Billing.csv)

und das hier würde nicht ueber echo laufen sondern mit mysql anfangen.
 
Zuletzt bearbeitet:
Also das billing funktioniert jetzt nur macht der immer noch aus dem skirpt 2 anrufe gibt es da nicht irgend nen befehl oder einen trick wie ich sagen kann der call file dass das nur ein anruf ist?

Code:
[autocall]
exten => _0[2-9].,1,Answer
exten => _0[2-9].,n,Dial(SIP/49${EXTEN:1}@arcor,60)
exten => _0[2-9].,n,Congestion
exten => _0[2-9].,n,Hangup 

exten => h,1,Hangup
Seit dem ich den befehl Answer also
exten => _0[2-9].,1,Answer
reingeschrieben habe berechnet der jetzt auch die dauer....


Gibt es so was wie einen Übergabe paramenter oder so was ? das währe doch mal eine interessante sache oder darf ich vielleicht kein hangup oder congestion in die dial vorgabe reingeschreiben.
Irgend wie muss das doch gehen ^^
Nur möchte ich jetzt halt beide verbindungen in einem haben....
das sieht dann so in meiner DB aus das mein call 0 oder eine sec gedauert hat und der andere ist halt untschiedlich lang....

Weiß da keiner einen trick?
 
Zuletzt bearbeitet:
@Ralph*
Bei 99% der Gespräche sind die Abweichungen < 2 Sekunden, aber ein kleiner Teil der Gespräche wird im CDR erheblich zu lang erfasst (z.B. 22 Sekunden Gespräch mit 114 Sekunden im CDR). Zur Überprüfung habe ich ein paar Tage alle Aktionen in die messages schreiben lassen und konnte feststellen, dass bei Abweichungen die Werte im CDR falsch sind.
Noch ein Hinweis zum CDR: Wenn Du in der h-Extension Auswertungen vornimmst erscheint im CDR "h" als Ziel. Abhilfe bringt ein Goto zur alten EXTEN vor dem Hangup.

MfG Mathias
 
Mathias,

dann muss ich doch mal die CDR-Daten mit den Einzelgesprächsnachweisen vergleichen... woher die falschen Zeiten für die Gesprächslänge kommen, ist vermutlich noch nicht geklärt worden?

Und ich dachte schon, die T-Com würde manchmal falsche Zeiten berechnen, Asterisk hatte ich da gar nicht im Verdacht :-)

Ralph
 
Zuletzt bearbeitet:
Fredjam schrieb:
Nur möchte ich jetzt halt beide verbindungen in einem haben....

Weiß da keiner einen trick?

Das wurde Dir doch weiter oben schon erklärt :rolleyes:

Anrufe über Callfiles sind für den Asterisk immer zwei Anrufe, da er zwei Channels aufbaut und dann miteinander verbindet.
 
ja oki aber kann man ihm das nicht auch anders verklickern?

Habe die verrechnung jetzt hinbekommen nur möchte ich gerne das
das er nur denn call verrechnet und nicht den aufbau zu dem Voice file
gibt es einem befehl wo asterisk untersagt wird das er das nicht in die DB schreibt?
so das nur der ausgehende call protokoliert wird ?
So hätte ich nämlich mein problem ganz gelöst :)
 
Mit nocdr() kannst Du die Protokollierung eines Anrufes abschalten.
Ob das bei Callfiles auch funktioniert, habe ich noch nicht probiert.
 
Ja cool werde ich nachher mal ausprobieren :)
Wenn das geht bin ich auf jeden fall schon mal einen großen schritt weiter

Kann hier nämlich nicht an der firewall vorbei :/
Muss mal irgend wie nen tunnel auf meinen Server Einrichten ^^

Erst mal vielen dank betateilchen
 
Sooo ich habe jetzt wie merkwürdig keit gefunden und vielleicht auch den grund wo ran es liegt...
Aber leider noch nicht die lösung....

Mein Skript

Code:
[raus]
exten => _0[2-9].,1,Answer ;;;<--Großes augenmerk auf den hier BITTE<--
exten => _0[2-9].,n,Dial(SIP/${EXTEN}@arcor,60)
exten => _0[2-9].,n,Congestion
exten => _0[2-9].,n,Hangup 

[menu-test1]

exten => 355,1,Wait(1)
exten => 355,2,SIPdtmfMode(auto)
exten => 355,3,DigitTimeout,5
exten => 355,4,ResponseTimeout,8
exten => 355,n,Playback(anrufmitteilung)
exten => 355,n,Record(/tmp/${CALLERIDNUM}antwort.wav,2,8,s)
exten => 355,n,Playback(aufwiederhoern)
exten => 355,n,Hangup 


exten => h,1,Hangup
Sobalt ich die exten => _0[2-9].,n,Answer funktion reinschreibe berechnet er mir die secunden an wie lange er telefoniert hat, und wenn ich das nicht reinschreibe halt nicht dann steht da wieder nur 0 sec...

Das Problem ist aber wenn ich jetzt bei raus
exten => _0[2-9].,n,Answer
Hin schreibe dann spielt er die Audi datei ab obwohl er noch nicht verbunden ist.
Gibt es einen befehl das er wartet bis die Person abgehoben hat?

MFG Fredjam

EDIT:

Also ich habe noch mal nachgeschaut das einfachste währe wenn ich kein Kommando das warte bis die Person den Hörer abgenommen hat.
So könnte ich erst ins [menu-test1] verbinden dann die person angerufen wird über [raus]
Die audi datein dürfen aber erst dann abgespielt werden nachdem die Person am Hörer ist....
Erst so könnte ich Perfekt ueber Voip on CD abrechnen ...
 
Zuletzt bearbeitet:
works as designed!

Sobald Du ein answer() in den Ablauf schreibst, gilt der Anruf als angenommen.
 
Aber damit komme ich ja nicht weiter ...

php schnipsel
Code:
	        fputs($socket, "Channel: local/$num@autocall\r\n");
               fputs($socket, "Exten: s\r\n" ); 
               fputs($socket, "Context: menu-test1\r\n" ); 
               fputs($socket, "Priority: 1\r\n" ); 
               fputs($socket, "Callerid: 7010\r\n" ); 
               fputs($socket, "Async: no\r\n\r\n" ); 
               $wrets=fgets($socket,128);

Code:
[raus]
exten => _0[2-9].,1,Answer ;;;Wenn hier Answer ist wird genau angezeigt wie lange der call braucht. nur halt wird die Playback(anrufmitteilung) dreckt abgespielt obwohl die person noch nicht verbunden ist. <--
exten => _0[2-9].,n,noCDR()
exten => _0[2-9].,n,Dial(SIP/${EXTEN}@arcor,60)
exten => _0[2-9].,n,Congestion
exten => _0[2-9].,n,Hangup 

[menu-test1]

exten => s,1,Wait(1)
exten => s,n,noCDR()
exten => s,n,SIPdtmfMode(auto)
exten => s,n,DigitTimeout,5
exten => s,n,ResponseTimeout,8
exten => s,n,Playback(anrufmitteilung)
exten => s,n,Record(/tmp/${CALLERIDNUM}antwort.wav,2,8,s)
exten => s,n,Playback(aufwiederhoern)
exten => s,n,Hangup 


exten => h,1,Hangup

Wenn jetzt also der answer in [raus] nicht drinne ist geht der call richtig aber die Berechnung stimmt nicht weil das dann halt auf 0 sec immer steht.

Wie kann ich also dem [menu-test1] klar machen das der erst die audio datei abspielen soll wenn er auch wirklich mit dem Telefon verbunden ist?

Habe schon versucht

Code:
[raus]
exten => _0[2-9].,1,Dial(SIP/${EXTEN}@arcor,60)
exten => _0[2-9].,n,Congestion
exten => _0[2-9].,n,Answer
exten => _0[2-9].,n,Hangup
Den answer hinter den Dial zu legen aber das will auch nicht ^^

Oder ich lasse nicht raus berechnen sondern menu-test1 aber da habe ich keine ahnung wie ich das machen soll.

Hat hier vielleicht jemand ne jute idee
 
Du sollstest mal sehr dringend Grundlagendokumentation zu Asterisk lesen. Dann kommst Du auch nicht auf so abstruse Ideen, wie z.B. ein Answer nach einem Dial einbauen zu wollen.

http://www.voip-info.org ist zum Beispiel eine sehr gute Anlaufstelle.

Offensichtlich hast Du keinen blassen Schimmer, was Du da eigentlich zusammenschräubelst, stattdessen redest Du hier seit 17 Beiträgen im Kreis rum :-Ö
 
Danke

aber habe mir schon 3 Bücher reingezogen und anscheinend geht das halt nicht mit normalen mitteln ...
 
Kostenlos!

Statistik des Forums

Themen
248,519
Beiträge
2,293,410
Mitglieder
378,018
Neuestes Mitglied
lg300