news 2026/9/9 10:45:05

Hi3403开发板部署openClaw智能体:openEuler Embedded与飞书机器人实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hi3403开发板部署openClaw智能体:openEuler Embedded与飞书机器人实战

前阵子把一块Hi3403开发板刷成了openEuler Embedded,折腾了整整一周,总算把openClaw智能体框架完整跑了起来,还接了飞书机器人。现在掏出手机,在飞书里给机器人发条消息,就能直接跟我部署在开发板上的Agent对话;在飞书工作台打开一个网页应用,还能看到Agent的当前状态和历史记录。整个过程踩了不少坑,从系统镜像烧录、轻量运行环境裁剪,到openClaw的模型配置,再到飞书事件订阅的回调验证,每一步都有值得记录的细节。这篇文章就按从零开始的顺序把这些内容串起来,给想在嵌入式设备上跑智能体、或者想把openClaw接进办公IM的朋友做个参考。

这套组合乍看有点奇怪:开发板、嵌入式Linux、智能体框架、办公协作软件,四个词不在一个频道上。但实际跑通之后你会发现,这恰恰是边缘智能体最实用的一种落地形态。本文的内容不仅适合嵌入式工程师,也适合做Agent应用、做办公自动化(包括但不限于飞书这类平台)的开发者。哪怕你手上不是Hi3403,用的是其他ARM开发板或者x86小主机,整体思路也完全能平移过去。

1. 项目整体设计思路拆解

1.1 为什么选择Hi3403开发板跑智能体

Hi3403开发板最大的特征是面向边缘计算场景:ARM架构、功耗低、外设接口全,而且在工业控制和嵌入式一体机上有不少实际部署案例。很多人觉得智能体是云上的事,必须扔到高配服务器上跑,其实不然。智能体真正进入生产环境后,大量场景要求低延迟、本地化、离线可控,比如车间里的设备语音助手、门店里的智能客服终端、园区里的巡检机器人——这些都是边缘设备。把这些部署到一个开发板上,不仅成本远低于云主机,也避免了把敏感业务数据全部传到远端的麻烦。

从硬件角度看,Hi3403在嵌入式板卡里的性能属于“干练”那一档:跑Linux系统、加载Python或Node.js runtime、支撑一个Agent框架的常驻进程,完全没问题;但真要本地跑大模型推理,就会明显吃紧。所以它的定位应该是“智能体的控制中枢”,而不是“算力中心”。这个定位直接影响后面所有选型决策——跑多大的模型、要不要开Web UI、用什么持久化方案,都要围绕硬件资源来权衡。

1.2 openEuler Embedded 是哪一路

openEuler Embedded 是 openEuler 面向嵌入式场景发布的系统版本。相比通用Linux发行版,它做了不少针对性裁剪和优化,内核更精简,启动更快,对资源占用更友好。同时它保留了容器、交叉编译、oec-turbo 等工具链,应用生态和服务器版 openEuler 基本对齐。选择它而不是通用服务器系统,最直接的原因是嵌入式场景需要小而稳,装一个完整桌面版纯属浪费存储和内存;另外 openEuler Embedded 对嵌入式硬件的适配比较充分,内核和驱动基本开箱可用,省去了大量自己编译内核、调整设备树的精力。

我遇到过不少朋友问,为什么不用 Ubuntu Server 或者 Debian?原因很简单:通用发行版默认带了一堆用不上的服务和驱动,在嵌入式设备上这些全是内存和存储负担;而且一旦系统更新,可能把内核或驱动升级到与新板卡不适配的版本,反而引入故障。openEuler Embedded 的更新节奏更贴近硬件厂商的支持窗口,还有统一的工具链管理机制,对开发板这种“固定硬件 + 长期运行”的场景更合适。

1.3 openClaw + 飞书的组合逻辑

openClaw 是腾讯开源的一个智能体(Agent)框架。它不只是一个聊天机器人,而是一套可以管理“Agent主体 + 技能Skill + 静态知识Knowledge + 动态记忆Memory + 定时任务/事件触达”的框架。你可以把它理解成一个可以编排各种工具、带有长期记忆能力的机器人大脑。而飞书在这里扮演的是“交互层”:通过飞书机器人,你可以用自然语言直接跟Agent对话;通过飞书网页应用,你能得到一个图形化的管理入口;通过多维表格,你甚至可以把Agent的长期记忆直接落到表格里,让记录可见、可导、可协作。三者叠加,等于一个跑在边缘的、随时可以通过办公IM触达的私人助理。

