diff --git "a/documentation/OpenEuler\344\270\212TBOX\347\232\204\345\256\211\350\243\205\344\275\277\347\224\250.md" "b/documentation/OpenEuler\344\270\212TBOX\347\232\204\345\256\211\350\243\205\344\275\277\347\224\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..aa90e1251ac0e24aa61a042361ece2e80985c3a4 --- /dev/null +++ "b/documentation/OpenEuler\344\270\212TBOX\347\232\204\345\256\211\350\243\205\344\275\277\347\224\250.md" @@ -0,0 +1,191 @@ +# OpenEuler 上 TBOX 的安装使用 + +本篇文章是为了确保可在 openEuler 上进行 TBOX 的安装,并测试和使用其模块。 + +## TBOX 是什么 + +TBOX 是一个用 c 语言实现的跨平台开发库。其针对各个平台,封装了统一的接口,简化了各类开发过程中常用操作,使你在开发过程中,更加关注实际应用的开发,而不是把时间浪费在琐碎的接口兼容性上面,并且充分利用了各个平台独有的一些特性进行优化。 + +## 一、安装 TBOX + +因为整个 tbox 项目都是由 xmake 这个跨平台的构建工具维护的。编译 tbox 源码,需要先安装 [xmake](https://github.com/xmake-io/xmake) 构建工具。 + +1. 安装 xmake + +```bash +#直接使用脚本安装 +bash <(curl -fsSL https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/get.sh)Copy to clipboardErrorCopied + +# 或者通过wget +bash <(wget https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/get.sh -O -) +Copy to clipboardErrorCopied + +#运行`xmake update`,确保为最新版本。 +xmake update +``` + +2. 下载源码、编译。 + +```bash +git clone https://gitee.com/tboox/tbox.git +cd tbox +xmake +``` + +如果你想直接创建一个带有 tbox 的空工程模型,也可以直接执行 `xmake create -t console_box dir_name` 命令来快速集成和编译使用 tbox。 + +在 openEuler 上安装的过程中, TBOX 有几率出现编译问题。 + +```c +[ydyk@localhost ~]$ cd tbox/ +[ydyk@localhost tbox]$ xmake +checking for platform ... linux +checking for architecture ... x86_64 +…… +checking for libc_strlcpy ... no +checking for libc_wcscasestr ... no +checking for libm_sincos ... ok +checking for posix_pthread_setaffinity_np ... ok +checking for libc_setjmp ... ok +checking for posix_open ... ok +checking for libm_fmod ... ok +checking for libc_strchr ... ok +checking for libc_fwrite ... ok +checking for libc_wcscat ... ok +checking for libc_memcmp ... ok +checking for wchar ... no +…… +checking for libc_wcslcpy ... no +…… +generating src/tbox/tbox.config.h.in ... ok +[ 0%]: ccache compiling.release src/tbox/tbox.c +[ 0%]: ccache compiling.release src/tbox/hash/adler32.c +…… +[ 0%]: ccache compiling.release src/tbox/math/impl/math.c +error: src/tbox/hash/../prefix/type.h:100:9: error: unknown type name ‘__WCHAR_TYPE__’ + 100 | typedef __WCHAR_TYPE__ tb_wchar_t; + | ^~~~~~~~~~~~~~ +src/tbox/hash/../prefix/type.h:157:9: error: unknown type name ‘__tb_volatile__’ + 157 | typedef __tb_volatile__ __tb_aligned__(4) tb_int32_t tb_atomic32_t; + | ^~~~~~~~~~~~~~~ +src/tbox/hash/../prefix/type.h:157:41: error: expected declaration specifiers or ‘...’ before numeric constant + 157 | typedef __tb_volatile__ __tb_aligned__(4) tb_int32_t tb_atomic32_t; + | ^ +src/tbox/hash/../prefix/type.h:164:9: error: unknown type name ‘__tb_volatile__’ + 164 | typedef __tb_volatile__ __tb_aligned__(8) tb_int64_t tb_atomic64_t; + | ^~~~~~~~~~~~~~~ +src/tbox/hash/../prefix/type.h:164:40: error: expected declaration specifiers or ‘...’ before numeric constant + 164 | typedef __tb_volatile__ __tb_aligned__(8) tb_int64_t tb_atomic64_t; + | ^ +src/tbox/hash/../prefix/type.h:169:9: error: unknown type name ‘tb_atomic64_t’ + 169 | typedef tb_atomic64_t tb_atomic_t; + > in src/tbox/hash/adler32.c +``` + +如果遇到以上情况,可以重新下载 tbox 进行编译,或者运行 `xmake f -c` 后重新编译。 + +3. 运行测试 + +```c +[ydyk@localhost tbox]$ xmake run demo math_random +[demo]: time: 16, average: 800, range: 600 - 1000 +[demo]: time: 15, average: 149, range: 100 - 200 +[demo]: time: 15, average: 201, range: -600 - 1000 +[demo]: time: 16, average: -200, range: -600 - 200 +[demo]: time: 16, average: -400, range: -600 - -200 +[demo]: time: 15, average: 0.499821, range: 0.000000 - 1.000000 +[demo]: time: 17, average: 100.094902, range: 0.000000 - 200.000000 +[demo]: time: 15, average: 100.011360, range: -200.000000 - 0.000000 +[demo]: time: 16, average: 199.802993, range: -200.000000 - 200.000000 +``` + +## 二、前置知识 +本部分对于 TBOX 中比较具有特色的模块进行简单介绍。 + +**流库**:针对 http、file、socket、data 等流数据,实现统一接口进行读写,并且支持阻塞、非阻塞读写模式。支持中间增加多层 filter,实现流之间数据过滤和变换,实现边读取,内部边进行解压、编码转换、加密等操作,极大的减少了内存使用。在目前的版本当中,可以使用 coroutine 协程模式来实现异步 io 开发。 + +tbox 目前主要提供以下模块: + +- `stream`:通用非阻塞流,用于单路阻塞、非阻塞 io 的处理。适用于通用数据流协议,功能强大,并且内置缓存,但是比较重量级 +- `static_stream`:针对静态数据 buffer 优化的静态流,仅用于维护静态的数据 buffer,以及读写、解析操作,比较轻量,效率也更高 + +我们可以在其上挂接多路 filter,实现流之间数据过滤和变换。目前支持以下几种 filter: + +1. **zip_filter:gzip**、zlib 的压缩和解压缩过滤器 +2. **charset_filter**:字符集编码的过滤器 +3. **chunked_filter:http** chunked 编码的解码过滤器 + +还有**基于流的传输器**: + +1. **transfer**:基于两路 stream 的传输器,可以用于简单的 http 下载、上传、文件之间的复制等。 + +## 三、简单使用 + +这一部分简单介绍一下 stream 模块的使用 + +### 流的初始化操作 + +```c +//初始化http流 +tb_stream_ref_t stream = tb_stream_init_from_url("https://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-20.03-LTS-SP3/ISO/x86_64/openEuler-20.03-LTS-SP3-everything-debug-x86_64-dvd.iso"); +//或者通过端口访问 +tb_stream_ref_t stream = tb_stream_init_from_http("www.xxxx.com", 80, "/file?args=xxx",tb_false ); +``` + +### 输入端-非阻塞读取模式 + +```c +if(stream){ + //阻塞打开流 + if(tb_stream_open(stream)){ + tb_byte_t_data[TB_STREAM_BLOCK_MAXN]; + + //beof判断流是否读取结束 + while(tb_stream_beof(stream)){ + //非阻塞读取流数据,real位实际读取到的大小,如果失败,则返回-1 + tb_long_t real = tb_stream_read(stream, data, TB_STREAM_BLOCK_MAXN); + + + if(!real){ + //当前读取不到流数据,等待指定时间间隔后再读取 + real = tb_stream_wait(stream, TB_STREAM_WAITREAD, tb_stream_timeout(stream)); + + //如果还是等待失败,返回-1,等待超时返回0,并对流进行结束读取处理 + tb_check_break(real > 0); + } + else if (real < 0) break; + } + tb_stream_clos(stream); + } + tb_stream_exit(stream); +} +``` + +### 输入端-非阻塞模式写入 + +```c +tb_long_t real real = tb_stream_writ(stream, data, size); +``` + +### 读取和解析 + +```c +//从数据流中,读取一个大端的16bits数值 +tb_uint16_t value; +if (tb_stream_bread_u16_be(stream, &value)) +{ + tb_trace_i("%x", value); +} +``` + +除此之外还支持大端读取、小端读取、本地端读取以及浮点、双精度数值的各端读取。 + +如果解析的数据量非常大,stream 内置的自动 cache 读写,可以充分优化 io 读写性能,在大量数值解析时候,减少频繁的文件读写操作。 + +以上只是简单介绍了使用方法,实际实现和使用中可以根据需求进行自定义流。 + +## 参阅 + +- [GitHub - tboox/tbox: 🎁 A glib-like multi-platform c library](https://github.com/tboox/tbox) +- [流库 - 《TBOX 1.5.x 使用教程》 - 书栈网 · BookStack](https://www.bookstack.cn/read/tboox-1.5.x/流库.md) +- [tbox 数据位操作接口的使用 (tboox.org)](https://tboox.org/cn/2016/08/12/bits-operation/) diff --git "a/documentation/openEuler\347\275\221\347\273\234\345\255\220\347\263\273\347\273\237\344\273\213\347\273\215.md" "b/documentation/openEuler\347\275\221\347\273\234\345\255\220\347\263\273\347\273\237\344\273\213\347\273\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..bd94a386aad873e1ab6a5670fe8da431a53351e5 --- /dev/null +++ "b/documentation/openEuler\347\275\221\347\273\234\345\255\220\347\263\273\347\273\237\344\273\213\347\273\215.md" @@ -0,0 +1,109 @@ +# openEuler 网络子系统相关介绍 + +参阅,推荐进一步阅读。 + +> [openEuler 网络子系统: 介绍 openEuler 网络子系统架构 (gitee.com)](https://gitee.com/MrRlu/openeuler_network_subsystem#结语) +> +> [Linux 内核网络(一)——初探内核网络 ](https://zhuanlan.zhihu.com/p/363718587) +> +> [openEuler-whitepaper-2109.pdf](https://www.openeuler.org/whitepaper/openEuler-whitepaper-2109.pdf) +> +> [使用 XDP(eXpress Data Path)防御 DDoS 攻击](https://blog.csdn.net/dog250/article/details/77993218) + +实现计算机之间的互联通信极其重要,计算机网络从一开始的目的就是实现不同计算机之间信息的传输和共享。操作系统作为底层软件,承担着通信模块中重要的角色。 + +> openEuler 网络子系统负责网络 IO,通过与网络设备(路由器、交换机等)的数据交互,实现端到端的数据交互过程。 + +本文通过梳理计算机网络的模型,简单介绍了 openEuler 中的网络子系统,并介绍了 openEuler 内核在网络通信方面的创新技术点,使得读者可以对 openEuler 的网络子系统有一定的了解。 + +## 网络模型 + +OSI 七层参考模型是 ISO 制定的用于计算机或通信系统间互联的标准体系。其中规定了一系列抽象的术语概念和具体的协议。但在现实当中,TCP/IP 五层模型通过快速占领了市场(第一代表一切)获得了实际的话语权。TCP/IP 凭借只包含应用层,传输层,网络层,链路层,物理层五个模型,大大减少了硬件厂商的工作量。如果将 OSI 对应过去的话,在 TCP/IP 中,OSI 的表示层、和会话层,一并交给应用层来处理。 + +计算机网络解决的是端到端的通信,在数据面上来看,几乎每一层都是直接与另一端的同一层进行交流,无需顾忌底层的细节。下面简单介绍以下五层模型的主要功能。 + +- 物理层:主要负责物理上的数据包传输,如 WiFi、以太网等协议; +- 数据链路层:主要负责处理端点间的数据传输; +- 网络层:负责数据包转发和主机编码; +- 传输层:完成结点间的数据发送; +- 应用层:各类应用层协议,如常用的 HTTP、FTP; + +对于操作系统而言,一般不涉及物理层和应用层,所以大部分情况只需要聚焦于 + +1. 链路层数据协议解析:接收到数据包时,向上传递给网路层,由目的地决定后续操作; +2. 网络层协议解析:分析目的地,如为本机则上传,否则则交还给数据链路层传输; +3. 传输层发送:发送数据包时,给定数据包格式,依次下发。 + +## Linux 子系统 + +Linux 作为通用操作系统,需要可以兼容大部分硬件。因此在实际涉及时,必须通过逻辑抽象,各个参数支持设定,以此淡化物理设备的差异。举一个 linux 网络设备中最关键的一个结构体为例 `net_device`。 + +```c +struct net_device { + char name[IFNAMSIZ]; + struct netdev_name_node *name_node; + struct dev_ifalias __rcu *ifalias; + /* + * I/O specific fields + * FIXME: Merge these and struct ifmap into one + */ + unsigned long mem_end; + unsigned long mem_start; + unsigned long base_addr; + int irq; + + /* + * Some hardware also needs these fields (state,dev_list, + * napi_list,unreg_list,close_list) but they are not + * part of the usual set specified in Space.c. + */ + + unsigned long state; + + struct list_head dev_list; + struct list_head napi_list; + struct list_head unreg_list; + struct list_head close_list; + struct list_head ptype_all; + struct list_head ptype_specific; + + struct { + struct list_head upper; + struct list_head lower; + } adj_list; + + netdev_features_t features; + netdev_features_t hw_features; + netdev_features_t wanted_features; + netdev_features_t vlan_features; + netdev_features_t hw_enc_features; + netdev_features_t mpls_features; + netdev_features_t gso_partial_features; + + int ifindex; + int group; + …… +``` + + [具体代码可以自行查看](https://github.com/openeuler-mirror/native-turbo-kernel/blob/62f8a4e02acf2a3367942f70f127def4138dd213/include/linux/netdevice.h#:~: text=struct%20net_device%20%7B,int%09%09%09group%3B) ,网络设备驱动作为数据链路层的主要实现,主要完成两个任务 + +- 接收数据包并传递给网络层 +- 传出数据包给其他端 + +该结构体作为对网络设备的抽象,包含了网络设备驱动相关的所有信息,但即使如此,在实际应用当中,也往往还需要额外定义信息。此时只需要自定义一个结构体,将 `net_device` 结构体作为成员包含进去。使用时需要先通过 register_netdev() 函数注册设备,并自行定义数据结构等进行实际操作。 + +这里我们可以看到,Linux 协议栈实现从链路层通用处理到 IP 层路由,都是通过支持一些函数调用实现的。 + +> 记住,OSI 模型也好,TCP/IP 模型也罢,所谓的分层仅仅是逻辑视图上的分层,好在让人们便于理解以及便于界定软件设计的边界和分工。 + +## XDP + +在《OpenEuler21.09 白皮书中》提到了一个内核创新点,那就是支持 XDP。 + +> XDP:基于 ebpf 的 一种高性能、用户可编程的网络数据包传输路径, 在网络报文还未进入网络协议栈之前就对数据进行处理,提升网络性能。可用于 DDOS 防御、防火墙、 网络 QOS 等场景。 +> +> XDP 优势:可编程、内核协同工作 **可编程**:在网络硬件智能化趋势下,可编程可以适用多种场景。 **内核协同**:XDP 并不是完全 bypass kernel,所以在必要的时候可以与内核协同工作,利于网络统一管理、部署。 + +XDP 通过 定义了一个受限的执行环境(a limited execution environment),运行在一个 eBPF 指令虚拟机中。在网卡收到包后最早能处理包的位置,做一些自定义数据包处理(包括重定向)。 + +例如,在服务器处理 DDOS 的时候,通过 XDP,可以直接在内核里直接处理黑名单内的 IP 地址,大大提高了 CPU 的利用率。 diff --git "a/documentation/\345\274\200\346\272\220\345\256\236\344\271\240\347\256\200\350\246\201\345\233\236\351\241\276.md" "b/documentation/\345\274\200\346\272\220\345\256\236\344\271\240\347\256\200\350\246\201\345\233\236\351\241\276.md" new file mode 100644 index 0000000000000000000000000000000000000000..2f5bb80e66d188f2f864a318155816d38cc1f84c --- /dev/null +++ "b/documentation/\345\274\200\346\272\220\345\256\236\344\271\240\347\256\200\350\246\201\345\233\236\351\241\276.md" @@ -0,0 +1,76 @@ +# 开源实习简要回顾 + +几天前,一个小伙伴私信我问道 + +> +> 你好,我也想参加 openEuler 的实习任务提升一下自己的能力,但是由于自己比较菜看完实习任务的需求后有点懵,不知道怎么下手,我想请教一下你参加开源通过什么途径去学习了解这些东西,然后去实现这些导师提出的需求的呀? + +尽管我是这次开源实习的“水王”,但这也不失为回顾本次开源实习,以及推广本次活动的好机会。官方有大量的宣传和指导散布在 QQ 群、微信推文当中,也有很多真正的大佬在完成了任务之后,写下了博客回顾。 + +因此,本文回顾了这次开源实习,并汇总了一系列资料,帮助还没参加的小伙伴以及刚刚参加的小伙伴可以更快的参与进来。 + +## 开源实习简要回顾 + + [openEuler 开源实习(openeuler.org)](https://www.openeuler.org/zh/internship/) 是openEuler社区和社区合作单位共同发起的线上实习项目。 + +### 申请任务前的前置条件 + +当前提供任务的社区主要有 SIG、openLooKeng、openGauss、昇思 MindSpore。 + +依照官网 [Internship (openeuler.org)](https://www.openeuler.org/zh/internship/) 流程申请的小伙伴,只能无障碍报名SIG的任务(非 [sig-OSCourse](https://www.openeuler.org/zh/sig/sig-list/sig-detail.html?id=95&name=sig-OSCourse) )。其他社区的往往还需要通过社区设置的小任务。而MindSpore [则需要进行另外的开源实习申请](https://www.openeuler.org/zh/internship/#task:~: text=MindSpore%E5%BC%80%E6%BA%90,%E6%8B%A9%E4%BC%98%E5%BD%95%E5%8F%96%E3%80%82) ,条件会更加苛刻一些,但可以其任务的积分也更加丰厚。 + +### 查阅任务方式 + +以下提供三种获得最新任务的途径 + +- 开源实习学生 QQ 群:526089131,2022 昇思 MindSpore 开源实习群:771293467; + +有老师会在里面发布一些并未展示出来的任务,以及汇总一些简单的任务来吸引同学们参加,比如: + +> 对前端感兴趣的同学看过来~~~ +> +> openEuler 官网即将改版,有兴趣有想法一起加入改版工作的同学欢迎参与 OpenDesign SIG 的实习。 +> +> 加入流程: +> 1、 投简历到 intern@openeuler.sh,注明参与 OpenDesign SIG +> 2、 简历通过筛选后,会由 OpenDesign SIG 导师进行一个线上交流面试 +> 3、 以上通过后,将加入 OpenDesign SIG 一起投入 openEuler 官网改版工作 +> 4、 在 OpenDesign SIG 你要参与的工作会分解成开源实习任务,指定分配,完成任务积累积分,凭积分获得实习工资与实习证明。 +> +> 要求: +> \1. 熟悉 Vue 框架,对 Vue3 和 Typescript 有使用经验者优先; +> \2. 能熟练使用 html、css、js; +> \3. 对组件化开发有一定了解; +> \4. 对常用设计模式有一定了解 +> ps: 有开源个人项目者可以提供相关链接,视情况加分 +> +> OpenDesign SIG 介绍:![img](file:///C: \Users\YDYK\AppData\Roaming\Tencent\QQTempSys\[5UQ[BL(6~BS2JV6W}N6[%S.png) https://gitee.com/openeuler/community/tree/master/sig/sig-OpenDesign + +- [任务 - src-openEuler - openEuler - Gitee.com](https://gitee.com/organizations/src-openeuler/issues?assignee_id=&author_id=&branch=&collaborator_ids=&issue_search=&label_ids=&label_text=&milestone_id=&priority=&private_issue=&program_id=&project_id=&project_type=&scope=&single_label_id=125219718&single_label_text=&sort=newest&state=&target_project=) + +- [任务 - openEuler - openEuler - Gitee.com](https://gitee.com/organizations/openeuler/issues?assignee_id=&author_id=&branch=&collaborator_ids=&issue_search=&label_ids=&label_text=&milestone_id=&priority=&private_issue=&program_id=&project_id=&project_type=&scope=&single_label_id=125219718&single_label_text=&sort=newest&state=&target_project=) + +在社区任务一栏当中,选择 intern 标签,就可以看到最新发布的所有任务了。 + +需要注意的是,实习活动是长期进行的,有些任务因为发得比较早没人领,所以截止时间就快到了,可以联系导师顺延时间。 + +### 开始实习 + +开源实习的目的就是鼓励在校学生积极参与开源社区,在实际的开源环境中提升实践能力。很多小伙伴搞错了因果,并不是先有能力再去实习,而是通过实习锻炼能力。 + +**但是,问题仍然存在,不会就是不会啊。**我无法完成实习,又怎么提高自己呢?我觉得关键在于寻找平衡点,想清楚参加开源实习的目的是什么。比如想要通过项目学习 rust,就报一个 rust 项目,哪怕最后做不出来,这中间也学会了 rust 的基本语法。 + +比如只是想要试试手,可以尝试一下 [QA SIG](https://gitee.com/organizations/src-openeuler/issues?assignee_id=&author_id=&branch=&collaborator_ids=&issue_search=&label_ids=124590164&label_text=&milestone_id=&priority=&private_issue=&program_id=&project_id=&project_type=&scope=&single_label_id=124590164&single_label_text=&sort=&state=open&target_project&skip_mobile=true) 的任务,这些任务相对简单一些。或者是一些调研类、文档类的任务,主要就是花时间。 + +选择任务的时候,可以参考任务里给的参考文献进一步阅读,了解是否适合自己,这里提供直播,可以学习了解一下真正的大佬是如何选择任务和完成任务的: + +- [SIG 组开放工作会议高校开发者专场_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1V3411T7Rq) +- [开源实习在线分享第一期:SIG-QA 加固测试类任务_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1NZ4y1k78u) + +### 学习途径 + +领取任务了的同学,第一件事就是给导师发邮件,让导师可以清楚你的水平,并有可能获得导师的规划指导以及学习指南。 + +除此之外,同学们还可以查阅完成了类似任务的经验分享,可以有效的学会任务路径,比如领取了 sig-QA 的同学,可以看看 + +- [开源实习经验分享:openEuler 软件包加固测试](https://www.openeuler.org/zh/blog/20220629-sig-qa/20220629.html) diff --git "a/documentation/\350\276\271\347\274\230\350\256\241\347\256\227\347\256\200\350\246\201\344\273\213\347\273\215.md" "b/documentation/\350\276\271\347\274\230\350\256\241\347\256\227\347\256\200\350\246\201\344\273\213\347\273\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..a42072476ef7fc19fb1df7d4baa8f9b48f8e3fc7 --- /dev/null +++ "b/documentation/\350\276\271\347\274\230\350\256\241\347\256\227\347\256\200\350\246\201\344\273\213\347\273\215.md" @@ -0,0 +1,47 @@ +# 边缘计算简要介绍 + +边缘计算是一种在网络边缘进行计算的新型计算模式,通过下行的云服务和上行的端服务对数据进行处理。边缘计算将计算和存储资源分配到边缘节点更靠近用户,边缘节点分析来自附近终端用户的数据,仅将计算结果等重要信息上传至云端,大大减轻服务器压力。 + +边缘端拥有大量、实时、完整的数据,随着海量数据在边缘产生,边缘计算可以解决**带宽负载**、**网络延时、数据管理成本**等方面的问题。作为数据入口,边缘计算可以更好地适应数据频繁交互需求,解决数据实时性、确定性、多样性等挑战。 + +## 边缘计算的构成 + +边缘计算的架构主要由三部分组成: + +1. 终端节点:主要进行数据采集,将数据导向边缘节点或云中心,负责环境感知,数据采集; +2. 边缘节点:负责实时处理、快速决策。但现实环境中,往往集成于终端节点上; +3. 云计算处理中心:虽然理论上应该将计算任务分布在边缘节点,但受限于成本、方案等实际因素,云计算仍然是主要进行全局性、非实时、长周期的大数据处理与分析任务的主要执行地,并负责则大量数据的存储; + +在实际应用当中,数据存储是一个十分重要的部分,终端节点受限于性能,无法存储大量数据,只能就近上传(涉及到远程传输、数据压缩、网速控制、按需触发……)至云端中心,边缘计算的结果由云计算中心进行永久性存储。 + +在实际环境当中,受限于成本的现实因素,往往不可能做到云边端都切实的部署或者及时的部署,以智能汽车为例。 + +1. 车端的传感器负责收集数据,通过 CAN 总线经由 SOME/IP 协议发送至 TBOX 或域控制器(VDCM/BDCM); +2. 车端的 TBOX 或域控制器内的 MCU(微控制器)接收/计算该部分数据,并将数据传给 MPU(微处理器),MPU 运行 Linux 或者 QNX,内部*基于模型的车载边缘计算*进行特征计算,车载信号存储负责存储原始信号和聚合信号。处理后/原始信号通过网关传输给 HMI 以及主机厂云计算中心 +3. 主机厂云计算中心分为生产环境和算法开发环境,生产环境包含车联网平台收集已经获得上传的信号,电池监控平台实时获得电池数据,二者输入大数据计算集群,进行云端批量计算以及实时预警分析,得到的结果存储在数据湖和数据仓库当中; +4. 算法开发环境使用独立的试验数据池将数据湖的信号复制过来,开发的云端算法利用最新的数据进行探索分析,制研发成功的模型则发送到车端进行部署。 + +边缘计算保证了数据处理的及时性、安全隐私性、无网络环境下的运行。 + +## openEuler 在边缘计算的应用案例 + +openEuler 21.09 Edge 集成的边云协同框架 KubeEdge,具备边云应用统一管理和发放等基础能力。以鲲鹏 + openEuler 软硬协同边缘计算平台为例,Open Euler 通过边缘计算节点对车牌识别图形、RSU 读取的车辆信息进行分析比对,异常信息实时上报同步至入口收费站进行实施管控,实现了**全国高速公路取消省界收费站项目** 。在和国家电网合作的时候,实现了数据“可提取、可流转、可汇集、可分析、可应用”,提供了灵活的网络、计算和存储环境。实现对运行数据的收集、分析和自动化处理,提升运行维护效率,降低运行成本,落地了**电力系统边缘变电站监控应用**。 + +## 搭建边云协同集群 + +可以参考 [在 openEuler 上通过 KubeEdge+iSulad 搭建云边协同集群](https://blog.csdn.net/weixin_41033724/article/details/121312708) 的流程。 + +部署文档则可以参考官网文档 [Kube Edge 部署指南 (openeuler.org)](https://docs.openeuler.org/zh/docs/21.09/docs/KubeEdge/KubeEdge部署指南.html) + +## 总结 + +> 边缘计算是未来 10 大战略技术趋势。随着智慧城市、自动驾驶、工业互联网等应用落地,海量数据将在边缘产生, IDC 预测中国 2025 年每年产生的数据将达 48.6ZB,集中式云计算在带宽负载、网络延时、数据管理成本等方面将愈发显 得捉襟见肘,难以适应数据频繁交互需求,边缘计算价值凸显 + +边缘计算作为最近几年的新兴技术,正在我们的身边逐步部署。openEuler 紧跟时代,借助国产 OS 的优势和硬件搭配正在逐步的占领边缘计算的至高地,**电力系统边缘变电站监控应用**和**全国高速公路取消省界收费站项目**使得这些技术离我们越来越近。 + +## 参阅 + +- [边缘计算:发展与挑战 (zhihu.com)](read://https_zhuanlan.zhihu.com/?url=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F432773278) +- [在 openEuler 上通过 KubeEdge+iSulad 搭建云边协同集群_边缘计算社区的博客-CSDN 博客](https://blog.csdn.net/weixin_41033724/article/details/121312708) +- [鲲鹏 + openEuler 软硬协同边缘计算平台 - 边缘计算产业联盟 (ecconsortium.org)](http://www.ecconsortium.org/Lists/show/id/515.html) +- [openEuler-whitepaper-2109.pdf](https://www.openeuler.org/whitepaper/openEuler-whitepaper-2109.pdf)