0

我正在尝试使用高速公路 python 连接到蚊子经纪人。如果我使用其中包含以下代码的 sub.py:

import mosquitto

def on_connect(mosq, obj, rc):
    print("rc: "+str(rc))

def on_message(mosq, obj, msg):
    print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

def on_publish(mosq, obj, mid):
    print("mid: "+str(mid))

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

def on_log(mosq, obj, level, string):
    print(string)

mqttc = mosquitto.Mosquitto()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
# Uncomment to enable debug messages
mqttc.on_log = on_log
mqttc.connect("localhost", 1883, 60)
mqttc.subscribe("control", 0)


rc = 0
while rc == 0:
    rc = mqttc.loop()

print("rc: "+str(rc))

它正在连接到代理并检索客户端发布到控制通道的所有消息。

我想以某种方式使用 websockets 将这些消息推送到网页,因为我正在尝试使用 websocket autobahn py 并从这里修改示例http://autobahn.ws/python/getstarted#yourfirstserver

我的代码是这样的

import sys
import mosquitto

from twisted.internet import reactor
from twisted.python import log

from autobahn.websocket import WebSocketServerFactory, \
                               WebSocketServerProtocol, \
                               listenWS


class EchoServerProtocol(WebSocketServerProtocol):
    def on_connect(mosq, obj, rc):
    print("rc: "+str(rc))

    def on_message(mosq, obj, msg):
        print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

    def onMessage(self, msg, binary):
      print "sending echo:", msg
      self.sendMessage(msg, binary)

    def on_publish(mosq, obj, mid):
        print("mid: "+str(mid))

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

mqttc = mosquitto.Mosquitto()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
# Uncomment to enable debug messages
mqttc.on_log = on_log
mqttc.connect("192.168.2.109", 1883, 60)
mqttc.subscribe("control", 0)


rc = 0
while rc == 0:
    rc = mqttc.loop()

print("rc: "+str(rc))   
if __name__ == '__main__':

   log.startLogging(sys.stdout)

   factory = WebSocketServerFactory("ws://192.168.2.109:8899", debug = TRUE)
   factory.protocol = EchoServerProtocol
   listenWS(factory)

   reactor.run()

但是当我尝试运行它时收到此错误:

root@Ubuntu:~/authobahn# python myserver.py Traceback(最近一次调用最后):文件“myserver.py”,第 30 行,在 mqttc.on_message = on_message NameError: name 'on_message' is not defined

4

1 回答 1

0

问题是你已经on_message()在类中定义了你的函数EchoServerProtocol。这意味着它对全局 mqttc 变量不可见。您可能还希望将所有 mqttc 代码也放入您的类中,尽管这取决于您实际想要实现的目标。

您可以执行以下代码:

import mosquitto

class MyMQTTClass:
    def __init__(self, clientid=None):
        self._mqttc = mosquitto.Mosquitto()
        self._mqttc.on_message = self.mqtt_on_message
        self._mqttc.on_connect = self.mqtt_on_connect
        self._mqttc.on_publish = self.mqtt_on_publish
        self._mqttc.on_subscribe = self.mqtt_on_subscribe

    def mqtt_on_connect(self, mosq, obj, rc):
        print("rc: "+str(rc))

    def mqtt_on_message(self, mosq, obj, msg):
        print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

    def mqtt_on_publish(self, mosq, obj, mid):
        print("mid: "+str(mid))

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

    def mqtt_on_log(self, mosq, obj, level, string):
        print(string)

    def run(self):
        self._mqttc.connect("test.mosquitto.org", 1883, 60)
        self._mqttc.subscribe("$SYS/#", 0)

        rc = 0
        while rc == 0:
            rc = self._mqttc.loop()
        return rc


# If you want to use a specific client id, use
# mqttc = MyMQTTClass("client-id")
# but note that the client id must be unique on the broker. Leaving the client
# id parameter empty will generate a random id for you.
mqttc = MyMQTTClass()
rc = mqttc.run()

print("rc: "+str(rc))
于 2013-06-24T08:13:50.740 回答