2016-04-23 8 views
0

次のコードは、組み込みデバイスのModbusインターフェイスをシミュレートするためのコードです。残念なことに、古いPython(2.4.3)があります。このコードは2.7で動作しますが、2.4.3では動作しません。これは、使用しているPythonのバージョンがstruct.pack_intoをサポートしていないため、struct.packのみをサポートしているためです。これを修正する方法についていくつかアドバイスを受けることができますか?私は、おそらく文字列を使用し、バイトバッファに変換する必要があると思う。これはPython以外のコードと話すので、pickleは使用できません。サイズ計算のビットでPython 2.4.3でPack_intoの代わりにPackを使用

import socket 
import sys 
import array 
import struct 

def hexdump(src, length=16): 
    FILTER = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)]) 
    lines = [] 
    for c in xrange(0, len(src), length): 
     chars = src[c:c+length] 
     hex = ' '.join(["%02x" % ord(x) for x in chars]) 
     printable = ''.join(["%s" % ((ord(x) <= 127 and FILTER[ord(x)]) or '.') for x in chars]) 
     lines.append("%04x %-*s %s\n" % (c, length*3, hex, printable)) 
    return ''.join(lines) 

HOST = '192.168.1.187' 
PORT = 502 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
s.bind((HOST,PORT)) 
s.listen(1) 
conn, addr = s.accept() 
data = [] 
datatran = array.array('B', '\x00' * 14) 
data = conn.recv(1024) 
print 'Connect by', addr 
while (data): 
    sys.stdout.write(hexdump(data)) 
    TransID , ProtoColID, PacketLength, UnitID, FC, StartAddress, RegisterCount = struct.unpack_from(">hhhBBhh", data) 
    print TransID, ProtoColID, PacketLength, UnitID 
    print FC, StartAddress, RegisterCount 
    struct.pack_into(">hhhBBBh", datatran, 0, TransID , ProtoColID, PacketLength+2, UnitID, FC, 2, 51) 
    conn.sendall(datatran) 
    data = conn.recv(1024) 

conn.close() 
s.close() 

おかげ

答えて

0

ではなくpackunpackを使用することが可能でなければなりません:

import socket 
import sys 
import array 
import struct 

def hexdump(src, length=16): 
    FILTER = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)]) 
    lines = [] 
    for c in xrange(0, len(src), length): 
     chars = src[c:c+length] 
     hex = ' '.join(["%02x" % ord(x) for x in chars]) 
     printable = ''.join(["%s" % ((ord(x) <= 127 and FILTER[ord(x)]) or '.') for x in chars]) 
     lines.append("%04x %-*s %s\n" % (c, length*3, hex, printable)) 
    return ''.join(lines) 

HOST = '192.168.1.187' 
PORT = 502 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
s.bind((HOST,PORT)) 
s.listen(1) 
conn, addr = s.accept() 
datatranStruct = '>hhhBBBh' 
datatranStructSize = struct.calcsize(datatranStruct) 
datatranFormat = '%s%dx' % (datatranStruct, 14 - datatranStructSize) 
recvStruct = '>hhhBBhh' 
recvStructSize = struct.calcsize(recvStruct) 
data = conn.recv(1024) 
print 'Connect by', addr 
while (data): 
    sys.stdout.write(hexdump(data)) 
    recvFormat = '%s%dx' % (recvStruct, len(data) - recvStructSize) 
    TransID , ProtoColID, PacketLength, UnitID, FC, StartAddress, RegisterCount = struct.unpack(recvFormat, data) 
    print TransID, ProtoColID, PacketLength, UnitID 
    print FC, StartAddress, RegisterCount 
    datatran = struct.pack(datatranFormat, TransID , ProtoColID, PacketLength+2, UnitID, FC, 2, 51) 
    conn.sendall(datatran) 
    data = conn.recv(1024) 

conn.close() 
s.close() 
+0

はい、これは非常にうまく機能している!!!!!おかげでレックス –

関連する問題