前言

我们在这里做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. Python语言——列表生成式

    生成[1x1, 2x2, 3x3, ..., 10x10]列表: >>> L = [] >>> for x in range(1, 11):... >> ...

  2. Lucene的初步了解和学习

    Lucene的学习一,什么是全文检索 1.数据的分类 1.结构化数据 格式固定,长度固定,数据类型固定. 例如:数据库中的数据: 2.非结构化数据 word文档,pdf文档,邮件,html,txt 格 ...

  3. 【CoreBluetooth】iOS 系统蓝牙框架

    https://www.jianshu.com/p/eb58dcbae5f9 2016.06.07 23:04* 字数 285 阅读 852评论 4喜欢 3 暂时 第一次功能性研究,具体实现,后续添加 ...

  4. selenium webdriver 相关网站

    ITeye:http://shijincheng0223.iteye.com/blog/1481446 http://ztreeapi.iteye.com/blog/1750554 http://sm ...

  5. 63 滑动窗口的最大值 &&front(),back()操作前一定要判断容器的尺寸不能为0

    给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6, ...

  6. Python 基础之推导式

    一.列表推导式 通过一行循环判断,遍历出一系列数据的方式就是推导式 特点:方便,简洁,可以实现一些简单的功能推导式当中只能跟循环和判断(单项分支)种类分为三种: 列表推导式  集合推导式  字典推导式 ...

  7. 已知空间三点组成的面求该面上某点的Z值

    已知空间三点,那么可以就可以确定空间三点组成的平面.此时可以根据某一点的X值和Y值,来求取该点在平面上的Z值.这个过程对于求三角面片上某点的高程或者权值特别有用,其本身也可以看作一种线性插值. 其算法 ...

  8. Python中from scipy.misc import imread报错的原因?

    from scipy.misc import imread 报错 查询后其原因是from scipy.misc import imread,imwrite 等方法已经被弃用,Python已经将imre ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:将页面元素所包含的文本内容替换为背景图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. B. Shortest Cycle 无向图求最小环

    题意: 给定 n 个点,每个点有一个权值a[i],如果a[u]&a[v] != 0,那么就可以在(u,v)之间连一条边,求最后图的最小环(环由几个点构成) 题解:逻辑运算 & 是二进制 ...