Search code examples
ibm-cloudmqttmosquittowatson-iot

MQTT subscription gets lost in Bluemix container


I am using the Bluemix IoT service. My program consists of the following elements:

  1. Publisher (Local Machine)
  2. Subscribed (Bluemix)
  3. Publisher (Bluemix)
  4. Subscriber (Local Machine)

I am currently following the steps Publisher (local machine) > Subscriber (Bluemix) > Publisher (Bluemix) > Subscriber (local machine)

The issue I am facing is the moment I try to use both the subscribers together the service unsubscribes from both the ends. If I keep only subscriber the steps work perfect. The topics I am using are as follows:

topic = "iot-2/type/mymqttdevice/id/mynewdev/evt/iotData/fmt/json"

topic2 = "iot-2/type/mymqttdevice/id/mynewdev/evt/iotFile/fmt/json"

Can someone guide what am I doing wrong here?

EDIT: Adding code

Publisher on local machine is a python file consisting of typical connect and publish method. After each publish I disconnect from the IoT service.

Subscriber code on Bluemix:

# -*- coding: utf-8 -*-

#!/usr/bin/env python

import paho.mqtt.client as mqtt
import os, json
import time

organization = "xel7"
username = ""
password = ""


#Set the variables for connecting to the iot service
broker = ""
devicename = "mynewdev"
topic = "iot-2/type/mymqttdevice/id/mynewdev/evt/iotData/fmt/json"

deviceType = "mymqttdevice"

topic2 = "iot-2/type/mymqttdevice/id/mynewdev/evt/iotFile/fmt/json"

clientID = "a:" + organization + ":appId"

broker = organization + ".messaging.internetofthings.ibmcloud.com"
mqttc = mqtt.Client(clientID)

if username is not "":
 mqttc.username_pw_set(username, password=password)


def on_connect(client, userdata, flags, rc):
 print("Connected with result code "+str(rc))

def on_subscribe(mosq, obj, mid, granted_qos):
 print("Subscribed: " + str(mid) + " " + str(granted_qos))


def on_message(client, userdata, msg):
    with open('indurator.txt', 'w') as fd:
     txt = (msg.payload.decode('string_escape'))
     fd.write(txt)
     #print txt
     fd.close()
     mqttc.publish(topic2,msg.payload);

mqttc.connect(host=broker, port=1883, keepalive=60)
test = mqttc.subscribe(topic,0)

mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_message = on_message

mqttc.loop_forever()

Subscriber code on local machine to receive file published from Bluemix subscriber:

-- coding: utf-8 --

#!/usr/bin/env python

import paho.mqtt.client as mqtt
import os, json
import time

organization = "xel7"
username = ""
password = ""


#Set the variables for connecting to the iot service
broker = ""
devicename = "mynewdev"

deviceType = "mymqttdevice"

topic = "iot-2/type/mymqttdevice/id/mynewdev/evt/iotFile/fmt/json"

clientID = "a:" + organization + ":appId"

broker = organization + ".messaging.internetofthings.ibmcloud.com"
mqttc = mqtt.Client(clientID)

if username is not "":
 mqttc.username_pw_set(username, password=password)


def on_connect(client, userdata, flags, rc):
 print("Connected with result code "+str(rc))

def on_subscribe(mosq, obj, mid, granted_qos):
 print("Subscribed: " + str(mid) + " " + str(granted_qos))


def on_message(client, userdata, msg):
    with open('receivednew.txt', 'w') as fd:
     txt = (msg.payload.decode('string_escape'))
     fd.write(txt)
     #print txt
     fd.close()

mqttc.connect(host=broker, port=1883, keepalive=60)
test = mqttc.subscribe(topic,0)

mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_message = on_message

mqttc.loop_forever()

Solution

  • Glad you figured out the solution. To summarize as hardillb and amadain mentioned, the same client ID should not be used simultaneously per the Watson IoT Platform documentation.

    If a client ID is being re-used, when you attempt to connect to the IoT platform, your device or application receives an error. This may indicate your disconnects are due to the clientID being re-used or “stolen”.

    enter image description here

    If you have two devices connecting with the same clientId and credentials – that leads to the clientId stealing. Only one unique connection is allowed per clientID; you can not have two concurrent connections using the same ID. If 2 clients attempt to connect to IoT at the same time using the same client ID, a connection error occurs