为什么物联网领域使用Rust的项目越来越多?

简介: 2021年2月8日,Rust基金会成立,Rust商标及所有权移交给基金会。
  1. 概述

image.png
Rust是由Mozilla员工Graydon Hoare于2006年作为个人项目而创造,Mozilla于2009年开始赞助该项目。2012年,第一个Rust编译器发布,2015年第一个Rust1.0稳定版本发布,目前,Rust已加发展到1.51版本。

   2021年2月8日,Rust基金会成立,Rust商标及所有权移交给基金会。基金会创始白金成员包括亚马逊、微软、谷歌、华为和Mozilla,白金会员Facebook。

截止到2021年5月,Rust在TOIBE编程语言排行榜上排名24%,占比0.66%。

  1. Rust功能

2.1. 语言主要特性

类型推导
Rust支持表达式类型推断,可根据代码自动推动表达式类型。

举例:

let x = 9.0;  //x是f64类型

零成本抽象
Rust中增加抽象定义,不会影响运行性能。

模式匹配
通过match关键字,可以很方便的对变量的值、范围、部分内容等进行匹配操作,支持匹配数字、字符串、函数调用等,支持逻辑与或匹配。匹配的作用可以简单理解为C语言的Switch语法功能的增强。

举例:

    match a {
        1 => println!("a is 1"),
        2...5 => println!(" 2<=a<=5"),
        6 | 8 => println!(" a=6 or a=8"),
        _ => println!("其它")
    }
 

所有权
内存所有权是Rust内存安全的核心基础。内存在一个时刻,所有权只能属于一个变量,超出作用域后,会被自动释放。所有权支持转移和借用。该机制可以有效解决空指针、野指针、内存泄漏、内存重复释放等内存问题。

举例:

    ...
    let b = a;  //所有权转移到b,通过a无法再访问

错误处理
Rust支持统一并简洁的错误处理方式。错误码统一,且支持同时返回值及错误码。

Rust将错误区分未可恢复错误及不可恢复错误,支持可恢复错误传递。

举例:

 
fn main() {
    let f = File::open("hello.txt");
 
    let f = match f {
        Ok(file) => file,   // 成功处理
        Err(error) => println!("Problem opening the file: {:?}", error),  //错误处理
    };
    panic!("run here panic!"); // 不可恢错误
}
 

切片(Slice)
切片是指对数据的部分引用,比如数组、字符串等。与python等语言的切片功能类似。

举例:

 
    let hello = &s[0..5];
    let world = &s[6..11];

泛型
类似于C++中的模板(Templete),可用于实现对通用类型的操作,有效提到代码抽象度,减少代码量。

举例:

    let mut mi = 0;
    let mut i = 1;
    while i < array.len() {
        if array[i] > array[mi] {
            mi = i;
        }
        i += 1;
    }
    array[mi]
}
 
 
fn main() {
    let a = [1, 3, 9, 7];
    println!("max = {}", max(&a));
    let b = [2.0, 4.1, 10.2, 8.3];
    println!("max = {}", max(&b));
}
 

特征(Trait)
Trait是对接口的抽象,可以指定接口的规则、默认接口实现,可以被继承、重载,可以与泛型结合使用,可以作为参数传递,也可以作为函数返回值。

举例:

    pub headline: String,
    pub location: String,
    pub author: String,
    pub content: String,
 
}
 
 
impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}, by {} ({})", self.headline, self.author, self.location)
    }
}
 

运算符重载
与C++的运算符重载功能类似。Rust通过Trait实现运算符重载功能。

Rust只支持有限形式的运算符重载。

闭包(Closure)
Rust的闭包与Java、Go、Python、Swift等语言中闭包概念类似,类似于这些语言中的Lambda表达式或者匿名函数。闭包通常不需要定义类型,支持对入参及返回值类型的推导。闭包支持绑定到变量中使用。闭包中支持使用外部变量。

举例:

 
fv(10);

迭代(iterator)
用于对变量集合的循环遍历,与其它语言中的迭代器概念类似。

上面仅描述了rust语言的部分主要特性,完整介绍参见 https://doc.rust-lang.org/book/

2.2 Rust程序组成形式

