根据项目需求,从官网上下载相应的tar包,解压编译,并用网上大佬的demo进行测试,对整个使用进行简单的整理,希望能给大家的程序开发提供帮助。在此非常感谢网上大佬们的测试方法与问题解决思路,也非常感谢大佬的demo。
mbedtls下载:https://tls.mbed.org/download
mbedtls编译采取cmake方式:
apt-get update
apt-get install cmake
cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On .
make SHARED=1
make install DESTDIR=xxx //可以自定义编译的路径
编译中出现的类似库没有被引用的情况:
1.可以在PATH下添加相关库的路径
echo $PATH //查看当前的PATH
export PATH=/usr/local/lib:$PATH //添加 /usr/local/lib 到PATH
2.修改/etc/ld.so.conf 添加/usr/local/lib
include /etc/ld.so.conf.d/*.conf
/usr/local/lib
编译成功,我这里是生成相应的可执行文件
demo示例代码:
/*******************************************************************************
* Copyright (c) 2012, 2013 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial contribution
* Ian Craggs - change delimiter option from char to string
* Andrew Domaszek - Modify to use mbedTLS in a naive way
*******************************************************************************/
/*
* build as:
* g++ -lpaho-embed-mqtt3c -lmbedtls -lmbedx509 -lmbedcrypto paho.mqtt-mbedtls.cpp MQTTTransport_mbedTLS.cpp -o paho.mqtt-mbedtls
*/
/*
stdout subscriber
compulsory parameters:
topic to subscribe to
defaulted parameters:
--host localhost
--port 1883
--qos 2
--delimiter \n
--clientid stdout_subscriber
--userid none
--password none
*/
#include <stdio.h>
#include <memory.h>
#include <signal.h>
#include <sys/time.h>
#include <stdlib.h>
#include <poll.h>
#include "MQTTClient.h"
#include "MQTTTransport_mbedTLS.h"
#define DEFAULT_STACK_SIZE -1
class Countdown
{
public:
Countdown()
{
}
Countdown(int ms)
{
countdown_ms(ms);
}
bool expired()
{
struct timeval now, res;
gettimeofday(&now, NULL);
timersub(&end_time, &now, &res);
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
//if (res.tv_sec > 0 || res.tv_usec > 0)
// printf("expired %d %d\n", res.tv_sec, res.tv_usec);
return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);
}
void countdown_ms(int ms)
{
struct timeval now;
gettimeofday(&now, NULL);
struct timeval interval = {ms / 1000, (ms % 1000) * 1000};
//printf("interval %d %d\n", interval.tv_sec, interval.tv_usec);
timeradd(&now, &interval, &end_time);
}
void countdown(int seconds)
{
struct timeval now;
gettimeofday(&now, NULL);
struct timeval interval = {seconds, 0};
timeradd(&now, &interval, &end_time);
}
int left_ms()
{
struct timeval now, res;
gettimeofday(&now, NULL);
timersub(&end_time, &now, &res);
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;
}
private:
struct timeval end_time;
};
int toStop = 0;
void* pMqttClient;
void usage()
{
printf("MQTT stdout subscriber\n");
printf("Usage: stdoutsub topicname <options>, where options are:\n");
printf(" --host <hostname> (default is localhost)\n");
printf(" --port <port> (default is 1883)\n");
printf(" --qos <qos> (default is 2)\n");
printf(" --delimiter <delim> (default is \\n)\n");
printf(" --clientid <clientid> (default is hostname+timestamp)\n");
printf(" --username none\n");
printf(" --password none\n");
printf(" --showtopics <on or off> (default is on if the topic has a wildcard, else off)\n");
exit(-1);
}
void cfinish(int sig)
{
signal(SIGINT, NULL);
toStop = 1;
}
struct opts_struct
{
char* clientid;
int nodelimiter;
char* delimiter;
MQTT::QoS qos;
char* username;
char* password;
char* host;
int port;
int showtopics;
} opts =
{
(char*)"stdout-subscriber", 0, (char*)"\n", MQTT::QOS2, NULL, NULL, (char*)"localhost", 1883, 0
};
void getopts(int argc, char** argv)
{
int count = 2;
while (count < argc)
{
if (strcmp(argv[count], "--qos") == 0)
{
if (++count < argc)
{
if (strcmp(argv[count], "0") == 0)
opts.qos = MQTT::QOS0;
else if (strcmp(argv[count], "1") == 0)
opts.qos = MQTT::QOS1;
else if (strcmp(argv[count], "2") == 0)
opts.qos = MQTT::QOS2;
else
usage();
}
else
usage();
}
else if (strcmp(argv[count], "--host") == 0)
{
if (++count < argc)
opts.host = argv[count];
else
usage();
}
else if (strcmp(argv[count], "--port") == 0)
{
if (++count < argc)
opts.port = atoi(argv[count]);
else
usage();
}
else if (strcmp(argv[count], "--clientid") == 0)
{
if (++count < argc)
opts.clientid = argv[count];
else
usage();
}
else if (strcmp(argv[count], "--username") == 0)
{
if (++count < argc)
opts.username = argv[count];
else
usage();
}
else if (strcmp(argv[count], "--password") == 0)
{
if (++count < argc)
opts.password = argv[count];
else
usage();
}
else if (strcmp(argv[count], "--delimiter") == 0)
{
if (++count < argc)
opts.delimiter = argv[count];
else
opts.nodelimiter = 1;
}
else if (strcmp(argv[count], "--showtopics") == 0)
{
if (++count < argc)
{
if (strcmp(argv[count], "on") == 0)
opts.showtopics = 1;
else if (strcmp(argv[count], "off") == 0)
opts.showtopics = 0;
else
usage();
}
else
usage();
}
count++;
}
}
template <class MQTTTransport_mbedTLS>
void myconnect(MQTTTransport_mbedTLS& ipstack, MQTT::Client<MQTTTransport_mbedTLS, Countdown, 1000>& client, MQTTPacket_connectData& data)
{
printf("Connecting to %s:%d\n", opts.host, opts.port);
int rc = ipstack.connect(opts.host, opts.port);
if (rc != 0)
printf("rc from TCP connect is %d\n", rc);
rc = client.connect(data);
if (rc != 0)
{
printf("Failed to connect, return code %d\n", rc);
exit(-1);
}
printf("Connected\n");
}
void messageArrived(MQTT::MessageData& md)
{
MQTT::Message &message = md.message;
if (opts.showtopics)
printf("%.*s\t", md.topicName.lenstring.len, md.topicName.lenstring.data);
if (opts.nodelimiter)
printf("%.*s", (int)message.payloadlen, (char*)message.payload);
else
printf("%.*s%s", (int)message.payloadlen, (char*)message.payload, opts.delimiter);
fflush(stdout);
}
int main(int argc, char** argv)
{
printf("1111111111111111111111\n");
int rc = 0;
if (argc < 2)
usage();
const char* topic = argv[1];
getopts(argc, argv);
if (strchr(topic, '#') || strchr(topic, '+'))
opts.showtopics = 1;
if (opts.showtopics)
printf("topic is %s\n", topic);
//IPStack ipstack = IPStack();
MQTTTransport_mbedTLS ipstack = MQTTTransport_mbedTLS();
//MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);
MQTT::Client<MQTTTransport_mbedTLS, Countdown> client =MQTT::Client<MQTTTransport_mbedTLS, Countdown>(ipstack);
signal(SIGINT, cfinish);
signal(SIGTERM, cfinish);
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.willFlag = 0;
data.MQTTVersion = 3;
data.clientID.cstring = opts.clientid;
data.username.cstring = opts.username;
data.password.cstring = opts.password;
data.keepAliveInterval = 20;
data.cleansession = 1;
printf("will flag %d\n", data.willFlag);
//myconnect(ipstack, client, data);
printf("Connecting to %s:%d\n", opts.host, opts.port);
rc = ipstack.connect(opts.host, opts.port);
if (rc != 0)
printf("rc from TCP connect is %d\n", rc);
rc = client.connect(data);
if (rc != 0)
{
printf("Failed to connect, return code %d\n", rc);
exit(-1);
}
printf("Connected\n");
rc = 0;
rc = client.subscribe(topic, opts.qos, messageArrived);
printf("Subscribed[%d] to %s\n", rc, topic);
while (!toStop)
{
#if defined(USE_POLLING)
client.yield(10);
struct pollfd pfds[1] = { { ipstack.pollableFd(), POLLIN, 0 } };
int prc = poll(pfds, 1, 1000); // wait 1 sec for fd to have something to read.
#else
client.yield(1000);
#endif
//if (!client.isconnected)
// myconnect(ipstack, cl
}
printf("Stopping\n");
rc = client.disconnect();
ipstack.disconnect();
return 0;
}
测试指令:./pahomqtt2 test123 --qos 0 --host x.x.x.x(服务器IP地址) --port x(端口号) --clientid 12346786 --username root -- password 123 --delimiter 0 --showtopics on
arm环境下的编译:
修改同级目录下的CmakeCache.txt文件,配置其中的编译工具为arm-linux-gcc:
//C compiler.
CMAKE_C_COMPILER:FILEPATH=/usr/local/arm/4.3.2/bin/arm-linux-gcc
编译指令:
cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On .
$ make SHARED=1
$ make install DESTDIR=xxx