MQTT移植和使用
说明:
MQTT有三个关系
发布者 --------> 服务器 ------ > 订阅者
安装服务器
apt-get install mosquitto
安装客户端
apt-get install mosquitto-clients
一般情况下,服务器是不需要移植,直接在阿里云上使用命令安装就行,客户端一般是需要移植到开发板作为发布者或订阅者
先说明路径存放的东西,要不后面容易懵逼
1.存放下载的源码及解压后的文件的目录
/home/embedfire/MQTT
2.存放交叉编译好的文件、库
/opt/mosquitto-arm
3.存放最终拷贝到开发板的文件
/home/embedfire/mqtt-arm
说明:其实3里面的文件就是从2里面拷贝出来的
1.下载源码 (mosquitto uuid openssl)
wget https://sourceforge.net/projects/libuuid/files/libuuid-1.0.3.tar.gz
wget https://www.openssl.org/source/openssl-1.0.2t.tar.gz
wget https://mosquitto.org/files/source/mosquitto-1.4.8.tar.gz
下载并解压
3.在/opt目录下创建目录存放我们交叉编译好的头文件、库
4.交叉编译 uuid 库
在前面已经把下载好的源码放在了~/MQTT目录下,并且解压了
1.进入解压后的目录
2.配置
./configure --prefix=/opt/mosquitto-arm/libuuid-1.0.3 CC=/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc --host=arm-linux
参数说明:
configure–prefix=/opt/mosquitto-arm/libuuid-1.0.3 指定安装路径,就是前面准备好的路径
CC=/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc 设置交叉编译器
–host=arm-linux设置是arm
3.make
4.make install 安装
5.现象
成功之后就可以在/opt/mosquitto-arm 下得到一个 libuuid 的文件夹
5.交叉编译 openssl 库
1.进入解压后的目录
2.配置
- setarch i386 ./config no-asm shared --prefix=/opt/mosquitto-arm/openssl/
参数说明:
setarch i386说明是32为CPU
shared :生成动态连接库
–prefix=/opt/mosquitto-arm/openssl/ 安装路径 - 如果 Makefile 中有 -m32 和-m64 就删掉 -m32 和-m64
- 修改Makefile 里面的编译器参数如下:
-
CC=/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
AR=/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf--ar $(ARFLAGS) r
RANLIB=/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc-ranlib
NM=/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc-nm4.make
5.make insatll
安装成功后会在我们设置/opt/mosquitto-arm 下得到一个 openssl 的文件夹 -
6.交叉编译 mosquitto
1.进入目录
2.编译
make WITH_SRV=no CC=/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc CXX=/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ CFLAGS="-I /opt/mosquitto-arm/openssl/include -I /opt/mosquitto-arm/libuuid-1.0.3/include -I /opt/mosquitto-arm/openssl/lib -I /opt/mosquitto-arm/libuuid-1.0.3/lib" LDFLAGS="-L /opt/mosquitto-arm/openssl/lib -L /opt/mosquitto-arm/libuuid-1.0.3/lib -lssl -lcrypto -luuid"
主要是指明编译C和C++的交叉编译器,依赖库的路径和头文件路径
3.安装
make install DESTDIR=/opt/mosquitto-arm/mosquitto-1.5
4.现象
/opt/mosquitto-arm 下得到一个 mosquitto-1.5 的文件夹
小知识:
1.配置阶段指定安装目录
-
# ./configure --prefix=~/home/out
-
# make -j20
-
# make install
-
注意:在make install时,就按装到了~/home/out下.
2.安装阶段指定安装目录
-
1.Makefile工程
-
# make install DESTDIR=/path
-
2.QT工程
-
make install INSTALL_ROOT=/path
-
3.ninja工程
-
DESTDIR=/path ninja -C . install
-
注意:./path为绝对路径
错误参考:
install -s --strip-program=strip libmosquitto.so.1 /opt/mosquitto-arm/mosquitto-1.5/usr/local/lib/libmosquitto.so.1
strip: Unable to recognise the format of the input file `/opt/mosquitto-arm/mosquitto-1.5/usr/local/lib/libmosquitto.so.1'
打开config.mk。在文件顶部添加如下
CC=arm-linux-gnueabihf-gcc
CXX=arm-linux-gnueabihf-g++
CPP=arm-linux-gnueabihf-g++
AR=arm-linux-gnueabihf-ar
LD=arm-linux-gnueabihf-ld
文件末尾的prefix= 需要输出路径
strip=arm-linux-gnueabihf-strip 注意:要把arm-linux-gnueabihf-strip拷贝到/usr/bin下
3.去掉config.mk中一些选项
WITH_TLS:=no
WITH_TLS_PSK:=no
WITH_SRV:=no
WITH_UUID:=no
当然,如果你需要这些外部库就需要编译出来,并改为yes
4.make && make install
问题:
install -s --strip-program=arm-linux-gnueabihf-strip libmosquitto.so.1 /home/vmuser/mqtt_install/lib/libmosquitto.so.1
strip: Unable to recognise the format of the input file `/opt/mosquitto-arm/mosquitto-1.5/usr/local/lib/libmosquitto.so.1'
好了到这里就把所有的库交叉编译完成了,下面就只需要拷贝过去到开发板即可,大家不要被这些移植吓到!!!!!
7.把编译好的库拷贝到开发板
为了不搞乱我们编译好的库,我们就先创建个目录mqtt-arm
进入cd /opt/mosquitto-arm目录拷贝三个库到我们前面新创建的目录下
cp -rf libuuid-1.0.3/ mosquitto-1.5/ openssl/ /home/lucifer/mqtt-arm
进入/opt/mosquitto-arm/mosquitto-1.5/etc/mosquitto拷贝下面的mosquitto.conf.example到/home/lucifer/mqtt-arm
进入/opt/mosquitto-arm/mosquitto-1.5/bin 找到一下应用,全部拷贝到/home/lucifer/mqtt-arm
5.进入/opt/mosquitto-arm/mosquitto-1.5/sbin拷贝下面文件mosquitto到/home/lucifer/mqtt-arm
6.打包
我们回到我们创建的目录下
tar -czf mqtt-arm.tar.gz mqtt-arm/
以下操作是在开发板上进行
7.开发板解压传过来文件
tar -zxvf mqtt-arm.tar.gz
8.目录下 libuuid-1.0.3/ mosquitto-1.5/ openssl/三个文件下的 lib 下 的库全部 放到开发板的/lib 下面
cp -rf libuuid-1.0.3/lib/* mosquitto-1.5/lib/* openssl/lib/* /lib/
9.前目录下 mosquitto.conf.example 复制一个和他一模一样名为 mosquitto.conf 的文件放 在/etc 下面,命令如下:
cp mosquitto.conf.example /etc/mosquitto.conf
10.拷贝mosquitto相关文件
mv mosquitto mosquitto_* /bin
好了到这里就全部搞定
测试:
1.以开发板作为服务器,Ubuntu 开俩个终端作为订阅者和发布者进行测试
1.使用以下命令启动开发板的 mosquitto 服务
mosquitto -d -c /etc/mosquitto.conf //开启服务器
ps -ef |grep mosquitto查看是否开启成功
2.在Ubuntu上订阅和发布主题
订阅mosquitto_sub -h 192.168.3.28 -t “mqtt” -v
发布mosquitto_pub -h 192.168.3.28 -t “mqtt” -m “Hello MQTT”
3.现象
可以在订阅终端看到 mqtt Hell MQTT
好了,到这里基本确定你是移植成功了,下面就是你写代码开发的时候了
2.编写C代码使用:
服务器(Ubuntu或者开发板或者阿里云服务器):
开启服务器:service mosquitto start
查看是否开启成功:ps -ef | grep mosquitto
发布者:
/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc mqtt_pub.c -o mqtt_pub -I /opt/mosquitto-arm/mosquitto-1.5/include/ -L /opt/mosquitto-arm/mosquitto-1.5/lib/ -L /opt/mosquitto-arm/libuuid-1.0.3/lib/ -L /opt/mosquitto-arm/openssl/lib/ -lmosquitto -lssl -lcrypto -luuid
订阅者:mosquitto_sub -h 192.168.2.105 -t “LJM” -v
参数说明:
/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
我们的交叉编译器
mqtt_pub.c -o mqtt_pub 我们的C文件和编译生成的可执行文件
-I /opt/mosquitto-arm/mosquitto-1.5/usr/local/include/ 指定我们交叉编译好的mosquitto的头文件路径
-L /opt/mosquitto-arm/mosquitto-1.5/lib/ lmosquitto库路径
-L /opt/mosquitto-arm/libuuid-1.0.3/lib/ -luuid库路径
-L /opt/mosquitto-arm/openssl/lib/ -lssl库路径
-lmosquitto -lssl -lcrypto -luuid
订阅者:
/home/lucifer/pro/tool/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc mqtt_sub.c -o mqtt_sub -I /opt/mosquitto-arm/mosquitto-1.5/include/ -L /opt/mosquitto-arm/mosquitto-1.5/lib/ -L /opt/mosquitto-arm/libuuid-1.0.3/lib/ -L /opt/mosquitto-arm/openssl/lib/ -lmosquitto -lssl -lcrypto -luuid
发布者:mosquitto_pub -h 192.168.2.105 -t “LJM” -m “Hello MQTT”
说明:
上面这些是交叉编译我们写的C代码的命令,如果你的安装路径和我的不一样要自己修改哦,还有C代码这里只供参考
一个是发布,一个是订阅
C代码的编写大写可以参考官网提供的API
https://mosquitto.org/api/files/mosquitto-h.html#mosquitto_loop_forever