Go + webrpc 实战:人在外面,远程查家里 NAS 磁盘和目录

发布时间:2026/8/21 20:40:44

Go + webrpc 实战:人在外面,远程查家里 NAS 磁盘和目录
独立开发者笔记非官方教程。Token 与 SDK 见 webrpc 控制台。人不在家里时常会碰到两个很具体的问题家里的 NAS / 小主机还活着吗磁盘还剩多少空间某个目录里有没有把备份跑完用 frp 可以硬把 Web 管理页或 SSH 透出来但你要先维护一台公网机器还要操心端口暴露面。之前我写过一篇更完整的双端 RPC 示例Ping/GetDeviceInfo这次换一个更贴近日常的痛点用 JSON 发请求远程查磁盘用量和列目录。下面示例依然是无公网 IP 场景A 端挂在家里当 AgentB 端在外面发起查询。这次和之前示例有什么不同点之前这篇载荷格式RPC|Ping|…管道分隔标准 JSON业务连通性测试disk.usage / dir.list代码结构双文件各写一套抽出公共protocol.go思路文内合并展示协议长这样// 请求{id:1,method:disk.usage}{id:2,method:dir.list,params:{path:/Photos}}// 响应{id:1,ok:true,data:{path:/,total_gb:931.5,free_gb:412.3}}{id:2,ok:true,data:{entries:[2024,2025,backup]}}准备控制台拿两个 TokenYOUR_TOKEN_A家里 Agent、YOUR_TOKEN_B外面 Client下载对应平台 SDK头文件和动态库放工程根目录Go 1.20能跑 CGO目录nas-remote-query/ ├── libwebrpc-Mac.h ├── libwebrpc-Mac.dylib ├── agent/main.go # 家里 NAS └── client/main.go # 外面查询公共回调读帧 JSON 类型两端都要连127.0.0.1:回调端口读 SDK 推来的数据。帧格式与官网一致sessionId(4) type(1) payload。数据流 type2。typeRequeststruct{IDintjson:idMethodstringjson:methodParamsmap[string]stringjson:params,omitempty}typeResponsestruct{IDintjson:idOKbooljson:okDatainterface{}json:data,omitemptyErrorstringjson:error,omitempty}funcreadDataFrame(conn net.Conn)(sessionIDuint32,payload[]byte,errerror){sidBuf:make([]byte,4)if_,errio.ReadFull(conn,sidBuf);err!nil{return}sessionIDbinary.BigEndian.Uint32(sidBuf)typ:make([]byte,1)if_,errio.ReadFull(conn,typ);err!nil{return}iftyp[0]!2{returnsessionID,nil,fmt.Errorf(unsupported frame type %d,typ[0])}lenBuf:make([]byte,4)if_,errio.ReadFull(conn,lenBuf);err!nil{return}n:binary.BigEndian.Uint32(lenBuf)payloadmake([]byte,n)_,errio.ReadFull(conn,payload)return}Agent家里 NAS 处理 disk.usage 和 dir.listagent/main.go核心逻辑funchandleRequest(webrpc C.GoUintptr,sessionIDuint32,raw[]byte){varreq Requestiferr:json.Unmarshal(raw,req);err!nil{reply(webrpc,sessionID,Response{OK:false,Error:bad json})return}log.Printf([Agent] 收到请求: %s,string(raw))varresp Response resp.IDreq.IDswitchreq.Method{casedisk.usage:resp.OKtrueresp.DatadiskUsage(/)// 见下方实现casedir.list:path:req.Params[path]ifpath{path.}entries,err:listDir(path)iferr!nil{resp.OKfalseresp.Errorerr.Error()}else{resp.OKtrueresp.Datamap[string]interface{}{entries:entries}}default:resp.OKfalseresp.Errorunknown method}reply(webrpc,sessionID,resp)}funcreply(webrpc C.GoUintptr,sessionIDuint32,resp Response){body,_:json.Marshal(resp)log.Printf([Agent] 回包: %s,body)gofunc(){cmsg:C.CString(string(body))deferC.free(unsafe.Pointer(cmsg))ret:C.WebrpcClient_SendData(webrpc,C.uint(sessionID),cmsg,C.int(len(body)),3000)log.Printf([Agent] SendData ret%d,int(ret))}()}funcdiskUsage(pathstring)map[string]interface{}{// Linux/macOS 可用 syscall.Statfs此处示意返回结构returnmap[string]interface{}{path:path,total_gb:931.5,free_gb:412.3,}}funclistDir(pathstring)([]string,error){ents,err:os.ReadDir(path)iferr!nil{returnnil,err}names:make([]string,0,len(ents))for_,e:rangeents{namesappend(names,e.Name())}returnnames,nil}Agent 的main与官网示例相同WebrpcClient_New→ 等LoginStatus→GetReceivePort→ goroutine 里net.Dial回调端口循环readDataFrame后调handleRequest。Client外面发 JSON 查询funcmain(){// … New / Login / GetReceivePort 同上 …gostartCallbackReader(int(tcpPort))// 打印收到的 JSON 响应peer:C.CString(YOUR_TOKEN_A)deferC.free(unsafe.Pointer(peer))sid:C.WebrpcClient_OpenSession(webrpc,peer,permission)ifsid0{log.Fatal(OpenSession 失败)}log.Printf(会话建立 sessionId%d,uint32(sid))sendJSON(webrpc,sid,Request{ID:1,Method:disk.usage})time.Sleep(time.Second)sendJSON(webrpc,sid,Request{ID:2,Method:dir.list,Params:map[string]string{path:/Photos},})select{}}funcsendJSON(webrpc C.GoUintptr,sid C.uint,req Request){body,_:json.Marshal(req)cmsg:C.CString(string(body))deferC.free(unsafe.Pointer(cmsg))ret:C.WebrpcClient_SendData(webrpc,sid,cmsg,C.int(len(body)),5000)log.Printf([Client] 发送 %s ret%d,body,int(ret))}回调里收到响应后直接log.Printf打印 JSON若要做得像同步 RPC可以用map[int]chan Response按id等待这里为短示例保持异步打印。CGO 头与官网一致/* #cgo CFLAGS: -I.. #cgo darwin LDFLAGS: -L.. -lwebrpc-Mac #cgo linux,amd64 LDFLAGS: -L.. -lwebrpc-Linux #cgo linux,arm64 LDFLAGS: -L.. -lwebrpc-Linux-arm64 #if defined(__APPLE__) #include libwebrpc-Mac.h #elif defined(__linux__) defined(__aarch64__) #include libwebrpc-Linux-arm64.h #elif defined(__linux__) #include libwebrpc-Linux.h #endif #include stdlib.h */importC跑起来家里Agent 先启动cdnas-remote-query/agentexportDYLD_LIBRARY_PATH..# Linux 用 LD_LIBRARY_PATHgo run.外面Clientcdnas-remote-query/client go run.Agent 侧大致会看到Client 侧会在回调里打印带free_gb和entries的 JSON。两端跨网家宽 手机热点测一次比同机两个进程更有说服力。三个容易踩的坑回调里同步 SendData 会卡死读循环——回包务必放 goroutine。OpenSession返回 0——Agent 没在线、Token 填反、或网络策略太严先同机验证逻辑。JSON 和业务权限——示例为了短没做鉴权真实 NAS 产品要在 Agent 里校验 caller、限制可列目录的路径避免dir.list被扫全盘。还能怎么扩展disk.usage换成真实syscall.StatfsLinux或unix.StatfsmacOS加file.pullAgent 读小文件SendData分块回传大文件用SendFile请求里加token或 HMAC做一层轻量鉴权把 Client 封成 CLInasctl disk/nasctl ls /Photos小结webrpc 不会替你实现「列目录」的业务逻辑但它把无公网 IP 下的会话和收发收进了 SDK。这篇示例解决的是很具体的一刀在外面用 JSON 问家里 NAS 还剩多少空间、目录里有什么——比管道字符串更接近真实产品也比再开一条 frp 隧道更贴应用层。完整 API 与多语言示例见 https://www.webrpc.cn/ 开发文档。Personal 档约$5/年/2 Token够 Agent Client 各用一个。

