wolfSSL & wolfMQTT

新项目要求底端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时,用户基准测试和反馈报告的性能显着提升。

  • 小尺寸:20-100kB
  • 运行时内存:1-36kB
  • 比OpenSSL小20倍

平台和语言支持

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

移植实施

以下是创建自己的项目移植步骤.

  1. Create network callback functions for Connect, Read, Write and Disconnect. See examples/mqttnet.c and examples/mqttnet.h.
  2. Define the callback functions and context in a MqttNet structure.
  3. Call MqttClient_Init passing in a MqttClient structure pointer, MqttNet structure pointer, MqttMsgCb function pointer, TX/RX buffers with maximum length and command timeout.
  4. Call MqttClient_NetConnect to connect to broker over network. If use_tls is non-zero value then it will perform a TLS connection. The TLS callback MqttTlsCb should be defined for wolfSSL certificate configuration.
  5. Call MqttClient_Connect passing pointer to MqttConnect structure to send MQTT connect command and wait for Connect Ack.
  6. Call MqttClient_Subscribe passing pointer to MqttSubscribe structure to send MQTT Subscribe command and wait for Subscribe Ack (depending on QoS level).
  7. Call MqttClient_WaitMessage passing pointer to MqttMessage to wait for incoming MQTT Publish message.