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()
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)