Jetson + OpenClaw + 飞书机器人:构建一个让边缘设备成为 AI Agent 助手的远程交互系统

Jetson + OpenClaw + 飞书机器人:构建一个让边缘设备成为 AI Agent 助手的远程交互系统

1. 背景

最近我希望在 Jetson 上部署一个本地 Openclaw,并通过飞书机器人进行远程交互,从而让闲置的边缘设备秒变我的高级AI助手。整体目标很简单:

  • 在 Jetson 上运行 OpenClaw
  • 接入自己的模型 API(我使用的是阿里的Coding Plan)
  • 通过飞书群聊 @机器人 或者私聊机器人直接调用本地 Agent

最终希望实现这样的工作流:

Feishu Group ↓ Feishu Bot ↓ OpenClaw Gateway (Jetson) ↓ Agent ↓ LLM API ↓ 返回飞书消息 

这篇文章记录一下从源码部署 OpenClaw,到接通飞书机器人的完整过程,以及过程中踩到的几个关键坑。


2. 环境信息

本文使用环境如下:

Jetson 环境

uname -a # 输出 Linux agx229-desktop 5.10.216-tegra #1 SMP PREEMPT Tue Mar 4 01:35:16 PST 2025 aarch64 aarch64 aarch64 GNU/Linux lsb_release -a # 输出 Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal nvcc --version # 输出 Cuda compilation tools, release 11.4, V11.4.315 

说明

当前平台为:

  • Jetson ARM64
  • Ubuntu 20.04
  • CUDA 11.4

这点很重要,因为后续某些依赖在 ARM64 + Ubuntu 20.04 上会遇到额外兼容性问题。


3. 安装 Node.js 与 pnpm

OpenClaw 是一个 Node.js 项目,因此首先需要准备 Node 环境。

建议使用 Node 22。

# 安装 nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash # 重新加载 shell 配置 source ~/.bashrc # 如果使用 zsh source ~/.zshrc # 配置镜像加速下载(可选,建议中国用户使用) nvm node_mirror https://npmmirror.com/mirrors/node/ nvm npm_mirror https://npmmirror.com/mirrors/npm/ # 安装并使用 Node.js 20 nvm install 20 nvm use 20 # 设为默认版本 nvm alias default 20 # 配置 npm 镜像加速 npm config set registry https://registry.npmmirror.com # 验证安装 node --version npm --version

还需要安装 pnpm

npm install -g pnpm 

安装后检查:

pnpm -v 

4. 配置 pnpm 环境变量

这一步非常重要。

如果不配置 PNPM_HOME,后面可能出现这些问题:

  • pnpm link --global 报错
  • OpenClaw 自动构建 UI 时提示找不到 pnpm
  • 全局命令不可用

建议将下面内容加入 ~/.bashrc

# pnpm export PNPM_HOME="/home/agx229/.local/share/pnpm" case ":$PATH:" in *":$PNPM_HOME:"*) ;; *) export PATH="$PNPM_HOME:$PATH" ;; esac # pnpm end 

保存后执行:

source ~/.bashrc 

再验证:

echo $PNPM_HOME which pnpm 

5. 克隆 OpenClaw 源码

cd ~ git clone https://github.com/openclaw/openclaw.git cd openclaw 

6. 解决 Jetson 上 CMake 版本过低的问题

在 Jetson Ubuntu 20.04 上,系统自带的 CMake 往往版本较低。
而 OpenClaw 的某些依赖在编译时要求更高版本的 CMake。

我在安装过程中遇到的典型报错是:

CMake 3.19 or higher is required. You are running version 3.16.3 

因此需要手动升级 CMake。

安装新版 CMake

cd ~ wget https://github.com/Kitware/CMake/releases/download/v3.31.6/cmake-3.31.6-linux-aarch64.sh chmod +x cmake-3.31.6-linux-aarch64.sh sudo ./cmake-3.31.6-linux-aarch64.sh --skip-license --prefix=/usr/local 

检查版本:

/usr/local/bin/cmake --version 

如果系统仍然找不到新版本,可临时加入 PATH:

export PATH=/usr/local/bin:$PATH hash -r cmake --version 

