aboutsummaryrefslogtreecommitdiff
path: root/random-notes.md
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2019-05-27 21:44:10 +0200
committerBjørn Mork <bjorn@mork.no>2019-05-27 21:44:10 +0200
commitb8853b4a5f3d360bab6be693b568d29d4fceb2b2 (patch)
tree4eb7d37b8160a22c5787547b1e9b2c58b7185639 /random-notes.md
parenta6ad199ab435be37c6e04b70e593bc23b110823d (diff)
move testing notes and code around
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Diffstat (limited to 'random-notes.md')
-rw-r--r--random-notes.md185
1 files changed, 185 insertions, 0 deletions
diff --git a/random-notes.md b/random-notes.md
new file mode 100644
index 0000000..ad44bce
--- /dev/null
+++ b/random-notes.md
@@ -0,0 +1,185 @@
+# obinsect - simple COSEM OBIS to MQTT proxy
+
+## plan
+
+IEC 62056-7-5:2017 annex D.1 "M-Bus with the HDLC based data link
+layer" provides this protocol stack:
+
+* COSEM Application process (IEC 62056-6-1, IEC 62056-6-2)
+* DLMS/COSEM Application layer (IEC 62056-5-3)
+* HLDC based Data Link layer (IEC 62056-46)
+* M-Bus Physical Layer (IEC 13757-2)
+
+
+### M-BUS connection
+
+ * by USB serial device.
+ * details out of scope.
+ * Assumed to be working and available on /dev/ttyUSBx.
+ * configurable device name, supporting symlinks
+
+### HDLC decoding
+
+ * no 0x7E escaping?
+
+ * section 8.3.2 "LLC PDU format" in Green-Book-Ed-83-Excerpt.pdf
+ shows the fixed LLC sublayer for a "response”:
+
+ LSAP | DSAP | Quality | Information
+ 0xE6 | 0xE7 | 0x00 | n octets
+
+The Information field carries the LSDU. Note that n == 0 is valid.
+
+ * section 8.4.1 "The MAC PDU and the HDLC frame" in
+ Green-Book-Ed-83-Excerpt.pdf documents the outer MAC layer of the
+ DLMS HDLC transport:
+
+ Flag | Frame format | Dest. address | Src. address | Control | HCS | Information | FCS | Flag
+
+Flag is 0x7E. Note that consequtive frames my be separated by a single
+flag, which then serves as both closing and opening flag.
+
+Frames without an "Information" field will not have HCS (redundant
+since HCS and FCS would cover the same data), thus compressing the
+format to
+
+ Flag | Frame format | Dest. address | Src. address | Control | FCS | Flag
+
+Frame format is 16 bit, split as
+ * 4 bits format. Fixed value: 1010b (0xa). Meaning "type 3", which is the only defined type for DLMS
+ * 1 segmentation bit
+ * 11 length bits
+
+The value of the frame length subfield is the count of octets in the
+frame excluding the opening and closing frame flag sequences.
+
+Control field is 1 octet, indicating the type of command or response.
+Will contain sequence numbers where appropriate. See
+https://en.wikipedia.org/wiki/High-Level_Data_Link_Control#Control_Field
+Observed values: 0x10 and 0x13, meaning:
+ * seq no 0
+ * final bit set
+ * 0x10: I-frame referring send seq no 0
+ * 0x13: U-frame with type == 0, meaning UI (Unnumbered Information) according to http://www.acacia-net.com/wwwcla/protocol/iso_4335.htm
+
+
+HCS is two octets, covering the bits between the opening flag sequence and the HCS.
+
+The "Information" field may be any sequence of bytes. Meaning that
+0x7E is allowed too? It carried the MSDU of data (I and IU) frames
+
+FCS is two octets, covering the bits between the opening flag sequence
+and the FCS. Excluding "any start and stop elements", whatever that
+means?
+
+Depending on the direction of the data transfer, both the client and
+the server addresses can be destination or source addresses. The
+client address shall always be expressed on one byte. This will be the
+destination address in our case, where we only ever receive
+"responses" from the server (AMS). The length of a complete server
+address field is restricted to be one, two or four bytes long.
+
+
+### COSEM decoding
+
+
+See IEC 62056-7-5:2017 Annex G.1 "xDLMS APDUs used (without protection
+and without general-block-transfer)" for the application protocol with
+examples.
+
+
+ 0F data-notification [15]
+ 00 00 00 00 long-invoke-id-and-priority
+ 0C 07 E1 0A 14 05 03 3A 1E FF 80 00 00 date-time
+ 02 19 .... notification-body
+
+
+#### long-invoke-id-and-priority
+
+ bits
+ 0-23 | invoke-id
+ 24-27 | reserved
+ 28 | self-descriptive
+ 29 | processing-option (0=continue, 1=break on error)
+ 30 | service-class (0=unconfirmed, 1=confirmed)
+ 31 | priority (0=normal, 1=high)
+
+
+#### ACCESS service
+
+See section 9.3.9 in Green-Book-Ed-83-Excerpt.pdf
+
+The ACCESS service is a unified service which can be used to access
+multiple COSEM object attributes and/or methods with a single .request
+/ .response.
+
+This allows the 4 byte long-invoke-id-and-priority:
+
+The Invoke-Id parameter of the GET, SET and ACTION services allows the
+client and the server to pair requests and responses. The range of the
+Invoke-Id is 0...15. In some cases this is not sufficient. To support
+those cases, the ACCESS service uses a Long-Invok-Id parameter. The
+range of the Long-Invoke-Id is 0...16 777 215.
+
+ACCESS service primitives provide a service parameter to carry the
+time stamp holding the date and time of invoking the service
+primitive. This further reduces overhead
+
+
+See also 14.2 "ACCESS service example"
+
+
+Note that NEK referes to IEC 62056-7-5, which simplifies stuff for
+one-way communication from meter to client.
+
+
+ * 1 byte. Fixed? 0x0F (xDLMS service "data-notification" is 15, ref https://www.saso.gov.sa/ar/about/PublicConsultation/Documents/SASO-IEC-62056-7-5-2017-E.pdf section 7.3 "xDLMS services")
+ * 4 bytes long-invoke-id-and-priority 0x00000000 or 0x40000000
+ * 1 or 13 bytes date-time 0x00 or 0x0C.........
+ * n bytes body
+
+
+
+### OBIS mapping
+
+configurable code to MQTT topic
+configurable packed struct to JSON mapping
+
+LUA configuration?
+
+### MQTT publish
+
+use libmosquitto
+support TLS by default
+
+
+### possible laguages with libraries
+
+#### C
+
+hdlc
+cosem
+obis
+json
+lua
+libmosquitto
+
+
+#### perl
+
+
+#### lua
+
+
+lua-mosquitto
+
+
+## references
+
+Lots of real samples, collected docs and sample parsing code:
+https://github.com/roarfred/AmsToMqttBridge.git
+
+local clone: /usr/local/src/git/AmsToMqttBridge
+
+
+The file ```Samples/Kaifa/readme.md``` contains a near complete breakdown of a HDLC frame - extremely useful!