前言

我们在这里做2件事情:

1)编译 paho.mqttmosquitto 2个开源项目的c版本库(mosquitto库没有用上)

2)编译好 依赖 paho.mqtt的库编写例程 + mosquitto 服务器。

host平台   :Ubuntu 16.04

arm 平台 : s5p6818

ssl : openssl-1.0.2t

MQTT-client : paho.mqtt.c

现在我们就来进行MQTT客户端的移植。

MQTT服务器(Broker)在很多 云服务器中自带了,没有特殊需求是不做移植的;而且就算做了 Broker 移植,也相对简单。

主机准备

使用以下脚本即可。

之前《搭建MQTT通信环境,并抓包测试》 没有介绍在:Linux下 编译运行 mosquitto 服务器,所以在下面的脚本中也有介绍,具体参考:make_mosquitto ()

##
# Copyright By Schips, All Rights Reserved
# https://gitee.com/schips/
# File Name: make.sh
# Created : Sat 30 Nov 2019 01:56:37 PM CST
##
#!/bin/sh
BUILD_HOST=arm-linux-
ARM_GCC=${BUILD_HOST}gcc
ARM_CPP=${BUILD_HOST}g++
BASE=`pwd`
OUTPUT_PATH=${BASE}/install OPENSSL=openssl-1.0.2t make_dirs () {
#为了方便管理,创建有关的目录
cd ${BASE} && mkdir compressed install source -p
} tget () { #try wget
filename=`basename $1`
echo "Downloading [${filename}]..."
if [ ! -f ${filename} ];then
wget $1
fi echo "[OK] Downloaded [${filename}] "
} tgit () { #try git and tar
filename=`basename $1 | sed 's/.git//g'` echo "Clone [${filename}]..."
if [ ! -f ${filename}.tgz ];then
git clone $1
rm ${filename}/.git* -rf
echo "Making a tar file."
tar -zcf ${filename}.tgz ${filename}
rm ${filename} -rf
fi echo "[OK] Cloned [${filename}] "
} download_package () {
cd ${BASE}/compressed
#下载包
tget https://www.openssl.org/source/${OPENSSL}.tar.gz
tgit https://github.com/eclipse/paho.mqtt.c.git
tgit https://github.com/eclipse/mosquitto.git
} tar_package () {
cd ${BASE}/compressed
ls * > /tmp/list.txt
for TAR in `cat /tmp/list.txt`
do
tar -xf $TAR -C ../source
done
rm -rf /tmp/list.txt
} pre_make_ssl () {
cd ${BASE}/source/${OPENSSL}
startLine=`sed -n '/install_html_docs\:/=' Makefile`
echo $startLine
# 为了避免 多行结果
for startline in $startLine
do
lineAfter=99
endLine=`expr $startline + 999`
sed -i $startline','$endLine'd' Makefile
echo "install_html_docs:" >> Makefile
echo "\t@echo skip by Schips" >> Makefile
echo "install_docs:" >> Makefile
echo "\t@echo skip by Schips" >> Makefile
echo "# DO NOT DELETE THIS LINE -- make depend depends on it." >> Makefile
break
done
} make_ssl () {
# 编译安装 zlib
cd ${BASE}/source/${OPENSSL}
rm ${OUTPUT_PATH}/${OPENSSL} -rf
echo "SSL ABOUT"
CC=${ARM_GCC} ./Configure no-asm shared --prefix=${OUTPUT_PATH}/${OPENSSL} sed 's/-m64//g' -i Makefile # 删除-m64 关键字 (arm-gcc 不支持)
#sudo mv /usr/bin/pod2man /usr/bin/pod2man_bak
#mv doc/apps /tmp/
pre_make_ssl
make && make install
} make_paho_mqtt_c () {
cd ${BASE}/source/paho.mqtt.c make CFLAGS+="-I ${OUTPUT_PATH}/${OPENSSL}/include" \
LDFLAGS+="-L${OUTPUT_PATH}/${OPENSSL}/lib" \
CC=${ARM_GCC} \
prefix=${OUTPUT_PATH}/paho.mqtt.c # BUG: make install 不符合我们的意愿
rm ${OUTPUT_PATH}/paho.mqtt.c -rf
mkdir ${OUTPUT_PATH}/paho.mqtt.c/lib -p
mkdir ${OUTPUT_PATH}/paho.mqtt.c/bin -p
mkdir ${OUTPUT_PATH}/paho.mqtt.c/include -p cp ${BASE}/source/paho.mqtt.c/build/output/lib* ${OUTPUT_PATH}/paho.mqtt.c/lib -d -v
cp ${BASE}/source/paho.mqtt.c/build/output/samples ${OUTPUT_PATH}/paho.mqtt.c/bin -r -v
cp ${BASE}/source/paho.mqtt.c/build/output/test ${OUTPUT_PATH}/paho.mqtt.c/bin -r -v
cp ${BASE}/source/paho.mqtt.c/src/*.h ${OUTPUT_PATH}/paho.mqtt.c/include -v } make_mosquitto () {
cd ${BASE}/source/mosquitto sed -r -i "/WITH_DOCS:=/ s/.*/WITH_DOCS:=no/" config.mk
sed -r -i "/WITH_SRV:=/ s/.*/WITH_SRV:=no/" config.mk
sed -r -i "/WITH_UUID:=/ s/.*/WITH_UUID:=no/" config.mk
sed -r -i "/WITH_WEBSOCKETS:=/ s/.*/WITH_WEBSOCKETS:=no/" config.mk
sed -r -i "/WITH_STRIP:=/ s/.*/WITH_STRIP:=yes/" config.mk
# 不添加 ssl 支持
sed -r -i "/WITH_TLS:=/ s/.*/WITH_TLS:=no/" config.mk
sed -r -i "/WITH_TLS_PSK:=/ s/.*/WITH_TLS_PSK:=no/" config.mk # 指定工具链
sed -i "N;2aCC=${BUILD_HOST}gcc" config.mk
sed -i "N;2aCXX=${BUILD_HOST}g++" config.mk
sed -i "N;2aCPP=${BUILD_HOST}g++" config.mk
sed -i "N;2aCC=${BUILD_HOST}gcc" config.mk
sed -i "N;2aAR=${BUILD_HOST}ar" config.mk
sed -i "N;2aLD=${BUILD_HOST}ld" config.mk
sed -r -i "/STRIP\?=/ s/.*/STRIP\?=${BUILD_HOST}strip/" config.mk
# 设置输出路径
echo "DESTDIR=${OUTPUT_PATH}/mosquitto" >> config.mk
echo "prefix=\\" >> config.mk make && make install # 添加 ssl 支持 下编译的 mosquitto
#sed -r -i "/WITH_TLS:=/ s/.*/WITH_TLS:=yes/" config.mk
#sed -r -i "/WITH_TLS_PSK:=/ s/.*/WITH_TLS_PSK:=yes/" config.mk
#make \
# CFLAGS+="-I ${OUTPUT_PATH}/${OPENSSL}/include" \
# LDFLAGS+="-L${OUTPUT_PATH}/${OPENSSL}/lib -lssl -lcrypto" #make \
# CFLAGS+="-I ${OUTPUT_PATH}/${OPENSSL}/include" \
# LDFLAGS+="-L${OUTPUT_PATH}/${OPENSSL}/lib -lssl -lcrypto" \
# install
} make_dirs
download_package
tar_package
make_ssl
make_paho_mqtt_c
make_mosquitto
exit $?

