Я подозреваю, что проблема связана с тем, как я создаю пакет ответа на контрольный сигнал . Вот соответствующая часть моего кода:
Код: Выделить всё
def create_heartbeat_response(status_info):
start_bit = b"\x78\x78"
protocol_number = b"\x13" # Heartbeat response protocol
serial_number = status_info['serial_number'] # Use the serial number from status info
packet_length = b"\x05" # Fixed length for response
# Calculate CRC for the packet
error_check = get_crc16(packet_length + protocol_number + serial_number)
stop_bit = b"\x0D\x0A"
# Construct the full packet
return start_bit + packet_length + protocol_number + serial_number + error_check + stop_bit
Код: Выделить всё
def parse_concox_data(data, client_socket):
if data.startswith(b"\x78\x78"): # Check for start bits
protocol_number = data[3]
if protocol_number == 0x13: # Status information (Heartbeat)
logger.info("Heartbeat/Status message received")
status_info = parse_status_info(data)
return create_heartbeat_response(status_info)
return None
Он отправляет контрольное сообщение (статус), и после того, как я отвечаю, устройство отключается.
Устройство отправляет данные о местоположении, когда я не отвечаю на сообщение Heartbeat.
Мои предположения:
Я подозреваю, что что-то не так с тем, как структурируется ответ Heartbeat или с тем, как я вычисляю контрольную сумму CRC-16 для пакет.
Код: Выделить всё
crctab16 = [
0x0000,
0x1189,
0x2312,
0x329B,....rest of table ]
# Function to calculate CRC-ITU (as per the protocol)
def get_crc16(data):
fcs = 0xFFFF # initialization
for byte in data:
fcs = (fcs >> 8) ^ crctab16[(fcs ^ byte) & 0xFF]
return (~fcs & 0xFFFF).to_bytes(2, "big")
Вопрос:
Что может быть причиной устройства Concox V5 отключиться после того, как я отправлю ответ Heartbeat? Что-то не так с тем, как я создаю ответный пакет Heartbeat?
Я попытался создать пакет ответа Heartbeat на основе документации протокола, включая стартовый бит (0x78 0x78), номер протокола (0x13 для пульса) и серийный номер из информации о состоянии, за которым следует контрольная сумма CRC-16 и стоповый бит.
Я ожидал, что устройство получит ответ пульса, подтвердит его и поддержит соединение. Однако после отправки ответа пульса устройство продолжает отправлять данные в течение короткого периода времени, но затем отключается.
Вот ссылка на спецификацию, которую я использую: http://www .iconcox.in/images/tr02-protocol.pdf
Подробнее здесь: https://stackoverflow.com/questions/790 ... hon-tcp-se