Files
kunlun/app/smart_grid/inc/proto_hx_dlms.h

316 lines
11 KiB
C
Raw Normal View History

2024-09-28 14:24:04 +08:00
/****************************************************************************
Copyright(c) 2024 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef PROTO_HX_DLMS_H
#define PROTO_HX_DLMS_H
#include "os_types_api.h"
#include "iot_utils_api.h"
#include "iot_pkt_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/* pack for the structures in the whole file */
#pragma pack(push) /* save the pack status */
#pragma pack(1) /* 1 byte align */
/* default baud rate for Q/HX-J011-04/02-2015 */
#define PROTO_HX_DLMS_DEFAULT_BAUD 9600
#define PROTO_HX_DLMS_START_BYTE 0x7e
#define PROTO_HX_DLMS_END_BYTE 0x7e
#define PROTO_HX_DLMS_START_END_LEN (2)
#define PROTO_HX_DLMS_FCS_LEN (2)
#define PROTO_HX_DLMS_FRAME_MODULE_REQ (5)
#define PROTO_HX_DLMS_FRAME_TRANS_REQ (12)
#define PROTO_HX_DLMS_LOGICAL_MODULE_ADDR 0x7c
#define PROTO_HX_DLMS_LOGICAL_METER_ADDR 0x01
#define PROTO_HX_DLMS_SEQ_MAX 7
#define PROTO_HX_DLMS_CMD_ID_GET_REQ 0xC0
#define PROTO_HX_DLMS_CMD_ID_GET_RSP 0xC4
#define PROTO_HX_DLMS_CMD_ID_SET_REQ 0xC1
#define PROTO_HX_DLMS_CMD_ID_SET_RSP 0xC5
#define PROTO_HX_DLMS_CMD_ID_ACTION_REQ 0xC3
#define PROTO_HX_DLMS_CMD_ID_ACTION_RSP 0xC7
#define PROTO_HX_DLMS_CMD_DESC_NORMAL 0x01
#define PROTO_HX_DLMS_RESULT_DATA 0x00
#define PROTO_HX_DLMS_RESULT_ACCESS 0x01
/* data type definition, see Q/HX-J011-04/02-2015 */
#define PROTO_HX_DLMS_DATA_TYPE_STRUCTURE 0x02
#define PROTO_HX_DLMS_DATA_TYPE_BIT_STR 0x04
#define PROTO_HX_DLMS_DATA_TYPE_OCTET_STR 0x09
#define PROTO_HX_DLMS_DATA_TYPE_UINT8 0x11
#define PROTO_HX_DLMS_DATA_TYPE_ENUM 0x16
/* definition network state */
#define PROTO_HX_DLMS_NET_STATE_OFFLINE 0x01
#define PROTO_HX_DLMS_NET_STATE_ONLINE 0x02
/* definition signal strength max */
#define PROTO_HX_DLMS_SIGNAL_STRENGTH_MAX 0x07
/* definition HX DLMS state sync len */
#define PROTO_HX_DLMS_STATE_SYNC_LEN 0x22
/* definition HX DLMS module version len */
#define PROTO_HX_DLMS_MODULE_VER_LEN 0x04
/* definition HX DLMS cco mac len */
#define PROTO_HX_DLMS_CCO_MAC_LEN 0x0C
/* define HX DLMS event status word */
#define PROTO_HX_DLMS_STATUS_BITMAP_LENGTH (8)
#define PROTO_HX_DLMS_STATUS_EVENT_FLAG (0x80)
#define PROTO_HX_DLMS_STATUS_PTA_FLAG (0x40)
#define PROTO_HX_DLMS_STATUS_IR_FLAG (0x20)
/* define HX DLMS event status words comm media type */
#define PROTO_HX_DLMS_COMM_MEDIA_PRIME (0x00)
#define PROTO_HX_DLMS_COMM_MEDIA_G3PLC (0x01)
/* define HX DLMS event push client values */
#define PROTO_HX_DLMS_EVENT_PUSH_CLIENT_MANAGE (0x01)
#define PROTO_HX_DLMS_EVENT_PUSH_CLIENT_READING (0x02)
#define PROTO_HX_DLMS_EVENT_PUSH_CLIENT_PUBLIC (0x10)
#define PROTO_HX_DLMS_EVENT_PUSH_CLIENT_PRECONNECT (0x66)
#define PROTO_HX_DLMS_EVENT_STR_LEN_NUM_MAX (2)
#define PROTO_HX_DLMS_EVENT_DATA_STRUCT_NUM (5)
union proto_hx_dlms_seq
{
struct {
/* frame sequence */
uint8_t frame_seq : 3,
/* serial id */
serial_id : 3,
/* reserved for future */
rsvd : 2;
} bit;
uint8_t value;
};
/* frame head info of HX DLMS protocol link layer frame */
typedef struct _proto_hx_dlms_head {
/* start char, see PROTO_HX_DLMS_START_BYTE */
uint8_t start_char;
/* frame length except start and end byte */
uint8_t len_h : 4,
/* type of the frame, see PROTO_HX_DLMS_FRAME_XXX */
frame_type: 4;
/* frame length except start and end byte */
uint8_t len_l: 8;
/* sequence format */
union proto_hx_dlms_seq seq;
/* destination logical address */
uint8_t dst_addr;
/* source logical address */
uint8_t src_addr;
/* data */
uint8_t data[0];
} proto_hx_dlms_head_t;
/* frame tail info of HX DLMS protocol link layer frame */
typedef struct _proto_hx_dlms_tail {
/* check sum */
uint8_t fcs[PROTO_HX_DLMS_FCS_LEN];
/* end char. see PROTO_DLMS_HDLC_END_BYTE */
uint8_t end_char;
} proto_hx_dlms_tail_t;
/* frame head info of HX HPLC app protocol link layer frame */
typedef struct _proto_hx_dlms_app_hdr {
/* version, default is 0x0001, big endian data*/
uint16_t ver;
/* source logical address, big endian data */
uint16_t src_addr;
/* destination logical address, big endian data */
uint16_t dst_addr;
/* length of data, big endian data */
uint16_t len;
/* data */
uint8_t data[0];
} proto_hx_dlms_app_hdr_t;
/* structure of DLMS HDLC link layer frame
-------------
|----7EH-------------| start of frame, 0x7E.
|----frame_format----| 2 byte of frame format. Include length(12 bit)
| | and frame type(4 bit).
|----seq-------------| sequence.
|----dst address-----| 1 byte of destination logical address.
|----src address-----| 1 byte of source logical address
|----Data------------| APDU. length is variable
|----FCS-------------| 2 byte of frame
|----7EH-------------| end of frame, 0x7E.
-------------
*/
/* frame head info of HX DLMS protocol apdu */
typedef struct _proto_hx_dlms_apdu_hdr {
/* command id, see PROTO_HX_DLMS_CMD_ID_XXX */
uint8_t cmd_id;
/* command descriptor, see PROTO_HX_DLMS_DESC_XXX */
uint8_t cmd_desc;
/* invoke id and priority */
uint8_t inv_id : 4,
rsvd : 2,
/* Service confirmation */
ser_class:1,
pri : 1;
/* command data */
uint8_t data[0];
} proto_hx_dlms_apdu_hdr_t;
/* HX DLMS data di */
typedef struct _proto_hx_dlms_data_di {
/* class id, big endian data */
uint8_t class_id[2];
/* obis, big endian data */
uint8_t obis[6];
/* attribute */
uint8_t attr;
} proto_hx_dlms_data_di_t;
/* HX DLMS data di */
typedef struct _proto_hx_dlms_rsp_result {
/* response result type, 0 mean data, 1 mean access result */
uint8_t type;
/* result data */
uint8_t data[0];
} proto_hx_dlms_rsp_result_t;
/* HX DLMS data */
typedef struct _proto_hx_dlms_data {
/* data type */
uint8_t type;
/* data length or data include cnt */
uint8_t num;
/* data content */
uint8_t con[0];
} proto_hx_dlms_data_t;
/* HX DLMS data with fix length */
typedef struct _proto_hx_dlms_data_fix {
/* data type */
uint8_t type;
/* data content */
uint8_t data[0];
} proto_hx_dlms_data_fix_t;
/* HX DLMS state sync */
typedef struct _proto_hx_dlms_state_sync {
/* type is PROTO_HX_DLMS_DATA_TYPE_ENUM */
uint8_t type1;
/* wan type */
uint8_t wan_type;
/* type is PROTO_HX_DLMS_DATA_TYPE_OCTET_STR */
uint8_t type2;
/* data len */
uint8_t data_len;
/* net state, see PROTO_HX_DLMS_NET_STATE_XXX */
uint8_t net_state;
/* signal strength, see PROTO_HX_DLMS_SIGNAL_STRENGT_XXX */
uint8_t signal_strength;
/* ver len */
uint8_t ver_len;
/* ver info */
uint8_t ver[PROTO_HX_DLMS_MODULE_VER_LEN];
/* cco mac len */
uint8_t cco_mac_len;
/* cco mac, big endian data */
uint8_t cco_mac[PROTO_HX_DLMS_CCO_MAC_LEN];
} proto_hx_dlms_state_sync_t;
#pragma pack(pop) /* restore the pack status */
/**
* @brief proto_hx_dlms_check - a dlms packet check.
* @param data: packet data
* @param len: length of the packet data
* @retval: NULL -- parse protocol fail.
* @retval: otherwise -- pointer to the hx dlms protocol header
*/
proto_hx_dlms_head_t *proto_hx_dlms_check(uint8_t* data,
uint16_t len);
/**
* @brief proto_hx_dlms_msg_build - creat a hx dlms message.
* @param data: apdu data
* @param len: length of the apdu data
* @param frame_type: type of the frame, see PROTO_HX_DLMS_FRAME_XXX
* @param dst_addr: destination logical address
* @param src_addr: source logical address
* @param serial_id: serial id
* @param seq: sequence of message
* @retval: NULL -- parse protocol fail.
* @retval: otherwise -- pointer to the hx dlms protocol message.
*/
iot_pkt_t *proto_hx_dlms_msg_build(const uint8_t *data, uint16_t len,
uint8_t frame_type, uint8_t dst_addr, uint8_t src_addr, uint8_t serial_id,
uint8_t seq);
/**
* @brief proto_hx_dlms_change_app_to_meter - change message from HX HPLC app
* protocol to HX DLMS protocol.
* @param head: head info of HX HPLC app protocol message
* @param len: length of message
* @param serial_id: serial id
* @param seq: sequence of HX DLMS message
* @retval: NULL -- parse protocol fail.
* @retval: otherwise -- pointer to the HX DLMS protocol message.
*/
iot_pkt_t *proto_hx_dlms_change_app_to_meter(
proto_hx_dlms_app_hdr_t *head, uint16_t len, uint8_t serial_id,
uint8_t seq);
/**
* @brief proto_hx_dlms_change_meter_to_app - change message from HX DLMS
* protocol to HX HPLC app protocol.
* @param head: head info of HX DLMS protocol message
* @retval: NULL -- parse protocol fail.
* @retval: otherwise -- pointer to the HX HPLC app protocol message.
*/
iot_pkt_t *proto_hx_dlms_change_meter_to_app(
proto_hx_dlms_head_t *head);
/**
* @brief proto_hx_dlms_check_frame_handler - check whether the frame
* is legitimate.
* @param buffer: the buffer containing data.
* @param buffer_len: len of the buffer.
* @param is_frame: false: the frame isn't legitimate.
* true: the frame is legitimate.
*/
void proto_hx_dlms_check_frame_handler(uint8_t* buffer,
uint32_t buffer_len, bool_t* is_frame);
/**
* @brief proto_hx_dlms_change_evt_to_app - change event message from HX DLMS
* protocol to HX HPLC app protocol
* @param data: event data.
* @param len: len of event length.
* @retval: NULL -- parse protocol fail.
* @retval: otherwise -- pointer to the HX HPLC app protocol message.
*/
iot_pkt_t *proto_hx_dlms_change_evt_to_app(uint8_t *data,
uint16_t len);
#ifdef __cplusplus
}
#endif
#endif /* PROTO_HX_DLMS_H */