2

我有一个传感器系统。传感器从我那里接收命令,做一些事情,然后向我发送响应。

响应是这样的:

seq. number |   net_id  |   opcode_group |  opcode | payloadlength    |   val

我有这些值由空格字符分隔。

现在我想取最后一个名为val. 在这一部分中,我有所有我想知道的信息来详细说明传感器的响应。

例如,对于想知道传感器的 IEEE MAC 地址的命令,我有以下响应:

回复

在这种情况下,val是响应中的所有字段Length。没有分离,但我有一种字符串。

我所要做的就是拆分这个数组/数字字符串,只知道每个字段的长度。例如。状态为 1 个字节,MAC 地址为 8 个字节,以此类推……

我的代码是这样的:

if response.error:
        ret['error'] = 'Error while retrieving unregistered sensors'
    else:
        for line in response.body.split("\n"):
            if line != "": 
                value = int(line.split(" ")[6])

    ret['response'] = value
    self.write(tornado.escape.json_encode(ret))
    self.finish()               

    if command == 'IDENTIFY':
        status = value.split(" ")[0]
        IEEEAddrRemoteDev = value.split(" ")[1]
        NWKAddrRemoteDev = value.split(" ")[2]
        NumOfAssociatedDevice = value.split(" ")[3]
        StartIndex = value.split(" ")[4]
        ListOfShortAddress = value.split(" ")[5]
        if status == 0x00:
            ret['success'] = "The %s command has been succesfully sent! \
            IEEE address: %s" % % (command.upper(), IEEEAddrRemoteDev)
            self.write(tornado.escape.json_encode(ret))
        elif status == 0x80:
            ret['success'] = "Invalid Request Type"
            self.write(tornado.escape.json_encode(ret))
        elif status == 0x81:
            ret['success'] = "Device Not Found"
            self.write(tornado.escape.json_encode(ret))

在第一部分中,我从整个响应中获取第 6 个值并将其放入变量中value。在此之后,我想在每个组件中拆分这个变量。

例如。这个status = value.split(" ")[0]我要怎么分????

非常感谢你的帮助!

4

2 回答 2

0

该字段的确切格式是什么val(即value代码中的内容)?它是一个字符串吗?一个字节序列?

如果它是一个字符串,你可以使用:

   status = value[0]
   IEEEAddrRemoteDev = value[1:8]
   NWKAddrRemoteDev = value[9:2]
   NumOfAssociatedDevice = value[11:1]
   StartIndex = value[12:1]
   ListOfShortAddress = value[13:2*NumOfAssociatedDevice]

如果它是一个字节序列,那么您可以使用struct.unpack()-see here

于 2013-01-28T17:25:36.777 回答
0

问题是您将其视为 Python 字符串,但它只是一堆位。

您需要使用struct.unpack来拆分这些。

于 2013-01-28T17:47:10.570 回答