一个Rust程序可以由Module、Carte、Package组成。Module是代码逻辑层面的封装,可以将实现一个功能的所有代码放在一个Module中,比如网络Module、文件系统Module等。Carte是二进制可执行程序或者库,是rust中的基本编译单元。Package将多个carte打包在一起。
image.png
2.3 编译构建

Rust使用rustc编译代码,编译过程中会自动进行类型检查。

rustc编译依赖LLVM(Windows环境依赖MSVC),在嵌入式环境,还依赖于嵌入式交叉编译工具链。

2.4 Cargo

Rust使用Cargo进行系统构建、代码检查及包(crate)管理,同时也可以从crate.io上下载或者更新crate到本地。

  1. Rust优势与劣势

Rust是一门赋予每个人构建可靠且高效软件能力的语言[1]。他的优势和劣势非常明显。

3.1 Rust优势

Rust具备系统级语言的高性能,同时也具备一些现代动态语言的功能。

3.1.1 高性能

Rust语言具备C/C++等语言的高性能。

Rust运行速度快,内存利用率高,占用资源少,没有垃圾回收及运行时,可以内嵌汇编,可以与其它语言混合编程,可以像C/C一样作为系统级语言,用于操作系统、硬件驱动、嵌入式设备等的开发。

3.1.2 安全可靠

Rust相比C/C++更安全可靠。

Rust通过所有权机制保证内存安全。

Rust具备丰富类型的强类型系统,编译时编译器可以做更多的类型检查,将错误在编译阶段提前暴露出来,而不是等到运行时。

Rust通过unsafe关键词将不安全的代码与安全代码隔离开。

3.1.3 支持现代高级语言特性

Rust支持泛型、闭包、迭代、切片、函数式编程、错误处理等特性。

3.2 Rust劣势

3.2.1 语言复杂

Rust的语法相对比较复杂,强类型、内存所有权、unsafe机制等对于初学者上手比较困难。

3.2.2 库较少

Rust目前官方及第三方库较少,相关开源代码较少,很多库需要借用c语言库,或者自己重新写,对于构建复杂系统难度较高。

3.2.3 不够稳定

Rust语言时间较短,一直处于快速发展中。

  1. Rust在物联网上的应用与发展

Rust性能高,占用资源少,可移植性好,支持嵌入式开发,且可集成到现有的C代码中,因此在物联网设备上,也可以使用Rust来开发。目前已加有一些公司在使用Rust实现RTOS系统、bootloader、传感器驱动、网络协议栈等。

4.1 硬件

Rust支持的嵌入式硬件设备范围从8bit单片机到64位4核Cortex-A53的树莓派。

Rust支持对外设、中断、异常、IO、内存、寄存器的操作,并提供了对应的库(Crat)。

详细文档见:

https://doc.rust-lang.org/stable/embedded-book/start/index.html

Rust目前已支持ARM、RISC-V,MIPS。目前已有几十款MCU,上百种硬件驱动支持rust,详见:

https://github.com/rust-embedded/awesome-embedded-rust

4.2 嵌入式运行环境

1)hosted环境

在这种环境下运行时,设备上已经运行了一个操作系统,并且提供了POSIX、文件系统、网络、内存管理、线程管理等系统接口。Rust的标准库会依赖这些接口已支撑rust程序的运行,与在PC机上运行类似。

2)bare metal环境

这种环境,设备本身没有操作系统,由rust程序直接在裸机上运行。此时需要使用no_std库。同时通过libcore获得与硬件平台无关的代码,并去掉嵌入式环境中不常用的功能,比如去掉动态内存分配器等。

使用该模式,可以编译启动代码、内核等。

4.3 支持rust的嵌入式/物联网项目

详见 https://github.com/rust-embedded/awesome-embedded-rust

4.3.1 RTOS

Drone OS
支持Rust实时应用的嵌入式操作系统。

FreeRTOS.rs
基于FreeRTOS的rust适配层

FreeRTOS-rust
基于FreeRTOS.rs,增加了rust的改造,比如main的入口使用rust实现,FreeRTOS调度从rust启动等。

Tock
支持在MCU上多应用并发运行的嵌入式操作系统,内核及驱动使用Rust编写。

4.3.2 协议栈

runmqtt
使用rust实现的mqtt协议

rubble
使用rust实现的蓝牙ble协议栈

4.3.3 其它

internet-of-streams
使用rust创建的iot无线传感器平台。

