Flutter for OpenHarmony:json_rpc_2 比 REST 更轻量的远程调用协议,实现高效的前后端通信(JSON-RPC 2.0 实现) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:json_rpc_2 比 REST 更轻量的远程调用协议,实现高效的前后端通信(JSON-RPC 2.0 实现) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

前言

在现代软件架构中,RPC (Remote Procedure Call) 无处不在。它允许我们像调用本地函数一样调用远程服务器上的函数。虽然 gRPC 和 REST (HTTP/JSON) 十分流行,但在一些特定场景下,JSON-RPC 2.0 依然是不可替代的标准。

  • 轻量级:仅依赖 JSON,无须复杂的 Protobuf 编解码或 HTTP Header 开销。
  • 传输无关:可以跑在 WebSocket、TCP Socket、甚至串口(Serial Port)上。
  • 广泛支持:以太坊(Ethereum)、比特币(Bitcoin)节点通信全部基于 JSON-RPC。
  • 简单明了:人眼可读,调试极其方便。

json_rpc_2 是 Google 官方维护的一个 Dart 库,严格遵循 JSON-RPC 2.0 规范,提供了极高质量的 Client 和 Server 实现。

对于 OpenHarmony 开发者,这意味着你可以轻松地用 Dart 构建与底层硬件(如智能家居网关、工控机)通信的客户端,或者搭建一个极简的微服务 API。

一、核心原理与协议规范

1.1 JSON-RPC 2.0 协议详解

JSON-RPC 的消息体极其简洁。

请求 (Request)

{"jsonrpc":"2.0","method":"subtract","params":[42,23],"id":1}

响应 (Response)

{"jsonrpc":"2.0","result":19,"id":1}

通知 (Notification)
没有 id 字段,服务端收到后不返回任何结果(Fire-and-Forget)。

{"jsonrpc":"2.0","method":"update","params":[1,2,3,4,5]}

错误 (Error)

{"jsonrpc":"2.0","error":{"code":-32601,"message":"Method not found"},"id":"1"}

json_rpc_2 库完全封装了这些 JSON 细节,让你直接面对 Dart 对象编程。

调用方法 add

序列化

网络传输 TCP/WS

逻辑处理

响应 JSON

返回 Future/结果

Flutter 客户端

json_rpc_2 库

请求明文

服务端

计算结果

二、核心 API 详解

2.1 客户端 (Client)

客户端需要一个 StreamChannel 来传输数据。这个 Channel 可以来自 web_socket_channel(用于 Web),也可以来自 dart:ioSocket(用于 TCP)。

