= Your Python SIP "Hello World!" Application = [[TracNav(Python_SIP/TOC)]] I'm not sure how one is supposed to make a SIP "Hello World!" application, but anyway here it is, a simple application to make call to a destination. == Simple Caller Application == #makecall This application will make call to a destination URI specified in the command line argument, and establish audio communication with remote party once the call is connected. {{{ #!python import sys import pjsua as pj # Logging callback def log_cb(level, str, len): print str, # Callback to receive events from Call class MyCallCallback(pj.CallCallback): def __init__(self, call=None): pj.CallCallback.__init__(self, call) # Notification when call state has changed def on_state(self): print "Call is ", self.call.info().state_text, print "last code =", self.call.info().last_code, print "(" + self.call.info().last_reason + ")" # Notification when call's media state has changed. def on_media_state(self): global lib if self.call.info().media_state == pj.MediaState.ACTIVE: # Connect the call to sound device call_slot = self.call.info().conf_slot lib.conf_connect(call_slot, 0) lib.conf_connect(0, call_slot) print "Hello world, I can talk!" # Check command line argument if len(sys.argv) != 2: print "Usage: simplecall.py " sys.exit(1) try: # Create library instance lib = pj.Lib() # Init library with default config lib.init(log_cfg = pj.LogConfig(level=3, callback=log_cb)) # Create UDP transport which listens to any available port transport = lib.create_transport(pj.TransportType.UDP) # Start the library lib.start() # Create local/user-less account acc = lib.create_account_for_transport(transport) # Make call call = acc.make_call(sys.argv[1], MyCallCallback()) # Wait for ENTER before quitting print "Press to quit" input = sys.stdin.readline().rstrip("\r\n") # We're done, shutdown the library lib.destroy() lib = None except pj.Error, e: print "Exception: " + str(e) lib.destroy() lib = None sys.exit(1) }}} Save the snippet above as '''simplecall.py'''. Now you can call another softphone (such as [http://www.pjsip.org/pjsua.htm pjsua]) by specifying the SIP URI as command line argument. For example, if the other softphone is on "sip:192.168.0.15:5080", run the program as follows: {{{ python simplecall.py sip:192.168.0.15:5080 }}} Here's the output of the program when I run it on Windows XP: {{{ 13:05:25.718 os_core_win32. pjlib 0.9.0-trunk for win32 initialized 13:05:25.718 sip_endpoint.c Creating endpoint instance... 13:05:25.718 pjlib WinNT IOCP I/O Queue created (00D230A0) 13:05:25.734 sip_endpoint.c Module "mod-msg-print" registered 13:05:25.734 sip_transport. Transport manager created. 13:05:25.968 pjsua_core.c pjsua version 0.9.0-trunk for win32 initialized Call is CALLING last code = 0 () Press to quit Call is EARLY last code = 180 (Ringing) Call is CONNECTING last code = 200 (OK) Hello world, I can talk! Call is CONFIRMED last code = 200 (OK) Call is DISCONNCTD last code = 200 (Normal call clearing) }}}