|
Lines 1-42
Link Here
|
| 1 |
import operator |
|
|
| 2 |
import socket |
| 3 |
from time import strftime; |
| 4 |
|
| 5 |
def SipSocket(host='localhost', port=5300): |
| 6 |
so = socket.socket() |
| 7 |
so.connect((host, port)) |
| 8 |
return so |
| 9 |
|
| 10 |
def login(so, uname='scclient', passwd='clientpwd', locn='The basement', |
| 11 |
seqno=0): |
| 12 |
port = so.getpeername()[1] |
| 13 |
if port == 5300: |
| 14 |
resp = send(so, '9300CN%s|CO%s|CP%s|' % (uname, passwd, locn), seqno) |
| 15 |
print "Received", repr(resp) |
| 16 |
print "Verified: ", verify(resp) |
| 17 |
else: |
| 18 |
raise "Logging in is only support for the raw transport on port 5300" |
| 19 |
|
| 20 |
def send(so, msg, seqno=0): |
| 21 |
if seqno: |
| 22 |
msg += 'AY' + str(seqno)[0] + 'AZ' |
| 23 |
msg += ('%04X' % calculate_cksum(msg)) |
| 24 |
msg += '\r' |
| 25 |
print 'Sending', repr(msg) |
| 26 |
so.send(msg) |
| 27 |
resp = so.recv(1000) |
| 28 |
return resp, verify(resp) |
| 29 |
|
| 30 |
def calculate_cksum(msg): |
| 31 |
return (-reduce(operator.add, map(ord, msg)) & 0xFFFF) |
| 32 |
|
| 33 |
def sipdate(): |
| 34 |
return(strftime("%Y%m%d %H%M%S")) |
| 35 |
|
| 36 |
def verify(msg): |
| 37 |
if msg[-1] == '\r': msg = msg[:-2] |
| 38 |
if msg[-6:-4] == 'AZ': |
| 39 |
cksum = calculate_cksum(msg[:-4]) |
| 40 |
return (msg[-4:] == ('%04X' % cksum)) |
| 41 |
# If there's no checksum, then the message is ok |
| 42 |
return True |