import'package:json_rpc_2/json_rpc_2.dart';import'package:web_socket_channel/io.dart';voidmain()async{// 1. 建立连接var socket =IOWebSocketChannel.connect('ws://localhost:4321');// 2. 创建 Clientvar client =Client(socket.cast());// 3. 必须先 listen (启动消息循环)unawaited(client.listen());try{// 4. 发送请求var result =await client.sendRequest('add',[1,2]);print('1 + 2 = $result');// 5. 发送通知 (无返回值) client.sendNotification('log',['Connection established']);}finally{await client.close();}}
在这里插入图片描述

2.2 服务端 (Server)

服务端 API 同样简洁。你可以注册方法来处理请求。

import'package:json_rpc_2/json_rpc_2.dart';import'package:shelf/shelf_io.dart'as io;import'package:shelf_web_socket/shelf_web_socket.dart';voidmain(){var handler =webSocketHandler((webSocket){var server =Server(webSocket.cast());// 注册方法 server.registerMethod('add',(Parameters params){var nums = params.asList;return nums[0]+ nums[1];}); server.registerMethod('subtract',(Parameters params){var nums = params.asList;return nums[0]- nums[1];});// 启动监听 server.listen();}); io.serve(handler,'localhost',4321).then((server){print('Serving at ws://${server.address.host}:${server.port}');});}

2.3 错误处理

json_rpc_2 会自动抛出 RpcException。你可以捕获具体的错误码。

try{await client.sendRequest('unknown_method');}onRpcExceptioncatch(e){if(e.code ==RpcException.methodNotFound){print('Method not found!');// Code -32601}else{print('Error ${e.code}: ${e.message}');}}
在这里插入图片描述

三、OpenHarmony 平台适配实战

在鸿蒙系统(尤其是 IoT 设备)中,TCP 通信比 HTTP 更常见且更高效。我们可以使用 Dart 原生的 Socket 来承载 JSON-RPC。

3.1 基于 TCP Socket 的全双工通信

假设我们有一个运行在鸿蒙开发板上的 Dart 服务端,控制 LED 灯。

// lib/rpc_server.dart (运行在开发板)import'dart:io';import'package:json_rpc_2/json_rpc_2.dart';import'package:stream_channel/stream_channel.dart';voidstartServer()async{// 监听 8080 端口var serverSocket =awaitServerSocket.bind(InternetAddress.anyIPv4,8080);print('Listening on port 8080...');awaitfor(var socket in serverSocket){// 将 Socket 包装为 StreamChannel<String> (UTF-8)var channel = jsonDocument.bind(StreamChannel(socket, socket));var rpcServer =Server(channel);// 注册控制方法 rpcServer.registerMethod('set_led',(Parameters params){ bool on= params['on'].asBool;// 获取命名参数print('Turning LED ${on ? 'ON' : 'OFF'}');// 硬件操作逻辑: GPIO.output(1, on);return{'status':'ok','led':on};}); rpcServer.listen();}}

3.2 客户端控制 App (Flutter)

// lib/rpc_client.dartimport'dart:io';import'package:json_rpc_2/json_rpc_2.dart';import'package:stream_channel/stream_channel.dart';classIotController{Client? _client;Future<void>connect(String ip)async{var socket =awaitSocket.connect(ip,8080);// 创建双向通道var channel = jsonDocument.bind(StreamChannel(socket, socket)); _client =Client(channel); _client!.listen();// 启动循环}Future<void>toggleLed(bool on)async{if(_client ==null|| _client!.isClosed)throwException('Not connected');// 调用远程方法// 虽然是异步网络请求,写起来就像本地函数调用try{var response =await _client!.sendRequest('set_led',{'on':on});print('Response: $response');}catch(e){print('RPC Error: $e');}}}

这个例子展示了 json_rpc_2 最强大的能力:Transport Agnostic (传输无关性)。只要你能提供一个 StreamChannel,不管是 TCP、WebSocket,甚至是 Bluetooth RFCOMM,它都能跑起来。

在这里插入图片描述

四、高级进阶:批量请求 (Batch Request)

JSON-RPC 2.0 支持一次发送多个请求,常用于初始化大量数据。

// 客户端 client.withBatch((){ client.sendRequest('add',[1,1]); client.sendRequest('add',[2,2]); client.sendNotification('log',['Batch test']);}).then((results){// results 包含所有返回结果print(results);// [2, 4, null] });

这对于移动网络环境极其友好,减少了 RTT(往返时延)。

五、总结

json_rpc_2 是 Dart 生态中被严重低估的一个库。它虽然看起来简单,但却是构建高可靠、低延迟、跨语言通信系统的基石。

与 gRPC 相比,它无需生成代码,调试只需 print;与 REST 相比,它支持全双工 Notification 推送。
对于 OpenHarmony 开发者,特别是涉及 硬件交互、即时通讯、区块链交互 的场景,JSON-RPC 是你的不二之选。

最佳实践

  1. 超时控制:在 sendRequest 后加上 .timeout(Duration(seconds: 5)),防止网络挂死。
  2. 错误定义:在服务端统一定义业务错误码(如 -32001 代表硬件故障),客户端据此做 UI 提示。

Read more

【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱

【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱

【DeepSeek应用】Deepseek R1 本地部署(Ollama+Docker+OpenWebUI) 【DeepSeek应用】DeepSeek 搭建个人知识库(Ollama+CherryStudio) 【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱 【DeepSeek应用】Zotero+Deepseek 阅读与分析文献 【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱 * 1. DeepSeek 工具箱:应用程序 * 2. DeepSeek 工具箱:AI Agent 框架 * 3. DeepSeek 工具箱:RAG 框架 * 4. DeepSeek 工具箱:即时通讯软件 * 5. DeepSeek 工具箱:浏览器插件 * 6. DeepSeek 工具箱:

By Ne0inhk
“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

大模型仍未对上商业的齿轮? 编译 | 王启隆 来源 | youtu.be/aWqfH0aSGKI 出品丨AI 科技大本营(ID:rgznai100) 现在的硅谷,空气里都飘着一股“再不上车就晚了”的焦躁感。 最近 OpenClaw 风头正旺,强势登顶 GitHub,终结了 React 神话,许多人更是觉得“AI 自己干活赚钱”的日子就在明天了。 特别是在斯坦福商学院(GSB)这种地方,台下坐着的都是成天琢磨怎么用下一个技术风口搞个独角兽出来的狠人。 微软的首席科学官(CSO)Eric Horvitz 被请到了这个几乎全美最想用 AI 变现的礼堂里。作为从上世纪 80 年代就开始搞 AI 的绝对老炮、也是微软技术底座的“扫地僧”,这位老哥并没有顺着台下的胃口,去吹捧下个月大模型又要颠覆什么行业,而是兜头给大家浇了一盆带点学术味的冷水。 他讲了一个挺有画面感的比喻:大家都在聊

By Ne0inhk
Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当大模型能在几秒钟内生成一段“看起来像那么回事”的补丁时,开源社区却开始付出另一种代价。 最近,开源游戏引擎 Godot 的核心维护团队公开吐槽:他们正被大量“AI 生成的低质量代码”淹没。那些代码往往结构完整、注释齐全、描述洋洋洒洒,但真正的问题是——提交者可能并不理解自己交上来的内容。 这件事,并不是简单的“有人偷懒用 AI 写代码”。它正在触及开源协作最核心的东西:信任。 一场悄无声息的“AI 洪水” 事情的导火索来自一条 Bluesky 讨论帖。 Godot 主要维护者之一、同时也是 Godot 商业支持公司 W4 Games 联合创始人的 Rémi Verschelde 表示,所谓的“AI slop”

By Ne0inhk
诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

当宇宙级的“嘴炮”遇到降维打击。 编译 | 王启隆 来源 | youtu.be/l6ZcFa8pybE 出品丨AI 科技大本营(ID:rgznai100) 打开最新一期知名播客 StarTalk 的 YouTube 评论区,最高赞的一条留言是这样写的: “我长这么大,第一次看到尼尔·德葛司·泰森(Neil deGrasse Tyson)在一档节目里几乎全程闭嘴,像个手足无措的小学生一样乖乖听讲。” 作为全美最知名的天体物理学家,泰森平时的画风是充满激情、喋喋不休、用宇宙的宏大来震撼嘉宾。但这一次,坐在他对面的那位满头银发、带着温和英音的英国老人,仅仅用最平淡的语气,就让整个演播室陷入了数次令人窒息的沉默。 这位老人是 Geoffrey Hinton。深度学习三巨头之一,2024 年诺贝尔物理学奖得主,被公认为“AI 教父”。 对经常阅读 Hinton 演讲的我来说,这也是比较新奇的一幕—

By Ne0inhk