在 python 中,我尝试创建一个服务来维护 SflPhone(dbus 服务)和外部应用程序之间的调用事件,当我启动 SimpleXMLRPCServer 时,我的服务不再响应任何调用事件,例如未调用 on_call_state_changed 函数。
当我注释掉thread.start_new_thread(start_server(s,))
一切正常时。我不知道如何使这两个东西一起工作。有人可以帮忙吗?感谢。
import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
from gobject import GObject
from SimpleXMLRPCServer import SimpleXMLRPCServer
import thread
from os import path
class SlfPhoneConnector :
def __init__(self) :
self.activeCalls = {}
account = {
"username" : "1111",
"Account.type" : "SIP",
"hostname" : "192.168.1.109",
"Account.alias" : "1111",
"password":"1111",
"Account.enable" : "TRUE"
}
session = dbus.SessionBus()
conf_obj = session.get_object("org.sflphone.SFLphone", "/org/sflphone/SFLphone/ConfigurationManager")
self.conf_mgr = dbus.Interface(conf_obj ,"org.sflphone.SFLphone.ConfigurationManager")
call_obj = session.get_object("org.sflphone.SFLphone", "/org/sflphone/SFLphone/CallManager")
self.call_mgr = dbus.Interface(call_obj ,"org.sflphone.SFLphone.CallManager")
self.call_mgr.connect_to_signal('incomingCall', self.on_incoming_call)
self.call_mgr.connect_to_signal('callStateChanged', self.on_call_state_changed)
self.account_id = self.conf_mgr.addAccount(account)
self.conf_mgr.sendRegister(self.account_id, 1)
#self.call_mgr.placeCall(self.account_id, self.account_id, "2222" )
def on_incoming_call(self, account, callid, to):
print "Incoming call: " + account + ", " + callid + ", " + to
self.activeCalls[callid] = {'Account': account, 'To': to, 'State': '' }
self.call_mgr.accept(callid)
# On call state changed event, set the values for new calls,
# or delete the call from the list of active calls
def on_call_state_changed(self, callid, state):
print "Call state changed: " + callid + ", " + state
if state == "HUNGUP":
try:
del self.activeCalls[callid]
except KeyError:
print "Call " + callid + " didn't exist. Cannot delete."
elif state in [ "RINGING", "CURRENT", "INCOMING", "HOLD" ]:
try:
self.activeCalls[callid]['State'] = state
except KeyError, e:
print "This call didn't exist!: " + callid + ". Adding it to the list."
callDetails = self.getCallDetails(callid)
self.activeCalls[callid] = {'Account': callDetails['ACCOUNTID'], 'To': callDetails['PEER_NUMBER'], 'State': state }
elif state in [ "BUSY", "FAILURE" ]:
try:
del self.activeCalls[callid]
except KeyError, e:
print "This call didn't exist!: " + callid
def getCallDetails(self, callid):
"""Return informations on this call if exists"""
return self.call_mgr.getCallDetails(callid)
def place_call(self, callid):
self.call_mgr.placeCall(self.account_id, self.account_id, callid)
def hangup(self) :
call0 = self.activeCalls.keys()[0]
self.call_mgr.hangUp(call0)
def start_server(obj):
server = SimpleXMLRPCServer( ("localhost", 9988), allow_none= True)
server.register_instance(obj)
print "server start @localhost 9988 forever ..."
server.serve_forever()
if __name__ == "__main__" :
DBusGMainLoop(set_as_default=True)
s = SlfPhoneConnector()
thread.start_new_thread(start_server(s,))
... {{ another code here }}
#loop = gobject.MainLoop()
#loop.run()