为什么选飞书而不是其他IM?同样是聊天机器人接口,飞书的开放平台事件订阅机制更规范,回调验签、消息去重、卡片消息这些都有现成的最佳实践;而且飞书的多维表格本身就是很好的结构化存储,Agent可以把记忆、任务状态、日志同时写进一个团队都能看的表格里,这是普通聊天机器人端口不具备的能力。

2. 环境准备与系统搭建

2.1 从镜像烧录到系统启动

拿到Hi3403开发板的第一件事,是把 openEuler Embedded 的镜像烧到板子的存储介质里。我这边用的是SD卡启动方案,操作比较简单:准备一张至少16GB的SD卡,通过读卡器接到电脑上,用 dd 命令写入镜像。

# Linux下烧录示例,根据实际设备名调整 sudo dd if=openEuler-Embedded-hi3403.img of=/dev/mmcblk0 bs=4M status=progress sync

烧录完成后,把SD卡插回开发板,接上串口线和网线,上电启动。建议第一时间通过串口登录做初始配置,串口的默认波特率一般可以在系统文档里查到(常见115200)。第一次登录需要设置root密码,配置网络。网络可以用静态IP,也可以在路由器上绑DHCP保留地址。我建议直接用静态IP,因为后续飞书回调、SSH连接都要反复用到这个地址,IP固定下来省很多事。

配置完网络后,下一步是确认板子的基本参数,特别是内存和存储,这决定了后面openClaw能跑多肥的配置:

free -h df -h uname -a cat /proc/cpuinfo | grep "model name" | head -n 1

建议记下这几个数字,后面做资源配置时都用得上。我这边板子是4GB内存,跑完整版openClaw加上一个本地小模型比较紧张,但如果只走云端API则完全没问题,这也是后面选模型策略的重要依据。

2.2 用oec-turbo补齐基础运行环境

openClaw运行时依赖Node.js 18以上的版本。在openEuler Embedded上,我强烈建议直接用系统自带的oec-turbo工具来安装,而不是下载一个随意的Node.js包。oec-turbo是openEuler Embedded的软件包管理和部署工具,它解决的不只是“把包装上”,而是“把包装到契合系统裁剪规则的合适位置”,避免出现依赖不兼容、动态库缺失这类玄学问题。

# 更新软件包索引 oec-turbo update # 安装Node.js oec-turbo install nodejs # 验证 node -v npm -v

如果软件源里没有预编译的Node.js,也可以考虑用nvm之类的版本管理器,但嵌入式设备网络和性能有限,源码编译Node.js会非常久,不太划算。另外一个思路是用Docker容器跑openClaw,通过oec-turbo安装docker或podman,然后用容器打包好一套openClaw环境。这个方法的好处是隔离性好、迁移方便,坏处是额外占用内存,4GB内存的板子需要权衡一下:如果只是单跑一个Agent,裸装完全够用;如果你打算在同一块板子上同时跑数据库、消息队列等多个服务,就必须上容器了。

2.3 换源和包管理器配置

嵌入式设备如果放在内网,npm官方源经常慢到让人崩溃,甚至超时失败。建议第一时间切换npm镜像源:

npm config set registry https://registry.npmmirror.com # 也可以设置全局镜像源 npm install -g pnpm pnpm config set registry https://registry.npmmirror.com

这里补一句:为什么用pnpm而不是npm?openClaw这类Node项目依赖非常多,pnpm对依赖做硬链接和内容寻址存储,安装速度快、占磁盘少,在存储有限的开发板上优势很明显。实测在Hi3403上,用pnpm安装openClaw全套依赖,比npm快三分之一左右,磁盘占用也少不少。

注意:如果板子长期放在生产环境,建议把所有基础源配置和依赖锁定固化到部署脚本里,避免系统重装后又要手工折腾一遍。同时把node_modules做一次快照备份,网络差的时候直接解压恢复,能省大量时间。