必要时可以加入 ~/.bashrc


7. 安装依赖并编译 OpenClaw

在项目目录执行:

cd ~/openclaw pnpm install pnpm build 

如果安装过程中出现原生模块编译问题,优先检查:

  • CMake 版本
  • build-essential 是否安装
  • pnpm 是否在 PATH 中

8. 配置模型 API

OpenClaw 通过 ~/.openclaw/openclaw.json 进行配置。

如果目录不存在,先创建:

mkdir -p ~/.openclaw nano ~/.openclaw/openclaw.json 

我使用阿里的Coding Plan,个人体验觉得挺不错的,速度快,模型也多,非广告!这部分配置教程可以参考阿里官方的教程
大模型服务平台百炼控制台


9. 配置 Gateway Token

这是本文里一个非常关键的坑。

OpenClaw 的架构不是“CLI 直接调用模型”,而是:

CLI / TUI / Logs ↓ Gateway ↓ Agent ↓ Model 

所以 CLI 其实是 Gateway 的客户端
既然是客户端连接服务端,就涉及认证。

为什么要加 token

如果只配置服务端 token,而没有配置客户端 token,就会出现:

unauthorized: gateway token mismatch 

因此需要让 gateway 服务端客户端连接配置 使用同一个 token。

通过 ~/.openclaw/openclaw.json 进行知道如下,推荐配置如下:

{ "gateway": { "mode": "local", "auth": { "mode": "token", "token": "Yours Token" }, "remote": { "token": "Yours Token" } } } 

解释

  • gateway.auth.token:Gateway 服务端认证 token
  • gateway.remote.token:CLI / TUI / logs 等客户端连接 Gateway 时使用的 token

这两个必须一致。


10. 启动 Gateway 服务

先安装 gateway service:

openclaw gateway install 

然后启动:

systemctl --user start openclaw-gateway.service 

检查状态:

openclaw gateway status 

正常情况下会看到类似输出:

Runtime: running RPC probe: ok Listening: 127.0.0.1:18789 

如果配置修改过,需要重启:

systemctl --user restart openclaw-gateway.service 

12. 验证 TUI 是否可用

如果配置正确,可以直接运行:

openclaw tui 

若成功,界面会显示已连接,并能直接与模型对话。

如果出现 token mismatch,基本就是 auth.tokenremote.token 不一致。


13. 配置飞书机器人

第一步:创建飞书应用

进入飞书开放平台https://open.feishu.cn/?lang=zh-CN,创建一个企业自建应用。

第二步:启用机器人能力

在应用后台启用机器人。

第二步:配置权限

在左侧目录树选择“开发配置 > 权限管理”,单击“批量导入/导出权限”按钮。

加入如下内容:

{ "scopes": { "tenant": [ "contact:contact.base:readonly", "docx:document:readonly", "im:chat:read", "im:chat:update", "im:message.group_at_msg:readonly", "im:message.p2p_msg:readonly", "im:message.pins:read", "im:message.pins:write_only", "im:message.reactions:read", "im:message.reactions:write_only", "im:message:readonly", "im:message:recall", "im:message:send_as_bot", "im:message:send_multi_users", "im:message:send_sys_msg", "im:message:update", "im:resource", "application:application:self_manage", "cardkit:card:write", "cardkit:card:read" ], "user": [ "contact:user.employee_id:readonly", "offline_access","base:app:copy", "base:field:create", "base:field:delete", "base:field:read", "base:field:update", "base:record:create", "base:record:delete", "base:record:retrieve", "base:record:update", "base:table:create", "base:table:delete", "base:table:read", "base:table:update", "base:view:read", "base:view:write_only", "base:app:create", "base:app:update", "base:app:read", "board:whiteboard:node:create", "board:whiteboard:node:read", "calendar:calendar:read", "calendar:calendar.event:create", "calendar:calendar.event:delete", "calendar:calendar.event:read", "calendar:calendar.event:reply", "calendar:calendar.event:update", "calendar:calendar.free_busy:read", "contact:contact.base:readonly", "contact:user.base:readonly", "contact:user:search", "docs:document.comment:create", "docs:document.comment:read", "docs:document.comment:update", "docs:document.media:download", "docs:document:copy", "docx:document:create", "docx:document:readonly", "docx:document:write_only", "drive:drive.metadata:readonly", "drive:file:download", "drive:file:upload", "im:chat.members:read", "im:chat:read", "im:message", "im:message.group_msg:get_as_user", "im:message.p2p_msg:get_as_user", "im:message.send_as_user", "im:message:readonly", "search:docs:read", "search:message", "space:document:delete", "space:document:move", "space:document:retrieve", "task:comment:read", "task:comment:write", "task:task:read", "task:task:write", "task:task:writeonly", "task:tasklist:read", "task:tasklist:write", "wiki:node:copy", "wiki:node:create", "wiki:node:move", "wiki:node:read", "wiki:node:retrieve", "wiki:space:read", "wiki:space:retrieve", "wiki:space:write_only" ] } }

