Closed zhy2on closed 1 month ago
def get_layer_fields(layer):
layer_fields = []
for field in layer.__class__.fields_desc:
if isinstance(field, ConditionalField):
condition = field.condition.__func__
if condition(layer):
layer_fields.append(field.fld.name)
else:
layer_fields.append(field.name)
return layer_fields
def layer_to_dict(layer):
layer_dict = {}
layer_fields = get_layer_fields(layer)
for field_name in layer_fields:
field_value = getattr(layer, field_name)
if isinstance(field_value, bytes):
field_value = field_value.decode('utf-8', errors='ignore')
elif isinstance(field_value, int):
layer_dict[field_name] = field_value
else:
layer_dict[field_name] = str(field_value)
return layer_dict
def process_packet(packet):
if MQTT in packet:
layer = packet[MQTT]
layer_dict = layer_to_dict(layer)
packet_type = CONTROL_PACKET_TYPE.get(layer.type, 'Unknown')
if packet_type != 'Unknown':
packet_type_fields = get_layer_fields(MQTT(type=layer.type))
type_dict = {field: layer_dict.get(
field.lower(), None) for field in packet_type_fields}
layer_dict[packet_type.lower()] = type_dict
return layer_dict
elif CoAP in packet:
layer = packet[CoAP]
return layer_to_dict(layer)
else:
raise ValueError("Unsupported protocol layer")
이런식으로 나중에 리팩토링 하기. 일단 서버부터 제대로 구현하기
지금 PacketHandler의 process_packet에서 클라이언트에 보내줄 json data를 만들 때 필요한 딕셔너리를 scapy 패킷 객체에 해당하는 값이 있는지 없는지 일일이 판단한 다음에 key, value를 나눠서 지정해 줬음.
근데 불필요해 보임.... 그냥
해당 패킷의 필드 돌면서 필드 이름을 key로 하고 값을 value로 해주면 됐었음..... 수정 해보고 프로그램 돌렸을 때 오류 나지 않으면 바꾸면 될 것 같다......... 클래스도 아니고 그냥 함수 하나만 구현하면 될 듯.......