我正在尝试使用MSMQ向C#服务器发送NMEA消息。此NMEA消息(字符串)将进行base64编码,然后作为字节数组发送。
我遇到的问题是在MSMQ中我的字节数组显示为:
03 00 00 00 00 00 00 00 ........
3C 00 00 00 00 00 00 00 <.......
01 00 00 00 00 00 00 00 ........
03 00 00 00 00 00 00 00 ........
3F 00 00 00 00 00 00 00 ?.......
01 00 00 00 00 00 00 00 ........
03 00 00 00 00 00 00 00 ........
78 00 00 00 00 00 00 00 x.......
反对我正在寻找的东西:
3C 3F 78 6D 6C 20 76 65 <?xml ve
72 73 69 6F 6E 3D 22 31 rsion="1
2E 30 22 3F 3E 0D 0A 3C .0"?>..<
62 61 73 65 36 34 42 69 base64Bi
我的代码示例:
# base64 encode the message
b64_nmea = base64.b64encode(nmea)
# Adding xml prolog.. used by the server
b64_nmea = '<?xml version="1.0"?>..<base64Binary>' + b64_nmea + '==</base64Binary>'
# creates a byte array from b64_nmea
bytearray_nmea = bytearray(b64_nmea)
# Then to send the message:
qinfo = win32com.client.Dispatch("MSMQ.MSMQQueueInfo")
computer_name = os.getenv('COMPUTERNAME')
qinfo.FormatName = "direct=os:" + computer_name + "\\Private$\\test"
queue = qinfo.Open(2, 0)
msg = win32com.client.Dispatch("MSMQ.MSMQMessage")
msg.Label = "test"
msg.Body = bytearray_nmea
msg.Send(queue)
queue.Close()
我的问题是:这些空值来自哪里,是由字节数组创建中的错误引起的,还是我调度到MSMQ的方法不稳定?
我已经使用bytearray()
尝试了很多变体..上面的代码会回到我的一个极端&#34;极端&#34;尝试。任何见解都表示赞赏。
这个问题可以通过在对我的消息进行排队的exe上使用subprocess.Popen()
来解决,但是只使用Python的解决方案会很棒。
答案 0 :(得分:1)
撒上一些print语句来观察python正在做什么。
这些工作正常,
import base64
nmea="hello, world"
print len(nmea)
b64_nmea = base64.b64encode(nmea)
print len(b64_nmea)
print b64_nmea
b64_nmea = '<?xml version="1.0"?>..<base64Binary>' + b64_nmea + '==</base64Binary>'
print len(b64_nmea)
print b64_nmea
print bytearray(b64_nmea)
您的问题出在以下某处,
#send the message:
computer_name = os.getenv('COMPUTERNAME')
使用不同的MSMQ实例调用win32com.client.Dispatch两次。 msg初始化似乎很明智。 qinfo调用看起来很健全。您可能想检查语法是msg.Send(队列)(可能是queue.Send(msg)?)。
这些看似合理,
qinfo = win32com.client.Dispatch("MSMQ.MSMQQueueInfo")
msg = win32com.client.Dispatch("MSMQ.MSMQMessage")
这些线似乎很安全,
qinfo.FormatName = "direct=os:" + computer_name + "\\Private$\\test"
msg.Label = "test"
msg.Body = bytearray_nmea
我会仔细研究这些(第一),
queue = qinfo.Open(2, 0)
msg.Send(queue)
queue.Close()