在弹窗中确认权限无误后,单击“申请开通”按钮,完成操作。

第三步:发布应用

到此就可以回来Jetson去连接我们的飞书机器人了

第四步:配置 Feishu Channel

运行:

openclaw channels add 

选择:

Feishu / Lark 

然后输入:

  • App ID
  • App Secret

具体过程可以选项可以参考我的

到此就基本完成了openclaw与飞书机器人的连接了,但是要实现聊天还得再继续配置。

第五步:重启Gateway

openclaw gateway restart

第六步:配置事件与回调

选择:

使用长连接接收事件 

然后添加事件:

im.message.receive_v1 

这是机器人接收消息所必需的事件。

继续配置回调

添加回调

第七步:发布应用版本

这一步非常关键。(这里参考第三步)

很多时候飞书应用配置改了但机器人无效,就是因为没有发布版本

进入:

版本管理与发布 

创建版本并发布。

第八步:配置私聊飞书机器人

在飞书APP中找到开发者小助手

之后给机器人发送任何信息

将Pairing code复制然后在Jetson终端输入

openclaw pairing approve feishu NHMC7CRG

到此,基本就实现了在飞书中直接召唤我们边缘设备干活了,回到飞书,与我们小助手聊天即可。


14. 常见坑总结

坑 1:Jetson 上 CMake 版本过低

会导致依赖编译失败。

坑 2:没有配置 pnpm PATH

会导致全局命令或 UI 构建异常。

坑 3:误以为需要单独安装 Feishu 插件

源码版已经内置,不需要重复安装。

坑 4:没有配置 gateway.remote.token

会导致 CLI 连接 Gateway 时出现 token mismatch。

坑 5:App ID / App Secret 使用了旧应用凭证

这是我这次飞书始终接不通的根因。

坑 6:飞书应用修改后未发布版本

会导致机器人看似配置好了,但实际不生效。


15. 最终效果

完成上述配置后,可以实现:

  • 在 Jetson 上运行 OpenClaw Gateway
  • 接入自己的模型 API
  • 在飞书群中 @机器人
  • 机器人调用本地 Agent 并返回回复

这为后续扩展提供了很好的基础,例如:

  • 远程查询 Jetson 状态
  • 执行自动化任务
  • 调用机器人系统接口
  • 通过飞书统一管理实验设备

16. 总结

这次在 Jetson 上部署 OpenClaw 并接入飞书机器人的过程,整体并不算复杂,但有几个坑非常容易卡住:

  • ARM 平台的依赖编译问题
  • pnpm 环境变量问题
  • Gateway token 机制

只要把这些关键点处理好,OpenClaw + 飞书这套链路其实是很顺的。

如果你也想在 Jetson 上搭一个可远程交互的本地 Agent,这套方案很值得尝试。


预告一下,下一期我将更新一下好用的Skills,让我们边缘设备更好的给我们干活!

Read more

电报中文机器人Telegram Chinese bot