rust-raspberrypi-OS-tutorials
基于rust和树莓派硬件的嵌入式操作系统开发指导

boa
使用rust实现的嵌入式JS引擎。

rust_sqlite
使用rust实现的sqlite。

OpenSK
谷歌开发的基于Tock OS的FIDO2蓝牙认证应用,目前支持Nordick nrf52840芯片。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
7月前
|
JavaScript 小程序 前端开发
【手把手教教学物联网项目】01 视频大纲
《手把手教教学物联网项目》是一系列视频教程,旨在引导初学者掌握物联网技术。视频涵盖物联网基础,如物联网概述、架构和技术;STM32微控制器的介绍、编程及外设使用;网关开发,涉及ESP8266和ESP32;物联网通信协议如TCP、MQTT、Modbus等;物联网总线协议如单总线、CAN、IIC和SPI;OLED显示原理与驱动;MQTT服务器搭建;物联网云平台介绍,包括阿里云平台的使用;微信小程序开发入门及前端VUE项目实践。此外,教程还涉及UniAPP和SpringBoot后台开发,最后通过“智能取餐柜”项目将理论知识付诸实践。视频可在B站找到,适合学生、爱好者和开发人员学习物联网技术。
316 12
【手把手教教学物联网项目】01 视频大纲
|
7月前
|
监控 物联网 应用服务中间件
流媒体方案之Nginx——实现物联网视频监控项目
流媒体方案之Nginx——实现物联网视频监控项目
流媒体方案之Nginx——实现物联网视频监控项目
|
7月前
|
监控 物联网 编解码
流媒体方案之FFmpeg——实现物联网视频监控项目
流媒体方案之FFmpeg——实现物联网视频监控项目
流媒体方案之FFmpeg——实现物联网视频监控项目
|
7月前
|
监控 JavaScript NoSQL
【开源视频联动物联网平台】写一个物联网项目捐献给Dromara组织
【开源视频联动物联网平台】写一个物联网项目捐献给Dromara组织
122 1
|
7月前
|
前端开发 NoSQL JavaScript
【开源视频联动物联网平台】开箱即用的物联网项目介绍
【开源视频联动物联网平台】开箱即用的物联网项目介绍
191 1
|
7月前
|
Rust Linux iOS开发
【一起学Rust | 开源项目】效率提升工具espanso——在日常输入中使用代码提示
【一起学Rust | 开源项目】效率提升工具espanso——在日常输入中使用代码提示
124 0
|
22天前
|
传感器 安全 算法
在物联网项目中使用 MicroPython 时如何确保数据安全
在物联网项目中使用MicroPython时,确保数据安全至关重要。可通过加密通信、安全固件更新、认证机制和定期审计等方法提升安全性,防止数据泄露和设备被恶意操控。
|
22天前
|
传感器 物联网 芯片
如何在物联网项目中使用 MicroPython
本指南介绍如何在物联网项目中使用MicroPython,涵盖设备选择、环境搭建、基础编程及网络通信等内容,助你快速上手MicroPython开发。
|
4月前
|
消息中间件 存储 传感器
RabbitMQ 在物联网 (IoT) 项目中的应用案例
【8月更文第28天】随着物联网技术的发展,越来越多的设备被连接到互联网上以收集和传输数据。这些设备可以是传感器、执行器或其他类型的硬件。为了有效地管理这些设备并处理它们产生的大量数据,需要一个可靠的消息传递系统。RabbitMQ 是一个流行的开源消息中间件,它提供了一种灵活的方式来处理和转发消息,非常适合用于物联网环境。
174 1
|
4月前
|
监控 UED 开发者
从设计到监控:用Xamarin打造高可用性移动应用的实战策略与案例深度剖析
【8月更文挑战第31天】在数字化时代,移动应用成为生活工作的重要组成部分,其稳定性和可靠性至关重要。Xamarin作为跨平台开发框架,已广受认可,但如何确保应用高可用性是开发者面临的挑战。本文以电商应用“SmartShop”为例,从设计、异常处理、性能优化、多线程及测试监控五个方面探讨构建高可用性Xamarin应用的最佳实践。通过模块化设计、有效异常处理、性能优化、多线程技术和全面测试监控,确保应用稳定高效,提升用户体验。
42 0

相关产品

  • 物联网平台