Впервые в Fifo в Linux, чтение с Python приводит к тарабарщине? (двоичный)Linux

Ответить
Anonymous
 Впервые в Fifo в Linux, чтение с Python приводит к тарабарщине? (двоичный)

Сообщение Anonymous »

Я пытаюсь получить данные с датчиков, чтобы передать их в базу данных influxdb. У нас есть очень старые датчики, записывающие это на сервер через FIFO на этом сервере. Я знаю, что могу это прочитать (сделал быструю программу):
# reader.py
import os

FIFO = '/var/axis/sensor1'

FIFO_PATH = FIFO

fifo_path = FIFO
print("about to "+fifo_path)
# Ensure the FIFO exists
if not os.path.exists(fifo_path):
raise IOError("The FIFO '{0}' does not exist. Please create it using 'mkfifo {0}'.".format(fifo_path))

print("Opening FIFO {0} for reading...".format(fifo_path))
fifo_fd = os.open(fifo_path, os.O_RDONLY)
fifo_file = os.fdopen(fifo_fd)

try:
while True:
line = fifo_file.read(1)
if not line:
break

# Print the line to the screen
print(line),

finally:
fifo_file.close()
print("FIFO Closed.")

Итак, когда я запускаю это и датчик обрабатывает данные, я вижу что-то вроде этого, прокручивая экран:
@eN?>??Y?n??A?)??[Z@?c
@eN?>??\?n??A?)??[Z@?(
@eN?>`?n??A?)??[Z@?? @eN?>33c?n??A?)??[Z@?? @eN?>fff?n??A?)??[Z@?? @eN?>??i?n??A?)??[Z@? @eN?>??l?n??A?)??[Z@? @eN?>p?n??A?)??[Z@? @eN?>33s?n??A?)??[Z@? @eN?>ffv?n??A?)??[Z@? @eN?>??y?n??A?)??[Z@? @eN?>??|?n??A?)??[Z@? @eN?>??n??A?)??[Z@? @eN?>33??n??A?)??[Z@? @eN?>ff??n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>?̌?n??A?)??[Z@? @eN?>??n??A?)??[Z@? @eN?>33??n??A?)??[Z@? @eN?>ff??n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>?̜?n??A?)??[Z@? @eN?>??n??A?)??[Z@? @eN?>33??n??A?)??[Z@? @eN?>ff??n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>?̬?n??A?)??[Z@? @eN?>??n??A?)??[Z@? @eN?>33??n??A?)??[Z@? @eN?>ff??n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>?̼?n??A?)??[Z@? @eN?>??n??A?)??[Z@? @eN?>33??n??A?)??[Z@? @eN?>ff??n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>??n??A?)??[Z@? @eN?>33??n??A?)??[Z@? @eN?>ff??n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>??n??A?)??[Z@? @eN?>33??n??A?)??[Z@@eN?>ff??n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>??n??A?)??[Z@? @eN?>33??n??A?)??[Z@? @eN?>ff??n??A?)??[Z@? @eN?>????n??A?)??[Z@? @eN?>????n??A?)??[Z@P? @???z?>?n??A?)??[Z@?~
@???z?>33?n??A?)??[Z@?_
@???z?>ff?n??A?)??[Z@??

Очевидно, что строка чтения — неправильная команда. Я думаю, эти данные двоичные? Всегда ли fifo двоичны? Если это двоичный файл, это означает, что мне нужно выяснить, как эта старая система/датчик записывает этот файл Fifo, чтобы знать, как его затем загрузить и проанализировать?
Я хочу знать, что я читаю поэтому я знаю, как упаковать его как json для отправки в influxdb.
РЕДАКТИРОВАТЬ: Я считаю, что нашел некоторый код c примера чтения структуры данных, со структурой я могу это прочитать в python?
C Структура данных:
typedef struct axis_data {
double now;
double p;
double v;
double current;
double error;
} AXIS_DATA;

fifoList.fd = open("/var/axis/sensor1", O_RDONLY);
AXIS_DATA data;
rb=read(this->fifoList.fd, &data, sizeof(data));

data.p, data.v, data.current, data.error

Конечно, я перефразировал C, и мой C заржавел, но я считаю, что хочу сделать то же самое, создав эквивалент структуры в Python и зачитав размер этой структуры в саму структуру. Каким-то образом, на Python, моя попытка сделать это ниже (не могу поверить, что я никогда не делал двоичные файлы в Python)
# reader.py
import os
from ctypes import *

class AXIS_DATA(Structure):
_fields_ = [('now', c_double),
('p', c_double),
('v', c_double),
('current', c_double),
('error', c_double)]

FIFO = '/var/axis/sensor1'

#FIFO = 'mytest'
FIFO_PATH = FIFO

fifo_path = FIFO
print("about to "+fifo_path)
# Ensure the FIFO exists
if not os.path.exists(fifo_path):
raise IOError("The FIFO '{0}' does not exist. Please create it using 'mkfifo {0}'.".format(fifo_path))

print("Opening FIFO {0} for reading...".format(fifo_path))
fifo_fd = os.open(fifo_path, os.O_RDONLY)
#fifo_file = os.fdopen(fifo_fd)
fifo_file = open(fifo_path)

try:
while True:
result = []
dat = AXIS_DATA()
# this just froze
while fifo_file.readinto(dat) == sizeof(dat):
result.append((dat.now, dat.p, dat.v, dat.current, dat.error))
if not line:
break

# Print the line to the screen
print(result),

finally:
fifo_file.close()
print("FIFO Closed.")


Подробнее здесь: https://stackoverflow.com/questions/789 ... ish-binary
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»