FDbus

2023-10-28

文章目录


DBus (Fast Distributed Bus) 是一种 IPC 机制, 用于进程间通信或进程.
DBus 类似, 但是其功能更齐全, 新能更高, 使用便利, 除了支持主机内的 IPC, 还能再多个主机之间组网, 同时可以制定安全策略, 支持不同的安全等级.
tips: IPC 机制还有 fifo管道, share memory, semaphore, message queue, socket …

介绍

FDbus 基于 Socket (TCP Unix domain) 之上, 采用 Google protobuf 做序列化和反序列化. FDBus 支持字符串形式的名字作为server地址. 通过 name server 自动为 server 分配Unix domain 地址和 TCP 端口号, 实现 client server 之间用服务名字寻址.

FDBus旨在为client-server之间提供面向连接,伸缩性强,安全可靠的IPC机制,进而发展成一套中间件开发框架,用于开发跨平台(WindowsQNXLinux),多线程/多进程协同工作的中间件层。FDBus开发框架适用于在定制系统上开发交互复杂的分布式项目,包括:
基于Linux的车载ECU,包括仪表,娱乐主机,TBox,通过以太网连接的域控制器
Hypervisors上多个Guest OS之间的通信
Android系统提供跨主机的IPC机制 (目前不支持Java API
基于Linux的小型通信设备,例如家用路由器
其它基于Linux的工控设备,智能设备
基于Windows开发的自动化测试设备

背景

不像其它内核,Linux一直没有自己独特且好用的IPC机制。WindowsMac OSQNX都有这样的机制,即便是基于LinuxAndroid也开发了用于IPCbinderLinux内核只提供一些最基础的组件-socketpipemessage queueshared memory等等。这也符合Linux的理念:每个工具只做一件事,把它做好。但是现实往往非常复杂,只做一件事远不能解决现实中遇到的问题,更不要说产品开发和大型商用项目。举个例子,订阅-广播是一个最基本的通信需求,但没有一个基础组件能够满足。

Linux实际上也有一个功能强大的IPCD-Bus。它有完善的方法调用机制和事件广播机制;它还包含一些诸如安全策略和服务按需启动之类的高级功能。但对它最大的争议是性能:它的性能非常低,由于要经daemon中转,一个请求-回复需要来回复制十次消息,四次消息验证,以及四次上下文切换。因此它只能用于处理实时要求较低,数据量较小的控制命令和消息传递,否则还是得求助于基础IPC框架。为此有人将D-Bus写进内核,产生了KDBus,虽然性能上得到提升,但缺点也很明显,只能在单机上运行,不支持跨主机。在这种情况下AndroidBinder也够用,况且Binder已经被内核接受了,KDBus至今还没转正。另外,无论是DBus还是KDBus,提供还是基础API,离中间件开发框架还有较大差距。但各行业包括车载领域对此都有越来越强烈需求,从而各种各样的DBus封装随之产生:Qt DBusgDBuscommonAPIDBus-C++… 但这些封装或者从属于大框架,或者缺少维护,总之使用起来并不友好。

Linux以及以太网使用越来越广泛的车载领域,缺乏合适的IPC逐渐成为突出问题:公司原来自创的IPC机制由于技术落后,定制痕迹明显,已经无法满足分布式,高性能,安全性要求,却又无法为新平台找到合适的IPC机制,更别说基于IPC机制衍生出的中间件开发框架。以太网在车载的应用催生了SOME/IPScalable service-Oriented MiddlewarE over IP)。SOME/IP同样是一套比较完善的IPC规范,甚至是专门为车载领域开发的。但是就如名字里暗示的,它是基于IP层的,在单机上性能并不好。且SOME/IP开源的实现也很少,GENIVI组织贡献了vsomeip,但活跃度非常低,GENIVI本身就是个松散的组织,参与者多,开发者少。与DBus不同,SOME/IP是为车载打造,应用范围很窄,不可能指望形成一个活跃的社区聚集一群专业的程序员来维护开放的源码(这大概也是GENIVI不成气候的原因)。最后很可能的情况是,不得不花钱购买闭源软件。

FDBus就是为解决以上各种问题而开发的,具有如下

