Instalando y configurando Mosquitto en la Raspberry Pi
Mosquitto es un broker MQTT. Se trata, en pocas palabras, de un servidor en el que podemos publicar información, o suscribirnos a la información que se publique. ¿Qué utilidad puede tener esto para nosotros? Pues en un sistema como el que estamos desarrollando, en el que tenemos ciertos nodos sensores que reciben información del medio de forma bastante heterogénea (sensores RF, comandos en sistemas Linux, sensores de luz, información meteorológica obtenida de páginas web, …) tiene muchísima utilidad. Podemos hacer que los sensores publiquen toda esta información en un lugar centralizado, y luego mediante openHAB suscribirnos a esa información y provocar ciertos comportamientos en base a ella (como encender unas farolas si hay poca luz y nos encontramos en el lugar, o regar las plantas si la humedad del suelo baja demasiado, …).
Vamos a ello. Añadimos el repositorio oficial de Mosquitto y lo instalamos:
curl -O http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key sudo apt-key add mosquitto-repo.gpg.key rm mosquitto-repo.gpg.key cd /etc/apt/sources.list.d/ sudo curl -O http://repo.mosquitto.org/debian/mosquitto-repo.list sudo apt-get update sudo apt-get install mosquitto mosquitto-clients python-mosquitto
Actualización 20-05-2015: Parece que han cambiado el nombre del fichero mosquitto-repo.list a mosquitto-jessie.list o mosquitto-wheezy.list y dependiendo de la versión de la distribución que tengáis, deberéis cambiar el comando anterior para bajaros una u otra. Gracias a Alberto por la nota.
Una vez hecho esto, si todo ha ido bien, deberemos tener el servidor mosquitto funcionando, escuchando peticiones en el puerto 1883, registrando errores en /var/log/mosquitto/mosquitto.log, y usando la configuración de /etc/mosquitto/mosquitto.conf. Lo podemos comprobar con el comando:
netstat -an --ip -p
Vamos a ir un poco más allá de la configuración por defecto y vamos a activar el soporte de cifrado SSL/TLS. Necesitaremos crear un certificado autofirmado para nuestra autoridad de certificación (CA), y después generar un certificado, firmado por esta CA, para nuestro servidor mosquitto (o pagar y pedir uno a Verisign…). En este punto, el autor del programa mqttitude, Jean-Piet Mens ha pensado en todos y ha creado un script que lo hace por nosotros. Lo descargamos, y lo ejecutamos:
wget https://github.com/binarybucks/mqttitude/raw/master/tools/mosquitto-setup.sh chmod +x mosquitto-setup.sh mkdir TLS cd TLS wget https://github.com/binarybucks/mqttitude/raw/master/tools/TLS/generate-CA.sh chmod +x generate-CA.sh cd ..
Antes de ejecutar el script mosquitto-setup.sh tenemos que cambiar unas lineas para que nos deje todos los archivos en las rutas correspondientes a nuestra instalación en lugar de en la carpeta /tmp/mosquitto, y con los permisos correctos para el usuario mosquitto:
sed -i 's/MOSQHOME=\/tmp\/mosquitto/MOSQHOME=\/etc\/mosquitto/g' mosquitto-setup.sh sed -i 's/cafile $MOSQHOME\/ca.crt/cafile $MOSQHOME\/ca_certificates\/ca.crt/g' mosquitto-setup.sh sed -i 's/certfile $MOSQHOME\/server.crt/certfile $MOSQHOME\/certs\/server.crt/g' mosquitto-setup.sh sed -i 's/keyfile $MOSQHOME\/server.key/keyfile $MOSQHOME\/certs\/server.key/g' mosquitto-setup.sh sed -i 's/#listener 1883/listener 1883/g' mosquitto-setup.sh sed -i 's/listener 1883 127.0.0.1/#listener 1883 127.0.0.1/g' mosquitto-setup.sh sed -i 's/MOSQUITTOUSER=${MOSQUITTOUSER:=$USER}/MOSQUITTOUSER=mosquitto/g' mosquitto-setup.sh sed -i 's/CACERT=${DIR}\/ca/CACERT=${DIR}\/ca_certificates\/ca/g' TLS/generate-CA.sh sed -i 's/SERVER=\"${DIR}\/${host}\"/SERVER=\${DIR}\/certs\/server/g' TLS/generate-CA.sh
De forma opcional también podemos revisar y cambiar algunos valores del script generate-CA.sh, como las variables ALT_HOSTNAMES, CA_ORG y CA_DN a valores que nos gusten para esos campos de los certificados. Si los dejamos tal cual, no pasa nada, el funcionamiento será el mismo, pero a la hora de ver las propiedades de los certificados veremos las diferencias (cadenas de texto en los atributos del certificado). Ejecutamos el script mosquitto_setup.sh y comprobamos que tenemos todos los certificados en las carpetas /etc/mosquitto/ca_certificates y /etc/mosquitto/certs, y el fichero de configuración en /etc/mosquitto/mosquitto.conf.
Con todo esto, ya podemos iniciar el servicio (/etc/init.d/mosquitto start) y comprobar que ahora tenemos el servidor escuchando por los puertos 1883 (normal) y 8883 (seguro).
Para probarlo abrimos dos terminales, y en uno ejecutamos el subscriptor:
cd /etc/mosquito/ca_certificates mosquitto_sub --cafile ca.crt -h 127.0.0.1 -p 8883 --tls-version tlsv1 -v -t sensores/#
y en el otro vamos publicando mensajes con:
cd /etc/mosquito/ca_certificates mosquitto_pub --cafile ca.crt -h 127.0.0.1 -p 8883 --tls-version tlsv1 -t sensores/temp/salon -m 17 mosquitto_pub --cafile ca.crt -h 127.0.0.1 -p 8883 --tls-version tlsv1 -t sensores/temp/exterior -m 13 mosquitto_pub --cafile ca.crt -h 127.0.0.1 -p 8883 --tls-version tlsv1 -t sensores/hum/invernadero -m 92
En siguientes entradas del blog, iré profundizando más en la configuración de MQTT y configuraremos la aplicación mqttitude para que nos publique cada cierto tiempo la posición de nuestro móvil Android en el servidor mosquitto, y más adelante configuraremos openHAB para que actúe en función de la localización del móvil. Espero que os guste, estad atentos porque ya están las entradas en el horno…
ACTUALIZACIÓN 17/04/2014: Parte 2 disponible aquí.
Buenas noches,
estoy bastante liada con el tema de la configuración de mosquitto. Estoy basando mi proyecto en la unificación de MQTT y Openhab para desarrollar la estructura de una casa domotica y el paso de mensajes entre la Arduino y la Raspberry por paso de mensajes. Quiero configurar Mosquitto para que se inicie mosquitto una vez se arrancque la Raspberry Pi pero no se si eso es posible y me estoy volviendo loca buscandolo.
¿Podéis ayudarme?
Gracias.
Un saludo.
La forma mas facil de hacer que algun programa se ejecute en el arranque es incluir el comando en el archivo /etc/rc.local seguido de un simbolo & para que se ejecute en segundo plano.
La forma ‘bien’ es crear un script en /etc/init.d o en /etc/init para que el programa se arranque como un servicio del sistema con el gestor de servicios que lleve tu sistema (upstart o similar).
Si se como agregarlo al script de inicio, la cuestión era si conocíais algun script para hacerlo. Ya que no se si es posible agregarlo o no porque como ademas no puedo arrancarlo con el usuario root.Y tampoco he visto scripts para el arranque de mosquitto.
En el archivo mosquitto .conf puedes agregar la linea start_type automatic y ya después lo cargas con mosquitto -c /etc/mosquitto/conf.d/mosquitto.conf
Se me olvidó comentar que cuando lanzo mosquitto, no puedo hacerlo con root. Me da error al intentar lanzarlo con este usuario, con otros usuarios si que arranca la aplicación sin problema.
¿Sabéis porque es? ¿Se puede solucionar de alguna forma?
Gracias.
Un saludo.
La forma mas facil de comprobar que un programa se esta ejecutando es listar los procesos activos con el comando ps:
root@jdomo:~# ps aux | grep mosquitto
mosquit+ 569 0.1 0.0 3856 1216 ? Ss ago24 17:29 /usr/local/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
root 28616 0.0 0.0 3296 752 pts/0 S+ 08:26 0:00 grep –color=auto mosquitto
Tambien puedes comprobarlo, haciendo un netstat -an y comprobando si el puerto 1883 y 8883 (que son los puertos estandar de mosquitto) estan abiertos.
Esto es lo que me refiero, si lo uso con el usuario root me dice que no es valido ese usuario, si lo lanzo con cualquier otro se ejecuta sin problemas. Por eso preguntaba si podia ejecutarse con root o no, o quizas a mi no me deje porque configure algo mal o que.
root@raspberrypi:~# mosquitto -d -c /opt/mosquitto/mosquitto.conf
1441051997: Error: Invalid user ‘mosquitto’.
root@raspberrypi:~# sudo su – openhab
openhab@raspberrypi ~ $ mosquitto -d -c /opt/mosquitto/mosquitto.conf
1441052017: mosquitto version 1.2.3 (build date 2015-08-30 20:51:14+0200) starting
1441052017: Config loaded from /opt/mosquitto/mosquitto.conf.
Si en el archivo de configuracion añades la linea:
user usuario
cuando lo arranques como root, se ejecutara como ese ‘usuario’ que le has indicado.
Si te bajas el paquete deb de mosquito (por ejemplo de aqui: http://ftp.us.debian.org/debian/pool/main/m/mosquitto/mosquitto_1.3.4-2_armhf.deb) y los descomprimes, en la carpeta /etc de dentro del fichero tienes los scripts para que mosquitto arranque automaticamente en Debian. Si lo has instalado a partir de un paquete .deb deberias tener ya esos archivos en tu sistema.
Si te bajas el .deb lo puedes instalar con dpkg -i archivo.deb
Espero que te sea de ayuda, si no, vemos mas opciones 😉
Al final consegui tenerlo en el arranque instalando todo de nuevo.
Gracias.
Me alegro mucho 🙂
jose maria soy estudiante de electronica y tengo en mi proyecto de titulacion la difcultad de comunicar mi raspberry con unos modulos esp8266 crees poder ayudarme ?
Claro, aunque yo te recomendaria que usases un firmware para los ESP8266 como el ESPEasy. Puedes ver un ejemplo de como lo uso yo en la entrada sobre domotizar un aire acondicionado.