from scapy.all import *alarm_map= {"211": "未系安全带", "205": "疲劳驾驶", "206": "疲劳驾驶", "208": "抽烟", "209": "出现异常"}defscan(target, port):
has_no_connect=TruewhileTrue:#根据接口进行监听报文
#接口获取由 IFACES 决定
try:#sniff开始获取报文,iface是接口,filter可以选择过滤报文类型, count为一次性获取多少个pkt
pkt = sniff(iface=IFACES.dev_from_index(12), filter="udp", count=1)#每个pkt格式类型于YAML,如果没有IP信息则代表这个包不完整
if pkt[0][IP].src == "192.168.43.1":ifhas_no_connect:#展示建立连接的第一个UDP包
pkt[0].show()if Raw inpkt[0]:
has_no_connect=False#load的值为bytes类型
body =pkt[0][Raw].loadif b'alarm":2' inbody:
result=json.loads(body.decode())if str(result.get('dms').get('alarm')) inalarm_map.keys():
now_time= datetime.datetime.now().strftime('%Y%m%d%H%M%S')
message={"event_name": alarm_map[str(result.get('dms').get('alarm'))],"event_time": now_time,
}print(message)else:print(result)exceptException as e:print(pkt[0])continue
"""调用show()可以展示数据包,抓到第一个数据包格式如下:
###[ Ethernet ]###
dst = 20:0d:b0:17:cf:d4
src = 02:08:22:b2:bb:fb
type = IPv4
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 208
id = 19582
flags = DF
frag = 0
ttl = 64
proto = udp
chksum = 0x163a
src = 192.168.43.1
dst = 192.168.43.19
\options \
###[ UDP ]###
sport = 23456
dport = 62472
len = 188
chksum = 0x202f
###[ Raw ]###
load = '{"code":3,"dms":{"alarm":0,"num":1,"id":0,"eye":0,"p":15.220612,"y":-29.808479,"r":6.351517,"fr":0.493671,"fmi":0,"fmon":0,"fx":0.389583,"fy":0.201852,"fw":0.192708,"fh":0.457407}}'"""