python 处理传输层的报文 TCP/UDP
from scapy.all import * alarm_map = {"211": "未系安全带", "205": "疲劳驾驶", "206": "疲劳驾驶", "208": "抽烟", "209": "出现异常"} def scan(target, port): has_no_connect = True while True: # 根据接口进行监听报文 # 接口获取由 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": if has_no_connect: # 展示建立连接的第一个UDP包 pkt[0].show() if Raw in pkt[0]: has_no_connect = False # load的值为bytes类型 body = pkt[0][Raw].load if b'alarm":2' in body: result = json.loads(body.decode()) if str(result.get('dms').get('alarm')) in alarm_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) except Exception 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}}' """