{"id":26051818,"url":"https://github.com/ljzd-pro/pydglab-ws","last_synced_at":"2025-04-10T21:22:17.742Z","repository":{"id":239799024,"uuid":"799907316","full_name":"Ljzd-PRO/PyDGLab-WS","owner":"Ljzd-PRO","description":"一个用于创建郊狼 3.0 DG-Lab App Socket 控制终端和服务端的 Python 库","archived":false,"fork":false,"pushed_at":"2024-10-30T14:50:45.000Z","size":1364,"stargazers_count":33,"open_issues_count":8,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-24T18:52:26.913Z","etag":null,"topics":["dg-lab","dg-lab-v3","lib","library","python","python3","websocket"],"latest_commit_sha":null,"homepage":"https://pydglab-ws.readthedocs.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ljzd-PRO.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-13T10:34:56.000Z","updated_at":"2025-03-07T15:13:26.000Z","dependencies_parsed_at":"2024-05-15T12:55:18.826Z","dependency_job_id":"fdf83f66-8568-4b36-930e-404a1f88f077","html_url":"https://github.com/Ljzd-PRO/PyDGLab-WS","commit_stats":null,"previous_names":["ljzd-pro/pydglab-ws"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ljzd-PRO%2FPyDGLab-WS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ljzd-PRO%2FPyDGLab-WS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ljzd-PRO%2FPyDGLab-WS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ljzd-PRO%2FPyDGLab-WS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ljzd-PRO","download_url":"https://codeload.github.com/Ljzd-PRO/PyDGLab-WS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248299026,"owners_count":21080449,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dg-lab","dg-lab-v3","lib","library","python","python3","websocket"],"created_at":"2025-03-08T05:13:20.284Z","updated_at":"2025-04-10T21:22:17.716Z","avatar_url":"https://github.com/Ljzd-PRO.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  PyDGLab-WS\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  一个用于创建郊狼 3.0 DG-Lab App Socket 控制终端和服务端的 Python 库\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pydglab-ws.readthedocs.io\"\u003e📖 完整文档\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.codefactor.io/repository/github/ljzd-pro/pydglab-ws\"\u003e\n    \u003cimg src=\"https://www.codefactor.io/repository/github/ljzd-pro/pydglab-ws/badge\" alt=\"CodeFactor\" /\u003e\n  \u003c/a\u003e\n\n  \u003ca href=\"https://codecov.io/gh/Ljzd-PRO/PyDGLab-WS\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://codecov.io/gh/Ljzd-PRO/PyDGLab-WS/branch/master/graph/badge.svg?token=VTr0LB1yWF\" alt=\"codecov\"/\u003e\n  \u003c/a\u003e\n\n  \u003ca href=\"https://github.com/Ljzd-PRO/PyDGLab-WS/actions/workflows/codecov.yml\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Test Result\" src=\"https://img.shields.io/github/actions/workflow/status/Ljzd-PRO/PyDGLab-WS/codecov.yml\"\u003e\n  \u003c/a\u003e\n\n  \u003ca href='https://pydglab-ws.readthedocs.io/'\u003e\n    \u003cimg src='https://readthedocs.org/projects/pydglab-ws/badge/?version=latest' alt='Documentation Status' /\u003e\n  \u003c/a\u003e\n\n  \u003ca href=\"https://github.com/Ljzd-PRO/PyDGLab-WS/activity\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/last-commit/Ljzd-PRO/PyDGLab-WS/master\" alt=\"Last Commit\"/\u003e\n  \u003c/a\u003e\n\n  \u003ca href=\"./LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/license/Ljzd-PRO/PyDGLab-WS\" alt=\"BSD 3-Clause\"/\u003e\n  \u003c/a\u003e\n\n  \u003ca href=\"https://pypi.org/project/pydglab-ws\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/v/release/Ljzd-PRO/PyDGLab-WS?logo=python\" alt=\"Version\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## 💡 特性\n\n- 通过该库可开发 Python 程序，接入 DG-Lab App\n- 完全使用 asyncio 异步，并发执行各项操作\n- 可部署第三方终端与 Socket 服务一体的服务端，降低部署复杂度和延迟\n- 使用异步生成器、上下文管理器等，结合语言特性\n- 通过 Pydantic, 枚举 管理消息结构和常量，便于开发\n\n### 🔧 DG-Lab App 的 Socket 被控功能支持的操作\n\n- 获取 A, B 通道强度 以及 通道强度上限 的数据更新\n- 对 A, B 通道强度进行操作，支持增加、减少、设定到指定值\n- 向 App 发送持续一段时间的波形操作数据\n- 清空 App 波形操作队列\n- 获取 App 按下反馈按钮的通知\n\n## 🚀 快速开始\n\n📖 更多用法和完整 API 请查看文档：https://pydglab-ws.readthedocs.io\n\n\u003e [!Note]\n\u003e 注意，您可能需要先大致了解一下第三方终端通过 WebSocket 连接控制 DG-Lab App 的基本流程和原理 \\\n\u003e 官方文档：https://github.com/DG-LAB-OPENSOURCE/DG-LAB-OPENSOURCE/blob/main/socket/README.md\n\n### 🔨 安装\n\n```bash\npip3 install pydglab-ws\n```\n\n### 📡 搭建服务端\n\n```python3\nimport asyncio\nfrom pydglab_ws.server import DGLabWSServer\n\n\nasync def main():\n    async with DGLabWSServer(\"0.0.0.0\", 5678, 60) as server:\n        while True:\n            print(f\"已连接的 WebSocket 客户端（终端/App）：{list(server.uuid_to_ws.keys())}\")\n            print(f\"已连接的本地终端：{list(server.local_client_ids)}\")\n            print(f\"关系绑定：{server.client_id_to_target_id}\")\n            await asyncio.sleep(5)\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n更多演示请查看 [`examples/server.py`](examples/server.py)\n\n### 🕹️ 搭建客户端 / 第三方终端\n\n当进入 `DGLabWSServer` 的异步生成器时，从 WebSocket 服务端获取 `clientId` 的操作会 **自动完成**\n\n```python3\nimport asyncio\nfrom websockets import ConnectionClosedOK\nfrom pydglab_ws import DGLabWSConnect\n\n\ndef print_qrcode(_: str):\n    \"\"\"输出二维码到终端界面\"\"\"\n    ...\n\n\nasync def main():\n    try:\n        async with DGLabWSConnect(\"ws://192.168.1.161:5678\") as client:\n            # 获取二维码\n            url = client.get_qrcode()\n            print(\"请用 DG-Lab App 扫描二维码以连接\")\n            print_qrcode(url)\n\n            # 等待绑定\n            await client.bind()\n            print(f\"已与 App {client.target_id} 成功绑定\")\n\n            # 从 App 接收数据更新，并进行远控操作\n            async for data in client.data_generator():\n                print(f\"收取到数据：{data}\")\n    except ConnectionClosedOK:\n        print(\"Socket 服务端断开连接\")\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n更多演示请查看 [`examples/ws_client.py`](examples/ws_client.py)\n\n### 🕹️ 搭建与第三方终端一体的 WebSocket 服务端\n\n这段代码不仅提供 DG-Lab WebSocket 服务端服务，还生成了一个本地终端可供 App 连接。\n\n\u003e [!Tip]\n\u003e 不管是本地终端 `DGLabLocalClient` 还是 WebSocket 终端 `DGLabWSClient`，**包含的主要方法都相同** \\\n\u003e 因此在该段代码中，终端相关的逻辑与上面的独立的 WebSocket 终端的实现基本相同。 \\\n\u003e 这种方式，省去了终端连接 WebSocket 服务端的环节，终端与 WebSocket 服务端一体，**网络延迟更低，部署更方便**。\n\n```python3\nimport asyncio\nfrom pydglab_ws import DGLabWSServer\n\n\ndef print_qrcode(_: str):\n    \"\"\"输出二维码到终端界面\"\"\"\n    ...\n\n\nasync def main():\n    async with DGLabWSServer(\"0.0.0.0\", 5678, 60) as server:\n        client = server.new_local_client()\n\n        url = client.get_qrcode(\"ws://192.168.1.161:5678\")\n        print(\"请用 DG-Lab App 扫描二维码以连接\")\n        print_qrcode(url)\n\n        # 等待绑定\n        await client.bind()\n        print(f\"已与 App {client.target_id} 成功绑定\")\n\n        # 从 App 接收数据更新，并进行远控操作\n        async for data in client.data_generator():\n            print(f\"收取到数据：{data}\")\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n\n```\n\n更多演示请查看 [`examples/local_client_with_server.py`](examples/server_with_local_client.py)\n\n## 📌 更多\n\n如果您在开发过程中，发现要实现一些常用的功能时并不方便，或者您有什么建议能够使开发更简单快捷，欢迎在 Issues 中提出~\n\n### 🔗 链接\n\n- PyPI: 🔗[pydglab-ws](https://pypi.org/project/pydglab-ws/)\n\n### 📐 代码覆盖率\n\n![codecov.io](https://codecov.io/github/Ljzd-PRO/PyDGLab-WS/graphs/tree.svg?token=VTr0LB1yWF)\n\n### 许可证\n\nPyDGLab-WS 使用 BSD 3-Clause 许可证.\n\nCopyright © 2024 by Ljzd-PRO.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fljzd-pro%2Fpydglab-ws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fljzd-pro%2Fpydglab-ws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fljzd-pro%2Fpydglab-ws/lists"}