特点:

  • 分布式:基于TCP socket和Unix Domain socket(UDS),既可用于本地IPC,也支持网络主机之间的IPC
  • 跨平台:目前已在Windows,Linux和QNX上验证
  • 高性能:点对点直接通信,不通过中央Hub或Broker转发
  • 安全性:能够为server的方法调用也事件广播配置不同等级的访问权限,只有权限足够高的client才能特点方法和接收特定事件
  • 服务名解析:server地址用名字标识,通过name server注册服务和解析名字,从而server可以在全网络任意部署
  • 支持跨平台的中间件开发框架,包括如下组件:
    1. Thread模型
    1. Event Loop
    1. 基于Job-Worker的线程间通信
    1. 基于Event Loop的Timer
    1. 基于Event Loop的watch
    1. Mutex
    1. Semaphore
    1. Socket
    1. Notification
  • IPC采用Client-Server模式,支持如下通信模式:
    1. 带超时的同步请求-答复
    1. 带超时的异步请求-答复
    1. 无答复的命令请求
    1. 注册-发布模式,实现多点广播
  • IPC消息采用Protocol buffer序列化和反序列化,支持IDL代码生成,高效简便;也支持raw data格式,便于大量数据传输
  • 可靠的心跳和重连机制,确保无论网络状况如何,无论哪个服务重新上线或重启,通信各方都能保持连接
  • C++实现,易于开发和维护

FDBus 中间件模型

  • Infrastructure层多个进程, 这些进程可以子啊不同的主机系统上, 每个进程中又可以运行多个线程, FDBus 在线程基础上运行特定的 event loop 循环事件, 将通用的线程强化为能够执行 job, timer, watch, worker thread
  • FDBus 通信双方 client 和 server 统称为 endpoint, endpoint 可以部署在不同的 worker thread 上, 也可以多个 endpoint 共享一个worker thread. 即Server在指定的 worker thread 上处理 client 请求, client 在指定的 worker thread 上处理 server 的异步回复和广播事件
    1. 中间层开发这可以根据情况用一个 worker thread 来处理多个 endpoint 事件, 避免消耗过多线程 (并发问题).
    2. 当然也可以用多个 worker thread 为一个 endpoint 服务, 例如创建多个线程来分别执行文件下载, 视频编解码, 外设IO等操作
  • 多线程协同工作(线程间通信)要求线程之间能够传递消息和数据,例如文件下载完毕要通知endpoint做后续处理。在进程内由于可以访问同一地址空间,最好的通信载体是对象 - 既能承载数据,还能指定数据的处理方式。job就是FDBus在线程之间传递的对象,通过job在线程之间的传递和执行实现进程间通信。
  • FDBus 更重要的功能是进程间通信 IPC, 进程之间无法直接传递对象, 只能以消息的形式交互, 并且消息传输过程中需要做序列化,接收到消息后需要做反序列化。
    1. 每种IPC机制,包括Binder,SOME/IP,DBus,都有自己的序列化方式。序列化方式的好坏直接影响到通信效率,负载,对数据结构的支持程度以及使用的便利性。
    2. FDBus没有自己的序列化方式,直接采用google protocol buffer,使用方便,功能齐全,并支持idl自动代码生成。
    3. 数据在进程间的通信采用socket,包括Unix Domain Socket(UDS)和TCP socket。具体采用哪种类型,系统会根据Client和Server的部署而自动选择:如果在同一主机内部使用UDS,否则使用TCP socket。对于Windows,由于不支持UDS,全部采用TCP socket。

FDBus 寻址和组网

Server地址

server地址是server在网络中的标识,通过该标识client可以找到指定的server并与之建立通信
前面提到,FDBus支持UDSTCP socket,每种socket有自己的命名方式和命名空间。为了统一FDBus使用如下规则定义Server地址:

  • UDS:file://socket文件名
  • TCP socket:tcp://ip地址:端口号
    不同于一般意义上的socket server,FDBus server可以同时绑定多个地址,每个地址都可接受client的连接。一旦连接上,每个地址都提供同样的服务,所以client可以选择任意一个地址建立连接。下面是一个FDBus server地址绑定示意图:


    上图中,server绑定了一个UDS地址:file:///tmp/fdb-ipc1。同一主机上的client可以用该地址发起连接,当然也可连接到其它任意地址,但无疑使用UDS是最高效的,且UDS支持peer credentials,进而支持安全策略。
    由于主机有多个网口,server还可以在每个网口上各绑定一个地址(端口号):tcp://192.168.1.2:60004和tcp://192.168.0.1:60004。每个地址用于连接对应网段的client。

Server命名和地址分配

