Exemple #1
0
class SIPClient:

    '''Send standard SIP request, receive reply & start audio thread'''

    def __init__(self):
        self.log = Logger(LOG_FILE)
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.connect((PROXY[0], int(PROXY[1])))
        self.sock.settimeout(0.05)

    def receive(self):
        try:  # Check if the proxy send an answer to our request
            data = self.sock.recv(1024).decode()
            self.log.receive(PROXY, data)  # Write in the log file
            return data
        except socket.timeout:
            return ''  # The server hasn't sent us new data
        except socket.error:  # The server is off
            self.log.error('No server listening at {} port {}'.format(*PROXY))
            raise SystemExit

    def send(self, msg):  # Send and create event in the log
        if 'sdp' not in msg:  # SDP don't need a blank line
            msg = msg + '\r\n\r\n'  # Add to original msg a blank line
        self.sock.send(msg.encode())
        self.log.send(PROXY, msg)

    def do_register(self, expires):  # Send REGISTER & create HASH response
        header = 'REGISTER sip:{}:{} SIP/2.0\r\nExpires: {}'
        header = header.format(MY_USER, SERVER[1], expires)  # User, port, exp
        self.send(header)
        resp = self.receive()
        if not resp or '401' not in resp:  # Check authorization response
            return  # We don't continue the registration process
        nonce = re.search(r'nonce="(.+)"', resp).group(1)  # Search nonce value
        md5 = hashlib.md5((nonce + MY_PASSWD).encode()).hexdigest()
        resp = '{}\r\nAuthorization: Digest nonce="{}", response="{}"'
        self.send(resp.format(header.strip(), nonce, md5))  # Add auth header
        self.receive()

    def do_invite(self, user):  # Send invite, check resp, send ACK,start audio
        header = 'INVITE sip:{} SIP/2.0\r\nContent-Type: application/sdp'
        body = '\r\n\r\nv=0\r\no={} {}\r\ns=PTAVI\r\nt=0\r\nm=audio {} RTP'
        self.send((header + body).format(user, MY_USER, SERVER[0], RTPORT))
        codes = []  # Store each response from Proxy here
        data = self.receive()
        while data:
            codes.append(data.split()[1])  # Store only response code
            data = self.receive()
        if codes == ['100', '180', '200']:  # Must receive Trying,Ringing & OK
            self.send('ACK sip:{} SIP/2.0'.format(user))
            system('./mp32rtp -i {} -p {} < {}'.format(SERVER[0], RTPORT, AUD))

    def do_bye(self, user):  # Send bye request & finish log
        self.send('BYE sip:{} SIP/2.0'.format(user))
        self.receive()

    def do_method(self, type_method, user):  # !(REGISTER,INVITE,BYE)
        self.send('{} sip:{} SIP/2.0'.format(type_method.upper(), user))
        self.receive()
Exemple #2
0
 def __init__(self):
     self.log = Logger(LOG_FILE)
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     self.sock.connect((PROXY[0], int(PROXY[1])))
     self.sock.settimeout(0.05)