kkprotocol 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kkprotocol/__init__.py +105 -0
- kkprotocol/builder.py +1005 -0
- kkprotocol/codec.py +804 -0
- kkprotocol/compiler.py +182 -0
- kkprotocol/contrib/__init__.py +8 -0
- kkprotocol/contrib/artnet.py +55 -0
- kkprotocol/contrib/bacnet_mstp.py +110 -0
- kkprotocol/contrib/cctalk.py +53 -0
- kkprotocol/contrib/cjt188.py +57 -0
- kkprotocol/contrib/dlt645.py +81 -0
- kkprotocol/contrib/hdlc.py +47 -0
- kkprotocol/contrib/mbus.py +61 -0
- kkprotocol/contrib/modbus_ascii.py +59 -0
- kkprotocol/contrib/nmea.py +59 -0
- kkprotocol/contrib/slip.py +38 -0
- kkprotocol/contrib/xmodem.py +74 -0
- kkprotocol/crc.py +103 -0
- kkprotocol/errors.py +48 -0
- kkprotocol/example_device.py +186 -0
- kkprotocol/example_modbus_rtu.py +176 -0
- kkprotocol/example_modbus_rtu_multi.py +391 -0
- kkprotocol/fields.py +167 -0
- kkprotocol/frame.py +114 -0
- kkprotocol/frame_codec.py +50 -0
- kkprotocol/framing.py +190 -0
- kkprotocol/length.py +151 -0
- kkprotocol/pack.py +222 -0
- kkprotocol/py.typed +0 -0
- kkprotocol/spec.py +494 -0
- kkprotocol-0.1.0.dist-info/METADATA +1015 -0
- kkprotocol-0.1.0.dist-info/RECORD +34 -0
- kkprotocol-0.1.0.dist-info/WHEEL +5 -0
- kkprotocol-0.1.0.dist-info/licenses/LICENSE +21 -0
- kkprotocol-0.1.0.dist-info/top_level.txt +1 -0
kkprotocol/__init__.py
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""kkprotocol —— 可自定义数据帧的 TCP 流式解析器。
|
|
3
|
+
|
|
4
|
+
快速上手::
|
|
5
|
+
|
|
6
|
+
from kkprotocol import AbstractFrameCodec, Field, LENGTH_FRAMING, crc16_modbus
|
|
7
|
+
|
|
8
|
+
class MyCodec(AbstractFrameCodec):
|
|
9
|
+
framing = LENGTH_FRAMING # 长度定界(默认)
|
|
10
|
+
device_field = "dev_id" # 可选:自动学习/校验设备号
|
|
11
|
+
def rules(self):
|
|
12
|
+
return [
|
|
13
|
+
Field.u8("header", fixed=0x55),
|
|
14
|
+
Field.u8("len"),
|
|
15
|
+
Field.raw("dev_id", 4),
|
|
16
|
+
Field.raw("data", "{len.val}-7"),
|
|
17
|
+
Field.checksum("crc", 2, group="{len}{dev_id}{data}"),
|
|
18
|
+
]
|
|
19
|
+
def crc_imp(self, data):
|
|
20
|
+
return crc16_modbus(data)
|
|
21
|
+
|
|
22
|
+
codec = MyCodec() # 每个连接一个实例
|
|
23
|
+
for frame in codec.feed(chunk): # 任意切分的 TCP 数据块
|
|
24
|
+
handle(frame)
|
|
25
|
+
|
|
26
|
+
帧首不是固定帧头而是设备号、且设备号首帧未知时,直接参考
|
|
27
|
+
:class:`HeadDeviceFrameCodec`(学到设备号后自动把它当同步字用)。
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from .builder import BuildResult, FrameBuilder, Protocol
|
|
31
|
+
from .codec import AbstractFrameCodec, CodecStats
|
|
32
|
+
from .compiler import CompiledField, compile_rules
|
|
33
|
+
from .crc import crc16_ccitt, crc16_modbus, crc16_x25, crc8, sum8, xor8
|
|
34
|
+
from .errors import FrameBuildError, FrameCodecError, FrameRuleError
|
|
35
|
+
from .fields import Field
|
|
36
|
+
from .frame import FieldValue, Frame
|
|
37
|
+
from .pack import Data, pack
|
|
38
|
+
from .spec import AutoField, ChecksumRule, FrameSpec, LengthRule, Pdu, SeqPolicy
|
|
39
|
+
from .framing import (
|
|
40
|
+
AUTO_FRAMING,
|
|
41
|
+
DELIMITER_FRAMING,
|
|
42
|
+
LENGTH_FRAMING,
|
|
43
|
+
DelimiterFraming,
|
|
44
|
+
escape_bytes,
|
|
45
|
+
find_end_delimiter,
|
|
46
|
+
unescape_bytes,
|
|
47
|
+
wrap_frame,
|
|
48
|
+
)
|
|
49
|
+
from .length import LengthExpr
|
|
50
|
+
from .example_device import (
|
|
51
|
+
DeviceFrameCodec,
|
|
52
|
+
HeadDeviceFrameCodec,
|
|
53
|
+
PppFrameCodec,
|
|
54
|
+
build_device_frame,
|
|
55
|
+
build_head_device_frame,
|
|
56
|
+
build_ppp_frame,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
__version__ = "0.1.0"
|
|
60
|
+
|
|
61
|
+
__all__ = [
|
|
62
|
+
"__version__",
|
|
63
|
+
"AbstractFrameCodec",
|
|
64
|
+
"AUTO_FRAMING",
|
|
65
|
+
"BuildResult",
|
|
66
|
+
"ChecksumRule",
|
|
67
|
+
"CodecStats",
|
|
68
|
+
"CompiledField",
|
|
69
|
+
"DELIMITER_FRAMING",
|
|
70
|
+
"DelimiterFraming",
|
|
71
|
+
"DeviceFrameCodec",
|
|
72
|
+
"Field",
|
|
73
|
+
"FieldValue",
|
|
74
|
+
"Frame",
|
|
75
|
+
"FrameBuildError",
|
|
76
|
+
"FrameBuilder",
|
|
77
|
+
"FrameCodecError",
|
|
78
|
+
"FrameRuleError",
|
|
79
|
+
"FrameSpec",
|
|
80
|
+
"HeadDeviceFrameCodec",
|
|
81
|
+
"LENGTH_FRAMING",
|
|
82
|
+
"LengthExpr",
|
|
83
|
+
"LengthRule",
|
|
84
|
+
"Pdu",
|
|
85
|
+
"PppFrameCodec",
|
|
86
|
+
"Protocol",
|
|
87
|
+
"SeqPolicy",
|
|
88
|
+
"AutoField",
|
|
89
|
+
"Data",
|
|
90
|
+
"pack",
|
|
91
|
+
"build_device_frame",
|
|
92
|
+
"build_head_device_frame",
|
|
93
|
+
"build_ppp_frame",
|
|
94
|
+
"compile_rules",
|
|
95
|
+
"crc16_ccitt",
|
|
96
|
+
"crc16_modbus",
|
|
97
|
+
"crc16_x25",
|
|
98
|
+
"crc8",
|
|
99
|
+
"escape_bytes",
|
|
100
|
+
"find_end_delimiter",
|
|
101
|
+
"sum8",
|
|
102
|
+
"unescape_bytes",
|
|
103
|
+
"wrap_frame",
|
|
104
|
+
"xor8",
|
|
105
|
+
]
|