如何解决通用工业协议,Python脚本失败
上下文-我一直在使用scapy作为通用格式的通用工业协议的python自动化脚本,以这种格式创建数据包。
在python 3.4环境中运行脚本没有任何问题,但是当尝试迁移到新环境时,基本上在使用python 3.6稍稍升级的环境中运行相同的脚本,我会看到以下错误。
File "/users/alpeck/pyats3.6/lib/python3.6/site-packages/plc.py",line 65,in __init__
self.sock.send( bytes(sessionpkt,'utf-8'))
此错误指出了一些脚本,但是我缩小了范围以进一步阐明该问题。
class PLCClient(object):
"""Handle all the state of an Ethernet/IP session with a PLC"""
def __init__(self,plc_addr,plc_port=44818):
if not NO_NETWORK:
try:
self.sock = socket.create_connection((plc_addr,plc_port))
print('Printing self sock') --> Printing self sock
print(self.sock) --> <socket.socket fd=17,family=AddressFamily.AF_INET,type=SocketKind.SOCK_STREAM,proto=6,laddr=('64.101.134.34',15065),raddr=('10.89.157.229',44818)>
except socket.error as exc:
logger.warn("socket error: %s",exc)
logger.warn("Continuing without sending anything")
self.sock = None
else:
self.sock = None
self.session_id = 0
self.enip_connid = 0
self.sequence = 1
# Open an Ethernet/IP session
sessionpkt = ENIP_TCP() / ENIP_RegisterSession()
print('Printing session packet') --> Printing session packet
print(sessionpkt) --> b'e\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00'
if self.sock is not None:
self.sock.send( bytes(sessionpkt,'utf-8'))
reply_pkt = self.recv_enippkt()
self.session_id = reply_pkt.session
-此追溯指向下面的plc.py块-
class ENIP_RegisterSession(scapy_all.Packet):
name = "ENIP_RegisterSession"
fields_desc = [
scapy_all.LEShortField("protocol_version",1),scapy_all.LEShortField("options",0),]
class ENIP_TCP(scapy_all.Packet):
"""Ethernet/IP packet over TCP"""
name = "ENIP_TCP"
fields_desc = [
scapy_all.LEShortEnumField("command_id",None,{
0x0004: "ListServices",0x0063: "ListIdentity",0x0064: "ListInterfaces",0x0065: "RegisterSession",0x0066: "UnregisterSession",0x006f: "SendRRData",# Send Request/Reply data
0x0070: "SendUnitData",}),scapy_all.LEShortField("length",None),scapy_all.LEIntField("session",scapy_all.LEIntEnumField("status",{0: "success"}),scapy_all.LELongField("sender_context",scapy_all.LEIntField("options",]
问题在上方突出显示,显示的会话数据包中没有数据或数据损坏。
sessionpkt = ENIP_TCP()/ ENIP_RegisterSession()
会话数据包在下面显示的另一个目录中创建。
{{1}}
如果还有其他方法可以解决此错误,我可以提供更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。