对于Python和XBee,我是一个菜鸟,所以感谢您的耐心等待。 我正在尝试构建一个XBee dest_addr_long(XBee的十六进制地址)但我一直收到错误 * ValueError:为'dest_addr_long'提供的数据不是8字节长* 我试过这个例子: 设备= { “CO3”: '\ X00 \ X13 \ XA2 \ X00 \ X40 \ X52 \ x8d \ x8a' } 这有效,但我不知道地址,直到设备出现在我的PAN上然后我得到地址并将其存储在数据库中并更改节点ID。
这是我的代码以及我如何尝试生成XBee地址
xbee_source_addr_long = xbee_packet['source_addr_long']
source_addr_long= ''.join(x.encode('hex') for x in xbee_source_addr_long)
xbee_source_addr_long_hex = (r"\x" + str(source_addr_long [0:2]) +
r"\x" + str(source_addr_long [2:4]) +
r"\x" + str(source_addr_long [4:6]) +
r"\x" + str(source_addr_long [6:8]) +
r"\x" + str(source_addr_long [8:10]) +
r"\x" + str(source_addr_long [10:12]) +
r"\x" + str(source_addr_long [12:14]) +
r"\x" + str(source_addr_long [14:16]))
这给了我一个正确格式的字符串,但len是32。
问题:如何获取source_addr_long并生成一个len为8的可读字符串,看起来像这样\ x00 \ x13 \ xa2 \ x00 \ x40 \ x52 \ x8d \ x8a
先谢谢...
答案 0 :(得分:0)
看一下Python的struct.pack()函数。它可以将您的值数组转换为打包的字节结构。
如果您要使用Python中的XBee模块,您可能需要尝试使用开源python-xbee库。
类似的东西:
struct.pack( "BBBBBBBB",
xbee_source_addr_long[0],
xbee_source_addr_long[1],
xbee_source_addr_long[2],
xbee_source_addr_long[3],
xbee_source_addr_long[4],
xbee_source_addr_long[5],
xbee_source_addr_long[6],
xbee_source_addr_long[7]);
请注意,我不是Python程序员,因此可能有一种更简单的方法来解决这个问题。
答案 1 :(得分:-1)
这篇文章可以解决您的问题。
假设您有以下情况。
source_addr = ['0x8f', '0x18']
source_addr_long = ['0x00', '0x13', '0xa2', '0x00', '0x40', '0xb5', '0xad', '0x6e']
# Coordinator transmit packet to any router .
# Decision can be taken at run time by coordinator.
# One to many nodes transmission is thus possible.
xbee1.tx
(
frame='0x1'
, dest_addr=bytearray( int(x,16) for x in source_addr)
, data='Hi'
, dest_addr_long= bytearray( int(x,16) for x in source_addr_long)
)
# It will Work . Go to very basic thing .
# string to int , int to hex , hex to int .
# hex(19) => '0x13'
# int('0x13',16) => 19
# x = '0x13'
# then int(x,16) will be 19