新项目要求底端MSP430设备使用MQTT-TLS加密方式传输,Google后搜到一个叫做wolfSSL和wolfMQTT的开源库。
wolfSSL & wolfMQTT 介绍
wolfSSL Embedded SSL Library
简介
wolfSSL嵌入式SSL库是一个用ANSI C编写的轻量级SSL / TLS库,针对嵌入式,RTOS和资源受限的环境 - 主要是因为它的体积小,速度快,功能集小。它通常在标准操作环境中使用,因为其免版税的价格和卓越的跨平台支持。wolfSSL支持高达当前TLS 1.2和DTLS 1.2级别的行业标准,比OpenSSL小20倍,并提供ChaCha20,Curve25519,NTRU和Blake2b等渐进式密码。在使用wSSSSL而不是OpenSSL时,用户基准测试和反馈报告的性能显着提升。
平台和语言支持
wolfSSL是为了最大的可移植性而构建的,并且通常在新平台上很容易编译
wolfSSL支持将C编程语言作为主接口。它还支持其他几种主机语言,包括Java(wolfSSL JNI),C#(wolfSSL C#),Python以及PHP和Perl(通过swig接口)。
支持的芯片制造商
wolfSSL有芯片,包括ARM,英特尔,摩托罗拉,mbed,支持NXP /飞思卡尔,Microchip的(PIC32)/ Atmel公司,意法半导体(STM32F2 / F4),亚德诺半导体,德州仪器,以及更多
wolfMQTT Client Library
简介
MQTT(消息队列遥测传输)是一种轻量级的开放式消息传递协议,专为M2M(机器对机器)和物联网(物联网)等需要小代码占用空间的受限环境而开发。MQTT基于发布消息和订阅主题的Pub / Sub消息传递原则。该协议有效地打包消息以尽量减少开销。MQTT规范建议TLS作为传输选项来保护使用端口8883(secure-mqtt)的协议,因为MQTT协议本身不提供安全性。受限设备可以从使用TLS会话恢复来减少重新连接成本中受益。
wolfMQTT库是用C语言编写的用于嵌入式应用的MQTT的客户端实现。它通过wolfSSL库支持SSL / TLS。由此可以提供MQTT协议缺乏的安全性。wolfMQTT建立在多平台,太空良知和可扩展的基础之上。它支持所有数据包类型,所有服务质量(QoS)级别0-2,并支持使用wolfSSL库的SSL / TLS。此实现基于MQTT v3.1.1规范。
- 小尺寸:3.6kB
- 能够利用轻量级wolfSSL嵌入式SSL / TLS库
- 用原生C89编写
- 最小的外部依赖性
- 少于1200行代码
支持的芯片制造商
wolfSSL有芯片,包括ARM,英特尔,摩托罗拉,mbed,支持NXP /飞思卡尔,Microchip的(PIC32)/ Atmel公司,意法半导体(STM32F2 / F4),亚德诺半导体,德州仪器,以及更多
wolfMQTT编译
wolfMQTT编译需要先编译wolfSSL。
windows平台编译
本指南为开发人员和工程师将wolfSSL轻量级SSL / TLS库移植到新的嵌入式平台,操作系统或传输介质(TCP / IP,蓝牙等)提供了参考。它调用wolfSSL代码库中的区域,在移植wolfSSL时通常需要修改。它应该被认为是一个“指南”,因此它是一个不断发展的工作。
参考地址1
https://www.wolfssl.com/docs/visual-studio/
需要配置为DLL_Release且平台为Win32,会在DLL_Release文件夹下生成.dll和.lib的动态库和静态库文件
将这两个文件拷贝到MQTT的目录下,再打开MQTT工程编译即可
嵌入式平台编译
参考地址wolfSSL移植指南(PDF)1
https://www.wolfssl.com/docs/porting-guide/
这是用C语言编写的用于嵌入式应用的MQTT客户端的实现,它通过wolfSSL库支持SSL / TLS。 这个库建立在多平台,空间良知和可扩展的基础之上。 与wolfSSL集成以提供TLS支持。
架构
这个库包含三个部件.
1. mqtt_client
这是MQTT客户端的顶级应用程序接口所在的位置。
int MqttClient_Init(MqttClient *client, MqttNet *net, MqttMsgCb msg_cb, byte *tx_buf, int tx_buf_len, byte *rx_buf, int rx_buf_len, int cmd_timeout_ms);
These API’s are blocking on MqttNet.read
until error/timeout (cmd_timeout_ms
):
int MqttClient_Connect(MqttClient *client, MqttConnect *connect);
int MqttClient_Publish(MqttClient *client, MqttPublish *publish);
int MqttClient_Subscribe(MqttClient *client, MqttSubscribe *subscribe);
int MqttClient_Unsubscribe(MqttClient *client, MqttUnsubscribe *unsubscribe);
int MqttClient_Ping(MqttClient *client);
int MqttClient_Disconnect(MqttClient *client);
这个函数阻止等待一个新的发布消息到达timeout_ms
的最大持续时间。
int MqttClient_WaitMessage(MqttClient *client, MqttMessage *message, int timeout_ms);
这些是包装MqttNet回调并处理WolfSSL TLS的网络连接/断开接口:
int MqttClient_NetConnect(MqttClient *client, const char* host, word16 port, int timeout_ms, int use_tls, MqttTlsCb cb);
int MqttClient_NetDisconnect(MqttClient *client);
帮助函数:
const char* MqttClient_ReturnCodeToString(int return_code);
2. mqtt_packet
这是处理所有数据包编码/解码的地方。
头部包含MQTT数据包结构,用于:
- Connect:
MqttConnect
- Publish / Message:
MqttPublish
/MqttMessage
(they are the same) - Subscribe:
MqttSubscribe
- Unsubscribe:
MqttUnsubscribe
3. mqtt_socket
这是传输套接字可选地包装TLS并使用MqttNet
回调进行平台特定网络处理的地方。
头部包含用于网络回调和上下文的MQTT网络结构MqttNet
。
移植实施
以下是创建自己的项目移植步骤.
- Create network callback functions for Connect, Read, Write and Disconnect. See
examples/mqttnet.c
andexamples/mqttnet.h
. - Define the callback functions and context in a
MqttNet
structure. - Call
MqttClient_Init
passing in aMqttClient
structure pointer,MqttNet
structure pointer,MqttMsgCb
function pointer, TX/RX buffers with maximum length and command timeout. - Call
MqttClient_NetConnect
to connect to broker over network. Ifuse_tls
is non-zero value then it will perform a TLS connection. The TLS callbackMqttTlsCb
should be defined for wolfSSL certificate configuration. - Call
MqttClient_Connect
passing pointer toMqttConnect
structure to send MQTT connect command and wait for Connect Ack. - Call
MqttClient_Subscribe
passing pointer toMqttSubscribe
structure to send MQTT Subscribe command and wait for Subscribe Ack (depending on QoS level). - Call
MqttClient_WaitMessage
passing pointer toMqttMessage
to wait for incoming MQTT Publish message.