相关新闻

呼吸道合胞病毒抗原检测试剂盒(胶体金法)说明书

呼吸道合胞病毒抗原检测试剂盒(胶体金法)说明书

2026/8/21 20:40:44

手足口病是春夏高发的肠道病毒传染性疾病,多见于5岁以下婴幼儿,传染性强、传播速度快,极易在幼儿园、校园等集体场所传播。感染后常伴随发热、口腔疱疹、手足臀部皮疹等症状,少数情况存在重 症风险,是儿童公共卫生重点…

2026/27五大联赛怎么看?英超西甲德甲开赛时间、观赛平台全攻略

2026/27五大联赛怎么看?英超西甲德甲开赛时间、观赛平台全攻略

2026/8/21 20:30:43

2026/27五大联赛新赛季全面开打,球迷的快乐又回来了。但面对英超、西甲、德甲、意甲、法甲,不少新球迷不知道具体赛事该去哪里看?看哪个?以及怎么投到电视上看?今天一篇全讲明白,帮你挑出最适合追的联赛。一…

服务器崩溃与数据丢失应急自救指南:从诊断到恢复的完整流程

服务器崩溃与数据丢失应急自救指南:从诊断到恢复的完整流程

2026/8/21 20:30:43

这次我们来看一个所有运维、开发甚至个人站长都可能遇到的“噩梦”场景:服务器崩溃,数据丢失。这不仅仅是云服务器或物理机的问题,从个人VPS到企业级集群,从Windows到Linux,从数据库到应用服务,崩溃和数据丢…