目标板准备

将install 下运行库拷贝到板子上,添加到路径即可。

测试

使用以下的测试程序,服务器根据自己的需求进行指定

有关的例程在 ${paho_mqtt_c}/src/samples 可以找到。

/*
# Copyright By Schips, All Rights Reserved
# https://gitee.com/schips/
#
# File Name: main.cpp
# Created : Sun 09 Feb 2020 10:14:44 AM CST
*/ #include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <MQTTClient.h> /* MQTT头文件的位置 */
#include <sys/time.h>
#include <termios.h> #define ADDRESS "tcp://localhost:1883" /* 指定服务器的ip地址 这里使用本机的 mosquitto 进行测试使用 */
#define CLIENTID "ExampleClientPub"
#define TOPIC "MQTT Examples"
#define PAYLOAD "Hello World!"
#define QOS 1
#define TIMEOUT 10000L using namespace std;
int main(int argc, char* argv[])
{
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token; MQTTClient_message *receivemsg = NULL ;
char* topicName_rev = NULL;
int topicLen_rev; int rc;
int i; MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 60;
conn_opts.cleansession = 1; if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to connect, return code %d\n", rc);
exit(-1);
}
pubmsg.payload = (void *)PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
MQTTClient_subscribe(client, "test", 1); /* 订阅一个客户端 的一个话题*/
usleep(10000);
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token); /* 发送消息 */
printf("Waiting for up to %d seconds for publication of %s\n"
"on topic %s for client with ClientID: %s\n",
(int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
printf("Message with delivery token %d delivered\n", token);
for(;;)
{
if(MQTTClient_isConnected(client) == true) /* 检测连接状态 */
{
printf("alive \n");
}else{
printf(" no alive \n");
break;
}
rc = MQTTClient_receive(client,&topicName_rev, &topicLen_rev, &receivemsg,5000); /* 接收消息 */
if(rc == MQTTCLIENT_SUCCESS)
{
printf("Message REv %d delivered\n", rc);
printf("topicName: %s topicName_LEN: %d \n", topicName_rev,topicLen_rev);
if(topicName_rev != NULL) /* 滤掉心跳包 */
{
printf("topicName: ");
for(i=0;i<topicLen_rev;i++)
{
printf(" %c ", topicName_rev[i]);
}
printf("\n");
printf("Data: %s len:%d msgid: %d \n",(char *)receivemsg->payload,receivemsg->payloadlen,receivemsg->msgid);
if(strcmp((char *)receivemsg->payload,"ESC") == 0)
{
printf("ESC \n");
break;
}
}
} usleep(10000);
usleep(100000);
}
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
return rc;
}

编译命令

arm-linux-g++ -I ./paho.mqtt.c/src -L ./paho.mqtt.c/build/output/ -lpaho-mqtt3c main.cpp  -o client

arm linux 移植 MQTT (paho、mosquitto)的更多相关文章

  1. arm linux 移植 x265

    背景 本来想着把 x265编译到ffmpeg里面,搞定了x265的编译:但是一直报ERROR: x265 not found using pkg-config这个错误,我按照网上的资料,查看了ffbu ...

  2. Linux 安装 go 以及 arm linux 移植 go

    背景 Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. 从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码 ...

  3. 移植 MQTT broker mosquitto 到 omapl138

    概述 本次移植使用创龙的 TL138-EVM 开发板,基于 TI 的 MCSDK 开发环境.具体上位机系统为 Ubuntu 12.04-32bit,软件环境基于创龙的用户手册搭建. 为了移植后在 13 ...

  4. arm linux 移植 ffmpeg 库 + x264

    背景 Ffmpeg 中带有h264的解码,没有编码,需要添加x264.libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx264. ...

  5. arm linux 移植 PHP

    背景: PHP 是世界上最好的语言. host平台 :Ubuntu 16.04 arm平台 : 3531d arm-gcc :4.9.4 php :7.1.30 zlib :1.2.11 libxml ...

  6. arm linux 移植支持 HP打印机

    背景 由于业务需要,需要hi3531d主板上加入对于HP打印机的支持. 通过与产品经理,技术主管的沟通:通用支持是不现实的,只要求彩色打印,先不考虑打印机的价格,只要支持一款打印机即可. 注意: Li ...

  7. arm linux 移植 gdb/gdbserver

    背景 调试工具gdb的使用对于嵌入式Linux开发人员来说是一项不可少的技能. 目前,嵌入式 Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机 ...

  8. arm linux 移植 udhcp 与 使用

    背景 在一些网络环境下,需要静态IP不够现实,需要使用DHCP进行自动获取IP地址. udhcpc是一个面向嵌入式系统的非常小的DHCP客户端,字母的缩写微μ- DHCP -客户端client(μDH ...

  9. arm linux 移植 rsync

    背景: 在产品开发中可以使用rsync进行大文件的拷贝,断点续传. host平台 :Ubuntu 16.04 arm平台 : 3531d   rsync   :3.1.3 arm-gcc :4.9.4 ...

随机推荐

  1. Update(Stage4):sparksql:第1节 SparkSQL_使用场景_优化器_Dataset & 第2节 SparkSQL读写_hive_mysql_案例

    目标 SparkSQL 是什么 SparkSQL 如何使用 Table of Contents 1. SparkSQL 是什么 1.1. SparkSQL 的出现契机 1.2. SparkSQL 的适 ...

  2. 验证码校验(Ajax)

    show.jsp <%@ page language="java" contentType="text/html; charset=utf-8" page ...

  3. uniGUI之UniSyntaxEdit(24)

    UniSyntaxEdit1语法高亮显示控件,主要属性Language,它是  多行 1]Language 语言 2]执行 FDquery1.Open(UniSyntaxEdit1.Lines.Tex ...

  4. 01Git复习笔记

    一.Git简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). SVN是集中式版本控制工具. 有哪些GIT网站? https://github.com/ 全球最大的开源项目网站. http ...

  5. 树形下拉框ztree、获取ztree所有父节点,ztree的相关方法

    参考:jQuery树形控件zTree使用小结 需求 添加.修改的终端需要选择组织,组织是多级架构(树状图显示). 思路 1.因为下拉框需要树状图显示,所以排除使用select做下拉框,改用input  ...

  6. HHR计划---作业复盘-直播第三课

    一,出租车广告: 1,三个点不合格:周期太长了,大而全互联网产品,不符合MVP原则:业务关键点丢掉了:没有业务认知和成长. 2,关键假设: (1)车主有没有需求呀,画像怎么样? (2)车主收入如何,能 ...

  7. 腾讯云 docker 镜像 dotnet/core sdk aspnet

    ccr.ccs.tencentyun.com/mcr.microsoft.com/dotnetcoresdk  = mcr.microsoft.com/dotnet/core/sdk  => 3 ...

  8. Python中self的用法

    在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self.其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法. 在python中,类是通 ...

  9. 3_07_MSSQL课程_Ado.Net_委托、事件

    委托和事件的区别? (1)委托是一个类. 事件是一个委托类型的实列. (2)委托可以在定义委托实列的类的外部触发执行.(不安全) 事件只能能在定义它的类的内部触发执行.(安全),类外部只能注册事件的响 ...

  10. Linux命令:grep命令 | egrep命令

    grep:文本搜素工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能被模式所匹配到的行 包含三个命令:grep.egrep(相当于grep -E 扩展的正则表达式)和fgrep(相当于grep ...