Сообщение MQTT из файла csv

#python #csv #mqtt #iot

#python #csv #mqtt #iot

Вопрос:

У меня есть csv-файл, и мне нужно отправить этот файл в виде сообщения MQTT, но мне нужно, чтобы он отправлялся только одной строкой с перерывом в несколько секунд, а затем следующей строкой и снова перерывом в несколько секунд. Это что-то вроде моделирования датчика, но с данными в файле csv. Я пытался решить это несколькими различными способами, но ничего не получалось. Я пишу на Python. Спасибо вам, ребята, за любую помощь. Код здесь — моя последняя попытка, и после запуска функции MQTT_publish() я получаю сообщения с перерывом в 5 секунд, но в каждом сообщении содержится целый файл, а не только одна строка. Я действительно не знаю, что с этим делать.

 def MQTT_publish(broker, file, topic):
  client = mqtt.Client()
  print("Connecting to broker", broker)
  client.connect(broker)
  client.loop_start()
  print("Publishing...")

  client.loop_start()
  with open(file, 'r') as read_obj:
      data = reader(read_obj)
      for row in data:
          client.publish(f"{topic}", str(row))
          time.sleep(5)
  client.loop_stop()

def on_message(client, userdata, message):
  print(str(message.payload.decode("utf-8")))


def MQTT_subscribe(broker, topic):
  client = mqtt.Client()
  print("Connecting to broker", broker)
  client.connect(broker)

  print(f"Subscribing {topic}")
  client.subscribe(f"{topic}")
  client.on_message = on_message
  client.loop_forever()

broker = "mqtt.eclipse.org"
 

Комментарии:

1. Не могли бы вы предоставить образец своего кода, чтобы показать, что вы пробовали и что используете в настоящее время?

2. Я добавил свой код в вопрос. Это последняя попытка, которую я сделал.

3. Откуда broker берется и какую ошибку вы получаете?

4. Может быть, ваша time.sleep(10) инструкция должна быть в цикле по строкам?

5. @Frodon Я запустил time.sleep(10) в цикл, и, к сожалению, это ничего не изменило:(

Ответ №1:

Разве вы не должны использовать readlines()??

 myfile = open(file, 'r')
Lines = myfile.readline()
for line in Lines:
  client.publish(f"{topic}", str(line.strip()))
  time.sleep(5)
 

Предполагается, что данные в файле представлены в формате ASCII с переводом строки.

Комментарии:

1. Он по-прежнему отправляет весь файл в виде сообщения: (

2. @py1527 Тогда в вашем файле нет перевода строки или он отформатирован таким образом, что функция readline() не может определить, где заканчивается одна строка и начинается другая. Как завершаются строки? Какую демаркацию вы хотите использовать для разделения ваших сообщений?