项目实战-广域网智能家居-把mosquitto移植到arm上
Mosquitto库依赖libuuid和openssl库,所以我们在交叉编译Mosquitto之前需要先交叉编译他所需要的依赖库,这里作者已经把需要的源码都下载好了,大家可以在这个文档的目录下找到。不建议大家下载和我不一致的版本,可能会出问题。
我们把uuid的源码拷贝到Ubuntu,作者是拷贝拷贝到了/home/topeet/mqtt下面,如下图所示:
输入以下命令,解压源码并进入解压生成的文件夹:
tar -vxf libuuid-1.0.3.tar.gz
如下图所示:
然后我们在/opt/下创建一个名为mosquitto-arm的文件夹,命令如下:
mkdir -p /opt/mosquitto-arm
如下图所示:
配置源码,我们在解压生成的uuid库的文件夹输入以下命令:
./configure --prefix=/opt/mosquitto-arm/libuuid-1.0.3 CC=arm-none-linux-gnueabi-gcc --host=arm-linux
如下图所示:
最后,编译并安装,命令如下:
make
make install
编译并安装成功后会在我们设置/opt/mosquitto-arm下得到一个libuuid的文件夹
2. 交叉编译openssl库
解压压缩包进进入解压后的目录
tar -vxf openssl-1.0.2g.tar.gz
cd openssl-1.0.2g
如下图所示。作者是放在了/home/topeet/mqtt目录下
配置编译参数
setarch i386 ./config no-asm shared --prefix=/opt/mosquitto-arm/openssl/
setarch i386:声明生成的是32位CPU,如果是64位CPU则去除该部分
--prefix :指定make install后生成目录的路径,不修改此项则默认为OPENSSLDIR目录(/usr/local/ssl)。
shared :生成动态连接库。
no-asm: 是在交叉编译过程中不使用汇编代码代码加速编译过程,原因是它的汇编代码是对arm格式不支持的
如果Makefile中有 -m32和-m64 就删掉 -m32和-m64,但是我的Makefile中没有,就没管这个。
如下图所示:
修改openss文件夹下的Makefile里面的编译器参数如下
CC= arm-none-linux-gnueabi-gcc
AR= arm-none-linux-gnueabi-ar $(ARFLAGS) r
RANLIB= arm-none-linux-gnueabi-ranlib
NM= arm-none-linux-gnueabi-nm
如下图所示:
编译并安装
make
make install
编译并安装成功后会在我们设置/opt/mosquitto-arm下得到一个openssl的文件夹
3.交叉编译mosquitto
解压压缩包进进入解压后的目录
tar -vxf mosquitto-1.5.tar.gz
cd mosquitto-1.5
如下图所示。作者是放在了/home/topeet/mqtt目录下
编译源码
make WITH_SRV=no CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-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/mosquit/to-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"
注意,如果大家这里安装uuid和openssl的库的时候路径和我的不一致,要把-I和-L指定的库和头文件的路径修改成自己对应安装uuid和openssl库的路径,否则编译不过去。
如下图所示:
编译成功如下图所示:
安装,命令如下
make DESTDIR=/opt/mosquitto-arm/mosquitto-1.5 install
编译并安装成功后会在我们设置/opt/mosquitto-arm下得到一个mosquitto-1.5的文件夹
至此,我们mosquitto就已经交叉编译完成了
4.把mosquitto移植到开发板
在Ubuntu的/home/topeet/下创建一个mqtt-arm的文件夹,如下图所示:
我们进入我们安装的mosquitto-1.5目录下,作者这里是安装在了/opt/mosquitto-arm下,如下图所示:
我们把当前路径下的/etc/mosquitto/下的mosquitto.conf.example文件拷贝到我们在/home/topeet/下创建一个mqtt-arm的文件夹,命令如下:
cp mosquitto.conf.example /home/topeet/mqtt-arm/
如下图所示
然后我们返回到mosquitto的安装目录,我们进到安装目录下mosquitto-1.5/usr/local/bin下面,如下图所示:
我们把这个目录下所有文件拷贝到我们在/home/topeet/下创建一个mqtt-arm的文件夹,命令如下:
cp ./* /home/topeet/mqtt-arm/
如下图所示:
然后我们返回到mosquitto的安装目录,我们进到安装目录下mosquitto-1.5/usr/local/sbin下面,如下图所示:
我们把这个目录下的mosquitto二进制文件拷贝到我们在/home/topeet/下创建一个mqtt-arm的文件夹,命令如下:
然后我们返回到mosquitto的安装目录,把libuuid-1.0.3 mosquitto-1.5 openssl这个三个文件夹全部拷贝到我们在/home/topeet/下创建一个mqtt-arm的文件夹,命令如下:
cp -rf libuuid-1.0.3/ mosquitto-1.5/ openssl/ /home/topeet/mqtt-arm
如下图所示:
然后我们返回到/home/topeet/下面,使用tar命令打包我们创建的mqtt-arm文件,命令如下:
tar -czf mqtt-arm.tar.gz mqtt-arm/
如下图所示:
我们把这个压缩包拷贝到开发板的根目录,这里以4412开发板为例,其他开发板操作一致
我们解压这个压缩包,并进入到解压生成的目录,如下图所示:
我们把开发板当前目录下libuuid-1.0.3/ mosquitto-1.5/ openssl/三个文件下的lib下的库全部放到开发板的/lib下面,命令如下:
cp -rf libuuid-1.0.3/lib/* mosquitto-1.5/usr/local/lib/* openssl/lib/* /lib/
如下图所示:
我们把当前目录下mosquitto.conf.example复制一个和他一模一样名为mosquitto.conf的文件放在/etc下面,命令如下:
cp mosquitto.conf.example /etc/mosquitto.conf
如下图所示:
然后我们把剩下的几个文件全部放在开发板的/bin目录下,命令如下:
mv mosquitto mosquitto_* /bin
如下图所示:
然后我们返回到开发板的根目录,删掉我们 mqtt-arm.tar.gz的压缩包和解压生成的mqtt-arm文件夹就可以了。
5.测试是否移植成功
以开发板作为服务器,Ubuntu开俩个终端作为订阅者和发布者进行测试
1,我们打开/etc下面的mosquitto.conf文件, 修改里面的第40行为 user root 并取消注释。如下图所示:
2.使用以下命令启动开发板的mosquitto服务
mosquitto -d -c /etc/mosquitto.conf
如下图所示:
查询是否启动成功,命令如下:
ps -ef |grep mosquitto
如果成功入下图所示:
3.使用ping命令ping一下自己的Ubuntu,这里一定要ping通,否则下面的步骤不成功,命令如下,IP为自己Ubuntu的ip
ping 192.168.3.34 -c 3
成功ping通如下图所示:
4.在文档的第一步,我们就已经在Ubuntu上安装了mosquitto,所示我们直接打开一个终端,订阅主题,命令如下:
mosquitto_sub -h 192.168.3.28 -t "mqtt" -v
其中参数-h是指定要连接的MQTT服务器,这里的192.168.3.28为开发板的IP,大家要根据自己的IP来设置,-t订阅主题,此处为mqtt,所以主题为mqtt,-v打印更多的调试信息。
如下图所示:
5.在Ubuntu上打开另一个终端(注意这里又打开了一个终端),发布主题,命令如下:
mosquitto_pub -h 192.168.3.28 -t "mqtt" -m "Hello MQTT"
其中参数-h是指定要连接的MQTT服务器,这里的192.168.3.28为开发板的IP,大家要根据自己的IP来设置,-t订阅主题,此处为mqtt,-m指定消息内容,这里发送的是
Hello MQTT。
如下图所示:
通信成功以后,我们会在另一个终端看到我们通过开发板作为mqtt服务器转发来的Hello MQTT
信息,如下图所示: