网络知识 娱乐 mqtt协议产品化实现-FreeRTOS实现mqtt客户端

mqtt协议产品化实现-FreeRTOS实现mqtt客户端

0、背景

        前面的两篇博客,笔者分别介绍了华为鸿蒙系统中实现mqtt客户端和mosquitto实现服务端broker,本节将介绍一下FreeRTOS中是如何实现mqtt客户端的。FreeRTOS是一款应用在小微型处理器上的实时操作系统,在嵌入式系统中应用非常广泛,当前的物联网终端设备如果要接入互联网,需要支持联网的操作系统,FreeRTOS就提供了这样的一套解决轻量级的解决方案。在这套解决方案中提供了C/S架构下的请求/响应(http)和发布/订阅(mqtt)两种消息模式,完全可以满足小微设备的联网诉求。

1、FreeRTOS简介

        FreeRTOS是在MIT开源版权下的,应用在小微型处理器上的实时操作系统,内核大小只有6k~12k,完整的mqtt实现大小在45k~64k,实现了连接、安全和相关功能的开源标准,适合小微型设备连接到边缘计算设备或者云端。从诞生至今已经超过18年,每170s就会被下载一次,FreeRTOS的构成包括一个内核和一个不断增长的适合于商业化应用的IOT包集合。具有可信的内核、商业级的精确定时和广泛的生态系统支持(诸如arm、microchip、mips、nxp、st、TI、xilinx等合作伙伴),支持40+的体系结构和15+的工具链[1],可以很方便地连接到AWS云端。

2、FreeRTOS中mqtt客户端实现

        这一部分我们将介绍一下FreeRTOS中是如何实现mqtt协议的,笔者也希望通过mqtt这样一个实现实例去梳理一下FreeRTOS的架构,如下图所示是笔者整理的mqtt协议的实现架构,本图例是依据FreeRTOS-plus的代码架构得来的,在模块编排上依据自上而下的依赖关系组织。mqtt作为FreeRTOS支持的两大核心应用层协议之一,实现了物联网终端设备的入网,在整个架构中承担着mqtt客户端的角色,可以发布和订阅主题;mqtt服务端broker角色,FreeRTOS主要支持与mosquitto开源项目的对接,因此使用该小节的FreeRTOS CoreMQTT和前面的mosquitto开源项目[2]就可以搭建一个完整的发布/订阅通信架构。后续笔者也将会将这一套架构搬移到边缘计算相关的实现中。

         继续往上图里边的模块看,mqtt客户端的实现包括4层,自上而下依次是应用层、传输层、网络层(包括辅助功能)和FreeRTOS内核,其实就是一套完整的协议栈和系统。我们的mqtt客户端是在应用层实现的,当前只支持3.1.1版本,低内存、增强了不同场景对qos的支持,比如在资源受限的场景只有qos0,资源丰富的场景可以用qos2和tls连接。对底层网络驱动隔离(对应着代码路径的network_transport),方便应用程序开发者选择自己的传输层,除了标准c库不依赖其他任何库,支持主题泛型,即可以批量订阅和发布主题,详见下图,支持完整的log信息记录。mqtt代理可以创建一个背景线程,管理mqtt的连接,是一个独立的mqtt agent任务,可以用在多线程的场景。在代码路径上对应着CoreMQTT和coreMQTT-Agent两个目录,两者的依赖关系也列在了图中。

        来到传输层,除了基本的传输层协议外,在编码格式上,FreeRTOS支持json和plaintext两种编码方式,coreJSON包提供了一种基于键值(key lookups)的解析器,用标准c语言开发,具备跨平台的可移植性和良好的可读性。在这一层还包括安全相关的模块,FreeRTOS支持mbedtls、X.509证书和pkcs11加密三种方式,前两种安全在笔者前面的博客中都有提及,pkcs11是这个系统独有的,它是基于OASIS标准,通过key存储、设置和获取加密对象的属性,硬件独立的。

        网络层就是tcp/ip协议的实现,与之前的华为鸿蒙系统直接使用的lwip或者at设备不同,FreeRTOS自己在各类操作系统的基础上,搞了一套轻量级的适合于嵌入式平台的tcp/ip协议栈,支持在不同的平台上移植,当然了应用开发者也可以自己选择想要的平台。

        最后我们来看一下这套实现mqtt协议的系统的大小,首先FreeRTOS内核大小只有6k~12k,mqtt核心协议的大小在7k~9k左右,json的大小在2~3k,pkcs11有10k左右的代码,完整的tcp/ip大小在20~30k,总代码量在45k~64k之间,在实际的工程实践中,我们可以根据硬件资源和场景进行裁剪,如果没有tls相关的安全诉求,就可以节省一部分的空间开销,在FreeRTOS的官方指导文档中也有这样的一些demo,感兴趣的读者可以去翻阅。

3、与华为鸿蒙系统的对比

        在实际的工程选择中,如果我们想选用实现mqtt客户端协议的开源项目,鸿蒙和FreeRTOS都是可选的方案,开发和维护者都是在各自领域(一个工业界,一个是学术界)比较顶尖的。商业视角来看,鸿蒙系统主要跟华为的IOT云平台绑定(提供broker功能),而FreeRTOS主要跟亚马逊的云平台对接,当然它也可以跟开源的mosquitto项目对接,灵活性更强,如果是用于学术研究和个人开源项目可以选择这个操作系统的实现。

        在安全管理方面,FreeRTOS具有更加丰富的安全策略和解决方案,而鸿蒙系统主要是支持mbedtls这一种,究竟选择哪种方案需要根据实际的应用场景和硬件方案进行,引入复杂的安全策略也会带来更多的空间资源消耗,所以不能以此来评价哪种管理策略更好。在TCP/IP协议栈的实现上,鸿蒙系统直接使用了现有的开源项目或者基于硬件模组开发,FreeRTOS则基于嵌入式的tcp/ip协议栈开发进行了自研,但是并没有将这个协议栈与mqtt进行绑定,应用开发者仍然可以自行选择自己想用的实现。

4、小结

        这一小节简单介绍了,在当前嵌入式小微型处理器场景下,广泛使用的FreeRTOS中如何实现mqtt客户端功能的,笔者并没有深入到源代码层次去一一解析这个协议,只是给出了一个系统的架构。后续笔者会将这一小节结合前面的mosquitto开源项目一起在边缘计算项目中进行实战,那时会有更多的实践经验再与大家分享。

参考文献:

[1]FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions

[2](2条消息) MQTT协议产品化实现-mosquitto开源产品(1)_linus_ben的博客-CSDN博客