当前位置: 首页 > 科技观察

物联网(IoT)操作系统比较

时间:2023-03-20 00:45:12 科技观察

介绍IoT(物联网)一直是一个在市场上没有爆火,但被炒作的概念。最近看了Brillo(Goolge发布的OSforIoT),结合手头的项目,聊聊IoT旗帜下的操作系统及其生态。可以让大家在选择这样的嵌入式系统软件平台时少一些困惑。首先,我不会在这里描述什么是物联网,因为这个概念太笼统了。但凡事都有套路。在我看来,大多数物联网操作系统都遵循这样的套路(应用场景):InternetPANCloud<->Boardrouter<->Nodes(thingsconnected)^^^|||----Smartdevice-----(e.g.phone,tablet)这个场景基本适用于家庭、楼宇和工业等,所以谁提出什么方案都可以按照这个套路走,下面你会看到。在本文中,我们将讨论以下操作系统:操作系统列表Brillo(来自Google的用于构建连接设备的解决方案)mbedOS(ARMmbed,ARM物联网设备平台)RIOT(物联网的友好操作系统)Contiki(用于物联网)Zephyr(一种用于资源受限系统的小型可扩展实时操作系统)Nuttx(一种强调标准合规性和占用空间小的实时操作系统)除了单独介绍这些操作系统外,我们还将有一个横向竞赛。目的是让项目负责人和产品经理在选择系统时有一个合理的参考。在嵌入式系统中,Linux当然更容易使用。但是当系统较小,容量不足以运行Linux时,就很容易纠结,尤其是对生态要求高的应用。intret=hw_get_module(LIGHTS_HARDWARE_MODULE_ID,&module);if(ret||!module)err(1,"Failedtoload%s",LIGHTS_HARDWARE_MODULE_ID);ret=module->methods->open(module,LIGHT_ID_NOTIFICATIONS,reinterpret_cast(&light_device));if(ret||!light_device)err(1,"Failedtoopen%s",LIGHT_ID_NOTIFICATIONS);上面代码调用HAL统一接口打开一个LIGHT设备,是不是很眼熟?然后启动一个Daemon,使用WeaveAPI接收来自网络的数据XMPP请求来配置或监控设备的状态。在云端和移动端,您可以使用网页版的WeaveDevelopersConsole和WeaveApp来控制监控设备。Brillo可以在资源较少的MPU上运行,35MB的内存就可以了,旧的ARM9可能也可以。它可以建立许多低成本的设备节点,用于与智能设备和云端的通信,或者作为PAN中外部设备的边界路由器。Brillo应该具有很高的可玩性。可以在家里的PC和路由器上运行,生态系统强大。但是致命的缺陷就是我们身处天朝,你懂的。相信国内的BAT之类的都会考虑移植、改造、变异。就像安卓一样。2、mbedOS2.1介绍mbed是ARM自己建立的物联网解决方案平台。ARMmbedIoT设备平台提供操作系统、云服务、工具和开发人员生态系统,使大规模创建和部署基于标准的商业IoT解决方案成为可能。它被ARM分成了三个部分,mbedCloudmbedDeviceConnectormbedClientARM实际上自己构建了一个Cloud,可以通过“mbedDeviceConnector”来访问连接到云端的设备。它还提供了网页版的Connector来管理设备,用户可以通过RESTfulAPIoverHTTP编写自己的APP。“mbedClient”的定义如下:一个将设备连接到mbedDeviceConnectorService的库,看起来很奇怪,但实际上它是一个集合,可以移植到各种操作系统,可以和mbedDeviceConnectorService通信,运行在设备上的硬件软件库。它使用基于UDP的CoAP协议进行通信,使用mbedTLS进行安全连接,兼容LWM2M。2.2mbedClient的架构至此,我们的主角mbedOS就登场了。为了在基于ARMCortex-M内核的硬件平台上运行设备并通过DeviceConnector访问云端,ARM必须有一个能够支持mbedClient的软件解决方案。mbedOS基于RTOS内核,提供各种ARMSoC硬件平台驱动和BSP操作系统。在此之上,实现了整个mbedClient库。在PAN的IoT领域,设备之间的通信可以使用mbedOS提供的解决方案来解决,它支持NFC、RFID、BLE、6LowPAN甚至Thread。在设备与云端的通信方面,mbedOS同时支持以太网、WiFi和3G。运行mbedOS的设备可以是设备节点,也可以是边界路由器(比如6LowPAN转IPv6),也可以通过BLE与智能设备进行通信。mbedDeviceConnector可以使用CoAP协议在设备和云之间进行通信。2.3mbedOS非常强大地支持网络。LWIPIPv4/v6,TCP/UDPmbedBLEstack6LowPAN(host,router,borderrouter)Thread(ED,router,borderrouter)BSDsocketAPI此外,还支持文件系统:cfstore,flash-journal等C++驱动接口,以及驱动程序抽象层HAL几乎所有使用ARMCortexM内核的主要硬件平台。广度不错,但深度有待提高。也就是说,mbed将每一类驱动抽象成一个基类。真正移植驱动的时候,就是从这个类派生出来,然后实现相应的HAL功能。实例化驱动的派生类后,用户可以调用相应的类接口来访问实际的设备驱动。例如,AnalogIn::read()返回ADC的采样结果。2.4mbed生态系统ARM提供在线IDE,可以快速在线编译。离线开发环境也很容易使用。mbedcli类似于android存储库。github上有很多例子,社区比较活跃,有很多小伙伴。ARM已经启动了云和RTOS,让人想起之前的Linaro,看起来很有前途。而且据说国内的BAT也在用mbed做产品。其实就是把mbedCloud换成自己的云,改造DeviceConnector即可。我也在研究mbed,后面会写一些使用的心得。3.RIOT介绍https://github.com/RIOT-OS/RIOT3.1ThefriendlyOperatingSystemfortheInternetofThingsRIOT的官方口号:)如果你的小物联网设备不能运行Linux,使用RIOTRIOT是为开发者准备的,一个开源的、物联网友好的操作系统。它背后没有企业支持,完全由社区驱动。它的一些特点:标准的C/C++编程标准的gcc编译环境可以运行在8位、16位和32位的嵌入式系统上部分兼容POSIX接口(未来目标是完全兼容)支持Linux/Unix在虚拟机上实时运行,快速中断响应(~50个时钟周期)微内核,可以动态加载组件,以及通过消息以最小开销为服务提供多线程支持(<25字节/线程)。丰富的网络支持:6LoWPAN,IPv6,RPL,CoAPandCBOR高精度定时器丰富的工具(Systemshell,SHA-256,Bloomfilters,…)3.2RIOT架构框图RIOTCPUIP驱动基本上有一套统一的接口,但是没有将抽象层放在源码的cpu\periph中。这意味着在做新平台支持的时候,要注意驱动接口要和API文档保持一致,比如ADC的adc_init(),adc_read()。源码的驱动放在板级驱动,比如NXP的MMA8541,使用i2c统一接口访问。因为是微内核的实现,所有的系统服务包括时钟、网络协议栈、网络服务等都是通过创建独立的线程来实现的。线程中有一个event_loop,接收服务请求,处理并发送服务结果。RIOT中最关键的是GNRC(Genericnetworkstack)网络协议栈,它实现了从MAC层到传输层的各种协议,如6LowPan、IPv4/v6、RPL、TCP/UDP等。而这些不同的协议栈都是通过netapi统一接口向用户开放的。针对应用层,GNRC提供了两个API,conn和socket。安全方面,802.15.4层好像没有增加AES支持,只是在应用层提供了tinyDTLS供用户使用。由于RIOT的POSIX和BSDsocket接口的部分兼容,很多应用程序可以很方便的移植。您可以在pkg/中找到libcoap和openwsn等应用程序。RIOT最早由柏林自由大学开发,目前完全由社区维护。似乎大多数开发人员都来自欧洲。从develmaillist来看,感觉社区总体活跃。在驱动方面,Contiki没有统一的驱动框架。驱动由各MCU的开发包提供。这样做的好处是可以保证生成的二进制代码足够小。Contiki有一个非常有特色的模拟器CoojaNetworkSimulator,可以运行很多例子,监控整个网络的数据包和节点状态。这允许用户在没有足够硬件的情况下进行开发。Contiki社区基本上依靠邮件列表来讨论问题,并依靠github来做拉取请求。从maillistarchive来看,社区非常活跃。5.Zephyrhttps://www.zephyrproject.org/Zephyr其实是Linux基金会的一个合作项目。应该是INTEL开源了WindRiver的商业操作系统WindRiverRocket(今年诞生)的一部分之后诞生的一个项目。目前可用的资料不多,支持的硬件平台也很少,ARM平台也不多。Zephyr与Linux非常相似。它的源代码目录结构、Kconfig的使用、启动过程、DriverModel都可以看到。用户的应用程序是启动后创建的最后一个线程。用户的main()将在所有驱动程序、组件和硬件板被初始化后被调用。驱动使用DEVICE_INIT(),组件使用SYS_INIT()初始化,有优先级。驱动会遵循一个统一的驱动结构:structdevice{structdevice_config*config;constvoid*driver_api;void*driver_data;};因此驱动程序必须定义一个配置结构、一组API函数指针和一个驱动程序状态结构。很像Linux。网络支持非常精彩,协议栈实际上是Contiki用的,蓝牙也比较完善。子系统方面,文件系统和USB都很简单,支持也比较原始。在安全方面,接管了mbedTLS和tinyDTLS。总的来说,Zephyr还处于起步阶段,很多东西还不完善。Owner又是Intel,希望不要重蹈Moblin的覆辙。6.Nuttxhttp://www.nuttx.org/Nuttx,实时操作系统,POSIX接口支持,Loadablekernelmodulesupport,BSDsocket,MMUsupport等等,只能说太像Linux了。build也是Kconfig,目录结构和LinuxKernel基本一样。ARM内核基本支持文件系统,VFS也支持,大而全。Network、NANDMTD、pseudo都支持自己的Clib,也可以支持uCLib。全面的网络协议栈,唯独没有无线!自带USB协议栈,一开始没打算讲Nuttx。它的无线支持很差,所以更不用说无线互联网了。但实际上有人将BAT用作云OS。估计团队对linux太熟悉了,跑不了linux就得找个类似的开发环境。有了BAT的支持,Nuttx估计能发展起来。7.比较这里用一个比较简单的表格来比较这些操作系统和生态系统。除了Brillo,其他都是小内核的RTOS。程序占用的内存和代码大小取决于你需要多少个硬件平台驱动程序,你需要什么样的协议栈,以及其他功能。8、收尾最近,行业风向发生了变化。再加上互联网依旧火爆,大家的关注点无疑已经从手机转移到了汽车、工业、物联网上。每个人都希望借助物联网和互联网,实现传统行业产品的互联互通,实现信息共享,提高生活、生产效率和质量。在我们所从事的半导体行业,除了要为市场提供更符合需求的处理器外,我们还需要提供基于我们自己的处理器的软硬件解决方案。操作系统作为应用程序的基础和基石,非常重要。本文只是对这些物联网操作系统进行粗略的介绍和比较,希望对读者有所帮助。