|
|
|
@ -11,35 +11,34 @@ import scapy.contrib.modbus as mb
|
|
|
|
|
from triPacket import triPacket
|
|
|
|
|
|
|
|
|
|
def decode(pkt):
|
|
|
|
|
'''Insert the packet's `pkt` main informations into the `connec` database'''
|
|
|
|
|
if "ModbusADU" in pkt:
|
|
|
|
|
global miniL
|
|
|
|
|
modpkt = pkt["ModbusADU"]
|
|
|
|
|
typeCall = ""
|
|
|
|
|
type_call = ""
|
|
|
|
|
|
|
|
|
|
if "Multiple" in modpkt.payload.name:
|
|
|
|
|
typeCall += "m"
|
|
|
|
|
type_call += "m"
|
|
|
|
|
else:
|
|
|
|
|
typeCall += "s"
|
|
|
|
|
type_call += "s"
|
|
|
|
|
|
|
|
|
|
if "Coil" in modpkt.payload.name:
|
|
|
|
|
typeCall += "C"
|
|
|
|
|
type_call += "C"
|
|
|
|
|
else:
|
|
|
|
|
typeCall += "R"
|
|
|
|
|
miniL[0] = typeCall
|
|
|
|
|
type_call += "R"
|
|
|
|
|
miniL[0] = type_call
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if "Read" in modpkt.payload.name:
|
|
|
|
|
typeCall += "r"
|
|
|
|
|
type_call += "r"
|
|
|
|
|
if "Response" in modpkt.payload.name:
|
|
|
|
|
byteCount = modpkt.payload.getfieldval("byteCount")
|
|
|
|
|
byte_count = modpkt.payload.getfieldval("byteCount")
|
|
|
|
|
status = []
|
|
|
|
|
if "C" in typeCall:
|
|
|
|
|
Value = modpkt.payload.getfieldval("coilStatus")
|
|
|
|
|
for j in range(byteCount):
|
|
|
|
|
bi=str(bin(Value[j]))
|
|
|
|
|
bi=bi[2:]
|
|
|
|
|
bi=bi.rjust(8,'0')[::-1]
|
|
|
|
|
status.extend(k for k in [*bi])
|
|
|
|
|
if "C" in type_call:
|
|
|
|
|
value = modpkt.payload.getfieldval("coilStatus")
|
|
|
|
|
for j in range(byte_count):
|
|
|
|
|
val=str(bin(value[j]))[2:].rjust(8,'0')[::-1]
|
|
|
|
|
status.extend(k for k in [*val])
|
|
|
|
|
else:
|
|
|
|
|
status = modpkt.payload.getfieldval("registerVal")
|
|
|
|
|
for j in range(len(status)):
|
|
|
|
@ -47,21 +46,21 @@ def decode(pkt):
|
|
|
|
|
triPacket([miniL[0][1],miniL[2]+j,status[j]],connec)
|
|
|
|
|
miniL = [0,0,0]
|
|
|
|
|
else:
|
|
|
|
|
startAddr = modpkt.payload.getfieldval("startAddr")
|
|
|
|
|
miniL[2] = startAddr
|
|
|
|
|
addr = modpkt.payload.getfieldval("startAddr")
|
|
|
|
|
miniL[2] = addr
|
|
|
|
|
else:
|
|
|
|
|
typeCall += "w"
|
|
|
|
|
type_call += "w"
|
|
|
|
|
if "Response" in modpkt.payload.name:
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
if "m" in typeCall:
|
|
|
|
|
if "m" in type_call:
|
|
|
|
|
addr = modpkt.payload.getfieldval("startAddr")
|
|
|
|
|
#byteCount = modpkt.payload.getfieldval("quantityOutput")
|
|
|
|
|
outputValue = modpkt.payload.getfieldval("outputsValue")
|
|
|
|
|
#byte_count = modpkt.payload.getfieldval("quantityOutput")
|
|
|
|
|
output_value = modpkt.payload.getfieldval("outputsValue")
|
|
|
|
|
status = []
|
|
|
|
|
if "C" in typeCall:
|
|
|
|
|
for j in range(len(outputValue)):
|
|
|
|
|
val=str(bin(outputValue[j]))[2:].rjust(8,'0')[::-1]
|
|
|
|
|
if "C" in type_call:
|
|
|
|
|
for j in range(len(output_value)):
|
|
|
|
|
val=str(bin(output_value[j]))[2:].rjust(8,'0')[::-1]
|
|
|
|
|
status.extend(k for k in [*val])
|
|
|
|
|
|
|
|
|
|
for j in range(len(status)):
|
|
|
|
@ -69,17 +68,18 @@ def decode(pkt):
|
|
|
|
|
triPacket([miniL[0][1],addr+j,status[j]],connec)
|
|
|
|
|
#print(bigL)
|
|
|
|
|
else:
|
|
|
|
|
if "C" in typeCall:
|
|
|
|
|
if "C" in type_call:
|
|
|
|
|
addr = modpkt.payload.getfieldval("outputAddr")
|
|
|
|
|
outputValue = modpkt.payload.getfieldval("outputValue")
|
|
|
|
|
output_value = modpkt.payload.getfieldval("outputValue")
|
|
|
|
|
else:
|
|
|
|
|
addr = modpkt.payload.getfieldval("registerAddr")
|
|
|
|
|
outputValue = modpkt.payload.getfieldval("registerValue")
|
|
|
|
|
triPacket([miniL[0][1],addr,outputValue],connec)
|
|
|
|
|
#bigL.append([miniL[0],outputValue,addr])
|
|
|
|
|
output_value = modpkt.payload.getfieldval("registerValue")
|
|
|
|
|
triPacket([miniL[0][1],addr,output_value],connec)
|
|
|
|
|
#bigL.append([miniL[0],output_value,addr])
|
|
|
|
|
|
|
|
|
|
#print(bigL)
|
|
|
|
|
bigL = []
|
|
|
|
|
#bigL = []
|
|
|
|
|
|
|
|
|
|
print("In order for data sniffed to be stored inside the database, please register the following :")
|
|
|
|
|
DB_HOST = input('host of the database server : ')
|
|
|
|
|
if not DB_HOST:
|
|
|
|
@ -96,3 +96,4 @@ connec=[DB_HOST,DB_NAME,DB_USER,DB_PASSWORD]
|
|
|
|
|
|
|
|
|
|
miniL = [0,0,0]
|
|
|
|
|
scapy.sniff(iface="lo", prn=decode)
|
|
|
|
|
|
|
|
|
|