MQTT — это аббревиатура от Message Queuing Telemetry Transport. Это облегченный протокол связи IoT, основанный на модели публикации/подписки. Он имеет следующие характеристики:
В приложениях для роботов MQTT можно использовать в следующих сценариях:
Протокол MQTT состоит из трех основных частей:
MQTT Протокол использует шаблон публикации/подписки для связи. Издатель публикует информацию по теме, а подписчик подписывается на тему и получает информацию, опубликованную издателем. Это очень похоже на тему в ros2
MQTT клиент может использовать любые типы приложений, включая встроенные устройства, ПК приложения и Web приложение. MQTT клиент должен быть реализован MQTT Три основные функции протокола:
MQTT сервердаа беги MQTT протоколизприложение. MQTT сервернужно реализовать MQTT Три основные функции протокола:
MQTT Путь темадаинформации, используемый для различения разных типов информации.темаиз格式为:
/topic/[topic_name]
в,topic_name
название даты. название темы может содержать буквы、число、Подчеркнуть и поставить точку.
Информация MQTT состоит из двух частей:
QoS Класс качества даинформации, используемый для контроля достоверности информации. качество обслуживания Есть три уровня:
Согласно предыдущему введению, вы можете знать, что для использования MQTT у вас должен быть сервер. Этот сервер можно развернуть самостоятельно или воспользоваться услугами публичного облака.
В настоящее время я предпочитаю развертывать службу локально, но из соображений стабильности и проблем с сетью позже я могу использовать службу MQTT от Alibaba Cloud.
Как упоминалось ранее, MQTT — это протокол со множеством конкретных реализаций. Здесь я решил использовать Mosquitto, который поддерживается Eclipse Foundation и реализует протокол MQTT версий 5, 3.1 и 3.1.1.
Вот некоторые преимущества использования Mosquitto:
Что меня удивило, так это то, что RabbiMQ также поддерживает протокол MQTT, и его конфигурация очень проста, но эта функция не включена по умолчанию. Вы можете попробовать ее в будущем. Разработчики в интернет-индустрии должны быть более знакомы с RabbitMQ.
sudo apt install mosquitto
# Создать файл конфигурации
vim /etc/mosquitto/mosquitto.conf
# Заполните следующее
# порт
listener 1883
# Имя пользователя и пароль
allow_anonymous true
Примечание. Я разрешаю здесь анонимный доступ для удобства локального тестирования, но в реальных приложениях для разработки этого делать не следует.
sudo systemctl start mosquitto
На этом этапе создан простой MQTT-сервер.
В ros есть специальные инструменты, помогающие в этом шаге, но в ros2 пока нет, однако, думаю, люди на форуме рекомендуют использовать код для передачи данных.
Я использую пакет Python paho, который необходимо сначала установить.
pip install paho
Я публикую здесь два кода, а именно издатель и подписчик, то есть издатель и подписчик.
import time
import paho.mqtt.client as mqtt
class Publisher:
def __init__(self, host="127.0.0.1", port=1883, topic="test_channel"):
self.host = host
self.port = port
self.topic = topic
self.client = mqtt.Client()
self.client.on_connect = self.on_connect
self.client.on_publish = self.on_publish
def on_connect(self, client, userdata, flags, rc):
print("Connected with result code "+str(rc))
def on_publish(self, client, userdata, mid):
print("Message Published ...")
def start(self, msg="Hello MQTT", times=10, delay=1):
self.client.connect(self.host, self.port, 60)
self.client.loop_start()
for i in range(times):
time.sleep(delay)
self.client.publish(self.topic, f"{msg} {i}")
if __name__ == "__main__":
publisher = Publisher()
publisher.start()
import paho.mqtt.client as mqtt
class Subscriber:
def __init__(self, host="127.0.0.1", port=1883, topic="test_channel"):
self.host = host
self.port = port
self.topic = topic
self.msg_count = 0
self.client = mqtt.Client()
self.client.on_connect = self.on_connect
self.client.on_message = self.on_message
def on_connect(self, client, userdata, flags, rc):
print("Connected with result code "+str(rc))
self.client.subscribe(self.topic)
def on_message(self, client, userdata, msg):
self.msg_count += 1
print(f"Message {self.msg_count}: {msg.topic} {str(msg.payload)}")
def start(self):
self.client.connect(self.host, self.port, 60)
self.client.loop_forever()
if __name__ == "__main__":
subscriber = Subscriber()
subscriber.start()
Вы можете запустить два вышеуказанных сценария на том же компьютере, что и mosquitto, в противном случае вам необходимо изменить хост в коде на фактический IP-адрес mosquitto и убедиться в отсутствии сетевых ограничений.
При тестировании необходимо сначала запустить подписчика, а затем публикатора, иначе подписчик может не получить данные.