From 34d1de4be350e0444bef9eec0da109ddf36b20e2 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Mon, 13 Oct 2025 17:10:24 +0800 Subject: [PATCH] =?UTF-8?q?add=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 123 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 29d3de6..c225d43 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,127 @@ -efka -===== +# ws_channel 模块 API 文档与交互逻辑 -An OTP application +## 注意websocket的数据格式为: text -1. 先解决数据的上行问题 -2. todo list - 要解决连接断开重新连接的问题 !!! +## 一、模块概述 +`ws_channel` 是基于 Erlang + Cowboy WebSocket 实现的 MQTT 相关交互模块,主要用于服务注册、主题订阅、指标数据上报、事件发送及消息广播等功能,通过 WebSocket 协议实现客户端与服务端的实时双向通信。 -Build ------ - $ rebar3 compile +## 三、核心 API 方法 +客户端通过发送 **JSON 格式文本消息** 与服务端交互,消息格式遵循 JSON-RPC 风格(包含 `id`、`method`、`params` 字段)。 + + +### 1. 服务注册(register) +#### 功能 +注册服务并建立客户端与服务进程的关联,是后续操作(订阅、上报数据等)的前提。 + +#### 请求格式 +```json +{ + "id": <整数,请求唯一标识>, + "method": "register", + "params": { + "service_id": <二进制,服务唯一标识,必填>, + "meta_data": <映射,服务元数据,可选>, + "container_name": <二进制,容器名称,可选> + } +} +``` + +#### 响应格式 +- 成功响应: + ```json + { + "id": <与请求id一致>, + "result": "ok" + } + ``` +- 失败处理:服务端直接关闭连接(因 `attach_channel` 失败) + +### 2. 主题订阅(subscribe) +#### 功能 +订阅指定主题,后续可接收该主题的广播消息。 + +#### 请求格式 +```json +{ + "id": <整数,请求唯一标识>, + "method": "subscribe", + "params": { + "topic": <二进制,订阅的主题名称,必填> + } +} +``` + +#### 响应格式 +- 成功响应: + ```json + { + "id": <与请求id一致>, + "result": "ok" + } + ``` +- 失败响应: + ```json + { + "id": <与请求id一致>, + "error": { + "code": -1, + "message": "错误描述" + } + } + ``` + +#### 处理逻辑 +通过 `efka_subscription:subscribe(Topic, self())` 完成订阅,订阅成功后客户端会收到该主题的广播消息。 + + +### 3. 指标数据上报(metric_data) +#### 功能 +向服务进程上报设备指标数据。 + +#### 请求格式 +```json +{ + "method": "metric_data", + "params": { + "device_uuid": <二进制,设备唯一标识,必填>, + "route_key": <二进制,路由键,必填>, + "metric": <指标数据,必填> + } +} +``` + +#### 响应处理 +服务端接收后无返回消息(处理逻辑:`efka_service:metric_data(ServicePid, DeviceUUID, RouteKey, Metric)`) + + +### 4. 事件发送(event) +#### 功能 +向服务进程发送事件消息。 + +#### 请求格式 +```json +{ + "method": "event", + "params": { + "event_type": <二进制,事件类型,必填>, + "body": <事件内容,必填> + } +} +``` + +## 五、基础交互协议 +1. **Ping/Pong 心跳**: + - 客户端发送 `ping` 消息 + - 服务端回复 `pong` 消息,维持连接 + +2. **未知消息处理**: + - 客户端发送未定义格式的消息时,服务端记录错误并关闭连接 + +## 七、典型交互流程 +1. 客户端发起 WebSocket 连接 +2. 客户端发送 `register` 请求完成注册 +3. 客户端发送 `subscribe` 请求订阅目标主题 +4. 客户端通过 `metric_data` 上报指标数据 / 通过 `event` 发送事件 +5. 服务端向客户端推送已订阅主题的消息(`publish` 方法) +6. 连接关闭(主动断开或异常终止) \ No newline at end of file