import struct
import socket
import numpy as np
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# doesn't even have to be reachable
s.connect(('10.255.255.255', 1))
IP = s.getsockname()[0]
except:
IP = '127.0.0.1'
finally:
s.close()
return IP
#bind_ip = get_ip()
print("\n\n[*] Current ip is %s" % (get_ip()))
bind_ip = ''
bind_port = 6502
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind((bind_ip,bind_port))
print("[*] Ready to receive UDP on %s:%d" % (bind_ip,bind_port))
while True:
data, address = server.recvfrom(1024)
print('[*] Received %s bytes from %s:' % (len(data), address))
arrLen = struct.unpack('>i', data[:4])[0]
print('[*] Received array of %d doubles:' % (arrLen,))
x = []
elt = struct.iter_unpack('>d', data[4:])
while True:
try:
x.append(next(elt)[0])
print(x[-1])
except StopIteration:
break
x = np.array(x)
y = x+1 # np.sin(x)
msg = data[:4]
for item in y:
msg += struct.pack('>d', item)
print(msg)
A = (address[0], 6503)
server.sendto(msg, A)
break
server.close()
print('[*] Server closed')
print('[*] Done')
我想记录下这个问题和解决方案,这样其他人就可以避免我在谷歌上浪费时间寻找解决方案。在
当LabVIEW展平数据时,在本例中是一组double,它只将它们作为一个合并字符串发送,每个double用8个字节表示。python将其解释为每个double 8个ASCII字符,显示为nonsense in your console。在
要返回传输的双精度数,您需要依次获取每个8字节的部分,并将ASCII字符转换为它们的ASCII代码,在Python中使用ord()。 这将给你一个8字节的十进制代码(例如4.8=
[64 19 51 51 51 51 51 51]
)事实证明,LabVIEW做了大多数事情,包括TCP/IP传输,Big-Endian。除非你在大端工作,否则你可能需要改变一下。例如,上面的例子将变成
[51 51 51 51 51 51 19 64]
。我将每个double放入一个列表中,因此能够使用list(reversed())
函数来更改endience。在然后你可以把它转换回双精度。python代码示例:
这对更有经验的程序员来说可能是显而易见的,但这让我困惑了好几天。我很抱歉使用stackoverflow作为平台,通过回答我自己的问题来分享这一点,但希望这篇文章能帮助下一个正在挣扎的人。在
编辑:注意如果您使用的是比Python2.7.5更早的版本,那么您可能会发现解包结构()将失败。使用上面的示例代码替换以下代码对我有效:
b = bytes(bytearray([51,51,51,51,51,51,19,64]))
LabVIEW扁平化数据格式的详细描述here。该文档没有显式描述双精度浮点(DBL类型)是如何表示的,但是稍微搜索一下发现了this,它澄清了它们存储在IEEE 754 format中。在
不过,以标准文本格式(如XML或JSON)发送数据可能更简单,也更适合将来使用,这两种格式都由LabVIEW中的内置函数和Python中的标准库模块支持。在
不使用LabVIEW扁平化数据与其他程序交换的另一个原因是,扁平化字符串不包括将其转换回原始数据类型所需的类型描述符—您需要知道数据是什么类型,以便对其进行解码。在
这个代码对我有用。UDP服务器接受扁平dbl数组x,返回x+1到端口6503。根据需要修改LabView UDP客户端。在
LabView UDP客户端:
相关问题 更多 >
编程相关推荐