最近接触物联网,感觉太有意思了,打算弄个用手机控制的遥控小车,
手机与小车之前通讯采用MQTT,服务器就需要安装mosquitto,于是就有了这篇文章,期间经历了不为人知的心酸与苦楚,早上起来,到晚上6点才整成功,记录一下中间过程。
linux centos7.4
这种方式是linux直接安装安装mosqutto软件的方式,
但是我这边配置ws,wss, SSL证书的教程没有,只支持到mqtt消息订阅与发布
总结就是操作简单,很容易就安装,并投入使用。
如果需要配置ws,wss,SSl等,请直接去第二步骤。
(第二部操作会比较繁琐,功能也能强大,比如支持微信小程序需要的wss加密链接)
cmake用来编译代码,经常用
yum install gcc-c++
yum install cmake
yum install openssl-devel
创建一个soft文件夹,用来存放下载的文件
mkdir soft
cd soft
wget http://mosquitto.org/files/source/mosquitto-1.4.10.tar.gz
tar -xzvf mosquitto-1.4.10.tar.gz
cd mosquitto-1.4.10
cmake ..
make
make install
简单配置一下
mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf
启动程序
-d 表示挂后台,根据自己情况要不要加
mosquitto -c /etc/mosquitto/mosquitto.conf -d
默认端口是1883
查看一下这个端口是否被占用,能看到tcp,tcp6两行基本上就算成功了。
netstat -tunlp|grep 1883
tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN 18987/mosquitto
tcp6 0 0 :::1883 :::* LISTEN 18987/mosquitto
再用软件MQtt.fx简单测试一下我们部署的mqtt服务;
发布一个hello 主题的 消息
如果中间出现什么找不到libmosquitto.so.1的话,输入以下指令修改一下libmosquitto.so的位置
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
sudo ldconfig
虽然成功了,但是有个问题需要思考一下,目前为止好像还没有验证账号,随便哪个人都能用呢。
现在来配置账号
修改一下配置文件"/etc/mosquitto/mosquitto.conf",没有的话自己创建一个“touch” 指令。
#禁止匿名登录
allow_anonymous false
#存放用户的文件
password_file /etc/mosquitto/pwfile.example
#权限文件
acl_file /etc/mosquitto/aclfile.example
test 账号,test123 是密码
mosquitto_passwd -b /mosquitto/config/pwfile.conf test test123
然后重新启动一下mosquitto服务。就可以了。
先说说需求吧,在手机点开一个连接,进入控制界面,点击按钮实现 小车的前进后退等功能。
这时候需要实时交互,但是浏览器不支持mqtt 协议,只有websockets能用,这时候就到这个文章的重点了,我得给mosquitto 支持websockets!
网上搜了一大堆文章都是说直接修改下面这个配置文件
/etc/mosquitto/mosquitto.conf
然后我就改了,加了websockets进去
#MQTT协议
port 1883
#websockets协议
# 主要是这两行
listener 8888
protocol websockets
#
#禁止匿名登录
allow_anonymous false
#存放用户的文件
password_file /etc/mosquitto/pwfile.example
#权限文件
acl_file /etc/mosquitto/aclfile.example
然后启动mosquitto,报错了
Error: Websockets support not available. Error found at /etc/mosquitto/mosq...
到处搜解决办法,看了几个都是说在mosquitto安装目录里面config.mk修改配置 no=>yes
# Build with websockets support on the broker.
WITH_WEBSOCKETS:=no
改成yes后,重新编译文件,运行mosquitto,还是一样的报错!就是这个问题花了一下午时间都在找解决办法,后面还不得不尝试各个版本的mosquitto,最后还是失败!
没办法了,后来无意间看到docker,就想去用docker试试了。
eclipse-mosquitto这个镜像应该是docker上面使用最多的,功能也很强大。
可以支持:
mqtt: http 非加密型
mqtt: https 加密型
ws: websockets 的http 非加密型
wss: websockets的https 加密型
平时使用的mqtt一般都是使用1883端口
如果开启websockets就是mqtt支持websocket, 例如:http://mqtt.xxx.com
如果开启websockets并配置证书密钥就是mqtt支持websockets,例如:https:mqtt.xxx.com
像微信小程序只支持https,这也是我写下这篇文章的来源了。
docker pull eclipse-mosquitto
每次重启,都从linux环境中的文件映射给docker容器里面程序
注意一下当前为止,pwd 指令。我用的是home目录
mkdir -p /home/mosquitto/config
mkdir -p /home/mosquitto/data
mkdir -p /home/mosquitto/log
chmod -R 755 /home/mosquitto
chmod -R 777 /home/mosquitto/log
这个是我自己用的,支持http与https的
# 关闭匿名模式
allow_anonymous false
# 指定密码文件
password_file /mosquitto/config/pwfile.conf
#持久化本地存储
persistence true
persistence_location /mosquitto/data
#日志的保存文件
log_dest file /mosquitto/log/mosquitto.log
#log_type error
#log_type warning
#log_type notice
#log_type subscribe
#log_type unsubscribe
# mqtt 这个端口是mqtt默认用的,尽量别改
listener 1883
protocol mqtt
# websocket 端口根据自己需要修改
listener 8887
protocol websockets
#websockets_log_level all
# websocket ssl 端口根据自己需要修改
listener 9001
protocol websockets
cafile /mosquitto/data/mqtt.xxx.com.ca.crt
keyfile /mosquitto/data/mqtt.xxx.com.server.key
certfile /mosquitto/data/mqtt.xxx.com.server.crt
# mqtt ssl ,端口根据自己需要修改
listener 8883
protocol mqtt
cafile /mosquitto/data/mqtt.xxx.com.ca.crt
keyfile /mosquitto/data/mqtt.xxx.com.server.key
certfile /mosquitto/data/mqtt.xxx.com.server.crt
tls_version tlsv1.2
不难发现上面的配置文件只要是涉及到https ssl的两个端口都要证书
生成证书指令,这边需要的是linux的openssl指令(没有的自己装一下)。
这边有个需要注意的地方是,创建两个key的时候记得用不同的地址
ca文件
1. 创建ca文件 :openssl genrsa -des3 -out ca.key 2048
2. 创建crt证书文件:openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
3. 创建服务器用的key文件:openssl genrsa -out server.key 2048
4. 服务器需要的scr文件: openssl req -new -out server.csr -key server.key
5. 服务器需要的crt文件:openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360
实际上配置mqtt ssl的时候只需要三个文件,在第四步列出来了.
其他几个文件如何使用呢?
举个例子,我的客户端,也就是windows电脑有个mqtt软件,
打开SSL/TLS那个标签,就可以选择用ca证书文件的方式访问服务器的htts端口了
这里很长一条指令,主要映射mqtt端口1883,其他三个端口根据自己需要配置,配置文件,数据文件,日志文件
docker run -it --name=mosquitto --privileged -p 1883:1883 -p 8886:8886 -p 8887:8887 -p 8888:8888-v /home/mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf -v /home/mosquitto/data:/mosquitto/data -v /home/mosquitto/log:/mosquitto/log -d eclipse-mosquitto
这时候应该还没有用户账号,我们去添加几个
# 进入docker 容器
docker exec -it mosquitto sh
# 添加账号密码
mosquitto_passwd -b /mosquitto/config/pwfile.conf test test1233
# 创建完成后退出容器,ctrl+p 然后 ctrl+q
docker restart mosquitto
如果用nginx代理那两个ssl的端口的话要加上https哦!
原身安装mosquitto其实很简单,但是其中开启websockets的配置,很坑,配置文件里面只有一个配置yes or no来控制,也没有其他的说明。即使把no 改成yes也不行,最后很是无奈,用上docker,太TM香了。期间查了好多网页打开过几百个链接,百度出来的结果都是一个模子出来的(拉机),后来出去找到了eclipse-mosquitto的官网,看了几篇教程,终于配置好了htts。