1. 极搜 (JiSo) @jiso @jisou 功能: 输入关键词即可搜索群组、频道、视频及各类文件资源。 2. SOSO 机器人 @soso 功能: 电报圈老牌搜索机器人,支持关键词检索公开群组和频道。目前也集成了一些 AI 搜索功能(SOSO AI)。 3. Super 搜索 (超级索引) @CJSY 功能: 专注于中文语境下的群组与频道资源关联搜索,发送词语即可获取相关链接。 4. 神马搜索 (SMSS) @smss 功能: 主要用于搜索群组资源。该机器人通常带有签到活动(如连续签到赠送 USDT 等奖励机制)。 使用说明: 您只需在 Telegram 应用顶部的搜索框中直接输入上述以 @ 开头的用户名,点击进入对话并发送 /start 命令即可开始搜索。注意甄别带有“AD”或广告后缀的仿冒机器人。

AI赋能传统行业:用Retinaface+CurricularFace镜像快速实现人脸考勤

AI赋能传统行业:用Retinaface+CurricularFace镜像快速实现人脸考勤 在传统企业中,考勤管理一直是个“老问题”——纸质签到效率低、指纹打卡易代刷、人工统计耗时费力。随着AI技术的普及,越来越多的企业开始尝试引入人脸识别考勤系统,但很多信息化负责人却面临一个现实困境:想用AI,但不懂算法;想上系统,又怕开发周期长、成本高、效果不稳定。 如果你也有这样的困扰,那这篇文章就是为你准备的。我们不讲复杂的模型训练原理,也不谈深奥的数学公式,而是直接给你一套开箱即用、小白也能操作的解决方案:通过ZEEKLOG星图平台提供的 RetinaFace + CurricularFace 预置镜像,你可以在几分钟内部署完成一个人脸检测与识别一体化的考勤系统原型,真正实现“零代码、快部署、可落地”。 这套方案的核心优势在于: * 人脸检测精准:基于 RetinaFace 模型,能在复杂光照、遮挡、侧脸等场景下稳定检出人脸; * 身份识别可靠:采用 CurricularFace 模型提取高区分度的人脸特征向量,识别准确率高; * 一键部署上线:无需安装依赖、配置环境,平台提供

801-203_各无人机厂家对RemoteID支持情况汇总

1. 大疆DJI 参考链接:大疆无人机RemoteID支持情况 DJI航拍无人机的RID广播信息包含以下信息: 1. ID等身份认证 2. 无人机的纬度、经度、几何高度和速度 3. 控制站的纬度、经度和几何高度的指示 4. 时间信息、紧急状态信息 支持RID的航拍无人机型号 大疆无人机支持RID型号列表 序号无人机机型支持情况备注1DJI Mavic 4 Pro支持2DJI Flip支持3DJI Air 3S支持4DJI Neo支持WIFI直连模式下和脱控模式下不支持5DJI Mini 4K支持V01.07.0400 及以后6DJI Avata 2V01.00.0300 及以后7DJI Mini 4 Pro支持V01.00.0400 及以后8DJI Air 3支持V01.00.1200 及以后9DJI Mini 3支持V01.

深入解析FPGA中的DDS实现:从ROM查表法到.mif文件生成

1. DDS技术基础与FPGA实现原理 第一次接触DDS技术是在五年前的一个信号发生器项目中,当时需要产生频率可调的正弦波信号。传统模拟电路方案需要复杂的LC振荡器和分频电路,而DDS(直接数字频率合成)技术让我眼前一亮——它用纯数字方式就能实现高精度频率合成。 DDS的核心思想其实很简单:想象一个旋转的指针,指针每转一圈就对应正弦波的一个周期。我们把这个圆周等分成若干份(比如512份),把每个角度对应的正弦值预先计算好存入ROM中。通过控制指针旋转的速度,就能改变输出波形的频率——这就是ROM查表法的基本原理。 在FPGA中实现DDS通常包含三个关键模块: * 相位累加器:相当于那个旋转的指针,用N位寄存器实现 * 波形存储器:存储波形数据的ROM * DAC接口:将数字量转换为模拟信号(FPGA外接) 以生成1kHz正弦波为例,当系统时钟为50MHz时,相位累加器的步进值F_WORD计算公式为: F_WORD = (目标频率 * 2^N) / 系统时钟频率 其中N是相位累加器的位宽(通常24-32位)。这个公式的实质就是控制指针每次转动的角度增量。 2.