2

我正在尝试构建一个 XBee dest_addr_long(XBee 的十六进制地址),但我不断收到错误消息

ValueError: The data provided for 'dest_addr_long' was not 8 bytes long

我试过这个例子:

device={
         "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

4

2 回答 2

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 程序员,因此可能有更简单的方法来实现这一点。

于 2013-09-03T05:19:58.753 回答
-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
于 2015-03-08T08:55:58.880 回答