MQTT : two way bridge publishing twice - mqtt

So I have setup a two MQTT brokers [say 'A' and 'B'](setup using cloud mqtt) where 'B' is bridged to 'A' (by a two way bridge). When I publish to a topic to 'A' it shows up under 'A' then shows up under 'B' (as expected). But, if i publish to 'B' it shows up under 'B' then under 'A' then a duplicate publish is seen under 'B'. Is there some flag I need to set or setting i need to change to prevent this ?

How did you initiate the bridge?
You need to define a local prefix and a different remote prefix for the connection. Do not mix that up with the meaning of "local" or "remote", but thake them as the names of those branches that should be mirrored to the other broker.
This prevents the brokers from looping the very same messages again and again.
Lets say your "A" broker sends commands over the branch order/command
and your "B" broker holds sensor values at home/sensor
Then if you publish a message to order/command/ on broker "A", you will see this message unter the same branch order/command/ at broker "B".
Also every sensor value thay may be published to home/sensor/ at broker "B" will be mirrored to home/sensor/ at broker "A"
mosquitto.conf: (Raspberry "A" is 192.168.1.100)
connection raspi-PC
address 192.168.1.110:1883
topic # both 0 order/command/ home/sensor/
Then this will work:
client1 : mosquitto_sub -h 192.168.1.110 -t order/command/#
client2 : mosquitto_sub -h 192.168.1.100 -t home/sensor/#
clientA : mosquitto_pub -t order/command/message -m "Hello from A"
clientB : mosquitto_pub -t home/sensor/temp -m "22.5C"
client1 --> order/command/message/"Hello from A"
client2 --> home/sensor/temp/"22.5C"
You see that client1 and client2 are cross subscribers to broker "A" and "B" and they get all branch and subbranch messages, but they are not necessarily local to the brokers.
On clientA and clientB I used the local client to send the message to the local broker.

Related

MQTT qos parameter has no effect

I have installed a mosquitto server on a raspberry server.
This server works fine: I have test with mosquitto_sub and mosquitto_pub commands.
I have write this python script:
import paho.mqtt.client as mqtt
import time
client = mqtt.Client('module_test_4')
client.connect('127.0.0.1', 1883, 10)
client.loop_start()
for i in range(10):
client.publish('topic_2', "valeur %d" % i, qos=0)
time.sleep(1)
client.loop_stop()
client.disconnect()
I have launched this script twice on 2 consoles:
mosquitto_sub -h 127.0.0.1 -i module_test_2 -t topic_2
It works fine: I see messages on each console.
Now, i have tried to change qos parameter to 0,1 and 2.
I have tried to run my python script without lauching any occurence of mosquitto_sub.
I was thinking mosquitto will buffer messages and send it again when mosquitto_sub will be launched but this does not work.
So i am wondering how qos works...
Thanks
QOS only applies to one leg of the connection at a time.
This means the QOS can be different between the publisher/broker and broker/subscriber.
So in the example you have posted you set QOS to 2 between the publisher and the broker, but it is still the default 0 between the subscriber and the broker. This means that as far as the broker is concerned the subscribing client only wants QOS 0.
If you want to test with mosquitto_sub you need to include a higher QOS on the command line as well. You need to have established a subscription at QOS 2 before disconnecting like so:
mosquitto_sub -h 127.0.0.1 -i module_test_2 -t topic_2 -q 2
You also need to tell mosquitto_sub not to ask for a clean session when it reconnects:
mosquitto_sub -h 127.0.0.1 -i module_test_2 -t topic_2 -q 2 -c

Display of the missed messages from the publisher with a new subscriber connection (MQTT / Mosquitto)

