{"id":49915868,"url":"https://github.com/600888/dlt645","last_synced_at":"2026-05-16T16:12:47.441Z","repository":{"id":319438623,"uuid":"1044346415","full_name":"600888/dlt645","owner":"600888","description":"DLT645-2007智能电表采集协议，支持RTU服务端/客户端，TCP服务端/客户端，目前有C++、Python和Go三个版本","archived":false,"fork":false,"pushed_at":"2026-02-21T01:19:28.000Z","size":10001,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-21T07:09:13.812Z","etag":null,"topics":["cpp","dlt645","go","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/600888.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-25T14:44:41.000Z","updated_at":"2026-02-21T01:19:03.000Z","dependencies_parsed_at":"2025-10-19T05:10:20.882Z","dependency_job_id":"76629f4d-60b4-4fed-9ed0-4287ce5fc169","html_url":"https://github.com/600888/dlt645","commit_stats":null,"previous_names":["600888/dlt645"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/600888/dlt645","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/600888%2Fdlt645","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/600888%2Fdlt645/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/600888%2Fdlt645/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/600888%2Fdlt645/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/600888","download_url":"https://codeload.github.com/600888/dlt645/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/600888%2Fdlt645/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33109466,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cpp","dlt645","go","python"],"created_at":"2026-05-16T16:12:46.344Z","updated_at":"2026-05-16T16:12:47.426Z","avatar_url":"https://github.com/600888.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DL/T645-2007协议多语言实现库\n\n一个功能完整的DL/T645-2007电能表通信协议的多语言实现项目，同时支持C++、Python和Go三种编程语言，提供了统一的接口和功能。\n\n## 🌴通讯支持\n\n| 功能                            | 状态 |\n| ------------------------------- | ---- |\n| **TCP客户端** 🐾 | ✅    |\n| **TCP服务端** 🐾 | ✅    |\n| **RTU主站** 🐾                   | ✅    |\n| **RTU从站** 🐾                   | ✅    |\n\n## 🌴 功能完成情况\n\n| 功能                                           | 状态 |\n| ---------------------------------------------- | -- |\n| **读、写通讯地址** 🐾  | ✅  |\n| **修改密码** 🐾  | ✅  |\n| **广播校时** 🐾  | ✅  |\n| **电能量** 🐾  | ✅  |\n| **最大需量及发生时间** 🐾         | ✅ |\n| **变量** 🐾                | ✅ |\n| **读、写参变量** 🐾            | ✅ |\n| **事件记录** 🐾                 | ✅ |\n| **冻结量** 🐾               | ❌ |\n| **负荷纪录** 🐾           | ❌ |\n\n\n## 选择语言版本\n\n请选择您感兴趣的语言版本查看详细文档：\n\n- [C++版本](../cpp/README.md)\n- Python版本\n- [Go版本](../go/README.md)\n\n## DL/T645-2007协议Python实现库\n\n一个功能完整的DL/T645-2007电能表通信协议Python实现库，支持TCP和RTU两种通信方式，可用于电能表数据读写和通信测试。\n\n## 功能特性\n\n- 🌐 **多种通信方式**：支持TCP和RTU（串口）通信\n- 📊 **完整协议支持**：实现DL/T645-2007协议的主要功能\n- 🔌 **客户端/服务端**：同时提供客户端和服务端功能\n- 📈 **多种数据类型**：支持电能量、最大需量、变量数据读写\n- 🛡️ **设备认证**：支持设备地址验证和密码保护\n- 📝 **完善日志**：内置日志系统，便于调试\n- 🎯 **易于使用**：简洁的API设计，快速上手\n\n## 支持的数据类型\n\n- **电能量数据**（00类）：正向有功电能、反向有功电能等\n- **最大需量数据**（01类）：最大需量及发生时间\n- **变量数据**（02类）：实时电压、电流、功率等\n- **参变量数据**（04类）：设备参数、配置信息等\n\n## 安装\n\n```bash\npip install dlt645\n```\n\n### 文档地址\n\n**https://600888.github.io/dlt645**\n\n![](resource/python/6.png)\n\n\n## 快速开始\n\n### 创建TCP服务器\n\n```python\nfrom dlt645 import MeterServerService\n\n# 创建TCP服务器\nserver_svc = MeterServerService.new_tcp_server(\"127.0.0.1\", 8021, 3000)\n\n# 设置设备地址\ndlt645_svc.set_address(\"123456781012\")\n\n# 设置密码\ndlt645_svc.set_password(\"00123456\")\n\n# 写电能\ndlt645_svc.set_00(0x00000000, 50.5)\n\n# 写最大需量\ndlt645_svc.set_01(\n    0x01010000,\n    Demand(78.0, datetime.strptime(\"2023-01-01 12:00:00\", \"%Y-%m-%d %H:%M:%S\")),\n)\n\n# 写变量\ndlt645_svc.set_02(0x02010100, 66.6)\n\n# 设置事件记录\ndlt645_svc.set_03(\n    0x03010000,\n    [\n        (\"000015\", \"000012\"),  # A相失压总次数、累计时间\n        (\"000025\", \"000024\"),  # B相失压总次数、累计时间\n        (\"000034\", \"000030\"),  # C相失压总次数、累计时间\n    ],\n)\n\n# 写参变量\ndlt645_svc.set_04(0x04000101, \"25110201\")  # 2025年11月2日星期一\ndlt645_svc.set_04(0x04000204, \"10\")  # 设置费率数为10\n\nschedule_list = []\nschedule_list.append(\"120901\")\nschedule_list.append(\"120902\")\nschedule_list.append(\"120903\")\nschedule_list.append(\"120904\")\nschedule_list.append(\"120905\")\nschedule_list.append(\"120906\")\nschedule_list.append(\"120907\")\nschedule_list.append(\"120908\")\nschedule_list.append(\"120909\")\nschedule_list.append(\"120910\")\nschedule_list.append(\"120911\")\nschedule_list.append(\"120912\")\nschedule_list.append(\"120913\")\nschedule_list.append(\"120914\")\ndlt645_svc.set_04(0x04010000, schedule_list)  # 第一套时区表数据\n\n# 启动服务器\nserver_svc.server.start()\n```\n\n![](resource/python/1.png)\n\n### 创建RTU服务器\n\n```python\nfrom dlt645 import MeterServerService\n\n# 创建RTU服务器\nserver_svc = MeterServerService.new_rtu_server(port=\"COM11\",data_bits=8,stop_bits=1,baud_rate=9600,parity=\"N\",timeout=1.0)\n\n# 设置设备地址\ndlt645_svc.set_address(\"123456781012\")\n\n# 设置密码\ndlt645_svc.set_password(\"00123456\")\n\n# 写电能\ndlt645_svc.set_00(0x00000000, 50.5)\n\n# 写最大需量\ndlt645_svc.set_01(\n    0x01010000,\n    Demand(78.0, datetime.strptime(\"2023-01-01 12:00:00\", \"%Y-%m-%d %H:%M:%S\")),\n)\n\n# 写变量\ndlt645_svc.set_02(0x02010100, 66.6)\n\n# 设置事件记录\ndlt645_svc.set_03(\n    0x03010000,\n    [\n        (\"000015\", \"000012\"),  # A相失压总次数、累计时间\n        (\"000025\", \"000024\"),  # B相失压总次数、累计时间\n        (\"000034\", \"000030\"),  # C相失压总次数、累计时间\n    ],\n)\n\n# 写参变量\ndlt645_svc.set_04(0x04000101, \"25110201\")  # 2025年11月2日星期一\ndlt645_svc.set_04(0x04000204, \"10\")  # 设置费率数为10\n\nschedule_list = []\nschedule_list.append(\"120901\")\nschedule_list.append(\"120902\")\nschedule_list.append(\"120903\")\nschedule_list.append(\"120904\")\nschedule_list.append(\"120905\")\nschedule_list.append(\"120906\")\nschedule_list.append(\"120907\")\nschedule_list.append(\"120908\")\nschedule_list.append(\"120909\")\nschedule_list.append(\"120910\")\nschedule_list.append(\"120911\")\nschedule_list.append(\"120912\")\nschedule_list.append(\"120913\")\nschedule_list.append(\"120914\")\ndlt645_svc.set_04(0x04010000, schedule_list)  # 第一套时区表数据\n\n# 启动服务器\nserver_svc.server.start()\n```\n\n![](resource/python/2.png)\n\n### 创建TCP客户端\n\n```python\nfrom dlt645 import MeterClientService\n\nclient_svc = MeterClientService.new_tcp_client(\"127.0.0.1\", 10521, timeout=1)\n\n# 设置设备密码(0级)\nclient_svc.set_password(\"00123456\")\n\n# 读取通讯地址\naddress_data = client_svc.read_address()\nif address_data and hasattr(address_data, \"value\"):\n    print(f\"通讯地址: {address_data.value}\")\nelse:\n    print(\"读取通讯地址失败\")\n\n# 设置设备地址\nclient_svc.set_address(address_data.value)\n\n# 读取电能数据\ndata_item = client_svc.read_00(0x00000000)\nprint(f\"电能数据: {data_item}\")\n\n# 读取最大需量及发生时间\ndata_item2 = client_svc.read_01(0x01010000)\nprint(f\"最大需量及发生时间: {data_item2}\")\n\n# 读取变量数据\ndata_item3 = client_svc.read_02(0x02010100)\nprint(f\"变量数据: {data_item3}\")\n\n# 读取事件记录数据\ndata_item4 = client_svc.read_03(0x03010000)\nprint(f\"事件记录数据: {data_item4}\")\n\n# 读取参变量\ndata_item5 = client_svc.read_04(0x04000101)\nprint(f\"日期及星期: {data_item5}\")\n\ndata_item6 = client_svc.read_04(0x04000204)\nprint(f\"费率数: {data_item6}\")\n\n# 读取时区表数据\ndata_item7 = client_svc.read_04(0x04010000)\nfor item in data_item7:\n    print(item)\n\n# 读取公共假日日期及时段表号\ndata_item8 = client_svc.read_04(0x04030001)\nprint(f\"公共假日日期及时段表号: {data_item8}\")\n\n# 修改密码\nclient_svc.change_password(\"00123456\", \"04123456\")\n\n# 写参变量\ndata_item9 = client_svc.write_04(\n    0x04000101, \"25120901\", password=\"04123456\"\n)  # 写日期及星期\n\n```\n\n![](resource/python/3.png)\n\n### 创建RTU客户端\n\n```python\nfrom dlt645 import MeterClientService\n\n# 创建RTU客户端\nclient = MeterClientService.new_rtu_client(\n    port=\"COM10\",\n    baudrate=9600,\n    databits=8,\n    stopbits=1,\n    parity=\"N\",\n    timeout=0.5\n)\n\n# 设置设备密码(0级)\nclient_svc.set_password(\"00123456\")\n\n# 读取通讯地址\naddress_data = client_svc.read_address()\nif address_data and hasattr(address_data, \"value\"):\n    print(f\"通讯地址: {address_data.value}\")\nelse:\n    print(\"读取通讯地址失败\")\n\n# 设置设备地址\nclient_svc.set_address(address_data.value)\n\n# 读取电能数据\ndata_item = client_svc.read_00(0x00000000)\nprint(f\"电能数据: {data_item}\")\n\n# 读取最大需量及发生时间\ndata_item2 = client_svc.read_01(0x01010000)\nprint(f\"最大需量及发生时间: {data_item2}\")\n\n# 读取变量数据\ndata_item3 = client_svc.read_02(0x02010100)\nprint(f\"变量数据: {data_item3}\")\n\n# 读取事件记录数据\ndata_item4 = client_svc.read_03(0x03010000)\nprint(f\"事件记录数据: {data_item4}\")\n\n# 读取参变量\ndata_item5 = client_svc.read_04(0x04000101)\nprint(f\"日期及星期: {data_item5}\")\n\ndata_item6 = client_svc.read_04(0x04000204)\nprint(f\"费率数: {data_item6}\")\n\n# 读取时区表数据\ndata_item7 = client_svc.read_04(0x04010000)\nfor item in data_item7:\n    print(item)\n\n# 读取公共假日日期及时段表号\ndata_item8 = client_svc.read_04(0x04030001)\nprint(f\"公共假日日期及时段表号: {data_item8}\")\n\n# 修改密码\nclient_svc.change_password(\"00123456\", \"04123456\")\n\n# 写参变量\ndata_item9 = client_svc.write_04(\n    0x04000101, \"25120901\", password=\"04123456\"\n)  # 写日期及星期\n\n```\n![](resource/python/4.png)\n\n### 使用第三方工具测试\n\n测试效果\n\n![](resource/python/5.gif)\n\n## API参考\n\n### 服务器端API\n\n#### MeterServerService\n\n主要的服务器服务类，提供以下方法：\n- `new_tcp_server(ip: str, port: int, timeout: float)` - 创建TCP服务器（类方法）\n- `new_rtu_server(port: str, data_bits: int, stop_bits: int, baud_rate: int, parity: str, timeout: float)` - 创建RTU服务器（类方法）\n- `set_00(di: int, value: float)` - 设置电能量数据\n- `set_01(di: int, demand: Demand)` - 设置最大需量数据\n- `set_02(di: int, value: float)` - 设置变量数据\n- `set_03(di: int, value: list)` - 设置事件记录数据\n- `set_04(di: int, value: float)` - 设置参变量数据\n- `set_address(address: str)` - 设置设备地址\n- `set_password(password: str)` - 设置密码\n- `change_password(old_password: str, new_password: str)` - 修改密码\n\n### 客户端API\n\n#### MeterClientService\n\n主要的客户端服务类，提供以下方法：\n\n- `new_tcp_client(ip: str, port: int, timeout: float)` - 创建TCP客户端（类方法）\n- `new_rtu_client(port: str, baudrate: int, databits: int, stopbits: int, parity: str, timeout: float)` - 创建RTU客户端（类方法）\n- `read_00(di: int)` - 读取电能量数据\n- `read_01(di: int)` - 读取最大需量数据\n- `read_02(di: int)` - 读取变量数据\n- `read_04(di: int)` - 读取参变量数据\n- `write_04(di: int, value: str, password: str)` - 写入参变量数据\n- `read_address()` - 读取设备地址\n- `write_address(new_address: str)` - 写入设备地址\n- `set_address(address: str)` - 设置本地设备地址\n- `set_password(password: str)` - 设置密码\n- `change_password(old_password: str, new_password: str)` - 修改密码\n\n## 数据标识说明\n\nDLT645协议使用4字节的数据标识来标识不同的数据项：\n\n### 电能量数据（00类）\n- `0x00000000` - 总有功电能\n- `0x00010000` - 正向有功电能\n- `0x00020000` - 反向有功电能\n\n### 最大需量数据（01类）  \n- `0x01000000` - 总最大需量\n- `0x01010000` - 正向最大需量\n\n### 变量数据（02类）\n- `0x02010100` - A相电压\n- `0x02010200` - B相电压\n- `0x02010300` - C相电压\n- `0x02020100` - A相电流\n- `0x02020200` - B相电流\n- `0x02020300` - C相电流\n\n### 参变量数据（04类）\n- `0x04000101` - 日期及星期(0代表星期天)\n- `0x04000102` - 时间\n\n## 配置文件\n\n库包含了丰富的配置文件，定义了各种数据类型：\n\n- `config/energy_types.json` - 电能量数据类型配置\n- `config/demand_types.json` - 最大需量数据类型配置  \n- `config/variable_types.json` - 变量数据类型配置\n- `config/event_record_types.json` - 事件记录数据类型配置\n- `config/parameter_types.json` - 参变量数据类型配置\n\n## 开发指南\n\n### 环境要求\n\n- Python \u003e= 3.7\n- loguru \u003e= 0.5.0\n- pyserial \u003e= 3.4\n\n### 运行测试\n\n```bash\n# 安装开发依赖\npip install -e .[dev]\n\n# 运行测试\npytest\n```\n\n### 调试日志\n\n库使用loguru进行日志记录，可以通过以下方式启用详细日志：\n\n```python\nfrom loguru import logger\nlogger.add(\"dlt645.log\", level=\"DEBUG\")\n```\n\n## 常见问题\n\n### Q: 如何处理通信超时？\nA: 可以在创建客户端时设置timeout参数，或者使用try-catch捕获超时异常。\n\n### Q: 支持哪些串口参数？\nA: 支持标准的串口参数：波特率（1200-115200）、数据位（7-8）、停止位（1-2）、校验位（N/E/O）。\n\n### Q: 如何添加自定义数据类型？\nA: 可以修改config目录下的JSON配置文件，添加新的数据标识和格式定义。\n\n## 许可证\n\nApache License 2.0\n\n## 贡献\n\n欢迎提交Issue和Pull Request！\n\n## 联系方式\n\n- 作者：Chen Dongyu\n- 邮箱：1755696012@qq.com\n- 项目地址：https://gitee.com/chen-dongyu123/dlt645","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F600888%2Fdlt645","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F600888%2Fdlt645","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F600888%2Fdlt645/lists"}