on_subscribe - ¿Por qué no puedo usar Python-mosquitto en la Raspberry Pi?
python and mqtt (2)
Estoy usando una Raspberry Pi con una imagen Debian Wheezy. He instalado Mosquitto (el intermediario del protocolo MQTT), mosquitto client y python mosquitto para usar mosquitto en mi script de Python, he ejecutado un ejemplo muy simple para comprobar si todos mis paquetes funcionan bien o no.
import mosquitto
mqttc = mosquitto.Mosquitto("python_pub")
mqttc.will_set("/event/dropped", "Sorry, I seem to have died.")
mqttc.connect("127.0.0.1", 1883, 60, True)
mqttc.publish("hello/world", "Hello, World!")
Por alguna razón, me sale el siguiente error.
Traceback (most recent call last):
File "test_1.py", line 1, in <module>
import mosquitto
File "/usr/lib/pymodules/python2.7/mosquitto.py", line 484, in <module>
_mosquitto_log_init = _libmosq.mosquitto_log_init
File "/usr/lib/python2.7/ctypes/__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "/usr/lib/python2.7/ctypes/__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /usr/lib/libmosquitto.so.1: undefined symbol: mosquitto_log
¿Alguien puede explicar por qué esto no funciona y una posible solución?
El módulo Mosquitto Python ha sido donado al proyecto Eclipse Paho. Se puede instalar usando "pip install paho-mqtt" y hay documentación disponible en https://pypi.python.org/pypi/paho-mqtt
Los usuarios existentes del módulo Mosquitto Python deberían encontrar muy fácil transferir su código a la versión de Paho.
http://mosquitto.org/documentation/python/
Ejemplo oficial de https://eclipse.org/paho/clients/python/ :
import paho.mqtt.client as mqtt
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe("$SYS/#")
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("iot.eclipse.org", 1883, 60)
# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()
¡Pruebalo!
De hecho, estoy desarrollando un proyecto para mi universidad usando mosquitto como intermediario de MQTT. Te recomiendo usar paho como el módulo de Python para publicar y suscribirse usando MQTT.
La página oficial:
https://pypi.python.org/pypi/paho-mqtt
Aquí hay un ejemplo muy simple que se suscribe al árbol de temas $ SYS del agente e imprime los mensajes resultantes (tomados de https://pypi.python.org/pypi/paho-mqtt ):
import paho.mqtt.client as mqtt
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe("$SYS/#")
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("iot.eclipse.org", 1883, 60)
# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()