Websocket 摩斯基托高速公路服务器聊天

Websocket 摩斯基托高速公路服务器聊天,websocket,mqtt,autobahn,Websocket,Mqtt,Autobahn,我正在尝试使用autobahn python连接到mosquitto代理。 如果我使用包含以下代码的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

我正在尝试使用autobahn python连接到mosquitto代理。 如果我使用包含以下代码的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))
它连接到代理并检索客户端发布到控制通道的所有消息

我想以某种方式将使用websocket的消息推送到一个网页,因为我正在尝试使用websocket autobahn py并从这里修改示例

我的代码是这样的

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回溯(最新版本) 最后调用):文件“myserver.py”,第30行,在 mqttc.on_message=on_message name错误:未定义名称“on_message”


问题是您在
EchoServerProtocol
类中定义了
on_message()
函数。这意味着它对全局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))

谢谢你的重播。这就是问题所在。