注:我沒有真正回答你的問題,而是提供了一個途徑爲不同的方式解決問題。
我幾年前有一個非常類似的問題。我們正在構建一個直接使用802.15.4 MAC層的產品,並且我們需要一個工具來剖析我們的定製有效載荷。
原來我用ccsniffpiper(和工具,我建它),並在LUA我加載到Wireshark的解剖寫道。然而,我發現這個過程很慢且乏味,原因很多(做LUA解析器非常棘手,將它們加載到wireshark中並不總是直截了當,而且使用Python的速度更快)。
相反,我公司開發的「命令行」工具,纏pyCCSniffer和蟒蛇提供我的自定義解剖!
我已經快速閱讀了pyCCSniffer的代碼,現在認爲它有點混亂......但我認爲它可能對您的問題非常方便。因此,我會解釋我們如何更詳細地使用它。
我們有一個自定義的「PacketHandler」我們公司的種類(例如「ACMEPacketHandler」),類似於pyCCSniffer.py文件中定義的一個。而我們在腳本的「主」方法進行註冊的:
def main():
packetHandler = ACMEPacketHandler()
packetHandler.enable()
# Create a list of handlers to dispatch to
# NB: handlers must have a "handleSniffedPacket" method
handlers = [packetHandler]
def handlerDispatcher(timestamp, macPDU):
if len(macPDU) > 0:
packet = SniffedPacket(macPDU, timestamp)
for handler in handlers:
handler.handleSniffedPacket(packet)
snifferDev = CC2531EMK(handlerDispatcher, args.channel)
我們ACMEPacketHandler的「handleSniffedPacket」的方法
然後,我們有這樣的事情:
class ACMEPacketHandler:
...
def handleSniffedPacket(self, sniffedPacket):
...check errors etc...
# parse as 802.15.4 frame
frame = ieee.IEEE15dot4FrameFactory.parse(sniffedPacket)
# parse contents of frames to our custom representation
our_frame = ACMEFrameFactory.parse(frame)
print(our_frame)
然後在「ACMEFrameFactory '我們有邏輯來解析我們從特定802.15所需的信息。4幀:
class ACMEFrameFactory(object):
@staticmethod
def parse(ieee15dot4Frame):
if noe ieee15dot4Frame.fcf.frametype is ieee.FrameType.DATA:
return ieee15dot4Frame # we only use payloads in DATA frames
byteStream = ieee15dot4Frame.msdu
offset = 0
fmt = "<B"
(packet_type,) = ieee.checkAndUnpack(fmt, byteStream, offset, (0, 0))
if packet_type == 1:
return WilyCoyotePlotFrame(...)
if packet_type == 2:
return RoadRunnerMeepMeepFrame(...)
# unknown packet_type
return ieee15dot4Frame
我希望有幫助(這是我的兩美分無論如何)。