MQTT订阅在Bluemix容器中丢失

时间:2017-03-30 06:48:49

标签: ibm-cloud mqtt mosquitto watson-iot

我正在使用Bluemix IoT服务。我的程序包含以下元素:

  
      
  1. 发布者(本地计算机)
  2.   
  3. 订阅(Bluemix)
  4.   
  5. 发布者(Bluemix)
  6.   
  7. 订阅者(本地计算机)
  8.   

我目前正在执行这些步骤 发布者(本地机器)>订户(Bluemix)>出版商(Bluemix)>订户(本地机器)

我面临的问题是,当我尝试同时使用两个订阅者时,服务取消订阅两端。如果我只保留订阅者,那么步骤就完美无缺。我正在使用的主题如下:

  

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

     

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

有人可以指导我在这里做错了吗?

编辑:添加代码

本地计算机上的Publisher是一个python文件,由典型的连接和发布方法组成。每次发布后,我都会断开与物联网服务的连接。

Bluemix上的订阅者代码:

UserLoggedIn == null

本地计算机上的订户代码,用于接收从Bluemix订户发布的文件:

- - 编码:utf-8 - -

# -*- 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()

1 个答案:

答案 0 :(得分:3)

很高兴你找到了解决方案。总结为hardillb和amadain提到的,不应该根据Watson IoT Platform documentation同时使用相同的客户端ID。

如果正在重复使用客户端ID,当您尝试连接到IoT平台时,您的设备或应用程序会收到错误。这可能表示您的断开连接是由于clientID被重复使用或“被盗”。

enter image description here

如果您有两台设备连接相同的clientId和凭据 - 这会导致clientId窃取。每个clientID只允许一个唯一的连接;您不能使用相同的ID进行两个并发连接。 如果2个客户端尝试使用相同的客户端ID同时连接到IoT,则会发生连接错误