Skip to content

Commit

Permalink
Now parsing messages from the node!
Browse files Browse the repository at this point in the history
Inserting current pin states into the database. Very exciting.
Also reading out card numbers is working. Next step is decoding them.
  • Loading branch information
tjhowse committed Dec 4, 2012
1 parent f3d8aec commit 618703f
Showing 1 changed file with 105 additions and 33 deletions.
138 changes: 105 additions & 33 deletions threaded_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import socket
import threading
import sqlite3

import array
queue = []

def toHex(s):
Expand All @@ -33,23 +33,17 @@ def toHex(s):
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

def handle(self):
mysqldb = sqlite3.connect('secnode.db')
#global sqldb
self.request.settimeout(5)
data = self.request.recv(16)
while data != '':
if (sys.getsizeof(data) == 37):
obj2 = AES.new('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', AES.MODE_ECB)
raw = obj2.decrypt(''.join(data))

# TODO parse message, update database with statuses from node
#print toHex(decrypted)
#for c in message:
# c = c+0.00
# print c.hex()
obj2 = AES.new(get_cryptokey(mysqldb, self.client_address[0]), AES.MODE_ECB)
decrypted = list(obj2.decrypt(''.join(data)))

if check_checksum(raw):

decrypted = list(raw)
#print "In: "
if check_checksum(decrypted):

print toHex(decrypted)
'''decrypted[0] = '\x00'
decrypted[1] = '\x63'
Expand All @@ -69,12 +63,12 @@ def handle(self):
decrypted[15] = '\x85'
print "Out: "
print toHex(decrypted)'''
#parse_message(decrypted)
decrypted = "".join(decrypted)
append_checksum(decrypted)
parse_message(mysqldb, self.client_address[0],decrypted)

#bytearray(raw)[5] = 0xBB
decrypted[5] = '\xF0'
# TODO Read from msgqueue and send off a message relevant to this node

decrypted = append_checksum(decrypted)
self.request.sendall(obj2.encrypt(decrypted))

else:
Expand All @@ -88,19 +82,73 @@ def handle(self):
#self.request.sendall(response)


def parse_message(message):
for i in range(2,4):
#print toHex(message[i])
print "High: ",get_high(bytearray(message[i]))
print "Low : ",get_low(bytearray(message[i]))
def parse_message(mysqldb, ip,message):
nodeID = get_nodeID(mysqldb,ip)
i = 1
while True:
msg_type = get_high(message[i])
msg_size = get_low(message[i])
if ((msg_type == 0) and (msg_size == 0)) or i >= 13:
break
if msg_type == 0:
# Analogue status inputstate (nodeid integer, pin integer, state integer, raw integer )')
pin_num = get_high(message[i+1])
pin_state = get_low(message[i+1])
mysqldb.execute('UPDATE inputstate SET state=? WHERE nodeid=? AND pin=?', (pin_state,nodeID,pin_num))
elif msg_type == 1:
# Analogue raw value
pin_num = get_high(message[i+1])
raw_val = (get_low(message[i+1])<<8)&message[i+2]
mysqldb.execute('UPDATE inputstate SET raw=? WHERE nodeid=? AND pin=?', (raw_val,nodeID,pin_num))
elif msg_type == 2:
# Digital value
pin_num = get_high(message[i+1])
pin_state = get_low(message[i+1])
mysqldb.execute('UPDATE outputstate SET state=? WHERE nodeid=? AND pin=?', (pin_state,nodeID,pin_num))
elif msg_type == 3:
# Digital value
card_number = message[i+1:msg_size+2]
print "Card: ",toHex(card_number)
#mysqldb.execute('UPDATE outputstate SET state=? WHERE nodeid=? AND pin=?', (pin_state,nodeID,pin_num))

i = i + msg_size + 1
mysqldb.commit()
c = mysqldb.cursor()
c.execute('SELECT * FROM inputstate WHERE nodeid=1')
value = c.fetchone()
while value:
print value
value = c.fetchone()
c.execute('SELECT * FROM outputstate WHERE nodeid=1')
value = c.fetchone()
while value:
print value
value = c.fetchone()

