Comments (16)
@requeijaum can you share the configuration file?
from 2mqtt.
from this I understand that, you are publishing and subscribing same topic.
- What ever you post on the topic
subscribe
will be sent to the serial device. - Whatever you receive on the serial device, will be published on the topic
publish
- the protocol
raw
simply forwards the data between mqtt and devices, here it is serial.
{"adapterName": "adapter1", "config": {"Name":"","Broker":"tcp://127.0.0.1:1883","InsecureSkipVerify":true,"Username":"","Subscribe":"vallydroid/#","Publish":"vallydroid/","QoS":0,"TransmitPreDelay":"0s","ReconnectDelay":"5s"}}
I think you are looking slimier to serial2mqtt. we have to implement the message parser to support your expectation
from 2mqtt.
@requeijaum I have added format script support. I hope with this option we can achieve your requirement. Still if you are interested in 2mqtt
let me know, I can guide you.
from 2mqtt.
Thanks for the reply!
I need to subscribe: "vallydroid/sensors/+/send" (notice the wildcard)
And post messages for each sub-device at "vallydroid/sensors/MAC_ADDR/recv".
Does 2mqtt have the possibility of publishing messages for different MQTT topics ???
from 2mqtt.
@requeijaum Can you give some of samples of following,
serial
data from your device and how you want to post it tomqtt
(including topic details)mqtt
subscribed data and how you want to post it toserial
device (including mqtt topic details)
Does 2mqtt have the possibility of publishing messages for different MQTT topics ???
It is possible, if you have the topic details on your serial data
from 2mqtt.
First of all:
I receive data from serial port - they are measurements for each sensor.
Since they are base64 coded: I need to decode them internally.
So I publish that data to the MQTT broker (at individual sensor topics).
"vallydroid/sensors/123456789/send" In this example.
After this decode operation: I need to update the sensors screens individually.
I proceed to publish another message in a different sub-topic.
"vallydroid/sensors/123456789/recv", in this case.
I just need to get this message from MQTT to Serial.
That's because all the sensors are running on a different kind of networking and we have a device that acts as a bridge through serial port.
The MQTT broker is a central part of my project because we use it as a way to organize all the sensors involved.
from 2mqtt.
@requeijaum from the log of your initial post I go the following data
-
from serial:
[1,\"vallydroid/sensors/E04066F23A08/send\",\"4EBm8joIAQ0BGgEM1SkCcwC/AAAQrhA=\"]\r
to mqtt:topic: vallydroid/sensors/E04066F23A08/send, data: 4EBm8joIAQ0BGgEM1SkCcwC/AAAQrhA=
-
from mqtt:
topic: vallydroid/sensors/E04066F23A08/recv, data: 4EBm8joIAQ0BGgEM1SkCcwC/AAAQrhA=
to serial:[1,\"vallydroid/sensors/E04066F23A08/recv\",\"4EBm8joIAQ0BGgEM1SkCcwC/AAAQrhA=\"]\r
Am I understand correctly?
from 2mqtt.
That's it. But /recv isn't base64 encoded.
from 2mqtt.
@requeijaum can you try the following configuration with your serial device?
use 2mqtt version 1.4
logger:
mode: development
encoding: console
level: debug
adapters:
- name: my_serial2mqtt
enabled: true
reconnect_delay: 30s
provider: raw
source:
type: serial
port: /dev/ttyUSB0
baud_rate: 115200
transmit_pre_delay: 10ms
mqtt:
broker: tcp://127.0.0.1:1883
insecure: false
username:
password:
subscribe:
publish:
qos: 0
transmit_pre_delay: 0s
reconnect_delay: 5s
formatter_script:
to_mqtt: |
let update_raw_data = raw_data
if (update_raw_data.endsWith("\\r")){
update_raw_data = update_raw_data.slice(0, -2)
}
let serialData = JSON.parse(update_raw_data)
// sample data
// [1,"vallydroid/sensors/E04066F23A08/send","4EBm8joIAQ0BGgEM1SkCcwC/AAAQrhA="]
let keyMap = ["command", "mqtt_topic", "data"]
let serialDataMap = {}
for (let index=0; index<serialData.length;index++) {
serialDataMap[keyMap[index]] = serialData[index]
}
result={
...serialDataMap
}
to_source: |
// generate as follows
// [1,"vallydroid/sensors/E04066F23A08/recv","my-data"]
result={
data: JSON.stringify([1, mqtt_topic, raw_data])
}
from 2mqtt.
I will check this in the next 6 hours. I'm on BRT (Brazilian time).
from 2mqtt.
@requeijaum ok, take your time
from 2mqtt.
I think that the script is running properly !!!
vd@vd1:~/downloads/2mqtt-1.4-linux-arm64$ ./2mqtt
2023-02-24T00:01:28.250Z info start/logger.go:14 welcome to the 2mqtt adapter server :)
2023-02-24T00:01:28.251Z info start/logger.go:15 server information {"version": "{version:1.4, gitCommit:4242702b0b9349e7f457792e3f784ac62a7366a9, buildDate:2023-02-20T02:02:53+00:00, goLang:go1.20.1, platform:linux, arch:arm64}", "logger": {"Mode":"development","Encoding":"console","Level":"debug"}}
2023-02-24T00:01:28.251Z debug adapter/store.go:48 starting an adapter {"name": "adapter1", "provider": "raw"}
2023-02-24T00:01:28.252Z debug mqtt/device.go:60 mqtt config {"adapterName": "adapter1", "config": {"Name":"","Broker":"tcp://127.0.0.1:1883","Insecure":false,"Username":"","Subscribe":"vallydroid/#","Publish":"vallydroid/","QoS":0,"TransmitPreDelay":"0s","ReconnectDelay":"5s"}}
2023-02-24T00:01:28.260Z debug mqtt/device.go:94 mqtt client connected successfully {"adapterName": "adapter1", "timeTaken": "8.139485ms", "clientConfig": {"Name":"","Broker":"tcp://127.0.0.1:1883","Insecure":false,"Username":"","Subscribe":"vallydroid/#","Publish":"vallydroid/","QoS":0,"TransmitPreDelay":"0s","ReconnectDelay":"5s"}}
2023-02-24T00:01:28.261Z info adapter/service.go:238 connected to the mqtt broker {"adapterName": "adapter1", "provider": "raw"}
2023-02-24T00:01:28.261Z debug mqtt/device.go:103 mqtt connection success {"adapterName": "adapter1"}
2023-02-24T00:01:28.261Z debug serial/device.go:58 source device config {"id": "adapter1", "config": {"Port":"/dev/ttyUSB0","BaudRate":115200,"MessageSplitter":10,"TransmitPreDelay":"10ms"}}
2023-02-24T00:01:28.262Z info serial/device.go:62 opening a serial port {"adapterName": "adapter1", "port": "/dev/ttyUSB0"}
2023-02-24T00:01:28.263Z debug mqtt/device.go:186 subscribed a topic {"adapterName": "adapter1", "topic": "vallydroid/#"}
2023-02-24T00:01:28.270Z info adapter/service.go:270 connected to the source device {"adapterName": "adapter1", "provider": "raw"}
2023-02-24T00:01:28.270Z info start/start.go:23 services started {"timeTaken": "18.336869ms"}
^[[21~2023-02-24T00:01:33.857Z debug adapter/service.go:172 received a message from source device {"message": "{data:[1,\"vallydroid/sensors/404266F23A08/send\",\"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=\"]\r, others:map[], timestamp:2023-02-24 00:01:33.857024546 +0000 GMT m=+5.619853010", "adapterName": "adapter1", "provider": "raw"}
2023-02-24T00:01:33.860Z debug javascript/utils.go:35 executing script {"variables": {"raw_data":"[1,\"vallydroid/sensors/404266F23A08/send\",\"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=\"]\r"}, "scriptString": "let update_raw_data = raw_data\nif (update_raw_data.endsWith(\"\\\\r\")){\n update_raw_data = update_raw_data.slice(0, -2)\n}\nlet serialData = JSON.parse(update_raw_data)\n// sample data\n// [1,\"vallydroid/sensors/E04066F23A08/send\",\"4EBm8joIAQ0BGgEM1SkCcwC/AAAQrhA=\"]\nlet keyMap = [\"command\", \"mqtt_topic\", \"data\"]\nlet serialDataMap = {}\nfor (let index=0; index<serialData.length;index++) {\n serialDataMap[keyMap[index]] = serialData[index]\n}\nresult={\n ...serialDataMap\n}\n"}
2023-02-24T00:01:33.862Z debug javascript/utils.go:50 executed script {"variables": {"raw_data":"[1,\"vallydroid/sensors/404266F23A08/send\",\"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=\"]\r"}, "scriptString": "let update_raw_data = raw_data\nif (update_raw_data.endsWith(\"\\\\r\")){\n update_raw_data = update_raw_data.slice(0, -2)\n}\nlet serialData = JSON.parse(update_raw_data)\n// sample data\n// [1,\"vallydroid/sensors/E04066F23A08/send\",\"4EBm8joIAQ0BGgEM1SkCcwC/AAAQrhA=\"]\nlet keyMap = [\"command\", \"mqtt_topic\", \"data\"]\nlet serialDataMap = {}\nfor (let index=0; index<serialData.length;index++) {\n serialDataMap[keyMap[index]] = serialData[index]\n}\nresult={\n ...serialDataMap\n}\n", "output": {"command":1,"data":"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=","mqtt_topic":"vallydroid/sensors/404266F23A08/send"}}
2023-02-24T00:01:34.271Z debug mqtt/device.go:134 about to send a message {"adapterName": "adapter1", "message": "{data:QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=, others:map[command:1 mqtt_qos:0 mqtt_topic:vallydroid/sensors/404266F23A08/send], timestamp:2023-02-24 00:01:33.857024546 +0000 GMT m=+5.619853010"}
2023-02-24T00:01:34.273Z debug adapter/service.go:162 received a mqtt message {"message": "{data:QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=, others:map[mqtt_qos:0 mqtt_topic:vallydroid//vallydroid/sensors/404266F23A08/send], timestamp:2023-02-24 00:01:34.272683907 +0000 GMT m=+6.035512370", "adapterName": "adapter1", "provider": "raw"}
2023-02-24T00:01:34.275Z debug javascript/utils.go:35 executing script {"variables": {"mqtt_qos":0,"mqtt_topic":"vallydroid//vallydroid/sensors/404266F23A08/send","raw_data":"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA="}, "scriptString": "// generate as follows\n// [1,\"vallydroid/sensors/E04066F23A08/recv\",\"my-data\"]\nresult={\n data: JSON.stringify([1, mqtt_topic, raw_data])\n}\n"}
2023-02-24T00:01:34.276Z debug javascript/utils.go:50 executed script {"variables": {"mqtt_qos":0,"mqtt_topic":"vallydroid//vallydroid/sensors/404266F23A08/send","raw_data":"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA="}, "scriptString": "// generate as follows\n// [1,\"vallydroid/sensors/E04066F23A08/recv\",\"my-data\"]\nresult={\n data: JSON.stringify([1, mqtt_topic, raw_data])\n}\n", "output": {"data":"[1,\"vallydroid//vallydroid/sensors/404266F23A08/send\",\"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=\"]"}}
2023-02-24T00:01:34.287Z debug adapter/service.go:162 received a mqtt message {"message": "{data:QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=, others:map[mqtt_qos:0 mqtt_topic:vallydroid//vallydroid/sensors/404266F23A08/send], timestamp:2023-02-24 00:01:34.286979533 +0000 GMT m=+6.049807996", "adapterName": "adapter1", "provider": "raw"}
2023-02-24T00:01:34.289Z debug javascript/utils.go:35 executing script {"variables": {"mqtt_qos":0,"mqtt_topic":"vallydroid//vallydroid/sensors/404266F23A08/send","raw_data":"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA="}, "scriptString": "// generate as follows\n// [1,\"vallydroid/sensors/E04066F23A08/recv\",\"my-data\"]\nresult={\n data: JSON.stringify([1, mqtt_topic, raw_data])\n}\n"}
2023-02-24T00:01:34.290Z debug javascript/utils.go:50 executed script {"variables": {"mqtt_qos":0,"mqtt_topic":"vallydroid//vallydroid/sensors/404266F23A08/send","raw_data":"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA="}, "scriptString": "// generate as follows\n// [1,\"vallydroid/sensors/E04066F23A08/recv\",\"my-data\"]\nresult={\n data: JSON.stringify([1, mqtt_topic, raw_data])\n}\n", "output": {"data":"[1,\"vallydroid//vallydroid/sensors/404266F23A08/send\",\"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=\"]"}}
2023-02-24T00:01:35.271Z debug adapter/service.go:148 posting a message to source device {"message": "{data:[1,\"vallydroid//vallydroid/sensors/404266F23A08/send\",\"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=\"], others:map[], timestamp:2023-02-24 00:01:34.272683907 +0000 GMT m=+6.035512370", "adapterName": "adapter1", "provider": "raw"}
2023-02-24T00:01:35.282Z debug adapter/service.go:148 posting a message to source device {"message": "{data:[1,\"vallydroid//vallydroid/sensors/404266F23A08/send\",\"QEJm8joIABoBKgAU1SUCVv/UAAAQ1xA=\"], others:map[], timestamp:2023-02-24 00:01:34.286979533 +0000 GMT m=+6.049807996", "adapterName": "adapter1", "provider": "raw"}
from 2mqtt.
Here are some screenshots.
I will check the serial port output later on.
from 2mqtt.
@requeijaum nice it worked for you. to avoid loopback the same data to 2mqtt
, update the subscribe
topic to vallydroid/sensors/+/recv
from 2mqtt.
Is there a way to subscribe in two topics ?
from 2mqtt.
@requeijaum I see it is possible with comma ,
separated. can you try that?
example:
adapters:
- name: my_serial2mqtt
mqtt:
subscribe: topic1,topic2,topic3
2mqtt/plugin/device/mqtt/device.go
Line 177 in 4242702
from 2mqtt.
Related Issues (3)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from 2mqtt.