开源 Linux 服务器与中间件(二)嵌入式Linux服务器和中间件
文章的目的记录所使用的的Linux服务器和中间件的配置和使用,防止时间太长忘记,进行重复工作。
推荐链接:
linux C 语言开发 (一) Window下用gcc编译和gdb调试
linux C 语言开发 (二) VsCode远程开发 linux
linux C 语言开发 (三) 建立云服务器
linux C 语言开发 (四) linux系统常用命令
linux C 语言开发 (五) linux系统目录结构
linux C 语言开发 (六) 程序的编辑和编译(vim、gcc)
linux C 语言开发 (七) 文件 IO 和标准 IO
linux C 语言开发 (八) 进程基础
linux C 语言开发 (九) 进程间通讯--管道
linux C 语言开发 (十) 进程间通讯--信号
linux C 语言开发 (十一) 进程间通讯--共享内存
linux C 语言开发 (十二) 进程间通讯--消息队列
Linux C到Android App开发推荐链接(入门十二章):
开源 java android app 开发(一)开发环境的搭建_csdn 开源 java android app-CSDN博客
开源 java android app 开发(一)开发环境的搭建-CSDN博客
开源 java android app 开发(二)工程文件结构-CSDN博客
开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客
开源 java android app 开发(四)GUI界面重要组件-CSDN博客
开源 java android app 开发(五)文件和数据库存储-CSDN博客
开源 java android app 开发(六)多媒体使用-CSDN博客
开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客
开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客
开源 java android app 开发(九)后台之线程和服务-CSDN博客
开源 java android app 开发(十)广播机制-CSDN博客
开源 java android app 开发(十一)调试、发布-CSDN博客
开源 java android app 开发(十二)封库.aar-CSDN博客
linux C到.net mvc开发推荐链接:
开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客
开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客
开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客
开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客
开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客、
内容:嵌入式linux中常用的服务器和中间件的介绍,技术架构组合,以及优缺点。
嵌入式Linux会极度追求精简、低功耗、实时性和稳定性。
核心区别:从“通用”到“专用”
在服务器领域,我们讨论的是支持海量并发、处理复杂业务的通用软件。而在嵌入式领域,这些软件大多被“瘦身”或重写,甚至其角色被直接整合到应用程序中。
-
Web服务器:目的不是为了服务公众,而是为了设备管理。通过一个简单的网页来配置设备参数、查看状态。
-
中间件:不是为了解耦复杂应用,而是为了提供关键的服务能力,如网络连接、数据传输、远程调用等。
-
数据库:很少使用MySQL等大型数据库,而是使用轻量级的键值存储或文件系统。
一、轻量级 Web 服务器
用于提供设备的管理界面(Web UI)。
1. Boa
-
特点:非常古老但极其小巧的单任务HTTP服务器。在一个时间点只能处理一个请求,但代码量极小。
-
应用场景:对资源极度敏感,且管理页面访问频率极低的设备(如网络交换机、简单传感器网关)。
2. Lighttpd
-
特点:相比Boa更强大,采用事件驱动模型,支持FastCGI,性能较好,同时内存占用仍远低于Nginx/Apache。
-
应用场景:需要较好性能和管理功能的嵌入式设备,如路由器、网络摄像头、智能家居中枢。
3. GoAhead
-
特点:专为嵌入式设备设计的Web服务器。非常轻量,安全性高,并内置了嵌入式JavaScript和表单处理等功能。
-
应用场景:在工业控制、网络设备中非常流行。
4. uhttpd
-
特点:OpenWrt项目默认使用的微型Web服务器,与LuCI(OpenWrt的Web配置界面)紧密集成。
-
应用场景:几乎所有基于OpenWrt的路由器和其他网络设备。
小结:在嵌入式领域,Nginx和Apache由于资源消耗过大,很少见。
二、网络通信与中间件
这是嵌入式Linux的核心,负责设备与外界(云、手机、其他设备)的通信。
1. MQTT
-
功能类型:轻量级的发布/订阅消息传输协议。专为受限环境和不稳定网络设计。
-
常用实现:
-
Eclipse Mosquitto:一个轻量级的MQTT代理(Broker),也可以嵌入到设备中。
-
Paho MQTT:提供了多种语言的客户端库,嵌入式C/C++版本非常常用。
-
-
应用场景:
-
物联网设备的标配。设备作为客户端,将数据(如温度、状态)发布到Broker,或从Broker订阅指令。
-
智能家居、工业物联网、车联网。
-
2. CoAP
-
功能类型:受限应用协议,可以理解为“物联网世界的HTTP”。基于UDP,非常省电和带宽。
-
应用场景:在计算能力极低的传感器节点间通信,特别是在电池供电的场景下。
3. D-Bus
-
功能类型:进程间通信总线。允许同一个设备上的不同应用程序相互通信和交换数据。
-
应用场景:
-
在智能电视、车载信息娱乐系统中,一个应用(如媒体播放器)通过D-Bus通知另一个应用(如系统UI)更新状态。
-
系统服务与用户应用程序之间的通信。
-
4. gRPC
-
功能类型:高性能、跨语言的RPC框架。基于HTTP/2和Protocol Buffers。
-
应用场景:在性能要求较高、需要强接口定义的复杂嵌入式系统中,如自动驾驶域控制器、高端机器人。
5. Avahi / mDNS
-
功能类型:零配置网络服务发现。允许设备在没有中央DNS服务器的情况下在本地网络中发现彼此。
-
应用场景:打印机、智能音箱、HomeKit设备等在局域网内自动被发现和连接。
三、轻量级数据存储
1. SQLite
-
特点:这不是一个服务器,而是一个库。整个数据库就是一个文件,零配置、无服务器、事务完整。它是嵌入式领域事实上的数据库标准。
-
应用场景:
-
存储设备配置信息、历史运行数据、事件日志。
-
手机App、浏览器内部都在大量使用SQLite。
-
2. 键值存储
-
特点:比SQLite更简单,通常就是一个简单的库,将数据以键值对的形式存储。
-
常见实现:
-
Berkeley DB:一个经典的嵌入式键值数据库。
-
LMDB:极其快速且内存映射的键值存储。
-
-
应用场景:缓存、快速配置存取。
四、特殊功能的“中间件”
1. Fluent Bit
-
功能类型:轻量级的日志处理器和转发器。
-
应用场景:在嵌入式设备上收集各种日志,然后高效地转发到中央日志系统(如ELK)或云平台。
2. EdgeX Foundry
-
功能类型:一个开源的、微服务式的边缘计算平台。
-
应用场景:在工业网关等边缘节点上,负责连接各种不同的物理设备(通过“设备服务”),进行数据标准化、本地处理,再上传到云端。它本身就是由一系列微服务中间件组成的。
典型嵌入式Linux系统架构示例
1. 智能家居网关
-
硬件:ARM Cortex-A SoC, 128MB RAM
-
软件栈:
-
Web UI:
Lighttpd
+ 一个简单的CGI/后端程序,用于用户配置Wi-Fi、添加设备。 -
通信:
Mosquitto MQTT Client
连接家庭内部的Zigbee/Z-Wave设备,并将数据聚合后通过Paho MQTT
发布到云平台。 -
数据存储:
SQLite
存储设备状态和简单的历史记录。 -
进程通信:
D-Bus
让Web后端、MQTT客户端、设备驱动管理等服务之间可以互相通知状态变化。
-
2. 工业控制器
-
硬件:高性能多核ARM或x86, 带实时补丁的Linux内核
-
软件栈:
-
通信:
OPC UA
作为工业标准通信协议,gRPC
用于内部高性能模块间调用。 -
边缘计算:
EdgeX Foundry
管理各种工业PLC和传感器。 -
数据:
Fluent Bit
将关键指标和日志发送到中央监控系统。
-
总结
类别 | 服务器/桌面Linux | 嵌入式Linux | 核心理念 |
---|---|---|---|
Web服务器 | Nginx, Apache | Boa, Lighttpd, GoAhead | 设备管理,而非公众服务 |
应用服务器 | Tomcat, Node.js | 应用直接编译为二进制,或使用轻量级框架 | 无中间层,直接运行 |
数据库 | MySQL, PostgreSQL, Redis | SQLite, 键值存储 | 库而非服务,文件存储 |
消息中间件 | RabbitMQ, Kafka | MQTT, CoAP | 轻量、低功耗、为IoT而生 |
服务发现 | Etcd, Consul | Avahi | 零配置,局域网内 |
嵌入式Linux的世界是“小而美”的。选择任何组件的第一原则都是:在满足功能需求的前提下,资源占用最小,稳定性最高。