# Passerelle port série vers broker MQTT

**URL:** <https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172>\
**Category:** Support Debian\
**Created:** [Février 5, 2020, 9:07 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172 "2020-02-05T21:07:51Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jean-BaptisteP](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/59ef9b/32.png) [@Jean-BaptisteP](https://www.debian-fr.org/u/Jean-BaptisteP)\
**Post date:** [Février 5, 2020, 9:07 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/1 "2020-02-05T21:07:51Z")

</div>

Bonjour,

Je cherche un moyen de rediriger les messages reçus sur le port série vers un broker MQTT installé sur la même machine.  
Les messages sont de ce type :  
T P1P2/P/T/TempRoom1:26.59  
T P1P2/P/T/TempLWT:23.56  
T P1P2/P/T/TempDHW:47.28  
T P1P2/P/T/TempOut1:3.50  
T P1P2/P/T/TempRWT:23.73  
Cela correspond visiblement à ce qu’un broker est célèbre d’interpréter.

J’ai essayé différentes options avec la commande socat, je ne suis pas arrivé à un résultat pertinent.  
Je souhaiterais aussi envoyer des messages vers le port série.

Merci d’avance

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 6, 2020, 9:15 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/2 "2020-02-06T09:15:44Z")

</div>

> [@Jean-BaptisteP](#):
>
> Je cherche un moyen de rediriger les messages reçus sur le port série vers un broker MQTT

Je ne connaissais pas ce machin d’internet of shit, «&nbsp;broker MQTT&nbsp;» et tu risques d’avoir peu de monde, j’imagine, qui soit vraiment compétent en IOT ici, mais si tu indiquais déjà ce que tu utilises comme broker, et comment tu as essayé de communiquer avec lui avec socat, on pourrait essayer de t’aider à créer le canal entre ton port série et le point d’entrée sans vraiment connaitre ton broker.  
Mais il faudrait plus d’infos.  
Ca ne serait pas un mosquitto, que tu essayes d’alimenter avec mosquitto\_pub, genre ?

> [@Jean-BaptisteP](#):
>
> Je souhaiterais aussi envoyer des messages vers le port série.

Ben tout bêtement `echo "bla bla" >/dev/ttyS0`, si c’est ce port série là, non ?

---

<div class="post-metadata">

**Author:** ![Jean-BaptisteP](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/59ef9b/32.png) [@Jean-BaptisteP](https://www.debian-fr.org/u/Jean-BaptisteP)\
**Post date:** [Février 6, 2020, 10:59 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/3 "2020-02-06T10:59:22Z")

</div>

Internet of shit, c’est assez bien vu. Je débute avec ça, je suis un peu perdu.

C’est bien ce truc (serveur mosquitto) que je cherche à alimenter, à défaut de savoir développer autre chose.  
J’ai essayé différentes options avec socat, mais ça ne fonctionne visiblement pas (ça se termine en broken pipe).  
Effectivement, utiliser mosquitto\_client est probablement plus pertinent.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 6, 2020, 3:06 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/4 "2020-02-06T15:06:37Z")

</div>

> [@Jean-BaptisteP](#):
>
> ’ai essayé différentes options avec socat

En regardant comment ça fonctionnait, je me disais qu’on pouvait transformer (avec sed par exemple) chaque ligne des messages qui arrive par le ttyS (avec une boucle qui surveille un tail -qf) en une instruction `mosquitto_pub -h localhost -t ...` dont tu lances l’execution à chaque réception de message, et j’ai (trés) vaguement un script ou un pipeline bash en tête pour faire ça, mais je suis loin d’avoir une idée claire de ce qu’il faudrait faire.  
Du coup, si tu es parti sur une mécanique avec socat, c’est que toi aussi tu avais une idée, et je pense que si tu filais quelques exemples de ce que tu as voulu faire socat et qui n’a pas marché, on pourrait t’aider à faire marcher ta solution, ça me semble plus simple

---

<div class="post-metadata">

**Author:** ![Jean-BaptisteP](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/59ef9b/32.png) [@Jean-BaptisteP](https://www.debian-fr.org/u/Jean-BaptisteP)\
**Post date:** [Février 6, 2020, 5:19 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/5 "2020-02-06T17:19:42Z")

</div>

Je n’ai pas vraiment d’idée précise avec socat.  
Je crois qu’effectivement il faut un script bash pour générer des envois vers mosquitto\_pub.

Merci

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 6, 2020, 5:41 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/6 "2020-02-06T17:41:53Z")

</div>

> [@Jean-BaptisteP](#):
>
> Je crois qu’effectivement il faut un script bash

Oui, mais non, je ne vais pas te l’écrire là comme ça, d’abord parce que ce n’est pas d’une totale évidence à pondre pour moi, même si j’ai des pistes, donc ça me prendrait un temps de réflexion dont je ne dispose pas, et en plus, je n’ai pas les moyens de tester si ça marche chez moi, donc on se retrouverait à faire des allers/retours de scripts de test, toussa.

D’autant plus qu’il me semble que quelqu’un a déjà traité le probléme:

> **[GitHub - mycontroller-org/serial2mqtt: Serial to MQTT adapter serivce](https://github.com/mycontroller-org/serial2mqtt)**
>
> Serial to MQTT adapter serivce

---

<div class="post-metadata">

**Author:** ![Jean-BaptisteP](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/59ef9b/32.png) [@Jean-BaptisteP](https://www.debian-fr.org/u/Jean-BaptisteP)\
**Post date:** [Février 6, 2020, 7:37 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/7 "2020-02-06T19:37:12Z")

</div>

Je comprends bien, je vais essayer de creuser ce que je peux faire comme script.  
Concernant le lien joint, j’avais déjà consulté ce site et je m’étais arrêté à ça :

_\> For now, this adapter supports only for [MySensors](https://www.mysensors.org/)_

Merci pour la réponse précédente.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 6, 2020, 8:52 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/8 "2020-02-06T20:52:34Z")

</div>

> [@Jean-BaptisteP](#):
>
> Concernant le lien joint, j’avais déjà consulté ce site et je m’étais arrêté à ça

Ah zut, j’avais pas vu ça.  
Et en plus, c’est du java, ça doit forcément être une usine à gaz. 😜

Bon, sinon, autre piste, le [2e sur la requète «&nbsp;serial to mosquitto&nbsp;»](https://gist.github.com/andypiper/1218932), indique qu’il y a une lib python chez mosquitto (pas trouvée) pour causer avec le port série.

Mais en lisant le [man mosquitto\_pub](https://mosquitto.org/man/mosquitto_pub-1.html), je me demande si ce n’est pas aussi simple à faire que **mosquitto\_pub -t my/topic -f \</dev/ttyS0**

---

<div class="post-metadata">

**Author:** ![Jean-BaptisteP](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/59ef9b/32.png) [@Jean-BaptisteP](https://www.debian-fr.org/u/Jean-BaptisteP)\
**Post date:** [Février 6, 2020, 9:36 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/9 "2020-02-06T21:36:00Z")

</div>

Visiblement, utiliser mosquitto\_pub sera le plus simple. Malheureusement, celui-ci veut un fichier dont la longueur est connue :

> sudo mosquitto\_pub -h localhost -t P1P2 -f /dev/ttyACM0 -d  
> Error: Unable to determine size of file «&nbsp;/dev/ttyACM0&nbsp;».  
> Error loading input file «&nbsp;/dev/ttyACM0&nbsp;»

Il y peut-être l’option _`--stdin-line`_ qui pourrait-être utilisée. Je vais faire des recherches.

Il faut probablement que je crée un script qui sélectionne la dernière ligne de la sortie série(vue via cat /dev/ttyACM0), renvoit celle-ci vers la commande mosquitto\_pub (mosquitto\_pub -h localhost -t P1P2 -m «&nbsp;$portsérie&nbsp;»), et se relance à chaque nouvelle valeur de la sortie série.

---

<div class="post-metadata">

**Author:** ![Jean-BaptisteP](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/59ef9b/32.png) [@Jean-BaptisteP](https://www.debian-fr.org/u/Jean-BaptisteP)\
**Post date:** [Février 6, 2020, 10:00 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/10 "2020-02-06T22:00:22Z")

</div>

J’y suis presque :

> sudo cat /dev/ttyACM0 | mosquitto\_pub -h localhost -t P1P2 -l -d  
> Client mosqpub|25916-maison sending CONNECT  
> Client mosqpub|25916-maison received CONNACK (0)  
> Client mosqpub|25916-maison sending PUBLISH (d0, q0, r0, m1, ‹&nbsp;P1P2&nbsp;›, … (10 bytes))  
> Client mosqpub|25916-maison sending PUBLISH (d0, q0, r0, m2, ‹&nbsp;P1P2&nbsp;›, … (77 bytes))

Je répond quand j’ai la solution.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 6, 2020, 10:55 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/11 "2020-02-06T22:55:52Z")

</div>

Je crois avoir vu la mention d’un `-r` aussi pour passer des cas de dispositifs peu verbeux, dans les exemples de la page de man (l’explication du rôle du flag n’est pas super claire, faut tester).

---

<div class="post-metadata">

**Author:** ![Jean-BaptisteP](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/59ef9b/32.png) [@Jean-BaptisteP](https://www.debian-fr.org/u/Jean-BaptisteP)\
**Post date:** [Février 6, 2020, 11:12 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/12 "2020-02-06T23:12:43Z")

</div>

Merci beaucoup pour l’aide fournie, je suis arrivé à surveiller ma machine.  
Je vais tester l’autre flag.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 6, 2020, 11:53 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/13 "2020-02-06T23:53:47Z")

</div>

Dernier “sinon”:  
je vois que tu fais des cat que tu pipe ensuite, mais cat, ça doit te lire le buffer du port et sortir ensuite.  
Je crois qu’un **tail -qf | …** devrait être mieux.

Et ajoutes l’user qui doit accèder à /dev/ttyACM0 au groupe dialout (vérifie si c’est bien ce groupe avec `ls -l /dev/ttyACM0`) ça devrait t’éviter de faire les choses en sudo.

---

<div class="post-metadata">

**Author:** ![Jean-BaptisteP](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/59ef9b/32.png) [@Jean-BaptisteP](https://www.debian-fr.org/u/Jean-BaptisteP)\
**Post date:** [Février 7, 2020, 8:55 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/14 "2020-02-07T08:55:21Z")

</div>

Bizarrement " **tail -qf**" ne renvoit aucune sortie.

Il ne me reste plus qu’à le faire tourner en daemon et j’ai fini.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 7, 2020, 1:31 UTC](https://www.debian-fr.org/t/passerelle-port-serie-vers-broker-mqtt/81172/15 "2020-02-07T13:31:04Z")

</div>

> [@Jean-BaptisteP](#):
>
> Bizarrement " **tail -qf**" ne renvoit aucune sortie.

Ca me semble normal, parce que le buffer du port série ne conserve pas d’historique de ce qui est passé avant s’il a été flushé, mais le `tail -qf` ne rend pas la main comme s’il avait reçu un `EOF` quand il arrive à la fin du flux, comme `cat`, et la prochaine fois que ton dispositif enverra un message, ton `tail -qf`, qui n’a pas décroché malgré le fait qu’il soit arrivé au bout du contenu de `ttyACM0`, te le sortira sur sa sortie standard.  
Un `tail -qf`, c’est un cat de fin de fichier qui ne décroche pas quand il arrive à la fin.  
Mais bon, si ça marche avec `cat`… 😃

[edit: erreur, ce n’est pas `tail -qf`, mais `tail -q` !  
le f, c’est pour prendre un fichier au lieu de l’entrée standard, je suis bête…  
`tail -q` = `tail -qf -` ]
