Seite 1 von 1
COM Server von 'Phoner' ansprechen ?
Verfasst: Mittwoch 21. Dezember 2005, 11:28
von snakeseven
Hi,
Habe ein COM Problem.
Ich habe das Programm Phoner
http://www.phoner.de, welches ich über 'subprocess.Popen()' aufrufen und zum Aufbau einer Telefonverbindung überreden kann. Sobald abgenommen wird soll ein WAV File abgespielt werden. Das geht aus Phoner heraus nicht, weswegen das in meinem Pythonscript passieren muß. Kein Problem, wenn ich eine Methode hätte zu erkennen, wann die Gegenstelle abgenommen hat ? Phoner hat einen integrierten COM Server, der alle Nötigen Infos nach außen gibt. Leider gibt es (noch) keine Doku dazu. Kann ich trotzdem rauskriegen, wie ich
a) die Applikation selbst anspreche ("Phoner.Applikation" funktioniert nicht) ?
b) auf welche Klassen, Methoden und Attribute von Phoner ich über COM zugreifen kann ?
Bin für jeden Tipp dankbar !
Seven
P.S. Es gibt auch eine ActiveX Schnittstelle zu Phoner, die sogar dokumentiert ist, aber da blicke ich nicht, wie man die anspricht ??

Achja, Win32Com ist natürlich installiert
Verfasst: Mittwoch 21. Dezember 2005, 16:16
von tabellar
Hi Snakeseven,
Telefonieren über den PC (VoIP) ist auch so eins meiner Hobbies.
Phoner kannte ich bisher nicht, macht aber einen ganz guten Eindruck

.
Ich selber hab nen Asterisk Server als PBX, ein Endlosthema...
Um an die COM Befehle von Phoner heranzukommen kannst Du z.B.
über den VBA Editor in Excel den Objektkatalog aufrufen. Dort findest
Du die entpsrechenden COM / OLE Server auf Deinem Rechner mit den
entsprechenden Funktionen.
Viel Glück...
Tabellar
Verfasst: Mittwoch 21. Dezember 2005, 16:40
von snakeseven
Hi Tabellar,
kenne mich zwar mit VB nicht aus aber Excell ist bei mir installiert und da ist ja auch ein VB Editor bei. Asterix läuft leider nur auf Linux (Unix) was ich beides nicht habe. Aber wenn ich an die Schnittstellen-Doku von Phoner komme (z.B. über VB), dann müßte es auch möglich sein, über win32com darauf zuzugreifen ?
Ich melde mich an dieser Stelle wieder, wenn ich was Erfolgreiches dazu sagen kann. Vieleicht haben ja Andere auch sowas vor !?
Gruss, Seven
Verfasst: Mittwoch 21. Dezember 2005, 16:58
von tabellar
snakeseven hat geschrieben:... Excell ist bei mir installiert und da ist ja auch ein VB Editor bei...
... s.o. ...
snakeseven hat geschrieben:... Asterix läuft leider nur auf Linux (Unix) was ich beides nicht habe
!!! ASTERISK !!!
snakeseven hat geschrieben:Aber wenn ich an die Schnittstellen-Doku von Phoner komme (z.B. über VB), dann müßte es auch möglich sein, über win32com darauf zuzugreifen ?
Korrekt. Hier nochmals ein kleiner Tipp. Im Excel VBA Editor musst Du noch über den Menüpunkt /Extras/Verweise den Phoner COM Server
auswählen, damit er anschliessend im "Objektkatalog" angezeigt wird.
Tabellar
Verfasst: Dienstag 27. Dezember 2005, 20:21
von snakeseven
Hi,
versuche mich da jetzt ranzupirschen. Phoner ist über den eigenen COM-Server über
zu erreichen. Es gibt die Funktion
GetState(CallID As Long, StateString). Sie enthält die für mich wichtige Variable 'StateString'. Sie kann die Werte 'Idle', 'Connecting' und 'Connected' haben. Wenn ich mit:
versuche StateString auszulesen gibts ein 'None' zurück, statt des zu erwartenden 'Idle'. Die Variable
NumberOfCalls kann ich hingegen korrekt auslesen.
MakeCall(Number As String) funktioniert auch.
Was mache ich falsch ??
Gruss, Seven
Verfasst: Freitag 30. Dezember 2005, 07:23
von Phoner
Der erste Parameter eines GetState() erwartet die ID des entsprechenden Calls, Du kannst da nicht einfach eine Null übergeben!
Du musst die Eventfunktion OnChangeState() auswerten. Da kommen die CallIDs mit...
Verfasst: Freitag 30. Dezember 2005, 12:45
von snakeseven
Phoner hat geschrieben:Du musst die Eventfunktion OnChangeState() auswerten. Da kommen die CallIDs mit...
Da verstehe ich was jetzt nicht. OnChangeState() verlangt ebenfalls als Parameter die CallID. Aber genau die weiss ich ja nicht ? Erklärtext in VB->Phoner.CPhoner:
Code: Alles auswählen
Event OnChangeState(CallID As Long)
Element von Phoner.CPhoner
Statusänderung
Wenn ich OnChangeState() mit einem Long-Dummy aufrufe, bekomme ich eine Fehlermeldung:
Code: Alles auswählen
raise AttributeError, "%s.%s" % (self._username_, attr)
AttributeError: Phoner.CPhoner.OnChangeState
Seven (ratlos dreinblick

)
Verfasst: Donnerstag 19. Januar 2006, 06:56
von mitsuhiko
Juhuuuuu. Spam Alarm. Noch immer nichts gegen die Deaktivierung der Gast Funktion? Und nein. Ich lösch es erst, wenn sich das jemand auser mir auch noch angesehen hat