用上述地址定位server使用不方便,不直观,地址会随组网方式变化而改变,无法灵活部署。为此FDBus增加了一种寻址方式:server名字寻址。每个server可以拥有自己的名字;运行一个叫name server的服务,负责为server分配地址,管理server名字与地址的映射,解析server名字,发布server地址。name server有点类似internet上的DNS。为支持server名字寻址,在两种URL之外增加一种格式,作为名字地址,如下所示:

  • svc://server名字
    名字地址是虚拟地址, 无论 server 位于何处,只要它的名字地址不变,client 都可以通过该地址与之建立联系。如果 server 调用 bind() 绑定名字地址(svc://开头的地址),name server 会为其分配实际地址(tcp://或file://开头的地址),并将名字和地址注册到映射表里。如果 client 连接名字地址,name server 会根据名字查找 server 的实际地址,选择一个最合适的实际地址发布给 client。client 通过该地址与 server 建立点对点的直连。下图是在 name server 协助下,client 和 Server 利用名字地址建立连接的流程:
  • 首先client调用connect(“svc://medisServer”)要求和名叫mediaServer的server建立连接。由于使用的是名字地址,FDBus会向name server索要mediaServer的实际地址。
  • 但现在mediaServer还没有上线,所以无法解析该名字,只是订阅了对该服务的上线通知。不久后server调用bind(“svc://mediaServer”)上线,由于使用名字地址,同样会向name server发出请求。name server为其注册名字,分配UDS和TCP地址并返给server。server分别绑定每个实际地址,成功后通知name server。
  • name server向整个系统发布该server上线的消息以及server地址:广播给本地client的是UDS地址,广播给其它节点上client的是TCP地址。client利用收到的地址与server建立连接,同时client和server都能收到onOnline()的事件通知。

name server使用如下规则分配server地址:

Server

TCP Address

UDS Address

host server

port No. 61000

/tmp/fdb-hs

name server

port No. 61001

/tmp/fdb-ns

user servers

Port 61002 – Port 65535或系统自动分配

/tmp/fdb-ipc0, /tmp/fdb-ipc1 …

多主机组网

  • 由于name server的地址是固定的,endpoint启动后,会自动连接到name
  • server注册(server)或解析(client)名字。 如果有多台主机,每台主机上运行自己的name server,负责各自的名字服务,那么这些主机就成了孤岛,无法通过svc://server_name这样的服务名称互相连接。当然client可以绕开name server,用实际地址直接连接上server,但这样无法灵活部署和组网
  • 为了支持跨网络的名字解析,需要有一个服务来管理系统里所有主机,把主机信息同步给所有name server,进而这些name server之间可以建立连接,协同工作,共同完成全网范围内的名字服务。这个服务就是host server

host server的工作原理

  • 整个网络运行一个 host server,可以位于任意一台大家都能访问的主机上。所有主机的name server都连接到host server,向它注册自己所在的主机。host server维护一张包含各主机ip地址的主机列表,并把该表同步给网络里所有的name server。name server根据该表与网络里所有主机上的name server建立连接。
  • 一旦所有主机上的name server都两两建立连接,就可以通过一套内部协议完成跨主机的服务名解析和服务上线通知。例如当一台主机上的client向本地name server请求解析服务名对应的地址,本地name server可以把该请求广播给所有相连的name server,在整个网络范围内查找服务。下面是整个系统组网示例图:

    上图中,name server和host server之间建立星形连接,name server和name server之间两两相连,组成一张网。在这个系统里,name server和host server的主要任务如下:

client server 建立连接过程

  1. name server连接到host server,把所在的主机注册进host server (星形连接)
  2. host server收集所有主机信息,形成主机地址表
  3. host server把主机地址表广播给所有name server
  4. name server从表中获得其它主机上name server的地址,并与之建立两两相连
  5. 所有server与本地name server相连,向其注册服务名字。本地name server将新注册的服务广播给本地的client以及网络里所有其它的name server
  6. 其它name server收到该广播后,同样在本地做一个广播,通知给所有client通过这种方式把服务上线的消息扩散到整个网络
  7. 所有client与本地name server相连,申请服务名字解析。本地name server搜索自身的server地址映射表,同时把申请发送给其它所有name server
  8. 其它name server收到申请后,搜索各自的server地址映射表,并把结果返回给发起申请的name server
  9. name server把收到的返回结果转发给发起申请的client,client利用结果里的实际地址与服务建立直连。通过这种方式可以找到所有主机上的服务

从上图也可以看出,一旦clientserver之间建立连接,所有的通信都通过这个连接完成,无需经过中间环节转发

服务名字的唯一性

  • 由于每台主机都有自己的 name server,所以在主机内部,服务不能重名,但是在不同主机上可以重名
  • 在这种情况下,当 client 申请名字解析时,可能会收到来自不同主机反馈 server 信息。client 可以定制连接策略:
  1. 总是连接新的server
  2. 只连接第一个server
  3. 或是只连接指定的server

心跳检测,重连和上线、离线检测

为了使整个系统可靠运行,保证任何服务都可以优雅重启(重启后整个系统依旧正常工作),FDBus有完善的心跳检测和上线、离线检测机制:

  • endpoints 和 name server 之间有重连机制, 确保 name server 重新启动后 endpoint 重视能够与之建立连接
  • name server 和 host server 之间有心跳检测机制, 一旦心跳消失, name server 回尝试与 host server 重连, 确保 name server 与 host server 之间连接的可靠性
  • name server 和 name server 之间的连接建立由 host server 来保证, 当 name server 上线时, host server 会通知所有其他的 name server 与之建立连接, 也会通知该 name server 与其他所有 name server 建立连接, 双向都寻求连接
  • client 和 server 之间的连接建立由 name server 来保证, server 上线时, name server 会通知 client 与之建立连接

安全性

随着系统越来越复杂和开放,安全性已经成为系统架构设计时关注的焦点。一个开放的系统意味着可能存在入侵者,一旦入侵者访问了不应该访问的资源就可能造成信息泄露或破坏。
另一方面,一个系统的安全性是建立在信任链的基础之上的,只有满足必要的安全基础才能构筑自身的安全能力。对于FDBus来说,有以下两个前提条件:

  1. 最基本的前提是FDBus自身的完整性:系统中运行的FDBus库,name server,host server都是合法的,没有被篡改或替换,否则无论如何也保证不了安全性。这一点通过操作系统能够权限管理,secure boot,DM-verity/FS-verity,安全升级,SELinux等机制来确保。
  2. 其次在网络上,FDBus消息是以明文传递的,一旦有人非法监听网络报文就有可能造成信息泄露以及安全漏洞。所以讨论FDBus安全性的另一前提是入侵者无法截取网络报文,获得FDBus在链路上传递的数据。将来会对关键数据如token加密,但目前暂时还没有实现。

基于这些假设,FDBus面临的攻击主要来自三方面:

  1. 非法主机连接到FDBus总线上并运行非法client访问其它主机上的server
  2. 在一台合法主机上运行非法client访问主机里的FDBus server
  3. 合法的主机上运行合法client,但试图获取没有权限的数据或执行没有权限的操作。基于以上攻击,FDBus从如下方面确保系统安全运行:

主机节点的鉴权:所有加入FDBus的主机都划分成不同的安全等级
服务访问的鉴权:所有client都划分成不同的安全等级
访问限制:server的方法调用和事件广播划分安全等级,对应的client才能调用与server安全等级相匹配的的方法和注册相匹配的事件广播

主机节点鉴权

服务访问鉴权

安全等级与访问权限

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FDbus 的相关文章

  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c

随机推荐

  • 目标检测中Anchor如何映射到原图

    利用深度学习进行目标检测一般需要经过较深的卷积神经网络 而卷积本身就有位置不变性 会将原图中的某块区域映射为特征图上的某个点 anchor和特征图的关系 既然anchor是特征图对应像素点在原图的某个区域 那么是怎样的对应关系呢 现在假设某
  • 下载R包遇到的问题用这个方法解决了!!!

    之前我一直以为一个镜像源能适用于下载所有的R包 然而最近两天在线下载R包没有一次成功的 也改了很多次镜像源 然而每次都报错 unable to access index for repository http streaming stat
  • GD32替代STM32使用Cube MX的HAL库开发

    目录 一 STM32F103与GD32F103 差别比较 二 GD32使用CubeMX配置 1 配置单片机型号 2 晶振配置 3 其它配置 三 GD32使用Keil配置 1 更改型号为GD32芯片 2 编译下载 四 例程下载链接 一 STM
  • C++之智能指针auto_ptr

    当你在读这篇文章的时候 应该都有这样一个疑问 那就是为什么要使用智能指针 我们先看这样一个示例 include
  • RC4(原理+代码+调用openssl库+报错分析)

    目录 一 原理 1 流密码的基本思想 2 RC4流密码算法的原理 1 初始化数据表S和T 2 初始置换数据表S 密钥调度算法 3 生成密钥流 伪随机数生成算法 二 代码实现 三 调用openssl库实现RC4 1 代码实现 2 调用open
  • 结合Wireshark捕获分组深入理解DNS协议

    一 概述 1 1 DNS 识别主机有两种方式 主机名 IP地址 前者便于记忆 如www yahoo com 但路由器很难处理 主机名长度不定 后者定长 有层次结构 便于路由器处理 但难以记忆 折中的办法就是建立IP地址与主机名间的映射 这就
  • vue3的文档

    四 Vue 3 1 TypeScript 1 动态类型的问题 前面我们讲过 js 属于动态类型语言 例如 function test obj obj 可能只是个字符串 test hello world obj 也有可能是个函数 test g
  • SLAM综述阅读笔记七:Visual and Visual-Inertial SLAM: State of the Art, Classification,and Experimental 2021

    Visual and Visual Inertial SLAM State of the Art Classification and Experimental Benchmarking 作者 Myriam Servi res Val ri
  • IP核的使用之ROM(Vivado)

    存储类IP核 ROM 文章目录 存储类IP核 ROM 一 引言 二 ROM IP核及相关内容扫盲 1 ROM简介 2 ROM的初始化文件介绍 3 分布式ROM和块ROM简介 4 单端口ROM和双端口ROM简介 三 分布式ROM IP核的创建
  • 高斯混合模型(GMM)先验的推断

    GMM先验的优化方程 假设图像降质模型为 Y A X N Y AX N Y AX N 我们希望恢复
  • 腾讯云SA3服务器AMD处理器CPU网络带宽性能详解

    腾讯云AMD服务器SA3实例CPU采用2 55GHz主频的AMD EPYCTM Milan处理器 睿频3 5GHz 搭载最新一代八通道DDR4 内存计算性能稳定 默认网络优化 最高内网收发能力达1900万pps 最高内网带宽可支持100Gb
  • 二极管常见分类及使用

    1 肖特基二极管 1 1概念 肖特基二极管 SBD 不是利用P型半导体与N型半导体接触形成PN结原理制作的 而是利用金属与半导体接触形成的金属 半导体结 肖特基势垒 原理制作的 因此 SBD也称为金属 半导体 接触 二极管或表面势垒二极管
  • 获取上个月的起止时间

    function 日期初始化 alert getStartDate alert getEndDate 获取开始时间 function getStartDate var date new Date var year date getFullY
  • Transform 基础知识

    Transform 变换 是场景中最常打交道的类 用于控制物体的位移 旋转 缩放等功能 Transform Class inherits from Component IEnumerable Position rotation and sc
  • HJ41 称砝码

    题目 HJ41 称砝码 题解 import java util 注意类名必须为 Main 不要有任何 package xxx 信息 public class Main public static void main String args
  • RBAC详解

    RBAC详解 1 RBAC模型的工作原理 2 RBAC模型的实现 3 总结 RBAC模型是一种基于角色的访问控制模型 它定义了一些规则和机制来控制用户对系统资源的访问 在本文中 我们将详细讨论RBAC模型的工作原理 并使用一个数据库示例来说
  • 剑指Offer - 面试题49:丑数

    题目 我们把只包含因子2 3 5的数称为丑数 Ugly Number 求按照从小到大的顺序的第1500个丑数 例如 6 8都是丑数 但14不是 因为它包含因子7 习惯上我们把1当作第一个丑数 分析 暴力法 从1开始每个数字都判断 若是丑数
  • 代码实现 —— 基于 STM32 的可见光通信系统课程设计

    目前课设已完成 2m距离 传输10000个连续数字 每个数字两字节大小 即总共20000个字节160000bit 用时7s 大约2 3万bit s 即22 4kB s 误码率为0 视频演示链接 另外 自己写了一个基于QT的串口上位机 结合U
  • 前端面试题汇总(vue+html基础)最新最全

    一 HTML基础部分 1 什么是盒子模型 重要 在网页中 一个元素占有空间的大小由几个部分构成 其中包括元素的内容 content 元素的内边距 padding 元素的边框 border 元素的外边距 margin 四个部分 这四个部分占有
  • FDbus

    文章目录 介绍 背景 特点 FDBus 中间件模型 FDBus 寻址和组网 Server地址 Server命名和地址分配 name server使用如下规则分配server地址 多主机组网 host server的工作原理 client 与