Mosquito con WS sobre apache2


Instalar Mosquitto con Websockets


Primero debemos instalar mosquitto con compatibilidad para websockets, en esta entrada esta enfocada para Ubuntu, para puedes consultar esta entrada para opensuse.

Instalando dependencias.


$ sudo apt-get update
$ sudo apt-get install build-essential python quilt devscripts python-setuptools libssl-dev cmake libc-ares-dev uuid-dev

Instalando libwebsockets


$ wget https://github.com/warmcat/libwebsockets/archive/v1.3-chrome37-firefox30.tar.gz
$ tar zxvf v1.3-chrome37-firefox30.tar.gz
$ cd libwebsockets/
$ mkdir build
$ cd build/
$ sudo cmake .. -DOPENSSL_ROOT_DIR=/usr/bin/openssl
$ sudo make
$ sudo make install

Descarga el código de mosquitto.


$ wget http://mosquitto.org/files/source/mosquitto-1.4.2.tar.gz
$ tar zxvf mosquitto-1.4.2.tar.gz
$ cd mosquitto-1.4.2

Edita el archivo config.mk cambiando la siguiente linea:

WITH_WEBSOCKETS:=no
A
WITH_WEBSOCKETS:=yes

$ sudo make
$ sudo make install
$ sudo cp mosquitto.conf /etc/mosquitto

Configuración


Crea el siguiente archivo de configuración para mosquitto , en donde especificaremos los puertos a usar y el protocolo.

$ sudo vim /etc/mosquitto/mosquitto.conf

listener 1883 localhost

Debemos crear un usuario para mosquitto con la siguiente linea.

$ sudo useradd -r -m -d /var/lib/mosquitto -s /usr/sbin/nologin -g nogroup mosquitto

Para iniciar mosquitto usamos el siguiente comando.

$ mosquitto -c /etc/mosquitto/mosquitto.conf



En algunas ocaciones puede dar el siguiente error:

mosquitto: error while loading shared libraries: libwebsockets.so.6: cannot open shared object file: No such file or directory

Se debe que a que la instalación de libwebsockets se encuentra en /usr/local/lib y mosquitto lo busca en /usr/lib o /usr/lib64 para x64 Se soluciona creando un link simbólico

$ sudo ln -s /usr/local/lib/libwebsockets.so.6 /usr/lib64/libwebsockets.so.6

Configurando apache.



Descargamos el modulo de apache para trabajar con  websockets. 

$ git clone git://github.com/disconnect/apache-websocket.git

Este modulo lo he probado en CentOS Ubunutu 14.04 y OpenSuse y trabaja perfectamente, primero instalamos las dependencias para compilar el código. 

 $ sudo apt-get install scons apache2-dev 
 $ cd apache-websockets

Editamos el archivo SConstruct para que apunte a nuestras librerías de apr /usr/include/apr-1.0 este puede variar según nuestra distribución.

Construimos con:

$ scons

e instalamos con:

$ scons install

Ahora instalamos el modulo para la conexión con mosquitto, clonando el siguiente repositorio. 

$ git clone https://github.com/willem4ever/mod_websocket_mosquitto.git
$ cd mod_websocket_mosquitto.

Igual editamos la referencia  a las librerias en el archivo SConstruct  dependiendo de nuestra distribución pueden estar en otros directorios.

 Compilamos e instalamos:

$ scons

$ scons install



Creamos los archivos de configuración de apache. 

$ sudo vi /etc/apache2/mods-available/websocket.load

LoadModule websocket_module /usr/lib/apache2/modules/mod_websocket.so 
LoadModule websocket_draft76_module /usr/lib/apache2/modules/mod_websocket_draft76.so

$ sudo vi /etc/apache2/mods-available/websocket.conf

<IfModule mod_websocket.c> 
    Loadmodule mod_websocket_mosquitto /usr/lib/apache2/modules/mod_websocket_mosquitto.so
    <Location /mqtt> 
        MosBroker localhost 
        MosPort 1883 
        SetHandler websocket-handler 
        WebSocketHandler /usr/lib/apache2/modules/mod_websocket_mosquitto.so mosquitto_init
    </Location>
</IfModule>


En algunos casos es necesario corregir los permisos.

$ ll /usr/lib/apache2/modules
....
 -rw-r--r--   1 root root 14344 2012-02-14 20:59 mod_usertrack.so
 -rw-r--r--   1 root root 10240 2012-02-14 20:59 mod_version.so
 -rw-r--r--   1 root root 10248 2012-02-14 20:59 mod_vhost_alias.so
 -rwxr-xr-x 1 root root 19109 2012-10-28 20:09 mod_websocket_draft76.so
 -rwxr-xr-x 1 root root 13599 2012-10-29 16:19 mod_websocket_mosquitto.so
 -rwxr-xr-x 1 root root 27675 2012-10-28 20:09 mod_websocket.so 
....
 $ sudo chmod 644 /usr/lib/apache2/modules/mod_websocket* 

Para finalizar activamos el modulo en apache y reiniciamos el servicio

 $ sudo a2enmod websocket
 $ sudo /etc/init.d/apache2 restart


Si estas usando el mod_rewrite para omitir index.php sobre el directorio principal puedes usar una configuracion similar a esta para omitir el Location  donde le indicamos que usara mosquitto. 

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine On
    RewriteRule ^(mqtt)($|/) - [L]
    #Send request via index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>


Fuente:



Comentarios

Publicar un comentario

Entradas más populares de este blog

Instalación de PROXMOX (por usb)

Firmar y publicar una app de Cordova en Play Store

Método PERT.