MQTT

MQTT est un protocole de messagerie standardisé pour la communication entre ordinateurs. Le protocole a une mise en œuvre simple et une grande efficacité de transfert de données. MQTT prend en charge la messagerie dans les deux sens : des appareils vers le cloud et inversement.

Vous devez ajouter ces paramètres au fichier config.yaml :

MQTT:
  url: "amqp://guest:guest@localhost:5672/%2F"
  exchange_name: "unicounter"
  queue_name: "unicounter"
  routing_key: "unicounter"
  app_id: "unicounter-1"
  period_sec: 1
  debug: true

Nous utilisons le protocole ampq standard.

Vous pouvez utiliser RabbitMQ comme option, mais vous pouvez le remplacer par votre adresse ampq ainsi que votre identifiant et mot de passe.

Le programme envoie des messages comme :

'{"some_camera_1": {"default": 6}}'

C’est-à-dire qu’un message peut contenir une mise à jour pour plusieurs caméras, et pour chaque caméra, pour plusieurs types d’objets comptés.

Seules les données comptées sont envoyées, c’est-à-dire non pas un total cumulé, mais simplement combien est passé pendant la période.

Pour tester, vous pouvez installer erlang et rabbit et exécuter ces deux scripts Python.

sender_example.py

import pika

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='unicounter')

channel.basic_publish(exchange='', routing_key='unicounter', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

consumer_example.py

import pika, sys, os

def main():
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()

    channel.queue_declare(queue='unicounter')

    def callback(ch, method, properties, body):
        print(f" [x] Received {body}")

    channel.basic_consume(queue='unicounter', on_message_callback=callback, auto_ack=True)

    print(' [*] Waiting for messages. To exit press CTRL+C')
    channel.start_consuming()

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print('Interrupted')
        try:
            sys.exit(0)
        except SystemExit:
            os._exit(0)