1
|
|
|
#!/usr/bin/env python |
2
|
|
|
# -*- coding: utf-8 -*- |
3
|
|
|
|
4
|
|
|
import logging |
5
|
|
|
logger = logging.getLogger(__name__) |
6
|
|
|
logger.debug("%s loaded", __name__) |
7
|
|
|
|
8
|
|
|
import doorpi |
9
|
|
|
import pjsua as pj |
10
|
|
|
|
11
|
|
|
SIPPHONE_SECTION = 'SIP-Phone' |
12
|
|
|
conf = doorpi.DoorPi().config |
13
|
|
|
|
14
|
|
|
def call_timeout(): |
15
|
|
|
return conf.get_int(SIPPHONE_SECTION, 'call_timeout', 30) |
16
|
|
|
|
17
|
|
|
def max_call_time(): |
18
|
|
|
return conf.get_int(SIPPHONE_SECTION, 'max_call_time', 120) |
19
|
|
|
|
20
|
|
|
def sipphone_server(): |
21
|
|
|
return conf.get(SIPPHONE_SECTION, 'server') |
22
|
|
|
|
23
|
|
|
def pj_log(level, msg, length): |
|
|
|
|
24
|
|
|
# beautify output - remove date / time an line break |
25
|
|
|
length_date_and_time = len('15:22:35.695 ') |
26
|
|
|
length_linebreak = len('\n') |
27
|
|
|
msg = str(msg[length_date_and_time:-length_linebreak]) |
28
|
|
|
# now it's a beautiful msg |
29
|
|
|
if level == 4: logger.trace("PJ: %s",msg) |
30
|
|
|
if level == 3: logger.debug("PJ: %s",msg) |
31
|
|
|
if level == 2: logger.info("PJ: %s",msg) |
32
|
|
|
if level == 1: logger.warning("PJ: %s",msg) |
33
|
|
|
if level == 0: logger.error("PJ: %s",msg) |
34
|
|
|
|
35
|
|
|
def create_UAConfig(): |
36
|
|
|
logger.debug("create_UAConfig") |
37
|
|
|
# Doc: http://www.pjsip.org/python/pjsua.htm#UAConfig |
38
|
|
|
UAConfig = pj.UAConfig() |
39
|
|
|
UAConfig.max_calls = conf.get_int(SIPPHONE_SECTION, 'ua.max_calls', 1) |
40
|
|
|
UAConfig.nameserver = conf.get_list(SIPPHONE_SECTION, 'ua.nameserver', []) |
41
|
|
|
UAConfig.stun_domain = conf.get(SIPPHONE_SECTION, 'ua.stun_domain', '') |
42
|
|
|
UAConfig.stun_host = conf.get(SIPPHONE_SECTION, 'ua.stun_host', '') |
43
|
|
|
UAConfig.user_agent = 'DoorPi' |
44
|
|
|
return UAConfig |
45
|
|
|
|
46
|
|
|
def create_MediaConfig(): |
47
|
|
|
logger.debug("create_MediaConfig") |
48
|
|
|
# Doc: http://www.pjsip.org/python/pjsua.htm#MediaConfig |
49
|
|
|
MediaConfig = pj.MediaConfig() |
50
|
|
|
MediaConfig.audio_frame_ptime = conf.get_int(SIPPHONE_SECTION, 'media.audio_frame_ptime', 20) |
51
|
|
|
MediaConfig.channel_count = conf.get_int(SIPPHONE_SECTION, 'media.channel_count', 1) |
52
|
|
|
MediaConfig.clock_rate = conf.get_int(SIPPHONE_SECTION, 'media.clock_rate', 8000) |
53
|
|
|
MediaConfig.ec_options = conf.get_int(SIPPHONE_SECTION, 'media.ec_options', 0) |
54
|
|
|
MediaConfig.ec_tail_len = conf.get_int(SIPPHONE_SECTION, 'media.ec_tail_len', 1024) |
55
|
|
|
MediaConfig.enable_ice = conf.get_bool(SIPPHONE_SECTION, 'media.enable_ice', True) |
56
|
|
|
MediaConfig.enable_turn = conf.get_bool(SIPPHONE_SECTION, 'media.enable_turn', False) |
57
|
|
|
MediaConfig.ilbc_mode = conf.get_int(SIPPHONE_SECTION, 'media.ilbc_mode', 30) |
58
|
|
|
MediaConfig.jb_max = conf.get_int(SIPPHONE_SECTION, 'media.jb_max', -1) |
59
|
|
|
MediaConfig.jb_min = conf.get_int(SIPPHONE_SECTION, 'media.jb_min', -1) |
60
|
|
|
MediaConfig.max_media_ports = conf.get_int(SIPPHONE_SECTION, 'media.max_media_ports', 32) |
61
|
|
|
MediaConfig.no_vad = conf.get_bool(SIPPHONE_SECTION, 'media.no_vad', False) |
62
|
|
|
MediaConfig.ptime = conf.get_int(SIPPHONE_SECTION, 'media.ptime', 0) |
63
|
|
|
MediaConfig.quality = conf.get_int(SIPPHONE_SECTION, 'media.quality', 10) |
64
|
|
|
MediaConfig.rx_drop_pct = conf.get_int(SIPPHONE_SECTION, 'media.rx_drop_pct', 0) |
65
|
|
|
MediaConfig.snd_auto_close_time = conf.get_int(SIPPHONE_SECTION, 'media.snd_auto_close_time', 5) |
66
|
|
|
MediaConfig.snd_clock_rate = conf.get_int(SIPPHONE_SECTION, 'media.snd_clock_rate', 0) |
67
|
|
|
MediaConfig.turn_conn_type = conf.get_int(SIPPHONE_SECTION, 'media.turn_conn_type', 17) |
68
|
|
|
#TODO: string to http://www.pjsip.org/python/pjsua.htm#AuthCred |
69
|
|
|
MediaConfig.turn_cred = None |
70
|
|
|
MediaConfig.turn_server = conf.get(SIPPHONE_SECTION, 'media.turn_server', '') |
71
|
|
|
MediaConfig.tx_drop_pct = conf.get_int(SIPPHONE_SECTION, 'media.tx_drop_pct', 0) |
72
|
|
|
return MediaConfig |
73
|
|
|
|
74
|
|
|
def create_LogConfig(): |
75
|
|
|
logger.debug("create_LogConfig") |
76
|
|
|
# Doc: http://www.pjsip.org/python/pjsua.htm#LogConfig |
77
|
|
|
LogConfig = pj.LogConfig( |
78
|
|
|
callback = pj_log, |
79
|
|
|
level = conf.get_int(SIPPHONE_SECTION, 'log.level', 1), |
80
|
|
|
console_level = conf.get_int(SIPPHONE_SECTION, 'log.console_level', 1) |
81
|
|
|
) |
82
|
|
|
return LogConfig |
83
|
|
|
|
84
|
|
|
def create_AccountConfig(): |
85
|
|
|
logger.debug("create_AccountConfig") |
86
|
|
|
# Doc: http://www.pjsip.org/python/pjsua.htm#AccountConfig |
87
|
|
|
server = conf.get(SIPPHONE_SECTION, "sipserver_server") |
88
|
|
|
username = conf.get(SIPPHONE_SECTION, "sipserver_username") |
89
|
|
|
password = conf.get(SIPPHONE_SECTION, "sipserver_password") |
90
|
|
|
realm = conf.get(SIPPHONE_SECTION, "sipserver_realm") |
91
|
|
|
|
92
|
|
|
AccountConfig = pj.AccountConfig() |
93
|
|
|
AccountConfig.id = "sip:" + username + "@" + server |
94
|
|
|
AccountConfig.reg_uri = "sip:" + server |
95
|
|
|
AccountConfig.auth_cred = [ pj.AuthCred(realm, username, password) ] |
96
|
|
|
AccountConfig.allow_contact_rewrite = conf.get_bool(SIPPHONE_SECTION, 'account.allow_contact_rewrite', 0) |
97
|
|
|
AccountConfig.reg_timeout = conf.get_int(SIPPHONE_SECTION, 'account.reg_timeout', 10) |
98
|
|
|
|
99
|
|
|
return AccountConfig |
100
|
|
|
|
101
|
|
|
def create_TransportConfig(): |
102
|
|
|
logger.debug("create_TransportConfig") |
103
|
|
|
# Doc: http://www.pjsip.org/python/pjsua.htm#TransportConfig |
104
|
|
|
TransportConfig = pj.TransportConfig( |
105
|
|
|
port = conf.get_int(SIPPHONE_SECTION, 'transport.port', 0), |
106
|
|
|
bound_addr = conf.get(SIPPHONE_SECTION, 'transport.bound_addr', ''), |
107
|
|
|
public_addr = conf.get(SIPPHONE_SECTION, 'transport.public_addr', '') |
108
|
|
|
) |
109
|
|
|
return TransportConfig |
110
|
|
|
|