嵌入式应用开发笔记之web端设备控制台
前正在学习嵌入式应用开发非科班非系统学习半路出家型选手但是有一定Linux基础手头正好有一个嵌入式开发设备硬件资源如下主要参数配置处理器单核792MHz Cortex® A7处理器内存DDR3 512MB存储eMMC 4GB/8GBRS2321路调试串口RS4854路CAN-bus3路以太网2路软件资源如下Ubuntu20.04系统RT-Linux内核各种驱动程序我想要把手头这个嵌入式设备的硬件资源都用起来所以做了一个web端设备控制台应用来练手其中需要的技术栈有lighttpdfcgisqlite3接下来就是开发过程了有几个阶段开发环境搭建web服务器及网页设计cgi后端代码编写di/do、led、adc、485、CAN、sqlite3)开发环境搭建采用vscodedocker的方案其中docker容器提供实际编译环境(arm-linux-gnueabihf-gcc等)vscode用于连接docker容器进行代码编写工作。docker容器部署在宿主机安装了必要的软件开发包和编译器并且添加了异质架构支持arm64armhf交叉编译嵌入式设备提供RS232的调试串口通过这个串口登录到系统中然后可以进行一些准备工作比如修改网路设置因为我需要使用ssh进行宿主机和设备端的连接并且web服务器也需要解决网络问题。宿主机可以联网设备端暂时无法联网所以需要额外的软件就需要先在宿主机编译源码然后再scp到设备端比如lighttpd和sqlite3设备端本身是没有的sqlite3的安装下载[源码](SQLite Download Page)到宿主机(docker)选择sqlite-autoconf-3530200.tar.gz这样的包用tar进行解压缩并进入到解压后的目录中配置编译环境和输出目录采用静态编译方式./configure \ --hostarm-linux-gnueabihf \ --prefix/tmp/em500/embed_pack/sqlite \ --disable-readline \ --disable-shared \ --enable-staticscp可执行文件sqlite3到设备端其余的输出文件include和lib在cgi代码中会用到web服务器及网页设计首先是对lighttpd.conf文件的配置这个文件决定了嵌入式设备于浏览器交互过程中调用的fcgi代码如下所示fastcgi.server ( # 把 /api/* 的请求交给 FastCGI 处理 /cgi-bin/app.fcgi ( app-handler ( socket /tmp/app.fcgi.socket, check-local disable, # 核心告诉 lighttpd 用哪个二进制来启动 FCGI 线程池 bin-path /var/www/cgi-bin/app.fcgi, max-procs 2, # 常驻进程数嵌入式设 1~3 即可 idle-timeout 30, ) ), /cgi-bin/history.fcgi ( history-handler ( socket /tmp/history.fcgi.socket, check-local disable, bin-path /var/www/cgi-bin/history.fcgi, max-procs 1, idle-timeout 30, ) ), )使用到两个fcgi文件app.fcgi和history.fcgi这两个fcgi代码在后面介绍网页的界面设计借助ai直接生成很简约就只有一个页面页面上的交互控件对应了嵌入式设备本身自带的硬件资源的可控/可读/可写部分图片如下所示在调试cgi功能的时候有几种调试方式wireshark抓包查看数据包的详细信息、包括请求头、请求参数等浏览器控制台查看报错信息cgi代码回发调试信息浏览器弹窗、控制台打印信息cgi后端代码编写在静态编译时所有依赖库都需要显式指定包括系统库我写了两个fcgi代码分别是app.fcgi和history.fcgi。编译history.fcgi的命令如下arm-linux-gnueabihf-gcc \ -static \ -o history.fcgi \ history.cpp \ -I$TARGET_DIR/usr/local/include \ -I$TARGET_DIR/sqlite/include \ $TARGET_DIR/usr/local/lib/libfcgi.a \ $TARGET_DIR/sqlite/lib/libsqlite3.a \ -lm \ -ldl \ -lpthread其中app.fcgi的功能是多路Led指示灯控制、多路数字输出(DO)控制、多路数字输入状态(DI)控制、以及多路ADC模拟量采集对于cgi的交互过程代码讲解如下在web端的js请求轮询请求const response await fetch(/cgi-bin/app.fcgi); const data await response.json();发送控制命令const response await fetch(/cgi-bin/app.fcgi, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ type: type, channel: channel,value: value }) }); const result await response.json();获取历史数据const url /cgi-bin/history.cgi?dataType${encodeURIComponent(dataType)}timeRange${encodeURIComponent(timeRange)}; const response await fetch(url, { method: GET });在设备服务器端首先是获取请求信息/* 获取请求方法 */ char *method getenv(REQUEST_METHOD); /* 获取请求资源url */ char *uri getenv(REQUEST_URI);分别处理不同请求// 处理控制请求POST if (strcmp(method, POST) 0 strstr(uri, /cgi-bin/app.fcgi)) { // 读取 POST 数据 FCGI_fread(post_data bytes_read,1, content_length - bytes_read, FCGI_stdin); // 解析JSON /* 解析type */ json_get_string(post_data, \type\, type, sizeof(type)); /* 解析channel */ channel json_get_int(post_data, \channel\); /* 解析value */ value json_get_int(post_data, \value\); } // 处理状态请求GET else if (strcmp(method, GET) 0 strstr(uri, /cgi-bin/app.fcgi)) { ... }调用硬件资源前需要确保硬件环境准备完成包括初始化、配置以及权限在调试过程中发现DO/DI这些资源多涉及到gpio的配置操作需要做export然后才能读写其次是history.fcgi的功能读取历史记录数据库是sqlite3表结构如下CREATE TABLE history( id INTEGER PRIMARY KEY AUTOINCREMENT, time TEXT, volt TEXT, curr TEXT, soc TEXT, loader TEXT);读取的历史记录效果如下

相关新闻

裂痕深处:弦理论的未竟困局与NKS计算范式的统一之问

裂痕深处:弦理论的未竟困局与NKS计算范式的统一之问

一、引言:物理学最深的裂痕 现代物理学建立在两大支柱之上:广义相对论与量子力学。广义相对论以弯曲时空的几何语言完美描述了引力与宇宙的大尺度结构;量子力学则以概率幅与算符代数精准掌控了微观粒子世界,解释了电磁力、强力和弱…

2026/7/4 20:25:44阅读更多 →
skynet性能优化学习

skynet性能优化学习

常见问题 消息堆积 / 服务延迟飙高 现象 某个服务 mq长度持续增长,skynet.stat看到 mqlen很大,同节点其他服务也跟着抖。 根因单条 callback 太重:在 skynet.dispatch里做了同步重计算(协议编解码、JSON 序列化、大表遍历&#xf…

2026/7/4 20:25:44阅读更多 →
第三届CISR2026智能系统与机器人学国际会议

第三届CISR2026智能系统与机器人学国际会议

第三届智能系统与机器人学国际会议由宁波工程学院主办、爱迩思出版社、AC学术平台和ESBK国际学术中心、宁波大学、中北大学、大连海事大学、南京航空航天大学、浙江万里学院协办,会议于2026年08月14日-16日在中国宁波举行。CISR 2026已经成功申请到IEEE列表会议&…

2026/7/4 20:25:44阅读更多 →
iOS 4.3到10.6全兼容!Slash低版本系统适配方案与最佳实践

iOS 4.3到10.6全兼容!Slash低版本系统适配方案与最佳实践

iOS 4.3到10.6全兼容!Slash低版本系统适配方案与最佳实践 【免费下载链接】Slash A better way to create attributed strings 项目地址: https://gitcode.com/gh_mirrors/slash/Slash Slash是一个强大的富文本字符串处理库,专为iOS平台设计&…

2026/7/4 21:35:48阅读更多 →
Websocket-Rails性能优化:构建高并发实时应用的终极指南

Websocket-Rails性能优化:构建高并发实时应用的终极指南

Websocket-Rails性能优化:构建高并发实时应用的终极指南 【免费下载链接】websocket-rails Plug and play websocket support for ruby on rails. 项目地址: https://gitcode.com/gh_mirrors/we/websocket-rails Websocket-Rails作为Ruby on Rails的即插即用…

2026/7/4 21:35:48阅读更多 →
nwpu-cram之信息检索:算法与实现 - 西北工业大学软件学院复习资料宝库解析 [特殊字符]

nwpu-cram之信息检索:算法与实现 - 西北工业大学软件学院复习资料宝库解析 [特殊字符]

nwpu-cram之信息检索:算法与实现 - 西北工业大学软件学院复习资料宝库解析 🚀 【免费下载链接】nwpu-cram 西北工业大学/西工大/nwpu/npu软件学院复习(突击)资料!! 项目地址: https://gitcode.com/GitHub_Trending/nw/nwpu-cram…

2026/7/4 21:35:48阅读更多 →
STM32与25CSM04 EEPROM的高速数据检索优化实践

STM32与25CSM04 EEPROM的高速数据检索优化实践

1. 项目背景与核心需求在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。25CSM04作为一款4Mb SPI接口的EEPROM存储器,与STM32F303VC这款Cortex-M4内核微控制器的组合,为解决这一问题提供了理想的硬件平台。我最近在一个工…

2026/7/4 21:35:48阅读更多 →
Grafonnet-lib实战案例:用代码定义Prometheus监控仪表盘的完整指南

Grafonnet-lib实战案例:用代码定义Prometheus监控仪表盘的完整指南

Grafonnet-lib实战案例:用代码定义Prometheus监控仪表盘的完整指南 【免费下载链接】grafonnet-lib Jsonnet library for generating Grafana dashboard files. 项目地址: https://gitcode.com/gh_mirrors/gr/grafonnet-lib 在当今云原生监控的世界中&#x…

2026/7/4 21:35:48阅读更多 →
jqjq实战应用:10个高效JSON数据处理技巧

jqjq实战应用:10个高效JSON数据处理技巧

jqjq实战应用:10个高效JSON数据处理技巧 【免费下载链接】jqjq jq implementation of jq 项目地址: https://gitcode.com/gh_mirrors/jq/jqjq jqjq是一个用jq实现的JSON处理工具,它继承了jq的强大功能,同时提供了更灵活的操作方式。无…

2026/7/4 21:30:48阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/4 14:25:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/4 14:57:00阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →