环境说明
- MQTT源码:paho_开源c_mqtt
- 阿里云版本:debian
阿里云部署mqtt代理
-
SecureCRT远程登陆阿里云
2、使用储存库安装 EMQ X-
安装所需要的依赖包
sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
-
添加 EMQ X 的官方 GPG 密钥
curl -fsSL https://repos.emqx.io/gpg.pub | sudo apt-key add - -
使用以下命令设置 stable 存储库
sudo add-apt-repository “deb [arch=amd64] https://repos.emqx.io/emqx-ce/deb/debian/ $(lsb_release -cs) stable”
这里不会打印任何信息 -
更新 apt 包索引
sudo apt update
-
安装最新版本的 EMQ X
sudo apt install emqx
这里稍微等待,需要下载19M. -
查询可用版本
sudo apt-cache madison emqx
-
使用第二列中的版本字符串安装特定版本,例如 4.0.0
sudo apt install emqx=4.0.0这里稍微等待,出现选项选y
-
启动 EMQ X
emqx start
-
查看状态
emqx_ctl status
至此mqtt代理服务器就搭建完成了。
-
动态库和静态库
-
动态库
linux下动态库文件以 lib*.so结尾。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行用到相应的函数时才会被被载入,因此编译出来的可执行文件比较小,在程序运行时还需要动态库存在,动态库的改变不会影响程序,后期程序的升级比较方便。多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次。
由于动态库使得可执行文件小,Linux下编译的默认动作是动态库。
-
静态库
静态库文件以 lib*.a结尾,多个*.o文件打包生成静态库文件。静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库。编译之后程序文件大,但加载快,隔离性也好,如果静态库改变,整个程序将重新编译。
mqtt源码动态库编译
-
在git下下载paho C库
git clone https://github.com/eclipse/paho.mqtt.c.git -
进入到mqtt根目录下,make编译动态库
make之后出现错误
解决方法下载libssl-doc
但是会出现以下错误
所以我找遍了百度终于找到以下解决方案
运行sudo aptitude install libssl-dev的时候会出现三个反问,注意第一个选n,不接受这个包,降级处理,第二个和第三个选y。最后就会再mqtt源码根目录下的build/output下生成动态库
-
在mqtt源码根目录下运行make intsall安装库到ubuntu
此时就可以在/usr/local/lib下看到库了
测试连接阿里云
- 将/paho.mqtt.c/src/samples目录下的MQTTAsync_subscribe.c和MQTTAsync_publish.c拷贝到test目录下
-
vim修改MQTTAsync_publish.c
地址改成阿里云的公网ip
消息随便改
-
vim修改MQTTAsync_subscribe.c
-
gcc编译,注:一定要添加链接库
生成可执行文件,分别用两个终端运行 -
首先看一下阿里云1883端口连接了多少个客户端
netstat -nat | grep -iw “1883” | wc -l
目前只有一个 -
运行ubuntu中的两个客户端
publish
订阅端
-
此时阿里云mqtt服务器连接了2个客户端,按理说应该连接3个,但是发布端发布完消息后立即断开了,所以只有两个。
到这里阿里云mqtt服务器已经搭建成功,源码编译mqtt客户端完成,并且成功做了测试。