nctoolbox:5 分钟在 MATLAB 里读通 NetCDF 与 OPeNDAP 模型数据

nctoolbox:5 分钟在 MATLAB 里读通 NetCDF 与 OPeNDAP 模型数据

2026/8/21 21:30:46

nctoolbox:5 分钟在 MATLAB 里读通 NetCDF 与 OPeNDAP 模型数据 【免费下载链接】nctoolbox NCTOOLBOX A Matlab toolbox for working with common data model datasets 项目地址: https://gitcode.com/gh_mirrors/nc/nctoolbox nctoolbox 是一个 MATLAB 工具…

Python如何实现蚁群算法

Python如何实现蚁群算法

2026/8/21 21:30:46

如何实现蚁群算法在这篇文章里面, 会针对怎样切实实现蚁群算法, 为大家展开极为详尽的讲解, 小编觉着它相当实用, 所以特此给予分享, 提供给大家当作参考, 期望大家在阅读完这篇文章以后, 能够有所斩获。1、引言几十年以来, 自然界里各种生物群体所展现出的智能, 受到了学者们的…

5 分钟跑起来京东自动下单工具:jd-happy 完整使用指南

5 分钟跑起来京东自动下单工具:jd-happy 完整使用指南

2026/8/21 21:30:46

5 分钟跑起来京东自动下单工具:jd-happy 完整使用指南 【免费下载链接】jd-happy [DEPRECATED]Node 爬虫,监控京东商品到货,并实现下单服务 项目地址: https://gitcode.com/gh_mirrors/jd/jd-happy 盯着京东页面反复刷新等补货&#x…

NAudio:5行C代码让MP3出声,.NET音频播放与录制入门

NAudio:5行C代码让MP3出声,.NET音频播放与录制入门

2026/8/21 21:30:46

NAudio:5行C#代码让MP3出声,.NET音频播放与录制入门 【免费下载链接】NAudio Audio and MIDI library for .NET 项目地址: https://gitcode.com/gh_mirrors/na/NAudio NAudio 是 .NET 平台上的音频与 MIDI 开源库,音频播放、音频录制、…

Python函数默认参数设置

Python函数默认参数设置

2026/8/21 21:30:46

我们清楚, 于调用函数之际, 要是未指定某一参数, 解释器会抛出异常。为处理此问题, 允许给参数设定默认值, 也就是在定义函数之时, 直接给形式参数赋予一个默认值, 如此一来, 哪怕调用函数时未给具备默认值的形参传递参数, 该参数能够直接运用定义函数时设置的默认值。定义带有…

GIMP批量图像处理BIMP完整教程:3个真实任务搞定批量水印、格式转换与重命名

GIMP批量图像处理BIMP完整教程:3个真实任务搞定批量水印、格式转换与重命名

2026/8/21 21:20:45

GIMP批量图像处理BIMP完整教程:3个真实任务搞定批量水印、格式转换与重命名 【免费下载链接】gimp-plugin-bimp BIMP. Batch Image Manipulation Plugin for GIMP. 项目地址: https://gitcode.com/gh_mirrors/gi/gimp-plugin-bimp BIMP(Batch Ima…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/19 3:36:59

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/20 21:07:35

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/19 8:02:16

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

091、主从同步控制策略

091、主从同步控制策略

2026/8/21 0:09:47

091、主从同步控制策略:从一次多轴抖动事故说起 去年调试一台四轴龙门平台,Z轴和两个X轴做主从同步。电机选的是台达A2系列,驱动器工作在位置模式,主站发脉冲指令,从站硬线跟随。调试时发现一个诡异现象:当主站以500rpm匀速运行时,从站电流波形每隔几秒会出现一次毛刺,…

向量检索实验失败后该查什么

向量检索实验失败后该查什么

2026/8/21 0:09:47

向量检索实验失败后该查什么 这篇要解决什么 向量检索实验失败后该查什么讨论的是一个可复查的工程问题。向量检索实验失败后该查什么不拿未经记录的事故、跑分或成本当作论据;判断需要回到当前项目的输入、版本和运行条件。 从边界开始 处理向量检索实验失败后该查…

提示词发布过程中的止损边界

提示词发布过程中的止损边界

2026/8/21 0:09:47

提示词发布过程中的止损边界 这篇要解决什么 提示词发布过程中的止损边界讨论的是一个可复查的工程问题。提示词发布过程中的止损边界不拿未经记录的事故、跑分或成本当作论据;判断需要回到当前项目的输入、版本和运行条件。 从边界开始 处理提示词发布过程中的止损…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…