3. openClaw核心部署流程

3.1 安装openClaw的两种方式与取舍

openClaw目前官方主推的安装方式比较灵活,既支持直接用npx拉起来临时体验,也支持全局安装后常驻运行。前期的环境搭建里我已经安装了Node.js 18+和pnpm,现在直接全局安装即可:

npm install -g openclaw # 验证 openclaw --version

如果你不想全局安装污染系统,也可以临时跑:

npx openclaw@latest

但注意:对于Hi3403这种嵌入式设备,npx每次都要检查更新,网络不稳定时体验很差,而且临时会话方式不方便做systemd服务守护。我最终还是选择了全局安装。安装过程中最可能遇到的问题有两个:一是网络抖动导致下载失败,这种情况建议把npm缓存目录放到空间较大的分区,同时加上--prefer-offline参数重试;二是全局bin目录不在PATH里,需要把Node.js的bin目录加进/etc/profile或者用户profile里,否则后面执行 openclaw 命令会提示找不到。

3.2 onboard初始化与模型配置

安装完成后,执行初始化向导:

openclaw onboard

onboard会通过交互方式询问项目目录、Agent名称、模型提供方、API Key等信息。交互式向导在服务器上操作并不舒服,而且嵌入式设备上SSH终端对交互式界面支持不一定好,所以更推荐直接编辑配置文件。openClaw的配置目录一般在~/.openclaw下,里面会有一个settings.json或类似命名的文件,模型配置的字段大致是这种结构:

{ "agent": { "name": "assistant", "systemPrompt": "你是部署在边缘设备上的智能助手。", "model": { "provider": "deepseek", "apiKey": "sk-你的key", "model": "deepseek-chat" } } }

热搜词里提到了“openclaw配置nvidia nim”和“openclaw companion本地模型”,这两条我实际都试过。先说NVIDIA NIM:它是NVIDIA提供的推理微服务,openClaw里可以通过OpenAI兼容接口直接对接,把provider改成openai-compatible,baseUrl指向NIM的v1接口即可。再说companion本地模型:openClaw支持在设备上启动一个companion进程,加载本地的GGUF等格式模型。本地模型这个方案在Hi3403上运行小模型(比如Qwen2.5 7B量化版)勉强能跑,但响应速度会明显偏慢;如果你只有4GB内存,建议优先走云端API,把本地模型作为离线降级方案。

3.3 启动、验证与资源限制

配置完成后,启动服务:

openclaw start openclaw status

启动后openClaw默认会提供一个控制台UI,一般监听在某个本地端口(热搜词里提到的“Control UI did not start”就会在这个阶段出现)。嵌入式设备没有桌面浏览器,如果是局域网环境,可以从电脑上通过板子IP访问;如果想省资源,也可以直接在配置里把UI关掉,只保留命令行和API交互。这里强烈建议在systemd里注册一个服务,让openClaw开机自启、崩溃自动重启。开发板上跑服务,如果不做守护,一旦掉线或者断电恢复,重启依赖手工操作就太折腾了。一个简单的systemd服务文件模板如下:

[Unit] Description=openClaw Agent After=network.target [Service] ExecStart=/usr/bin/openclaw start Restart=always RestartSec=10 [Install] WantedBy=multi-user.target

写入/etc/systemd/system/openclaw.service后,执行systemctl daemon-reload && systemctl enable --now openclaw即可。注意ExecStart里的路径,务必用which openclaw查到的绝对路径,因为systemd环境下的PATH和SSH登录环境不一定一致。

4. 飞书接入与交互实现

4.1 在飞书开放平台创建自建应用

要让飞书跟openClaw联动,第一步是到飞书开放平台后台创建一个企业自建应用。这一步不需要写代码,但需要企业管理员的权限。创建后重点做两件事:第一,在“应用能力-机器人”里启用机器人功能,拿到机器人的webhook地址(如果用的是自定义机器人)或App ID/App Secret(如果走API/SDK);第二,在“权限管理”里开通发消息、读取用户信息、读取消息等权限,并确保应用发布版本生效。这里有个易错点:不要只在开发调试环境修改权限,发布新版本后老版本应用可能仍然沿用旧权限,排查问题时非常容易踩。

