这两天研究一下MQTT协议,玩玩物联网的东西,然后发现mosquitto是个比较著名的服务器端,所以下下来,然后配置玩了几下,过程中也遇到一些问题,这里记录一下。
首先进行安装,这里采用源码安装的方式,非常简单
1. 从git复制代码到服务器上
git clone https://github.com/eclipse/mosquitto
2. 修改 config.mk
通过vi找到WITH_SRV 这个然后配置成no,这个目前不晓得干啥子用,但是这个选择YES mosquitto-auth-plug 会有问题,plug编译完成的so配置到配置文件调用会报 undefined symbol ares_library_init 错误,查看了一些资料说是缺少一个库,但是通过yum方式安装,然后依旧报错,所以,这里直接关掉方便一点。
3.然后make & make install 就安装完毕了
接下来要解决一些用户认证的问题
mosquitto提供了一种 username/password的方式管理客户端,但是这个默认是通过文件管理用户名密码,而且文件修改还得重启服务器不是很智能,万幸,mosquitto也考虑到这一点,提供了鉴权的口给外部,只要按照定义实现就可以调用自己想要的鉴权方式,这个git上有个一mosquitto-auth-plug 很成熟就决定用这个。支持非常多的数据库比如 MySQL Redis 还有很多可以去git上查看,https://github.com/jpmens/mosquitto-auth-plug。
mosquitto-auth-plug 的安装比mosquitto麻烦一点首先看官网安装一下依赖
安装完依赖以后就是对config.mk进行修改,默认config.mk是空的,但是目录下提供了一个模板 config.mk.in 可以把内容复制进去,然后编辑
首先看到有如下的一句话,这个是配置所需要支持的存储类型
# Select your backends from this list
BACKEND_CDB ?= no
BACKEND_MYSQL ?= yes
BACKEND_SQLITE ?= no
BACKEND_REDIS ?= no
BACKEND_POSTGRES ?= no
BACKEND_LDAP ?= no
BACKEND_HTTP ?= no
BACKEND_JWT ?= no
BACKEND_MONGO ?= no
BACKEND_FILES ?= no
BACKEND_MEMCACHED ?= no
我这里选择的是经典的MySQL方式,
下来就是指定mosquitto源码位置,配置文件默认给的例子提供的是mac路径
# Specify the path to the Mosquitto sources here
# MOSQUITTO_SRC = /usr/local/Cellar/mosquitto/1.4.12
MOSQUITTO_SRC = /home/mosquitto/mosquitto
下来指定openSSL的可执行文件所在目路
# Specify the path the OpenSSL here
OPENSSLDIR = /usr/bin
下来的部分就是指定一些库和头文件所在的位置,基本上按照注释说明的来就行了,下面是我的例子
# Specify optional/additional linker/compiler flags here
# On macOS, add
# CFG_LDFLAGS = -undefined dynamic_lookup
# as described in https://github.com/eclipse/mosquitto/issues/244
#
# CFG_LDFLAGS = -undefined dynamic_lookup -L/usr/local/Cellar/openssl/1.0.2l/lib
# CFG_CFLAGS = -I/usr/local/Cellar/openssl/1.0.2l/include -I/usr/local/Cellar/mosquitto/1.4.12/include
CFG_LDFLAGS = -L/usr/lib64/openssl/engines/
CFG_CFLAGS = -I/usr/include/openssl/ -I/home/mosquitto_makefile/mosquitto/lib
配置完成后执行make指令,然后就会有一个 auth-plug.so的文件在目录下生成了,接下来按照 plug的官网给出的配置说明进行配置就好了,这里特别说明一下,官网底下password给出的示例的加密结果是错的,害我浪费了非常多的时间。。。,数据库存储的密码加密方式是 PBKDF2WithHmacSHA256 这里的SHA可以自己指定。