当前位置: 首页 > article >正文

嵌入式Web服务器事先,控制开发板硬件(流程概述)

嵌入式 Web 控制硬件Boa CGI JSON-RPC 完整实现一、系统架构开发板i.MX6ULL运行Boa Web 服务器提供静态页面和 CGI 支持。RPC 服务端常驻后台基于 JSON‑RPC 接收调用通过 Modbus 控制 LED 等硬件。CGI 程序被 Boa 调用作为中间层连接前端与 RPC 服务端。用户通过浏览器访问开发板 IP → 点击按钮 → 异步 CGI 请求 → RPC 控制硬件 → 返回状态 → 页面无刷新按钮变色。二、配置文件与代码1. Boa 配置文件/boa/boa.conftextPort 80 User 0 Group 0 ErrorLog /boa/log/error_log DocumentRoot /boa/www UserDir public_html DirectoryIndex index.html DirectoryMaker /boa/boa_indexer KeepAliveMax 1000 KeepAliveTimeout 10 MimeTypes /boa/mime.types DefaultType text/plain CGIPath /bin:/usr/bin:/usr/local/bin Alias /doc /usr/doc ScriptAlias /cgi-bin/ /boa/cgi-bin/2. 前端页面/boa/www/index.htmlhtml!DOCTYPE html html head meta charsetUTF-8 title嵌入式硬件控制/title style button { padding: 10px 20px; font-size: 16px; cursor: pointer; background-color: #4CAF50; color: white; border: none; border-radius: 5px; } button.red { background-color: #f44336; } /style /head body h3LED 远程控制/h3 button idmyBtn驱动硬件/button p idstatus/p script const btn document.getElementById(myBtn); const statusP document.getElementById(status); btn.onclick function() { this.classList.add(red); fetch(/cgi-bin/led_cgi_1.cgi) .then(response response.json()) .then(data { console.log(CGI返回:, data); statusP.innerText LED 状态: data.led; setTimeout(() { btn.classList.remove(red); }, 1000); }) .catch(err { console.error(请求失败:, err); btn.style.backgroundColor orange; statusP.innerText 请求失败; }); }; /script /body /html3. CGI 程序/boa/cgi-bin/led_cgi_1.cgic#include stdio.h #include stdlib.h #include rpc_client.h #define PATH /tmp/led_state.txt int main() { int cur_stat 0; FILE *fp fopen(PATH, r); if (fp) { fscanf(fp, %d, cur_stat); fclose(fp); } int new_stat cur_stat ? 0 : 1; if (RPC_Client_Init() 0) { printf(Content-Type: text/plain\n\nERROR: RPC init failed); return 1; } if (rpc_led_control(1, new_stat) 0) { printf(Content-Type: text/plain\n\nERROR: rpc led control failed); return 1; } fp fopen(PATH, w); if (fp) { fprintf(fp, %d, new_stat); fclose(fp); } printf(Content-Type: application/json\n\n); printf({\led\:\%s\}, new_stat ? ON : OFF); return 0; }4. RPC 客户端 (rpc_client.c核心)c#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #include errno.h #include cJSON.h #include rpc.h #define PORT 8888 static int g_SocketClient; int RPC_Client_Init(void) { int sock socket(AF_INET, SOCK_STREAM, 0); if (sock 0) return -1; struct sockaddr_in addr; addr.sin_family AF_INET; addr.sin_port htons(PORT); addr.sin_addr.s_addr inet_addr(127.0.0.1); if (connect(sock, (struct sockaddr*)addr, sizeof(addr)) 0) { close(sock); return -1; } g_SocketClient sock; return sock; } int rpc_led_control(int num, int status) { char buf[200]; sprintf(buf, {\method\:\led_control\,\params\:[%d,%d],\id\:\2\}, num, status); send(g_SocketClient, buf, strlen(buf), 0); int len read(g_SocketClient, buf, sizeof(buf)-1); if (len 0) return -1; buf[len] 0; cJSON *root cJSON_Parse(buf); cJSON *result cJSON_GetObjectItem(root, result); int ret result ? result-valueint : -1; cJSON_Delete(root); return ret; }5. RPC 服务端 (rpc_server.c核心)c#include jsonrpc-c.h #include stdio.h #include stdlib.h #include unistd.h #include rpc.h #include modbus.h // 包含 modbus_do_write 等 #define PORT 8888 static struct jrpc_server my_server; static int serial_fd; cJSON * server_led_control(jrpc_context *ctx, cJSON *params, cJSON *id) { cJSON *num cJSON_GetArrayItem(params, 0); cJSON *status cJSON_GetArrayItem(params, 1); modbus_do_write(serial_fd, 2, num-valueint, status-valueint); return cJSON_CreateNumber(0); } int main() { // 初始化串口、Modbus RS485 等 serial_fd open_serial(/dev/ttymxc2); set_opt(serial_fd, 115200, 8, N, 1); // ... 其他初始化 jrpc_server_init(my_server, PORT); jrpc_register_procedure(my_server, server_led_control, led_control, NULL); // 可注册更多方法如 dht11_read, EEPROM_write 等 jrpc_server_run(my_server); jrpc_server_destroy(my_server); return 0; }三、运行步骤编译 RPC 服务端放到开发板并后台运行bash./rpc_server 编译 CGI 程序交叉编译basharm-buildroot-gcc -o led_cgi_1.cgi led_cgi_1.c rpc_client.c cJSON.c -lpthread复制到/boa/cgi-bin/启动 Boa Web 服务器bashboa浏览器访问http://开发板IP点击按钮即可控制 LED页面无刷新按钮变红并恢复显示当前 LED 状态。四、注意事项状态文件/tmp/led_state.txt在重启后会丢失tmpfs如需持久化可改为/root/led_state.txt等。RPC 服务端和 CGI 程序编译时需链接cjson和jsonrpc-c库。确保 CGI 程序有可执行权限chmod x /boa/cgi-bin/led_cgi_1.cgi如果使用fetch请求浏览器可能因同源策略限制但开发板上访问同 IP 和端口不存在跨域问题。

相关文章:

嵌入式Web服务器事先,控制开发板硬件(流程概述)

嵌入式 Web 控制硬件:Boa CGI JSON-RPC 完整实现 一、系统架构 开发板(i.MX6ULL)运行: Boa Web 服务器:提供静态页面和 CGI 支持。 RPC 服务端(常驻后台):基于 JSON‑RPC 接收调…...

项目中**LabVIEW 位操作逻辑**的完整、清晰解释,以及与 C# 实现的对应关系

以下是针对项目中LabVIEW 位操作逻辑的完整、清晰解释,以及与 C# 实现的对应关系。 LabVIEW 中关键位操作函数 你的描述(“数字转换成 bool 数组 → 反转一维数组 → 循环检查”)主要涉及以下两个核心 LabVIEW 函数: Number To Boolean Array(数值转布尔数组) 位置:Pr…...

C语言数据类型与变量

一、数据类型1.字符型char2.整形short 【int】intlong 【int】long long 【int】3.浮点型floatdoublelong double4.布尔型(使用需要包含头文件<stdbool.h>)_Bool取值为true或false5.各种数据类型的长度需要用到sizeof操作符sizeof 是⼀个关键字&#xff0c;也是操作符&am…...

专为视障人士设计的免费辅助工具

软件介绍 NVDA是一款免费的屏幕阅读器&#xff0c;专门为视障人士设计。它通过语音合成和盲文显示两种方式&#xff0c;帮助视障人士实现对电脑的无障碍操作&#xff0c;缩小数字鸿沟。 轻量化与基础操作 软件是绿色版&#xff0c;无需安装&#xff0c;双击"nvda.exe&qu…...

元组、列表、集合、字典和切片

列表&#xff08;List&#xff09;列表是可变的有序序列&#xff0c;元素可重复&#xff0c;用方括号 [] 定义。支持增删改查操作。案例fruits ["apple", "banana", "cherry"] fruits.append("orange") # 添加元素 fruits[1] "…...

【教学类-160-14】20260425 AI视频培训-练习014“豆包AI视频《月下枯蔷(哥特风)》+豆包图片风格:油画”

20260425 《014月下枯蔷&#xff08;哥特风&#xff09;》风格&#xff1a;油画背景需求 选了哥特风格故事脚本 豆包故事脚本 只有画面&#xff0c;没有图片关键词、图片转视频动态关键词 内容有点长&#xff0c;我要控制在10秒一个镜头 很好只有10秒一个镜头了。 写一个故事名…...

抖音无水印视频下载终极指南:3分钟掌握免费高清资源获取秘籍

抖音无水印视频下载终极指南&#xff1a;3分钟掌握免费高清资源获取秘籍 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback…...

学Simulink——基于Simulink的电池热管理系统(BTMS)多目标优化​

目录 手把手教你学Simulink——基于Simulink的电池热管理系统&#xff08;BTMS&#xff09;多目标优化​ 摘要​ 一、背景与挑战​ 1.1 为什么电池越快充&#xff0c;温差越容易“失控”&#xff1f;​ 1.2 核心痛点与设计目标​ 二、系统架构与核心控制推导​ 2.1 整体架…...

DLSS Swapper终极指南:三步实现游戏DLSS智能管理,告别手动替换烦恼

DLSS Swapper终极指南&#xff1a;三步实现游戏DLSS智能管理&#xff0c;告别手动替换烦恼 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾经为了提升游戏帧率&#xff0c;在数十个游戏目录中手动寻找并替换DL…...

Driver Store Explorer:Windows系统驱动管理的终极解决方案

Driver Store Explorer&#xff1a;Windows系统驱动管理的终极解决方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾为Windows系统盘空间不断减少而烦恼&#xff1f;是否发现…...

基于Simulink的电池热管理系统(BTMS)多目标优化​

目录 手把手教你学Simulink——基于Simulink的电池热管理系统(BTMS)多目标优化​ 摘要​ 一、背景与挑战​ 1.1 为什么电池越快充,温差越容易“失控”?​ 1.2 核心痛点与设计目标​ 二、系统架构与核心控制推导​ 2.1 整体架构:从“盲目制冷”到“多目标运筹帷幄”的…...

2026北航计算机学院保研硕士预推免面经

2026年开始北航计算机学院全面取消了夏令营&#xff0c;最终保研的录取资格全由预推免决定。而作为经典的强com院校&#xff0c;北航的预推免延续了前夏令营的节奏&#xff0c;即考核通过才有机会在保研时录取。一、日程9.18 上午报道心理健康测评 下午机试&#xff08;如需要&…...

FAQ 数据库MySQL与SQLite选择与切换

Skeyevss FAQ&#xff1a;数据库 MySQL 与 SQLite 选择与切换 试用安装包下载 | SMS | 在线演示 项目地址&#xff1a;https://github.com/openskeye/go-vss 1. 何时用 SQLite 适合&#xff1a;单机试用、开发本机、小规模验证。优点是无独立数据库进程、部署简单&#xff1…...

工业PHP网关性能瓶颈诊断手册(CPU飙高98%、MQTT丢包率超12%的17个真实故障根因)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;工业PHP网关性能瓶颈诊断手册&#xff08;CPU飙高98%、MQTT丢包率超12%的17个真实故障根因&#xff09; 工业PHP网关常被部署于边缘计算节点&#xff0c;承担协议转换、设备接入与实时数据路由等关键任…...

CaTok:基于因果标记化的图像序列建模新方法

1. 项目概述&#xff1a;重新定义图像序列建模的因果边界在计算机视觉与序列建模的交叉领域&#xff0c;图像标记化&#xff08;Image Tokenization&#xff09;一直是连接像素空间与离散表示的关键桥梁。传统方法如ViT的1616分块策略虽然简单高效&#xff0c;却忽视了图像序列…...

如何用LeagueAkari智能工具集提升英雄联盟游戏效率的完整指南

如何用LeagueAkari智能工具集提升英雄联盟游戏效率的完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit LeagueAkari是一款基于英雄联盟官…...

【PHP 8.9类型系统终极指南】:Strict Type Enforcement如何将运行时错误拦截在编译前?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PHP 8.9类型系统严格校验的演进与定位 PHP 8.9 并非官方发布的正式版本&#xff08;截至 PHP 官方最新稳定版为 8.3&#xff09;&#xff0c;但作为社区广泛讨论的“假想演进节点”&#xff0c;它承载了…...

量子编译框架QClaw:模块化设计与硬件感知优化实践

1. 项目概述与核心价值最近在量子计算的开源社区里&#xff0c;一个名为QuantumClaw/QClaw的项目引起了我的注意。这个名字本身就很有意思&#xff0c;“Quantum”指向了其核心领域——量子计算&#xff0c;而“Claw”则暗示了某种抓取、操控或接口的能力。简单来说&#xff0c…...

十大Web安全扫描工具

十大Web安全扫描工具 扫描程序可以在帮助造我们造就安全的Web站点上助一臂之力&#xff0c;也就是说在黑客“黑”你之前&#xff0c;先测试一下自己系统中的漏洞。我们在此推荐10大Web漏洞扫描程序&#xff0c;供您参考。 Nikto 这是一个开源的Web服务器扫描程序&#xff0c;它…...

基于炬芯ATS2825音响系统开发

基于炬芯ATS2825音响系统开发...

《每日一命令15:du——深度分析磁盘占用》

本期摘要du 是 Linux 下分析磁盘占用最直接的命令&#xff0c;与 df 互补&#xff1a;df 看分区整体&#xff0c;du 看具体目录/文件。掌握 du -sh&#xff08;汇总目录大小&#xff09;、du -sh *&#xff08;列出子目录&#xff09;、du -h --max-depth1&#xff08;限制深度…...

《100个“反常识”经验15:Nginx 502排查:从应用到内核》

本期摘要502 Bad Gateway 是 Nginx 最让人头疼的错误码之一。它不像 404 那样明确&#xff08;文件不存在&#xff09;&#xff0c;而是表示“上游服务器返回了无效响应”。本文从一次真实故障切入&#xff0c;按“客户端 → Nginx → 应用 → 数据库”的链路分层排查&#xff…...

FastHMR:基于Transformer与扩散模型的高效人体网格恢复

1. 项目背景与核心价值人体网格恢复&#xff08;Human Mesh Recovery&#xff09;是计算机视觉领域的重要研究方向&#xff0c;其目标是从单张RGB图像中重建出具有三维几何信息的人体模型。传统方法通常依赖复杂的优化流程或级联网络&#xff0c;而FastHMR通过融合Transformer架…...

扩散模型文本条件生成机制与调制引导技术解析

1. 扩散模型中的文本条件生成机制解析扩散模型&#xff08;Diffusion Models&#xff09;作为当前生成式AI的核心架构&#xff0c;其文本条件生成能力直接影响着图像/视频生成的质量与可控性。传统实现路径主要依赖两大机制&#xff1a;1.1 注意力机制的核心作用跨注意力层&…...

代码大语言模型训练框架与优化实践

1. 项目概述"代码大语言模型训练框架与优化实践"这个标题背后&#xff0c;隐藏着当前AI领域最炙手可热的技术方向之一。作为一名在AI工程化领域摸爬滚打多年的从业者&#xff0c;我亲眼见证了从早期基于规则的系统到如今百亿参数大模型的演进历程。代码大语言模型&am…...

Sage智能体平台:从LLM到生产级自动化工作流的工程实践

1. 项目概述&#xff1a;从复杂任务到可靠交付的智能体平台如果你和我一样&#xff0c;在过去几年里深度参与过AI应用开发&#xff0c;特别是基于大语言模型&#xff08;LLM&#xff09;的智能体&#xff08;Agent&#xff09;项目&#xff0c;那你一定体会过那种“理想很丰满&…...

CtxPort:AI对话结构化剪贴板,一键导出Markdown

1. 项目概述&#xff1a;CtxPort&#xff0c;一个为AI对话而生的结构化剪贴板如果你和我一样&#xff0c;每天的工作流里充斥着与ChatGPT、Claude、Gemini等AI助手的深度对话&#xff0c;那你一定也经历过这种痛苦&#xff1a;花了半小时讨论出一个绝妙的架构设计&#xff0c;或…...

Dify实战:我把公司内部Wiki变成了一个能对话的AI助手(附详细配置与踩坑记录)

Dify实战&#xff1a;我把公司内部Wiki变成了一个能对话的AI助手&#xff08;附详细配置与踩坑记录&#xff09; 每次新员工入职&#xff0c;总能看到他们在公司Wiki里迷路的样子——像走进了一个没有地图的图书馆。技术文档散落在十几个目录里&#xff0c;产品需求藏在三年前的…...

LLM评估准则偏差解析与优化实践

1. LLM评估准则偏差现象的本质解析在大型语言模型(LLM)的评估与对齐流程中&#xff0c;评估准则(rubrics)作为评判模型输出的标准框架&#xff0c;其设计质量直接影响着下游策略的优化方向。传统观点往往将评估准则视为静态的"度量尺"&#xff0c;但我们的实验揭示了…...

Win11Debloat:Windows系统优化工具,轻松实现高效系统清理与隐私保护

Win11Debloat&#xff1a;Windows系统优化工具&#xff0c;轻松实现高效系统清理与隐私保护 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other cha…...