0

我将其发送到服务器:

import requests 
response = requests.get('http://SERVER-IP/get.cgi?req=zones')
print(response.content)

我得到一串这样的数据:

b'CS\x01\x00\x00\x00\x01\x00MainAuditorium\x00\x00\x00\x00\x01\x00\x03\x00\x00\x00\x01\x00\x00\x00'

在网站上,它列出了可变长度结构

typedef struct ZonesData {
    uint16_t            signature;              // Signature = 'CS'
    int16_t             version;                // Version = 0x0001 (or negative error code)
    uint8_t             reserved[2];            // -
    uint16_t            zoneCount;              // Number of zones
    ZoneRecord          zones[];                // Variable array of zone records
} ZonesData;

#define STACK_NAME_BUF_SIZE     16

typedef struct ZoneRecord {
    char                name[STACK_NAME_BUF_SIZE];  // Name of zone
    uint8_t             playbackIndex;          // Playback index
    uint8_t             joinGroup;              // Join group
    uint16_t            count;                  // Number of PresetID/Status pairs
    uint32_t            data[];                 // Array of PresetID/Status pairs (32 pairs max)
} ZoneRecord;
  1. 如何让 python 以人类可读的形式放置代码?

  2. 可以使用返回的整数来更新 UI 上的按钮吗?我假设我可以,我只是不确定我是否会引用整数或整数的人类可读性。

附加项目上下文:我正在尝试将 Qsys 和 Cueserver 集成在一起,以便在从 Cueserver 墙控台触发新预设时更新 Qsys 触摸板按钮。

4

1 回答 1

0

我的姐夫和我在这个周末做了一些工作,他想出了这个……我仍在研究他所做的事情,以便我可以修改它以获得更多回应。您可以要求服务器返回一堆不同的字符串(全部采用相同的原始格式)。看起来我必须为每个人编写一个单独的响应......

import requests
import struct
from collections import namedtuple

PresetStatusPair = namedtuple('PresetStatusPair', 'preset status')

class ZoneData:
def __init__(self, data, offset):
    self.size = 20

   self.name, self.playback_index, self.join_group, count = struct.unpack_from("16sBBH", data, offset)
    self.name = str(self.name, 'ascii')
    self.data = []
    for i in range(count):
        unpacked = struct.unpack_from("II", data, offset + self.size)
        self.data.append(PresetStatusPair._make(unpacked))
        self.size += 8


class ZonesData:
def __init__(self, data):
    if len(data) == 4:
        raise Exception("CS internal error")

    self.signature, self.version, zone_count_unused = struct.unpack_from("2sHxxH", data)
    self.signature = str(self.signature, 'ascii')
    self.parse_zone_records(data)

def parse_zone_records(self, data):
    self.zone_records = []
    offset = 8
    while offset < len(data):
        zone_data = ZoneData(data, offset)
        offset += zone_data.size
        self.zone_records.append(zone_data)


zones_data = ZonesData(data)
print(f"signature: {zones_data.signature}")
print(f"version  : {zones_data.version}")
print(f"records  :")

for record in zones_data.zone_records:
print(f"    name          : {record.name}")
print(f"    playback_index: {record.playback_index}")
print(f"    join_group    : {record.join_group}")
print(f"    data          : {record.data}")
于 2020-07-21T14:21:09.683 回答