def get_nodeID(mysqldb, ip):
c = mysqldb.cursor()
c.execute('SELECT nodeid FROM nodes WHERE ip=?',(ip,))
result = c.fetchone()
if result != None:
return result[0]
else:
return 0

def get_cryptokey(mysqldb, ip):
c = mysqldb.cursor()
c.execute('SELECT cryptokey FROM nodes WHERE ip=?',(ip,))
result = c.fetchone()
if result != None:
return result[0]
else:
return 0


def get_high(byte):
print type(byte)
return byte>>4

def get_high(byte):
return bytearray(byte)[0]>>4

def get_low(byte):
return byte[0]&0x0F
return bytearray(byte)[0]&0x0F

def check_checksum(message):
parity = 0
Expand All @@ -117,23 +165,47 @@ def append_checksum(message):
for byte in message:
parity = parity ^ byte
message.append(parity)
return message
return array.array('B',message).tostring()

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass


def init_sqldb(db):
db.execute('CREATE TABLE IF NOT EXISTS nodes (nodeid real, tag text, description text, cryptkey text, ip text, status text, zone text)')
db.execute('CREATE TABLE IF NOT EXISTS msgqueue (msgid INTEGER PRIMARY KEY, nodeid real, message text)')
db.execute('CREATE TABLE IF NOT EXISTS nodestatus (nodeid real, var real, state real)')
db.execute('CREATE TABLE IF NOT EXISTS pinstate (nodeid real, pin real, state real, duration real)')

db.execute('INSERT INTO nodes VALUES (1, "TEST", "TEST NODE", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "192.168.1.177", "FINE, I GUESS.", "OUTSIDE")')
db.execute('DROP TABLE IF EXISTS nodes')
db.execute('DROP TABLE IF EXISTS msgqueue')
db.execute('DROP TABLE IF EXISTS nodestatus')
db.execute('DROP TABLE IF EXISTS inputstate')
db.execute('DROP TABLE IF EXISTS outputstate')
db.commit()

db.execute('CREATE TABLE IF NOT EXISTS nodes (nodeid INTEGER PRIMARY KEY, tag text, description text, cryptokey text, ip text, status text, zone text)')
db.execute('CREATE TABLE IF NOT EXISTS msgqueue (msgid integer, nodeid integer, message text)')
db.execute('CREATE TABLE IF NOT EXISTS nodestatus (nodeid INTEGER PRIMARY KEY, var integer, state integer)')
db.execute('CREATE TABLE IF NOT EXISTS inputstate (nodeid integer, pin integer, state integer, raw integer )')
db.execute('CREATE TABLE IF NOT EXISTS outputstate (nodeid integer, pin integer, state integer, duration integer)')

#db.execute('INSERT INTO nodes VALUES (1, "TEST", "TEST NODE", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "192.168.1.177", "FINE, I GUESS.", "OUTSIDE")')
setup_new_node(db)

db.commit()
# TODO Load a nodes list from a CSV file, populate the nodes DB.

def setup_new_node(db):
db.execute('INSERT INTO nodes VALUES (1, "TEST", "TEST NODE", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "192.168.1.177", "FINE, I GUESS.", "OUTSIDE")')
db.execute('INSERT INTO inputstate VALUES (1, 0, 2, 0)')
db.execute('INSERT INTO inputstate VALUES (1, 1, 2, 0)')
db.execute('INSERT INTO inputstate VALUES (1, 2, 2, 0)')
db.execute('INSERT INTO inputstate VALUES (1, 3, 2, 0)')
db.execute('INSERT INTO inputstate VALUES (1, 4, 2, 0)')

db.execute('INSERT INTO outputstate VALUES (1, 0, 0, 0)')
db.execute('INSERT INTO outputstate VALUES (1, 1, 0, 0)')
db.execute('INSERT INTO outputstate VALUES (1, 2, 0, 0)')
db.execute('INSERT INTO outputstate VALUES (1, 3, 0, 0)')
db.execute('INSERT INTO outputstate VALUES (1, 4, 0, 0)')

def enqueue_message(node_id, message):
global sqldb
t = (node_id, message)
Expand Down

0 comments on commit 618703f

Please sign in to comment.