mbedtls 安装与使用

       根据项目需求,从官网上下载相应的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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值