Verfasst: Donnerstag 19. Januar 2006, 17:02
von Leonidas
blackbird hat geschrieben:Ich lösch es erst, wenn sich das jemand auser mir auch noch angesehen hat

Brauchst du nicht mehr, hab ich gemacht

Verfasst: Donnerstag 19. Januar 2006, 18:24
von snakeseven
??? was geht hier vor ??? Ich hoffte schon, jemand weiss wie man Phoner fernsteuert. Leider nicht

Seven
Verfasst: Mittwoch 25. Januar 2006, 15:12
von snakeseven
Hi,
Ich brauche nochmal eure Hilfe in Sachen
Phoner:
Nachfolgendes Script ruft Phoner über win32com auf, wählt, spielt eine WAV-Datei ab und legt wieder auf. Alles schick, nur daß ich
die CallID manuell eintragen muß, weil ich an die immer noch nicht rankomme. Ich habe sie mir über
diese HTML Applikation
auslesen lassen und sie ist immer dieselbe. Dennoch ist es "unelegant" und geschummelt. Wie komme ich über den
COM-Server von
Phoner an die CallID ? Das Phoner Forum antwortet dazu
das hier. Das verstehe ich aber nicht, denn woher soll der Phoner-Server, über den Phoner alle Informationen rausgibt, meine Funktion kennen ??? Hat einer von euch eine Idee ?
Mein Script:
Code: Alles auswählen
import win32com.client,time,threading
cid = "257" #CallID
stat = ""
wavlen = 21 #Länge des Wavfiles
tme = 0
Z = ''
def zaehler():
global Z,tme
Z = threading.Timer(1, zaehler) #Thread: Sekundenzähler
Z.start()
tme += 1
def make_call():
phon = win32com.client.Dispatch("Phoner.CPhoner") #Phoner öffnen
phon.MakeCall("021158007207") #Echotestloop
call_start = tme
call = True
ply = False
while call:
zustand = phon.GetState(cid,stat)
if zustand == "Connected":
if not ply:
ply = True
connect_start = tme #Play-Zähler setzen
phon.SendWAVE(cid,"G:/AutomergeMobile/MP3_out/temp1.wav")
else:
if tme - connect_start > wavlen: #Nach Abspielen Ruf beenden
call = False
elif zustand == "Disconnecting" or zustand == "None":
call = False
else:
if tme - call_start > 30: #wenn nach 30 Sekunden Ruf nicht angenommen
call = False
phon.DisconnectCall(cid)
Z.cancel()
del(phon) #Phoner schließen
zaehler()
make_call()