Publusher sends a message -m "hello" to the topic -t hello using the command mosquitto_pub -h 172.17.*.* -t hello -m "hello" -d. The subscriber sees the message -m "hello" only if the connection to the topic -t hello is active. However, if the subscriber is not subscribed to the -t hello topic and the publisher still sends messages on the -t hello topic, then when you try to subscribe to this topic mosquitto_sub -h 172.17. *. * -t hello subscriber does not receive sent messages from publisher.
After reading the documentation, breaking a couple of brokers, I achieved only the fact that you can see the last message if you put the flag on the publisher -r like this - -mosquitto_pub -h 172.17. *. * -r -t hello -m "hello". I configured mosquitto.conf, because I thought that the main changes, an example of the current problem, can only be achieved through it.
How can I solve such a problem, I would like to see all missed messages from publisher when i resubscribe to the topic?
You need to use the QOS (Quality of Service) values for the messages. By default QOS is set to 0 which is basically fire and forget, QOS 1 is ensure delivery (but could mean delivered more than once). QOS 2 is ensured delivery only once.
It's needs pointing out that QOS is between 1 client and the broker, so this can be between the publisher and the broker, or the broker and a subscriber independently. (e.g. you can publish at QOS 0 and then subscribe to the topic at QOS 2).
For message queuing for offline clients, the client needs to have been subscribed at QOS 1 or QOS 2 and when it reconnects it needs to have it's cleanSession flag set to false and use the same client id.
MQTT brokers will not queue messages for clients that have never connected before.
With mosquitto_sub and mosquitto_pub you can set the QOS level with -q option and you can set the client id with the -i option. To set the clean session flag to false for mosquitto_sub you should use the -c option

How to use client id in Mosquitto MQTT?

I am new to Mosquitto. I have installed Mosquitto and Mosquitto Client in Ubuntu. I am trying to subscribe with client-id also publish with client-id, please look the command that I have run in console, but unfortunately, the subscriber is not receiving the message.
Subscription
mosquitto_sub -h localhost -t temp/city1 -c -q 2 --id client-one
Publish
mosquitto_pub -h localhost -t temp/city1 -m "32 Celsius" -q 2 --id client-one
but if I Publish message without client id the subscriber is receiving message, so please help me where I did the mistake?
As mentioned in the comment, clientIds are just that, they are a unique identifier for each client connected to the broker.
ClientIds need to be totally unique, if a second client tries to connect with a clientid that is already connected the broker must disconnect the first client to allow the second to connect (this is dictated by the specification). In the example you have given the subscriber will be disconnected before it receives the message published by the second.
Messages are published to topics and clients can subscribe to these topics (or patterns of topics with wildcards)
So using the mosquitto command line tools you can do the following:
mosquitto_sub -v -t 'foo/bar'
This will subscribe to the topic foo/bar and will print out the topic and then message when ever a message is published to that topic. To publish a message containing the string testing you would use:
mosquitto_pub -t 'foo/bar' -m 'testing'
The mosquitto command line tools will generate random clientids if none are provided on the command line.

Using Mosquitto to experiment with the Watson Iot platform service

I have successfully connected a device and an application to the Watson IoT platform over MQTT protocal, the application subscribe the event published by device. example:http://iotf.readthedocs.io/en/latest/getting_started/quickstart/index.html
then I tried to let the device subscrbe a command published by the application.
device:
mosquitto_sub -h 184.172.124.189 -p 1883 -i "d:quickstart:devicetype:deviceid" -t iot-2/cmd/cid/fmt/json
application:
mosquitto_pub -h 184.172.124.189 -p 1883 -i "a:quickstart:applicationid" -t iot-2/type/devicetype/id/deviceid/cmd/cid/fmt/json -m " {\"d\" : {\"temp\" : 36 }}"
the device can't receive the message published by application.
what does the command include and how doed it work ?
Quickstart (which is completely unauthenticated, was intended to do what it says on the tin) doesn't include the ability to send commands to devices. You will have to create a device type and register a device, then something like this could work.
When you do this, in the strings you use to authenticate e.g. quickstart will be replaced by your organization id, devicetype and deviceid by the names you use for the device type and the device name.

Messages not received on first time connection

I am unable to receive messages on first time connection. for in more detail,user A is connected and publishing messages,but user B is not connected to that topic.So when user B will connect,he will not get any message from user A because there is first time connection b/w user a and user b.
How we can resolve this issue ?
Thanks
A principle of pub/sub is that the publisher and subscriber are decoupled, so you shouldn't really be thinking in terms of user a being connected to user b.
If you want a client to receive messages when they are not connected (leaving retained messages to one side), the only way to do this is:
Connect beforehand with cleansession=false
Subscribe with QoS>0 (or on mosquitto use the queue_qos0_messages option)
Ensure that messages are published with QoS>0
When the client reconnects, use cleansession=false
To test this, try:
mosquitto_sub -i prajbot-singh -h test.mosquitto.org -t prajbot-singh -c -q 1
Then quit from mosquitto_sub and run:
mosquitto_pub -h test.mosquitto.org -t prajbot-singh -m hello -q 1
And run mosquitto_sub again:
mosquitto_sub -i prajbot-singh -h test.mosquitto.org -t prajbot-singh -c -q 1

Resources