4.2 事件订阅:把飞书消息转给openClaw

想让用户在飞书里给机器人发消息后,openClaw能收到,必须配置事件订阅。飞书开放平台的事件订阅地址需要是一个可被公网访问的HTTPS回调地址,飞书会把事件POST到这个地址。如果你的Hi3403开发板在局域网,外网无法直接访问,建议把回调地址指向一台具备公网入口的服务器,由它反向代理到内网开发板,同时做好访问控制,避免回调接口暴露在公网后被任意请求打到Agent上。

回调地址的验证逻辑很直接:飞书第一次配置时,会向该地址发送一个带challenge字段的请求,你的服务必须解析出challenge并原样返回,否则配置不会通过。以下是一个用Node/Express实现的最简回调服务示例:

const express = require('express'); const app = express(); app.use(express.json()); app.post('/feishu/callback', (req, res) => { const { challenge, type } = req.body; if (type === 'url_verification') { return res.json({ challenge }); } // 这里把事件转发给openClaw处理 console.log(req.body); res.json({ code: 0 }); }); app.listen(3000);

注意:真实生产环境里,强烈建议对飞书回调做验签,避免伪造请求。验签需要拿到请求头的签名和时间戳,用App Secret做HMAC-SHA256计算,和飞书传过来的签名比对。如果板子系统时间没有同步,时间戳超出允许范围,验签会直接失败。这个坑我在后面专门展开讲。

4.3 用飞书机器人把openClaw变成可对话的同事

事件订阅打通之后,核心链路其实已经通了:用户在飞书里给机器人发消息 → 飞书推送事件到回调服务 → 回调服务通过openClaw的API把消息喂给Agent → Agent返回结果 → 回调服务调用飞书API把结果回传给用户。

这里最常犯的一个错误是没有做“消息去重”。飞书的事件推送是至少一次机制,同一消息可能推送多次,如果你在回调里每次都调用Agent,用户会看到重复回复。处理方式是在回调服务里维护一个最近处理过的消息ID集合,或者用Redis做分布式去重。开发板上资源有限,不建议为了单一Agent单独上Redis,用一个进程内的LRU缓存就够了,但要注意重启会丢去重状态,极端情况下仍可能出现少量重复,这是可以接受的。

4.4 网页应用免登录与管理界面

除了机器人对话,还可以在飞书工作台里添加一个网页应用,这样用户点击应用就能在飞书内打开一个web管理面板,看到Agent的运行状态、日志,甚至手动触发Agent。飞书网页应用支持免登能力:前端通过飞书JSSDK向飞书客户端申请免登授权码,后端拿这个授权码调用开放平台接口换用户身份。

这里以Vue前端为例,核心代码片段是一个请求免登code的过程:

import { requestAuthCode } from '@lark-base-open/js-sdk'; async function auth() { const { code } = await requestAuthCode(); // 把code传给后端,由后端换成用户token并初始化openClaw管理页 const res = await fetch('/api/feishu/auth', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code }) }); const data = await res.json(); console.log(data); }

后端拿到code之后,调用飞书开放平台的身份换token接口,用 app_access_token + code 换取用户身份信息。注意这里的app_access_token要用 app_id 和 app_secret 从开放平台接口获取,不能直接把App Secret暴露给前端。热搜词里说的“飞书免登录”就是这个流程,本质是飞书帮你在客户端内安全地完成了一次OAuth,你在后端只负责校验和换取用户信息。这个能力对Agent管理界面特别实用,团队里每个成员打开应用,看到的是以自己身份授权的数据,权限控制也在飞书后台统一管理。

4.5 用多维表格做Agent记忆外置

这个是我个人觉得最实用的扩展。把openClaw的长期记忆、任务状态写进飞书多维表格,等于给Agent加了一块“可视化大脑”。多维表格的API权限开通后,可以用API直接插入记录、查询记录。具体做法是:在openClaw的自定义Skill里写一个“保存记忆到飞书多维表格”的能力,注册成一个函数,Agent在对话过程中只要发现需要长期记住的内容,就自动调用这个Skill。

好处是显而易见的:第一,团队其他成员即使不懂技术,也能直接打开多维表格看到Agent记住了什么;第二,多维表格支持导入导出,数据随时可以离线备份;第三,后续可以把多维表格当作Agent的知识库,通过飞书API检索相关记录再喂给模型,比让Agent自己从纯文本记忆里翻找要靠谱得多。不过要注意API调用频率限制,Agent如果频繁写入多维表格,很容易触达限流,建议在Skill层做批量写入和缓存。

5. 常见问题与排查技巧实录

这部分是几周折腾下来最值钱的记录。我整理了一张问题速查表,基本覆盖了热搜词里提到的高频报错。

报错/现象可能原因解决办法
openclaw node runtime not foundNode.js未正确安装或不在PATH检查 node -v;确认全局bin目录在PATH;通过oec-turbo或软链接修正
failed to remove ~/.openclaw: EBUSY文件被进程占用,或SD卡文件系统锁关闭openclaw相关进程;用fuser -k定位占用进程;检查SD卡写保护开关
agent failed before reply: unknown model配置的模型名与提供方不一致,或本地模型未加载核对model字段;如用本地模型先启动provider服务;用status确认加载模型
Control UI did not start端口被占用或UI被禁用查看日志;改端口;确认配置里ui.enabled=true
飞书事件验证失败/错误码2700002签名校验失败或access_token过期重新获取app_access_token;检查时间戳和nonce参数;确认回调URL携带签名头
飞书消息重复回复未做消息去重维护已处理消息ID集合,做幂等控制
板子内存不足导致openClaw被杀模型或Node进程内存超限关闭System UI;限制Node内存;云端API代替本地模型

下面挑几个展开说。

5.1 关于“unknown model: deepseek”这类问题

这个报错我一开始也遇到过,纯粹是自己粗心:openClaw配置里写了deepseek-chat,但DeepSeek那边某个版本把模型名调整了,两边对不上。这类问题排查方法很简单:先把日志打开,看看openClaw在调模型API时实际发送的model字段是什么,再去模型服务商的文档页面核对当前可用的模型名。如果是本地模型,还要确认模型服务是否真的启动,地址和端口是否可达。可以在板子上直接curl一下模型服务地址,返回非200基本都是服务没起或者地址错了。这里有个通用原则:任何“unknown model”“model not found”都先别怀疑框架,先去模型提供方核对模型名,十有八九是名字拼错或版本过期。

5.2 Node运行时相关的报错

“openclaw node runtime not found”这类报错,本质是系统找不到Node执行文件。很多人在服务器上遇到过,在嵌入式设备上更容易出现,因为嵌入式系统的PATH路径常常是精简过的。排查三步走:先whereis node看看Node安装在哪里,再echo $PATH看全局bin目录在不在,最后用绝对路径启动openClaw。如果使用systemd服务,还要注意服务运行时的环境变量可能和SSH登录时不同,尽量在ExecStart里写绝对路径。另外还有一个非常隐蔽的点:在嵌入式设备上安装Node时,如果选了错误的架构版本,比如在ARM设备上装了x64包,命令虽然能执行但会报“Exec format error”,这种情况直接认准arm64架构重新安装。

5.3 飞书回调相关问题

飞书回调里如果一直报签名校验失败,99%是参数取值问题。你需要在回调服务里拿到飞书请求头的X-Lark-Signature、X-Lark-Request-Timestamp、X-Lark-Request-Nonce,用App Secret做HMAC-SHA256运算,和签名对比。时间戳超过一定范围会直接判失败,所以板子时间一定要用NTP同步,嵌入式设备如果长时间没联网,系统时间偏差大,回调验签就会莫名其妙失败。这个坑特别隐蔽,我在板子上踩了两次。排查技巧:在验签失败时,先看飞书返回的错误信息里到底是“timestamp expired”还是“signature mismatch”,如果是前者,优先解决系统时间;如果是后者,去检查请求体原样字符串是否和签名时完全一致,尤其是JSON的字段顺序和转义符号。

5.4 嵌入式资源紧张怎么办

如果板子内存只有2GB~4GB,我建议这样配置:关闭openClaw的Web UI,减少不必要的Skill加载,把模型切到云端API模式,限制Node.js的堆大小。另外可以给系统加swap,虽然SD卡读写速度一般,但至少能避免内存突然爆掉时进程被杀。下面的参数可以参考:

# 限制openClaw的Node进程堆内存为1GB export NODE_OPTIONS="--max-old-space-size=1024" # 添加swap(以2GB为例) fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile

开了swap之后不要以为万事大吉,SD卡的磨损和写入延迟仍然存在,高频写入场景下建议换成固态介质或者减少日志输出。如果板子有多个服务,可以给openClaw单独配置cgroup内存限制,避免它和其他服务抢内存。实测下来,关闭Web UI后,openClaw的常驻内存能省下300MB左右,对内存紧张的板子帮助很大。

6. 后续扩展方向与个人体会

按惯例最后说点扩展。这套“嵌入式开发板 + openClaw + 飞书”的组合,后续还能做很多事:比如在openClaw里注册一个定时Skill,每天早上把夜间生成的报表推送到飞书群;比如把多维表格变成项目知识库,让Agent自动在表格里整理会议纪要;比如把板子上的传感器数据通过Agent总结后实时推到飞书——这些都是加几十行代码就能实现的玩法。

我个人在实际操作中最大的体会是:别把Agent部署想得太重。太多人默认Agent必须跑在云端高配GPU上,结果一个小任务拖了一堆依赖。真正落地时,一个ARM开发板加一个轻量Agent框架加一个办公IM入口,就已经能覆盖很多生产级场景。资源受限不是坏事,它会逼着你把Agent按“刚需功能”来设计,而不是什么酷炫功能都塞进去。最后再分享一个小技巧:千万不要在openClaw的配置文件里写死明文API Key,生产环境请使用环境变量挂载,或者在开发板上用类似systemd的EnvironmentFile机制统一管理,这样即使文件被误读、备份被导出,也不会直接泄漏密钥。

这些坑都是我亲自踩过的,希望对想上车的人有点帮助。动手折腾起来吧。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 10:44:48

单总线协议核心拆解:从物理层时序到ROM多设备寻址

做嵌入式这些年,我接触过的通信方式不少,但单总线协议(1-Wire)始终是很特别的一个。它不靠时钟线,也不靠差分信号,只靠一根数据线配合严格的时间窗口,就能完成供电、通信和设备识别。DS18B20 温…

作者头像 李华
网站建设 2026/9/9 10:41:59

JSP项目Session管理全解析:原理、实操与踩坑指南

做Java Web开发,尤其是长期维护过传统JSP项目的朋友,对Session管理一定不陌生。无论是学生信息管理系统、企业后台、还是带审批流的OA页面,用户的登录状态、权限信息、临时业务数据,十有八九都存在Session里。我见过不少新手&…

作者头像 李华
网站建设 2026/9/9 10:41:09

Ollama本地部署全指南:安装、模型下载与API对接避坑

简介:面向需要在类Unix操作系统(如Linux、macOS)中部署Ollama的用户,这份安装资源包以“安装”为主线,系统梳理了从环境准备、脚本执行到配置验证的完整流程,避免用户在搜索零散教程时来回折腾。资源内容既…

作者头像 李华
网站建设 2026/9/9 10:40:36

AI生成测试用例如何人工审核?避坑指南与实操流程

最近不少测试同学都在讨论AI生成测试用例这个话题。有的团队直接用ChatGPT、Cursor或者专门的AI测试用例生成平台,让AI按需求描述输出一版用例,结果拿回来一看,结构确实漂亮,步骤也清晰,但真拿着去执行的时候&#xff…

作者头像 李华
网站建设 2026/9/9 10:40:11

嵌入式实时性设计:理解截止时间与任务调度,避免系统失稳

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/9 10:39:39

Delphi经典蓝牙控件设计与Android真机联调实战

简介:面向Delphi开发者的Android蓝牙开发资源,内含经典蓝牙控件源码及配套演示工程,解决移动端设备间无线通信需求。资源共160个文件,压缩包仅1.03MB,以.pas与.fmx源码、.dpr/.dproj工程文件、.dcu编译单元及配置文件为…

作者头像 李华