恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

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

  • 首页
  • 资讯中心
  • /
  • Go + webrpc 实战:人在外面,远程查家里 NAS 磁盘和目录

相关资讯

呼吸道合胞病毒抗原检测试剂盒(胶体金法)说明书 2026/8/21 20:41:12
ARLArena:构建稳定智能体强化学习的统一框架与工程实践 2026/8/21 20:41:12
基于Python的智能停车管理系统(源码+文档+部署讲解等) 2026/8/21 20:41:12

最新资讯

SolidWorks国标插件安装指南:从环境检查到稳定运行全流程
智慧教育平台电子课本怎么下载成 PDF:3 步存到本地
中国“人形机器人数据地图”
Waydroid在Fedora上初始化总报OTA错误?一条命令解决
Python打卡第9天
库存积压和缺货并存,问题出在哪儿?

今日推荐

OpenCode AI编程助手:从核心原理到本地部署的完整实践指南
基于SpringBoot与Vue的企业资产与采购管理系统设计与实现(程序+文档+讲解)
Linux命令-uucico(UUCP传输程序)

本周热门

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码
【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

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

发布时间:2026/8/21 20:41:12
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 各用一个。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号