2013-06-23 3 views
0

Я пытаюсь подключиться к брокеру mosquitto, используя autobahn python. Если я использую sub.py, который имеет этот код внутри:autobahn mosquitto server chat

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 автобана ру и модифицируем пример здесь 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() 

, но я получаю эту ошибку, когда я пытаюсь запустить его:

[email protected]:~/authobahn# python myserver.py Traceback (most recent call last): File "myserver.py", line 30, in mqttc.on_message = on_message NameError: name 'on_message' is not defined

ответ

0

проблема заключается в том, что вы определили свой on_message() Functio n внутри класса 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)) 
+0

Thsnk вас для переигровки. В этом проблема была. – bogdanioanliviu