Files
kunlun/export/inc/sg_lib/proto_gw_app.h
2024-09-28 14:24:04 +08:00

2073 lines
67 KiB
C

/****************************************************************************
Copyright(c) 2019 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_GW_APP_H
#define PROTO_GW_APP_H
#include "os_types_api.h"
#include "iot_utils_api.h"
#include "proto_645.h"
#include "iot_config_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 */
/* guo wang application protocol version */
#define GW_APP_PROTO_VERSION 0x01
/* guo wang application protocol port definitions */
#define GW_APP_PORT_OTHER 0x11
#define GW_APP_PORT_UPGRADE 0x12
/* guo wang application protocol port definitions for production testing */
#define GW_APP_PORT_PRODUCT_TEST 0xff
/* guo wang application protocol id definitions */
#define GW_APP_ID_CONCENTRATOR_METER_R 0x0001
#define GW_APP_ID_ROUTE_METER_R 0x0002
#define GW_APP_ID_CONCENTRATOR_P_METER_R 0x0003
#define GW_APP_ID_CORRECTING_TIME 0x0004
#define GW_APP_ID_COMM_TEST 0x0006
#define GW_APP_ID_EVENT_REPORT 0x0008
/* sta report minute collection function in V2.8 */
#define GW_APP_ID_MIN_CLCT_REPORT 0x000A
#define GW_APP_ID_QUERY_SEC_NODE_REG 0x0011
#define GW_APP_ID_START_SEC_NODE_REG 0x0012
#define GW_APP_ID_STOP_SEC_NODE_REG 0x0013
#define GW_APP_ID_ACK_NACK 0x0020
#define GW_APP_ID_DATA_COLLECT 0x0021
/* extend protocol of heilongjiang */
#define GW_APP_ID_CLOCK_MANAGER 0x0028
#define GW_APP_ID_CLOCK_QUERY 0x0029
#define GW_APP_ID_START_UPGRADE 0x0030
#define GW_APP_ID_STOP_UPGRADE 0x0031
#define GW_APP_ID_TRANSFER_FILE_DATA 0x0032
#define GW_APP_ID_TRANSFER_FILE_DATA_B 0x0033
#define GW_APP_ID_QUERY_UPGTADE_STATUS 0x0034
#define GW_APP_ID_EXECUTE_UPGRADE 0x0035
#define GW_APP_ID_QUERY_STATION_INFO 0x0036
#define GW_APP_ID_QUERY_MODULE_ID_INFO_HN 0x0037
#define GW_APP_ID_CTRL_PROTO 0x0040
#define GW_APP_ID_CTRL_PASSTHROUGH_YN 0x0041
#define GW_APP_ID_RTC_TIMER_SYNC 0x0070
#define GW_APP_ID_TSFM_DETECT 0x00A1
#define GW_APP_ID_QUERY_MODULE_ID_INFO 0x00A2
#define GW_APP_ID_ACCURATE_CORRECT_TIME 0x00A3
/* extend protocol of xi'an */
#define GW_APP_ID_NLI_ABNORMAL 0x00B0
#define GW_APP_ID_STA_CORRECT_TIME 0x00B1
#define GW_APP_ID_SET_MODULE_CLCT_PARAM 0x00B2
#define GW_APP_ID_HISTORY_DATA_READ 0x00B3
#define GW_APP_ID_QUERY_METER_PARAM 0x00B4
/* extend protocol of hunan */
#define GW_APP_ID_STA_JOIN_CHECK 0x00C1
/* extend protocol of v2.8 */
#define GW_APP_ID_CLCT_TASK_CONFIG_SET 0x00E2
#define GW_APP_ID_CLCT_TASK_DATA_READ 0x00E3
/* extend protocol of zhe'jiang */
#define GW_APP_ID_STA_NET_LOCK_TIME 0x00F0
/* extend protocol of production testing,
* only for GW_APP_PORT_PRODUCT_TEST
*/
#define GW_APP_ID_PRODUCTION_TEST 0x00ff
/* extend protocol id definitions. */
#define GW_APP_ID_QUERY_VENDOR_INFO 0xA001
#define GW_APP_ID_CORRECT_TIME_EXT 0xA002
/* guo wang application protocol frame header */
typedef struct _gw_app_header {
uint8_t port;
uint16_t id;
uint8_t control;
} gw_app_header_t;
/* guo wang protocol version defintion */
#define GW_APP_VERSION 1
#define GW_APP_CONTROL 0
/* parameter for secondary node registration */
#define GW_APP_SEC_NODE_REG_NO_FORCE_ACK 0
#define GW_APP_SEC_NODE_REG_FORCE_ACK 1
/* guo wang protocol data type definition */
#define GW_APP_DATA_TYPE_TRANSPARENT 0
#define GW_APP_DATA_TYPE_645_1997 1
#define GW_APP_DATA_TYPE_645_2007 2
#define GW_APP_DATA_TYPE_69845 3
#define GW_APP_DATA_TYPE_SEC_AUTH 4
#define GW_APP_DATA_TYPE_LP_METER_RAW 15
/* low power meter type */
#define GW_APP_LP_METER_TYPE_UNKNOWN 0
#define GW_APP_LP_METER_TYPE_RPT_MOD_WM 4 /* report model water meter */
#define GW_APP_LP_METER_TYPE_NORMAL_WM_GM 5 /* normal model water gas meter */
#define GW_APP_LP_METER_TYPE_GAS_METER 6 /* gas meter */
#define GW_APP_LP_METER_TYPE_HEAT_METER 7 /* heat meter */
/* low power meter frame type */
#define GW_APP_LP_METER_CMD_BCAST_QR 1
#define GW_APP_LP_METER_CMD_RSSI_QR 2
#define GW_APP_LP_METER_CMD_MR 3
#define GW_APP_LP_METER_CMD_DEV_TYPE_QR 4
/* rssi threshold value */
#define GW_APP_LP_METRE_RSSI_THRESHOLD 95
/* secondary node register parameter */
#define GW_APP_REG_PARAM_QUERY_RESULT 0
#define GW_APP_REG_PARAM_START_REG 1
#define GW_APP_REG_PARAM_LOCK 2
#define GW_APP_REG_PARAM_QR_NODE_PARAM 3
#define GW_APP_REG_PARAM_LP_METER 4
#define GW_APP_REG_PARAM_STORAGE_DEV_TYPE 5
#define GW_APP_REG_PARAM_NETWORK_LOCK 6
/* low power dev type definition */
#define GW_APP_LP_DEV_TYPE_HPLC_COLLECTOR 1
#define GW_APP_LP_DEV_TYPE_LP_COLLECTOR 2
/* guo wang device type definition */
#define GW_APP_DEV_TYPE_POWER_METER 0
#define GW_APP_DEV_TYPE_COLLECTOR_T1 1
#define GW_APP_DEV_TYPE_COLLECTOR_T2 2
/* guo wang event function code definition */
/* downlink function code */
#define GW_APP_EVENT_FN_CONF_ACK 1
#define GW_APP_EVENT_FN_ALLOW_RPT 2
#define GW_APP_EVENT_FN_FORBID_RPT 3
#define GW_APP_EVENT_FN_FULL_ACK 4
/* uplink function code */
/* event triggered by smart meter */
#define GW_APP_EVENT_FN_METER_RPT 1
/* event triggered by sta modular */
#define GW_APP_EVENT_FN_STA_RPT 2
/* event triggered by collector */
#define GW_APP_EVENT_FN_COLLECTOR_RPT 3
/* bitmap type data */
#define GW_APP_EVENT_TYPE_POWER_DOWN 1
#define GW_APP_EVENT_TYPE_POWER_UP 2
/* address type data */
#define GW_APP_EVENT_TYPE_POWER_DOWN_ADDR 3
#define GW_APP_EVENT_TYPE_POWER_UP_ADDR 4
/* abnormal electric current event report for neutralwire and livewire */
#define GW_APP_EVENT_TYPE_RPT_NLI_ABNORMAL 6
/* phase type data */
#define GW_APP_EVENT_TYPE_PHASE_SEQUENCE 0xA
/* search meter result data */
#define GW_APP_EVENT_TYPE_SEARCH_RESULT 0x32
/* guo wang frame priority definition */
#define GW_APP_PRIO_METER_READ 3
#define GW_APP_PRIO_CORRECTING_TIME 3
#define GW_APP_PRIO_EVENT_REPORT 3
#define GW_APP_PRIO_PING_TEST 3
#define GW_APP_PRIO_SEC_NODE_REG 2
#define GW_APP_PRIO_UPGRADE 2
#define GW_APP_PRIO_COMM_TEST 2
#define GW_APP_PRIO_TSFM_DETECT 3
#define GW_APP_PRIO_SET_STA_CLCT_PARAM 3
#define GW_APP_PRIO_DEFAULT 2
#define GW_APP_PRIO_PRIV_ACK 2
/* the max meter reading message length supported by Guowang concurrent
* meter reading, only for non-645 protocols.
*/
#define GW_APP_CON_MR_MAX_MSG_LEN 2000
/* the max number of meter reading messages supported by Guowang concurrent
* meter reading, only for 645 protocols.
*/
#define GW_APP_CON_MR_MAX_MSG_CNT 13
/* guo wang upgrade block size definition */
#define GW_APP_UPGRADE_BLOCK_1 100
#define GW_APP_UPGRADE_BLOCK_2 200
#define GW_APP_UPGRADE_BLOCK_3 300
#define GW_APP_UPGRADE_BLOCK_4 400
#define GW_APP_UPGRADE_BLOCK_MAX GW_APP_UPGRADE_BLOCK_4
/* guo wang upgrade state */
#define GW_APP_UPGRADE_ST_IDLE 0
#define GW_APP_UPGRADE_ST_RECVING 1
#define GW_APP_UPGRADE_ST_RECV_DONE 2
#define GW_APP_UPGRADE_ST_EXECUTING 3
#define GW_APP_UPGRADE_ST_TRAIL_RUN 4
/* OK to upgrade */
#define GW_APP_UPGRADE_OK 0
/* receive request in invalid state */
#define GW_APP_UPGRADE_STATE_ERR 1
/* same version. don't upgrade */
#define GW_APP_UPGRADE_ERR_SAME_VERSION 2
/* flash operation error */
#define GW_APP_UPGRADE_FLASH_ERROR 3
/* don't upgrade in trail run state*/
#define GW_APP_UPGRADE_TRAIL_RUN_REJ 4
/* upgrade err because no memory */
#define GW_APP_UPGRADE_ERR_NO_MEM 5
/* block size error */
#define GW_APP_UPGRADE_ERR_BLOCK_SIZE 6
/* unknown error */
#define GW_APP_UPGRADE_OTHER_ERR 7
/* guo wang upgrade block query definition */
#define GW_APP_UPGRADE_QUERY_ALL_BLOCK 0xFFFF
#define GW_APP_UPGRADE_QUERY_TRANSFER_ONGOING 0
#define GW_APP_UPGRADE_QUERY_TRANSFER_DONE 1
/* station info element ID definition */
#define GW_APP_STA_INFO_ID_VENDOR_ID 0
#define GW_APP_STA_INFO_ID_VERSION 1
#define GW_APP_STA_INFO_ID_BOOTLOADER 2
#define GW_APP_STA_INFO_ID_CRC 3
#define GW_APP_STA_INFO_ID_FILE_LEN 4
#define GW_APP_STA_INFO_ID_DEV_TYPE 5
#define GW_APP_STA_INFO_ID_MAX 5
#define GW_APP_STA_INFO_VENDOR_ID_LEN 2
#define GW_APP_STA_INFO_VERSION_LEN 2
#define GW_APP_STA_INFO_BOOTLOADER_LEN 1
#define GW_APP_STA_INFO_CRC_LEN 4
#define GW_APP_STA_INFO_FILE_SIZE_LEN 4
#define GW_APP_STA_INFO_DEV_TYPE_LEN 1
/* max element length */
#define GW_APP_STA_INFO_MAX_LEN 4
/* guo wang power off bitmap TEI definitions */
#define GW_APP_EVENT_TEI_FIRST (1)
#define GW_APP_EVENT_TEI_LAST (PLC_NETWORK_SCALE)
#define GW_APP_EVENT_TEI_IS_VALID(__tei) \
((__tei) >= GW_APP_EVENT_TEI_FIRST && (__tei) <= GW_APP_EVENT_TEI_LAST)
/* guo wang tei to bitmap index conversion */
#define GW_APP_TEI_TO_BM(tei) (tei + 1)
/* guo wang bitmap index to tei conversion */
#define GW_APP_BM_TO_TEI(bm) ((uint16_t)((bm) - 1))
/* guo wang controller sub protocol Q/GDW 1376.2 */
#define GW_APP_CTRL_PROTO_3762 (0)
/* guo wang controller sub protocol passthrough */
#define GW_APP_CTRL_PROTO_PASSTHROUGH (0)
/* guo wang controller primary request message flag */
#define GW_APP_CTRL_PRM_MASTER (1)
#define GW_APP_CTRL_PRM_SLAVE (0)
/* transformer detection feature type */
#define GW_APP_TSFM_FEATURE_INVALID (0)
#define GW_APP_TSFM_FEATURE_VOLTAGE (1)
#define GW_APP_TSFM_FEATURE_FREQUENCY (2)
#define GW_APP_TSFM_FEATURE_PERIOD (3)
#define GW_APP_TSFM_FEATURE_POWER_FACTOR (4)
#define GW_APP_TSFM_FEATURE_CURRENT (5)
#define GW_APP_TSFM_FEATURE_SNR (6)
/* transformer detection feature collection type */
#define GW_APP_TSFM_COLLECT_START (1)
#define GW_APP_TSFM_COLLECT_COLLECT (2)
#define GW_APP_TSFM_COLLECT_REPORT (3)
#define GW_APP_TSFM_COLLECT_QUERY (4)
#define GW_APP_TSFM_COLLECT_RESULT (5)
/* set transformer address */
#define GW_APP_TSFM_COLLECT_SET_TSFM_ADDR (10)
/* delete transformer address */
#define GW_APP_TSFM_COLLECT_DEL_TSFM_ADDR (11)
#define GW_APP_TSFM_COLLECT_QUERY_PW (180)
#define GW_APP_TSFM_COLLECT_RESULT_PW (181)
/* transformer detect result */
#define GW_APP_TSFM_DETECT_RET_UNKNOWN (0)
#define GW_APP_TSFM_DETECT_RET_SAME (1)
#define GW_APP_TSFM_DETECT_RET_DIFFERENT (2)
/* collect type */
#define GW_APP_TSFM_COLLECT_TYPE_DEFAULT (0)
#define GW_APP_TSFM_COLLECT_TYPE_FALLING (1)
#define GW_APP_TSFM_COLLECT_TYPE_RISING (2)
#define GW_APP_TSFM_COLLECT_TYPE_EDGE (3)
/* guo wang protocol phase definition */
#define GW_APP_DATA_PHASE_DEFAULT (0)
#define GW_APP_DATA_PHASE_A (1)
#define GW_APP_DATA_PHASE_B (2)
#define GW_APP_DATA_PHASE_C (3)
/* module id information length */
#define GW_APP_MODULE_ID_INFO_LEN (11)
/* chip id information length */
#define GW_APP_CHIP_ID_INFO_LEN (24)
/* id information type definition */
#define GW_APP_ID_INFO_TYPE_MOD (0)
#define GW_APP_ID_INFO_TYPE_CHIP (1)
#define GW_APP_ID_INFO_TYPE_MOD_EXT (2)
/* vendor information type definition */
#define GW_APP_VENDOR_INFO_TYPE_VERSION (0)
/* device type definition */
#define GW_APP_ID_INFO_DEV_TYPE_METER_CONTROLLER (1)
#define GW_APP_ID_INFO_DEV_TYPE_CONCENTRATOR (2)
#define GW_APP_ID_INFO_DEV_TYPE_POWER_METER (3)
#define GW_APP_ID_INFO_DEV_TYPE_REPEAT (4)
#define GW_APP_ID_INFO_DEV_TYPE_COLLECTOR_2 (5)
#define GW_APP_ID_INFO_DEV_TYPE_COLLECTOR_1 (6)
#define GW_APP_ID_INFO_DEV_TYPE_THREE_PHASE_METER (7)
#define GW_APP_BCAST_TO_1STA_ENABLE (0)
/* convert ntb to ms. in HW, the ntb clock freq is 25 mhz. */
#define GW_APP_NTB_TO_MS(ntb) ((ntb) / (25 * 1000))
/* convert ms to ntb. in HW, the ntb clock freq is 25 mhz. */
#define GW_APP_MS_TO_NTB(ms) ((ms) * (25 * 1000))
/* phase sequence status is normal */
#define GW_APP_PHASE_SEQ_STAUS_NORMAL 0
/* phase sequence status is abnormal */
#define GW_APP_PHASE_SEQ_STAUS_ABNORMAL 1
/* power meter type */
#define GW_APP_PM_TYPE_SINGLE_PHASE (0)
#define GW_APP_PM_TYPE_THREE_PHASE (1)
/* zc type */
#define GW_APP_ZC_TYPE_FALLING_EDGE (0)
#define GW_APP_ZC_TYPE_RISING_EDGE (1)
/* curve collect period, unit is 1min */
#define GW_APP_CURVE_COLLECT_PERIOD_1MIN (1)
#define GW_APP_CURVE_COLLECT_PERIOD_5MIN (5)
#define GW_APP_CURVE_COLLECT_PERIOD_15MIN (15)
#define GW_APP_CURVE_COLLECT_PERIOD_30MIN (30)
#define GW_APP_CURVE_COLLECT_PERIOD_60MIN (60)
/* lock time function code for zhejiang protocol */
#define GW_APP_LOCK_TIME_FN_INVALID (0)
#define GW_APP_LOCK_TIME_FN_SET (1)
#define GW_APP_LOCK_TIME_FN_QUERY (2)
/* secondary node network lock cmd control type */
#define GW_APP_SEC_NODE_NW_LOCK_CMD_TYPE_UNLOCK (0x00)
/* clock manager cmd type */
#define GW_APP_CLOCK_MANAGER_AUTO_CORR (1)
#define GW_APP_CLOCK_MANAGER_THRESHOLD (3)
#define GW_APP_CLOCK_MANAGER_CORR_TIME (4)
/* electric current length */
#define GW_APP_ELECTRIC_CURRENT_LEN (3)
/* abnormal electric current report time length for neutralwire and livewire */
#define GW_APP_ABNORMAL_TIME_DATA_LEN (6)
/* abnormal electric current command type for neutralwire and livewire */
#define GW_APP_ABNORMAL_NLI_CMD_READ (0)
#define GW_APP_ABNORMAL_NLI_CMD_READ_REPLY (1)
#define GW_APP_ABNORMAL_NLI_CMD_CFG (2)
#define GW_APP_ABNORMAL_NLI_CMD_CFG_REPLY (3)
/* query module collect data respond result */
#define GW_APP_QUERY_CLCT_RESULT_SUCCESS (0)
#define GW_APP_QUERY_CLCT_RESULT_TASK_NOT_EXIT (1)
#define GW_APP_QUERY_CLCT_RESULT_NO_DATA (2)
#define GW_APP_QUERY_CLCT_RESULT_OTHER (3)
/* module collect parameter task number for gw v2.8 protocol */
#define GW_APP_V28_CLCT_PARAM_TASK_NUM_MAX (7)
#define GW_APP_V28_CLCT_PARAM_TASK_NUM_ALL (0xFF)
/* module collect parameter config result for gw v2.8 protocol */
#define GW_APP_V28_CLCT_PARAM_CFG_SUCCESS (0)
#define GW_APP_V28_CLCT_PARAM_CFG_FAIL (1)
/* sta report minute collection function code for v2.8 */
#define GW_APP_MIN_CLCT_RPT_FN_CFG_SET_REQ (1)
#define GW_APP_MIN_CLCT_RPT_FN_CFG_QUERY_REQ (2)
#define GW_APP_MIN_CLCT_RPT_FN_CFG_QUERY_RESP (3)
#define GW_APP_MIN_CLCT_RPT_FN_DATA_REPORT (4)
#define GW_APP_MIN_CLCT_RPT_FN_DATA_QUERY_REQ (5)
#define GW_APP_MIN_CLCT_RPT_FN_DATA_QUERY_RESP (6)
/* flag of sta report minute collection cfg for v2.8 */
#define GW_APP_MIN_CLCT_RPT_CFG_FLAG_INVALID (0)
#define GW_APP_MIN_CLCT_RPT_CFG_FLAG_VALID (1)
/* respond flag of minute collection cfg */
#define GW_APP_MIN_CLCT_RPT_CFG_NO_NEED_RSP (0)
#define GW_APP_MIN_CLCT_RPT_CFG_NEED_RSP (1)
/* production test cmd function code */
#define GW_APP_PRODUCT_TEST_FN_SET_MAC (0x04)
#define GW_APP_PRODUCT_TEST_FN_QUERY_MAC (0x05)
#define GW_APP_PRODUCT_TEST_FN_QUERY_CHIP_ID (0x16)
#define GW_APP_PRODUCT_TEST_FN_QUERY_MOD_ID (0x2a)
#define GW_APP_PRODUCT_TEST_FN_QUERY_VER (0x2f)
#define GW_APP_PRODUCT_TEST_FN_QUERY_INTER (0x3b)
/* chip info data length for production test cmd */
#define GW_APP_PRODUCT_TEST_CHIP_LEN 24
#define GW_APP_PRODUCT_TEST_MODE_LEN 11
#define GW_APP_PRODUCT_TEST_VER_LEN 2
/* low power meter reading extend data field */
typedef struct _gw_app_meter_r_lp_meter {
/* low power meter type, see GW_APP_LP_METER_TYPE_XXX */
uint8_t lp_meter_type;
/* data */
uint8_t data[0];
} gw_app_meter_r_lp_meter_t;
/* meter reading payload from cco to sta */
typedef struct _gw_app_meter_r_dl {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* timout retry */
timeout_retry :1,
/* nack retry */
nack_retry :1,
/* max retry count */
max_retry :2,
/* data type. see GW_APP_DATA_TYPE_XXX */
data_type :4,
/* data length */
data_len :12;
/* packet sequence */
uint16_t seq;
/* communication time out used by sta while communicating with power meter
* and collector. unit is 100 ms.
*/
uint8_t timeout;
/* options */
uint8_t option;
/* data */
uint8_t data[0];
} gw_app_meter_r_dl_t;
/* meter reading payload from sta to cco */
typedef struct _gw_app_meter_r_ul {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* ack status */
ack_status :4,
/* data type. see GW_APP_DATA_TYPE_XXX */
data_type :4,
/* data length */
data_len :12;
/* packet sequence */
uint16_t seq;
/* options */
uint16_t option;
/* data */
uint8_t data[0];
} gw_app_meter_r_ul_t;
/* start secondary node register payload from cco to sta */
typedef struct _gw_app_start_sec_node_reg {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* force ack flag */
force_ack :1,
/* register parameter */
reg_param :3,
/* reserved for future */
reserved :16;
/* packet sequence */
uint32_t seq;
} gw_app_start_sec_node_reg_t;
/* query secondary node register payload from cco to sta */
typedef struct _gw_app_query_sec_node_reg_dl {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* force ack flag */
force_ack :1,
/* register parameter. see GW_APP_REG_PARAM_XXX */
reg_param :3,
/* reserved for future */
reserved :16;
/* packet sequence */
uint32_t seq;
/* source mac address, big-endian */
uint8_t source_addr[IOT_MAC_ADDR_LEN];
/* destination mac address, big-endian */
uint8_t dest_addr[IOT_MAC_ADDR_LEN];
} gw_app_query_sec_node_reg_dl_t;
/* query whether sec node supports minute collection for jiangsu */
typedef struct _gw_app_qr_storage_dev_type {
/* flag to mark if sec node support minute collection */
uint8_t minute_clct :1,
/* reserved for future */
reserved :7;
} gw_app_qr_storage_dev_type_t;
/* query secondary node register payload from cco to sta */
typedef struct _gw_app_power_meter_info {
/* power meter mac address */
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
/* power meter data type. see GW_APP_DATA_TYPE_XXX */
uint8_t data_type;
/* module type. see GW_APP_DEV_TYPE_XXX */
uint8_t module_type :4,
/* reserved for future */
reserved :4;
} gw_app_power_meter_info_t;
/* query secondary node parameters */
typedef struct _gw_app_sec_node_param {
/* physical phase of the device, bit0-2 means phaseA/B/C, set "1" to
* indicate which phase the device belongs to.
*/
uint16_t phase :3,
/* power meter type 0 is single phase meter 1 is three phase meter,
* this bit replaces the reserved bit.
*/
meter_type :1,
/* flag to mark if L/N reversed in Single-phase power meter or phase
* sequence reversed in Three-phase power meter.
*/
opposite_phase :1,
/* flag to mark if physical phase identification done */
detect_state :1,
/* reserved for further */
rsvd1 :10;
/* reserved for further */
uint8_t rsvd2;
} gw_app_sec_node_param_t;
/* secondary node network unlock cmd contol data for beijing */
typedef struct _gw_app_sec_node_net_unlock_data {
/* delay time, unit is 1min */
uint8_t delay;
/* reserved for further */
uint8_t rsvd[3];
} gw_app_sec_node_net_unlock_data_t;
/* secondary node network lock dl cmd for beijing */
typedef struct _gw_app_sec_node_net_lock_cmd_dl {
/* control type, see GW_APP_SEC_NODE_NW_LOCK_CMD_TYPE_XXX */
uint8_t control_type;
/* control data len */
uint8_t control_data_len;
/* reserved for further */
uint16_t rsvd;
/* contol data */
uint8_t data[0];
} gw_app_sec_node_net_lock_cmd_dl_t;
/* secondary node network lock ul cmd for beijing */
typedef struct _gw_app_sec_node_net_lock_cmd_ul {
/* control type, see GW_APP_SEC_NODE_NW_LOCK_CMD_TYPE_XXX */
uint8_t control_type;
/* control data len */
uint8_t control_data_len;
/* reserved for further */
uint16_t rsvd;
} gw_app_sec_node_net_lock_cmd_ul_t;
/* query secondary node register payload from sta to cco */
typedef struct _gw_app_query_sec_node_reg_ul {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* status */
status :1,
/* register parameter */
reg_param :3,
/* power meter count */
pm_cnt :8,
/* product type. see GW_APP_DEV_TYPE_XXX */
product_type :8;
/* device mac address */
uint8_t dev_addr[IOT_MAC_ADDR_LEN];
/* device ID */
uint8_t dev_id[IOT_MAC_ADDR_LEN];
/* packet sequence */
uint32_t seq;
/* if support minutes collect */
uint32_t clct_min :1,
/* reserved for future */
reserved :31;
/* source mac address, big-endian */
uint8_t source_addr[IOT_MAC_ADDR_LEN];
/* destination mac address, big-endian */
uint8_t dest_addr[IOT_MAC_ADDR_LEN];
/* data */
gw_app_power_meter_info_t pm[0];
} gw_app_query_sec_node_reg_ul_t;
/* stop secondary node register payload from cco to sta */
typedef struct _gw_app_stop_sec_node_reg {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :20;
/* packet sequence */
uint32_t seq;
} gw_app_stop_sec_node_reg_t;
/* correcting time payload from cco to sta */
typedef struct _gw_app_correcting_time {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :8,
/* data length */
data_len :12;
/* data */
uint8_t data[0];
} gw_app_correcting_time_t;
/* correcting time extend payload from cco to sta */
typedef struct _gw_app_correcting_time_ext {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :8,
/* data length */
data_len :12;
/* corresponding cco ntb of the correct time */
uint32_t cco_ntb;
/* data */
uint8_t data[0];
} gw_app_correcting_time_ext_t;
/* accurate correcting time payload from cco to sta */
typedef struct _gw_app_accurate_correct_time {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* data length */
data_len :12,
/* sequence */
seq :8;
/* corresponding cco ntb of the correct time */
uint32_t cco_ntb;
/* data */
uint8_t data[0];
} gw_app_accurate_correct_time_t;
/* time of the clock manager */
typedef struct _gw_app_clock_manager_corr_time {
/* corresponding cco ntb of the correct time */
uint32_t cco_ntb;
/* time stamp, BCD code to represent */
uint8_t sec;
uint8_t min;
uint8_t hour;
uint8_t day;
uint8_t month;
uint8_t year_low_byte;
uint8_t year_high_byte;
} gw_app_clock_manager_corr_time_t;
/* clock manager payload from cco to sta */
typedef struct _gw_app_clock_manager {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
reserved :4;
/* meter addr, little endian */
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
/* cmd type see GW_APP_CLOCK_MANAGER_XXX */
uint8_t cmd_type;
/* data len */
uint8_t data_len;
/* data */
uint8_t data[0];
} gw_app_clock_manager_t;
/* clock query payload from cco to sta */
typedef struct _gw_app_clock_query_dl {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
reserved1 :4;
/* meter addr, little endian */
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
/* reserved */
uint8_t reserved2;
} gw_app_clock_query_dl_t;
/* clock query payload from sta to cco */
typedef struct _gw_app_clock_query_ul {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
reserved1 :4;
/* meter addr, little endian */
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
/* switch of auto correct time */
uint8_t auto_corr_switch;
/* reserved */
uint8_t reserved2;
/* correct time threshold */
uint8_t corr_threshold;
} gw_app_clock_query_ul_t;
/* abnormal electric current enable reply for neutralwire and livewire */
typedef struct _gw_app_nli_abnormal_enable_cmd_read_reply {
/* enable flag, 0 - disabled, 1 - enable */
uint8_t enable;
} gw_app_nli_abnormal_enable_cmd_read_reply_t;
/* abnormal electric current configuration for neutralwire and livewire */
typedef struct _gw_app_nli_abnormal_cfg_cmd {
/* configuration enable flag , 0 - disabled, 1 - enable */
uint8_t enable;
} gw_app_nli_abnormal_cfg_cmd_t;
/* abnormal electric current configuration reply for neutralwire and livewire */
typedef struct _gw_app_nli_abnormal_cfg_cmd_reply {
/* configuration result , 0 - success, 1 - fail */
uint8_t result;
} gw_app_nli_abnormal_cfg_cmd_reply_t;
/* abnormal electric current enable command for neutralwire and livewire */
typedef struct _gw_app_nli_abnormal_enable_cmd {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag */
dir :1,
/* start flag */
start :1,
/* reserved */
rsvd :2;
/* packet sequence */
uint16_t seq;
/* source mac address, it's cco addr in down link,
* it's sta addr in up link, little endian.
*/
uint8_t src_addr[IOT_MAC_ADDR_LEN];
/* command type, see GW_APP_ABNORMAL_NLI_CMD_XXX */
uint8_t cmd_type;
/* data length */
uint8_t data_len;
/* data */
uint8_t data[0];
} gw_app_nli_abnormal_enable_cmd_t;
/* event report payload between cco and sta */
typedef struct _gw_app_event_report {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* direction flag */
dir :1,
/* start flag */
start :1,
/* function code. see GW_APP_EVENT_FN_XXX */
fn :6,
/* data length */
data_len :12;
/* packet sequence */
uint16_t seq;
/* power meter mac address */
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
/* data */
uint8_t data[0];
} gw_app_event_report_t;
/* abnormal electric current data for neutralwire and livewire */
typedef struct _gw_app_nli_abnormal_data {
/* power meter address, little endian */
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
/* phase electric current */
uint8_t phase_electric[GW_APP_ELECTRIC_CURRENT_LEN];
/* neutralwire electric current */
uint8_t neutralwire_electric[GW_APP_ELECTRIC_CURRENT_LEN];
/* electric current for neutralwire and livewire */
uint8_t nl_electric[GW_APP_ELECTRIC_CURRENT_LEN];
/* abnormal time, bcd format */
uint8_t time[GW_APP_ABNORMAL_TIME_DATA_LEN];
} gw_app_nli_abnormal_data_t;
/* event report abnormal electric current data for neutralwire and livewire */
typedef struct _gw_app_event_nli_abnormal_data {
/* report cnt */
uint16_t rpt_cnt;
/* abnormal data for neutralwire and livewire */
gw_app_nli_abnormal_data_t nl_data[0];
} gw_app_event_nli_abnormal_data_t;
/* event data field */
typedef struct _gw_app_evt_data_field {
/* event type, see GW_APP_EVENT_TYPE_XXX */
uint8_t evt_type;
/* data */
uint8_t data[0];
} gw_app_evt_data_field_t;
/* bitmap type for event data field */
typedef struct _gw_app_evt_data_bitmap {
/* the tei of the start bit in the bitmap */
uint16_t tei;
/* tei map */
uint8_t map[0];
} gw_app_evt_data_bitmap_t;
/* power meter info for power event report */
typedef struct _gw_app_power_evt_pm_info {
/* power meter mac address */
uint8_t mac[IOT_MAC_ADDR_LEN];
/* 0 - power off, 1- power on */
uint8_t power_state;
} gw_app_power_evt_pm_info_t;
/* addr type for event data field */
typedef struct _gw_app_evt_data_addr {
/* power meter count */
uint16_t pm_count;
/* power meter info */
gw_app_power_evt_pm_info_t pm_info[0];
} gw_app_evt_data_addr_t;
/* phase sequence type for event data field */
typedef struct _gw_app_phase_seq_info {
/* three phase meter addr */
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
/* phase sequence status, see GW_APP_PHASE_SEQUENCE_STAUS_XXX */
uint8_t phase_seq_status;
} gw_app_phase_seq_info_t;
/* meter info for search pm result event report */
typedef struct _gw_app_search_pm_info {
/* meter mac address, little-endian */
uint8_t mac[IOT_MAC_ADDR_LEN];
/* pm protocol type, see PROTO_TYPE_XXX */
uint8_t proto_type;
} gw_app_search_pm_info_t;
/* search pm result for event data field */
typedef struct _gw_app_evt_search_data {
/* collector or pm moudle mac, little-endian */
uint8_t dev_mac[IOT_MAC_ADDR_LEN];
/* power meter count */
uint8_t pm_count;
/* search meter result info */
gw_app_search_pm_info_t pm_info[0];
} gw_app_evt_search_data_t;
/* ping test payload from cco to sta */
typedef struct _gw_app_comm_test {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :4,
/* data type. see see GW_APP_DATA_TYPE_XXX */
data_type :4,
/* data length */
data_len :12;
/* data */
uint8_t data[0];
} gw_app_comm_test_t;
/* ctrl proto payload */
typedef struct _gw_app_ctrl_proto {
/* protocol type, see GW_APP_CTRL_PROTO_XXX */
uint8_t proto_type;
/* data length */
uint16_t data_len;
/* data */
uint8_t data[0];
} gw_app_ctrl_proto_t;
/* ctrl passthrough proto payload */
typedef struct _gw_app_ctrl_proto_passthrough {
/* passthrough data protocol type, see GW_APP_CTRL_PROTO_XXX */
uint8_t proto_type;
/* primary request message flag, see GW_APP_CTRL_PRM_XXX */
uint8_t prm : 1,
/* reserve1 for future */
rsvd1: 7;
/* baudrate: small endian */
uint8_t baud[4];
/* reserve2 for future */
uint32_t rsvd2;
/* data length */
uint16_t data_len;
/* data */
uint8_t data[0];
} gw_app_ctrl_proto_passthrough_t;
/* ack and nack payload between cco and sta */
typedef struct _gw_app_ack_nack {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag */
dir :1,
/* ack flag */
ack :1,
/* reserved for future */
reserved :2;
/* packet sequence */
uint16_t seq;
/* options */
uint16_t option;
} gw_app_ack_nack_t;
/* start upgrade payload from cco to sta */
typedef struct _gw_app_start_upgrade_dl {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :20;
/* upgrade id */
uint32_t id;
/* upgrade time window. uint is 1 minute */
uint16_t window;
/* upgrade block size. see GW_APP_UPGRADE_BLOCK_XXX */
uint16_t block_size;
/* upgrade file size */
uint32_t file_size;
/* file crc */
uint32_t file_crc;
} gw_app_start_upgrade_dl_t;
/* start upgrade payload from sta to cco */
typedef struct _gw_app_start_upgrade_ul {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :12,
/* start upgrade result code. 0 for success, non zero for failure case */
result :8;
/* upgrade id */
uint32_t id;
} gw_app_start_upgrade_ul_t;
/* stop upgrade payload from cco to sta */
typedef struct _gw_app_stop_upgrade {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :20;
/* upgrade id */
uint32_t id;
} gw_app_stop_upgrade_t;
/* transfer file payload from cco to sta */
typedef struct _gw_app_transfer_file {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :4;
/* block size */
uint16_t size;
/* upgrade id */
uint32_t id;
/* block sequence */
uint32_t seq;
/* data */
uint8_t data[0];
} gw_app_transfer_file_t;
/* query upgrade payload from cco to sta */
typedef struct _gw_app_query_upgrade_status_dl {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :4;
/* number of consecutive blocks to be queried. 0xFFFF means all blocks.
* see GW_APP_UPGRADE_QUERY_ALL_BLOCK.
*/
uint16_t cnt;
/* sequence of first block to be queried */
uint32_t start_seq;
/* upgrade id */
uint32_t id;
} gw_app_query_upgrade_status_dl_t;
/* query upgrade payload from sta to cco */
typedef struct _gw_app_query_upgrade_status_ul {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* upgrade status. See GW_APP_UPGRADE_QUERY_TRANSFER_XXX */
status :4;
/* number of available blocks */
uint16_t cnt;
/* sequence of first block to be queried */
uint32_t start_seq;
/* upgrade id */
uint32_t id;
/* bitmap to show blocks received */
uint8_t bm[0];
} gw_app_query_upgrade_status_ul_t;
/* execute upgrade payload from cco to sta */
typedef struct _gw_app_execute_upgrade {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :4;
/* wait for reset duration */
uint16_t reset_dur;
/* upgrade id */
uint32_t id;
/* trial run duration */
uint32_t trial_run_dur;
} gw_app_execute_upgrade_t;
/* query station payload from cco to sta */
typedef struct _gw_app_query_station_dl {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :12,
/* number of id in the info element id list */
cnt :8;
/* info element id list. see GW_APP_STA_INFO_ID_XXX */
uint8_t id[0];
} gw_app_query_station_dl_t;
/* station information element */
typedef struct _gw_app_sta_info_element {
/* info element id. see GW_APP_STA_INFO_ID_XXX */
uint8_t id;
/* data length */
uint8_t len;
/* data */
uint8_t data[0];
} gw_app_sta_info_element_t;
/* query station payload from sta to cco */
typedef struct _gw_app_query_station_ul {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :12,
/* number of element in the info element list */
cnt :8;
/* upgrade id */
uint32_t id;
/* info element list. see gw_app_sta_info_element_t. */
uint8_t data[0];
} gw_app_query_station_ul_t;
/* transformer detect package */
typedef struct _gw_app_tsfm_detect {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag, 0 - downlink, 1 - uplink */
dir :1,
/* start flag, 0 - from slave, 1 - from master */
start :1,
/* collect phase, see GW_APP_DATA_PHASE_XXX. */
phase :2;
/* packet sequence */
uint16_t seq;
/* cco mac address or sta mac address, big-endian */
uint8_t addr[IOT_MAC_ADDR_LEN];
/* transformer feature type, see GW_APP_TSFM_FEATURE_XXX */
uint8_t feature_type;
/* transformer feature collection type, see GW_APP_TSFM_COLLECT_XXX */
uint8_t collect_type;
/* data */
uint8_t data[0];
} gw_app_tsfm_detect_t;
/* transformer feature collection snr request */
typedef struct _gw_app_tsfm_collect_snr_req {
/* start index */
uint16_t index;
/* count */
uint8_t cnt;
} gw_app_tsfm_collect_snr_req_t;
/* sta neighbor node info uint structure */
typedef struct _gw_app_neighbor_node_info {
/* neighbor node tei */
uint16_t tei;
/* neighbor node mac address, big-endian */
uint8_t mac[IOT_MAC_ADDR_LEN];
/* snr between neighbor node and local node */
int8_t snr;
} gw_app_neighbor_node_info_t;
/* transformer feature collection snr resp */
typedef struct _gw_app_tsfm_collect_snr_resp {
/* NTB at the start of the first collection */
uint32_t start_ntb;
/* neighbor node total cnt */
uint16_t total_cnt;
/* start index */
uint16_t index;
/* resp count */
uint8_t resp_cnt;
/* neighbor node info */
gw_app_neighbor_node_info_t node_info[0];
} gw_app_tsfm_collect_snr_resp_t;
/* transformer feature collection type package.
* GW_APP_TSFM_COLLECT_START package
*/
typedef struct _gw_app_tsfm_collect_start {
/* NTB at the start of the whole network collection */
uint32_t start_ntb;
/* collection interval, uint is 1s. when transformer
* feature type is GW_APP_TSFM_FEATURE_PERIOD, interval
* is invalid.
*/
uint8_t interval;
/* collection cnt */
uint8_t cnt;
/* collection sequence, the sequence is generated by CCO
* the value range of sequence is 1-255.
*/
uint8_t seq;
/* reserve for future */
uint8_t rsvd;
} gw_app_tsfm_collect_start_t;
/* transformer feature collection type package.
* GW_APP_TSFM_COLLECT_REPORT package
*/
typedef struct _gw_app_tsfm_collect_report {
/* tei of cco or sta */
uint16_t tei :12,
/* collect type, see GW_APP_TSFM_COLLECT_TYPE_XXX.
* valid only in the GW_APP_TSFM_FEATURE_PERIOD.
*/
clct_type :2,
/* reserved for future */
rsvd :2;
/* collection sequence, the sequence is generated by CCO
* the value range of sequence is 1-255.
*/
uint8_t seq;
/* report feature total cnt */
uint8_t cnt;
/* transformer feature collection data */
uint8_t data[0];
} gw_app_tsfm_collect_report_t;
/* transformer feature collection data */
typedef struct _gw_app_tsfm_collect_data {
/* NTB at the start of the first collection */
uint32_t start_ntb;
/* reserved for future */
uint8_t rsvd;
/* phase a report count */
uint8_t phase1_cnt;
/* phase b report count */
uint8_t phase2_cnt;
/* phase c report count */
uint8_t phase3_cnt;
/* feature data */
int16_t data[0];
} gw_app_tsfm_collect_data_t;
/* transformer detection feature type package.
* GW_APP_TSFM_FEATURE_VOLTAGE package
*/
typedef struct _gw_app_tsfm_collect_v {
/* A phase voltage. use 2 bytes of BCD code to represent the voltage.
* for example, 220.0V uses 2 bytes of BCD code to represent
* the following 0x22, 0x00.
*/
uint8_t bcd[PROTO_645_V_LEN];
} gw_app_tsfm_collect_v_t;
/* transformer detection feature type package.
* GW_APP_TSFM_FEATURE_FREQUENCY package
*/
typedef struct _gw_app_tsfm_collect_freq {
/* frequency. use 2 bytes of BCD code to represent the frequency.
* for example, 50.00V uses 2 bytes of BCD code to represent
* the following 0x50, 0x00.
*/
uint8_t bcd[PROTO_645_FREQ_LEN];
} gw_app_tsfm_collect_freq_t;
/* transformer detection feature type package.
* GW_APP_TSFM_FEATURE_PERIOD package
*/
typedef struct _gw_app_tsfm_collect_period {
/* Each period value represents the difference
* between a zero-crossing period and 20ms.
* unit is 1/3125000S (the 8-minute frequency
* of the counting frequency is 25MHz, that is
* 3.125 MHz).
*/
int16_t period;
} gw_app_tsfm_collect_period_t;
/* transformer detection feature type package.
* GW_APP_TSFM_FEATURE_POWER_FACTOR package
*/
typedef struct _gw_app_tsfm_collect_pf {
/* A phase power factor.use 2 bytes of BCD code to represent the power
* factor. for example, 0.999 uses 2 bytes of BCD code to represent
* the following 0x09, 0x99. */
uint8_t bcd[PROTO_645_07_PF_LEN];
} gw_app_tsfm_collect_pf_t;
/* transformer detection feature type package.
* GW_APP_TSFM_FEATURE_CURRENT package
*/
typedef struct _gw_app_tsfm_collect_a {
/* A phase current.use 3 bytes of BCD code to represent the current.
* for example, 123.456A uses 3 bytes of BCD code to represent
* the following 0x12, 0x34, 0x56. */
uint8_t bcd[PROTO_645_07_A_LEN];
} gw_app_tsfm_collect_a_t;
/* transformer detect result */
typedef struct _gw_app_tsfm_detect_result {
/* node tei */
uint16_t tei;
/* 0 - transformer detect in progress, 1 - transformer detect done */
uint8_t done;
/* see GW_APP_TSFM_DETECT_RET_XXX */
uint8_t result;
/* real transformer mac address, big-endian */
uint8_t tsfm_addr[IOT_MAC_ADDR_LEN];
} gw_app_tsfm_detect_result_t;
/* private protocol transformer detect result down-link */
typedef struct _gw_app_tsfm_detect_result_pw_dl {
/* sn required to be reported, range of sn is 1-31 */
uint8_t sn;
} gw_app_tsfm_detect_result_pw_dl_t;
/* private protocol node info data */
typedef struct _gw_app_tsfm_node_info_pw {
/* node address, little-endian */
uint8_t addr[IOT_MAC_ADDR_LEN];
/* reserve for future */
uint8_t reserve1;
/* node protocol type, see GW_APP_DATA_TYPE_XXX */
uint8_t pro_type : 4,
/* node device type, see GW_APP_ID_INFO_DEV_TYPE_XXX */
dev_type : 4;
/* reserve for future */
uint8_t reserve2;
} gw_app_tsfm_node_info_pw_t;
/* private protocol transformer detect result up-link */
typedef struct _gw_app_tsfm_detect_result_pw_ul {
/* node tei */
uint16_t tei;
/* 0 - transformer detect in progress, 1 - transformer detect done */
uint8_t done : 2,
/* follow data of flag. 1 - there is follow-up data.
* 0 - there is no follow-up data.
*/
flw_flag : 1,
/* rpt sn, range of sn is 1-31 */
sn : 5;
/* see GW_APP_TSFM_DETECT_RET_XXX */
uint8_t result : 2,
/* number of nodes of same tsfm found by the device */
node_cnt : 6;
/* real transformer mac address, big-endian */
uint8_t tsfm_addr[IOT_MAC_ADDR_LEN];
/* hardware transformer mac address, big-endian */
uint8_t hw_tsfm_addr[IOT_MAC_ADDR_LEN];
/* node info data */
gw_app_tsfm_node_info_pw_t node[0];
} gw_app_tsfm_detect_result_pw_ul_t;
typedef struct _gw_app_tsfm_detect_set_tsfm_addr {
/* transformer address, big endian */
uint8_t tsfm_addr[IOT_MAC_ADDR_LEN];
/* reserved */
uint16_t rsvd;
} gw_app_tsfm_detect_set_tsfm_addr_t;
/* query module id information from sta */
typedef struct _gw_app_query_module_id_dl {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag, 0 - downlink, 1 - uplink */
dir :1,
/* id type, see GW_APP_ID_INFO_TYPE_xxx */
id_type :3;
/* packet sequence */
uint16_t seq;
} gw_app_query_module_id_dl_t;
/* report module id information to cco, hunan province extend protocol */
typedef struct _gw_app_query_module_id_ul_hn {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag, 0 - downlink, 1 - uplink */
dir :1,
/* reserved for future. */
rsvd :3;
/* packet sequence */
uint16_t seq;
/* module id length */
uint8_t module_id_len;
/* module id information */
uint8_t module_info[GW_APP_MODULE_ID_INFO_LEN];
} gw_app_query_module_id_ul_hn_t;
/* report module id information to cco */
typedef struct _gw_app_query_module_id_ul {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag, 0 - downlink, 1 - uplink */
dir :1,
/* id type, see GW_APP_ID_INFO_TYPE_xxx */
id_type :3;
/* packet sequence */
uint16_t seq;
/* module id length */
uint8_t module_id_len;
/* module id information */
uint8_t module_info[GW_APP_MODULE_ID_INFO_LEN];
/* device type, see GW_APP_ID_INFO_DEV_TYPE_xxx */
uint8_t dev_type;
} gw_app_query_module_id_ul_t;
/* report chip id information to cco */
typedef struct _gw_app_query_chip_id_ul {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag, 0 - downlink, 1 - uplink */
dir :1,
/* id type, see GW_APP_ID_INFO_TYPE_xxx */
id_type :3;
/* packet sequence */
uint16_t seq;
/* chip id length */
uint8_t chip_id_len;
/* chip id information */
uint8_t chip_info[GW_APP_CHIP_ID_INFO_LEN];
/* device type, see GW_APP_ID_INFO_DEV_TYPE_xxx */
uint8_t dev_type;
} gw_app_query_chip_id_ul_t;
/* query vendor specific information from sta */
typedef struct _gw_app_query_vendor_info_dl {
/* protocol version */
uint16_t ver : 6,
/* header length */
header_len : 6,
/* direction flag, 0 - downlink, 1 - uplink */
dir : 1,
/* reserved */
rsvd : 3;
/* packet sequence */
uint16_t seq;
/* info type, see GW_APP_VENDOR_INFO_TYPE_XXX */
uint8_t info_type;
/* length of data */
uint16_t data_len;
/* data specific info to be queried. it's optional. */
uint8_t data[0];
} gw_app_query_vendor_info_dl_t;
/* report queried vendor specific information to CCo. */
typedef struct _gw_app_query_vendor_info_ul {
/* protocol version */
uint16_t ver : 6,
/* header length */
header_len : 6,
/* direction flag, 0 - downlink, 1 - uplink */
dir : 1,
/* reserved */
rsvd : 3;
/* packet sequence */
uint16_t seq;
/* info type, see GW_APP_VENDOR_INFO_TYPE_XXX */
uint8_t info_type;
/* length of data */
uint16_t data_len;
/* data with queried information */
uint8_t data[0];
} gw_app_query_vendor_info_ul_t;
/* sta correct time */
typedef struct _gw_app_sta_correct_time {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
rsvd :4;
/* packet sequence */
uint16_t rsvd1 :4,
/* data len */
data_len :12;
/* data */
uint8_t data[0];
} gw_app_sta_correct_time_t;
/* query meter parameter from sta */
typedef struct _gw_app_query_meter_param_dl {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
rsvd :4;
/* packet sequence */
uint32_t seq;
/* source mac address, big-endian */
uint8_t src_addr[IOT_MAC_ADDR_LEN];
/* destination mac address, big-endian */
uint8_t dest_addr[IOT_MAC_ADDR_LEN];
} gw_app_query_meter_param_dl_t;
/* report meter parameter to cco */
typedef struct _gw_app_query_meter_param_ul {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
rsvd :4;
/* packet sequence */
uint32_t seq;
/* source mac address, big-endian */
uint8_t src_addr[IOT_MAC_ADDR_LEN];
/* destination mac address, big-endian */
uint8_t dest_addr[IOT_MAC_ADDR_LEN];
/* power meter type, see GW_APP_PM_TYPE_XXX */
uint8_t pm_type :4,
/* zc type, see GW_APP_ZC_TYPE_XXX */
zc_type :4;
/* reserved */
uint8_t rsvd1[4];
} gw_app_query_meter_param_ul_t;
/* set module collect parameter */
typedef struct _gw_app_set_module_clct_param_dl {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
rsvd :4;
/* packet sequence */
uint32_t seq;
/* source mac address, big-endian */
uint8_t src_addr[IOT_MAC_ADDR_LEN];
/* destination mac address, big-endian */
uint8_t dest_addr[IOT_MAC_ADDR_LEN];
/* reserved */
uint16_t rsvd1 :4,
/* data len */
data_len :12;
/* data */
uint8_t data[0];
} gw_app_set_module_clct_param_dl_t;
/* di and result length */
typedef struct _gw_app_di_info {
/* di */
uint32_t di;
/* meter reading result length */
uint8_t di_result_len;
} gw_app_di_info_t;
/* set module collect parameter for v2.8 */
typedef struct _gw_app_set_module_clct_param_dl_v28 {
/* protocol version */
uint16_t ver : 6,
/* header length */
header_len : 6,
/* reserved */
rsvd : 4;
/* packet sequence */
uint32_t seq;
/* destination mac address, big-endian */
uint8_t dest_addr[IOT_MAC_ADDR_LEN];
/* task number 0 ~ 7, 0xFF is all tasks.
* see GW_APP_V28_CLCT_PARAM_TASK_NUM_XXX
*/
uint8_t task_num;
/* 0 - disabled, 1 - enabled */
uint8_t enabled : 1,
/* 2 - DL/T645-2007, 3 - DL/T 698.45, otherwise - reserved */
proto_type : 3,
/* 0 - single phase meter, 1 - three phase meter */
pm_type : 2,
/* reserved */
rsvd1 : 2;
/* unit is 1min, see GW_APP_CURVE_COLLECT_PERIOD_XXX */
uint8_t clct_period;
/* di count */
uint8_t di_cnt;
/* di information */
gw_app_di_info_t di_info[0];
} gw_app_set_module_clct_param_dl_v28_t;
typedef struct _gw_app_meter_clct_param {
/* 0 - single phase meter, 1 - three phase meter */
uint8_t pm_type;
/* di count of single phase meter */
uint8_t di_cnt;
/* di result total length of single phase meter */
uint8_t di_result_len;
/* di information of single phase meter */
gw_app_di_info_t di_info[0];
} gw_app_meter_clct_param_t;
/* sta collect parameter */
typedef struct _gw_app_module_clct_param {
/* 0 - disabled, 1 - enabled */
uint8_t enabled;
/* unit is 1min, see GW_APP_CURVE_COLLECT_PERIOD_XXX */
uint8_t clct_period;
/* 2 - DL/T645-2007, otherwise - reserved */
uint8_t proto_type;
/* collect parameter */
//gw_app_meter_clct_param_t clct_param[0];
} gw_app_module_clct_param_t;
/* report module collect parameter config */
typedef struct _gw_app_set_module_clct_param_ul {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
rsvd :4;
/* packet sequence */
uint32_t seq;
/* source mac address, big-endian */
uint8_t src_addr[IOT_MAC_ADDR_LEN];
/* destination mac address, big-endian */
uint8_t dest_addr[IOT_MAC_ADDR_LEN];
/* 0 - success, 1 - fail */
uint8_t result;
/* reserved */
uint16_t rsvd1;
} gw_app_set_module_clct_param_ul_t;
/* report module collect parameter config for v2.8 */
typedef struct _gw_app_set_module_clct_param_ul_v28 {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
rsvd :4;
/* packet sequence */
uint32_t seq;
/* source mac address, big-endian */
uint8_t src_addr[IOT_MAC_ADDR_LEN];
/* task number 0 ~ 7, 0xFF is all tasks,
* see GW_APP_V28_CLCT_PARAM_TASK_NUM_XXX.
*/
uint8_t task_num;
/* 0 - disabled, 1 - enabled */
uint8_t enabled :1,
/* configuration result , 0 - success, 1 - fail,
* see GW_APP_V28_CLCT_PARAM_CFG_XXX.
*/
result :1,
/* reserved */
rsvd1 :6;
} gw_app_set_module_clct_param_ul_v28_t;
/* query module collect data dl for v2.8 */
typedef struct _gw_app_query_module_clct_data_dl_v28 {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag, 0 - downlink, 1 - uplink */
dir :1,
/* reserved */
rsvd :3;
/* packet sequence */
uint32_t seq;
/* 2 - DL/T645-2007, 3 - DL/T 698.45, otherwise - reserved */
uint8_t proto_type :4,
/* 0 - single phase meter, 1 - three phase meter */
pm_type :1,
/* reserved */
rsvd1 :3;
/* destination mac address, big-endian */
uint8_t dest_addr[IOT_MAC_ADDR_LEN];
/* task number 0 ~ 7, 0xFF is all tasks,
* see GW_APP_V28_CLCT_PARAM_TASK_NUM_XXX.
*/
uint8_t task_num;
/* time stamp, BCD code to represent */
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t min;
uint8_t sec;
} gw_app_query_module_clct_data_dl_v28_t;
/* query module collect data ul for v2.8 */
typedef struct _gw_app_query_module_clct_data_ul_v28 {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag, 0 - downlink, 1 - uplink */
dir :1,
/* reserved */
rsvd :3;
/* packet sequence */
uint32_t seq;
/* 2 - DL/T645-2007, 3 - DL/T 698.45, otherwise - reserved */
uint8_t proto_type :4,
/* 0 - single phase meter, 1 - three phase meter */
pm_type :1,
/* query result, see GW_APP_QUERY_CLCT_RESULT_xxx */
result :3;
/* source mac address, big-endian */
uint8_t src_addr[IOT_MAC_ADDR_LEN];
/* task number 0 ~ 7, 0xFF is all tasks,
* see GW_APP_V28_CLCT_PARAM_TASK_NUM_XXX.
*/
uint8_t task_num;
/* time stamp, BCD code to represent */
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t min;
uint8_t sec;
/* respond di count */
uint8_t di_cnt_rsp;
/* respond di data len */
uint16_t di_data_len;
/* respond di data */
uint8_t di_data[0];
} gw_app_query_module_clct_data_ul_v28_t;
/* query ID information request message layout */
typedef struct _gw_app_query_id_info_dl {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* direction flag, 0 - downlink, 1 - uplink */
dir :1,
/* id type, see GW_APP_ID_INFO_TYPE_xxx */
id_type :3;
/* packet sequence */
uint16_t seq;
} gw_app_query_id_info_dl_t;
/* report id information message header layout */
typedef struct _gw_app_query_id_info_ul_hdr {
/* version */
uint16_t ver :6,
/* header length */
header_len :6,
/* dir flag, 0 - downlink, 1 - uplink */
dir :1,
/* id type, see GW_APP_ID_INFO_TYPE_xxx */
id_type :3;
/* packet sequence */
uint16_t seq;
/* id info length */
uint8_t id_len;
/* id info payload */
uint8_t id[0];
} gw_app_query_id_info_ul_hdr_t;
/* report id information message tail layout */
typedef struct _gw_app_query_id_info_ul_tail {
/* device type, see PLC_DEV_TYPE_XXX */
uint8_t dev_type;
} gw_app_query_id_info_ul_tail_t;
/* query low power secondary node register dev type data field */
typedef struct _gw_app_lp_meter_query_dev_type {
/* low power dev type, see GW_APP_LP_DEV_TYPE_XXX */
uint8_t dev_type :4,
/* reserved */
reserved :4;
} gw_app_lp_meter_query_dev_type_t;
/* low power meter rssi data */
typedef struct _gw_app_lp_meter_rssi_info {
/* low power meter mac address, little-endian */
uint8_t pm_addr[IOT_MAC_ADDR_LEN];
/* low power meter mac address high byte */
uint8_t high_addr;
/* rssi data */
uint8_t rssi;
} gw_app_lp_meter_rssi_info_t;
/* query low power meter rssi info up link */
typedef struct _gw_app_lp_meter_query_rssi_ul {
/* total count of low power meter */
uint16_t total_node_cnt;
/* current reported count of low power meter */
uint8_t ack_count;
/* low power meter rssi information */
gw_app_lp_meter_rssi_info_t rssi_info[0];
} gw_app_lp_meter_query_rssi_ul_t;
/* query low power meter rssi info down link */
typedef struct _gw_app_lp_meter_query_rssi_dl {
/* query start index */
uint16_t start_index;
/* query count */
uint8_t cnt;
} gw_app_lp_meter_query_rssi_dl_t;
/* query low power meter data */
typedef struct _gw_app_lp_meter_data {
/* query lp meter cmd type, see GW_APP_LP_METER_CMD_XXX */
uint8_t cmd_type :4,
/* reserved */
reserved :4;
/* data */
uint8_t data[0];
} gw_app_lp_meter_data_t;
/* bcast query low power meter */
typedef struct _gw_app_lp_meter_bcast_qr {
/* bcast sn */
uint8_t bcast_sn;
/* sta count */
uint16_t sta_cnt;
/* low power meter count */
uint16_t lp_meter_cnt;
/* rssi threshold value */
uint8_t rssi;
/* bitmap size */
uint16_t bm_size;
/* sec node bitmap */
uint8_t bm[0];
} gw_app_lp_meter_bcast_qr_t;
/* query low power meter info from cco to sta */
typedef struct _gw_app_lp_meter_query_data_dl {
/* start sequence */
uint16_t start_seq;
/* query low power meter count */
uint8_t count;
} gw_app_lp_meter_query_data_dl_t;
/* low power meter report 188 proto data */
typedef struct _gw_app_lp_meter_mr_data {
/* low power meter mac addr, little endian */
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
/* CJ-T_188-2004 proto data length */
uint16_t data_len;
/* CJ-T_188-2004 proto data */
uint8_t data[0];
} gw_app_lp_meter_mr_data_t;
typedef struct _gw_app_lp_meter_info_rpt {
/* low power meter total count */
uint16_t total_cnt;
/* report low power meter count */
uint8_t rpt_cnt;
/* gw_app_lp_meter_mr_data_t */
uint8_t data[0];
} gw_app_lp_meter_info_rpt_t;
typedef struct _gw_app_lock_time_data {
/* net lock time, uint is 1min.
* 0 means no lock.
*/
uint16_t net_lock_time;
/* the lock time of abnormal leave net, uint is 1min.
* 0 means no lock.
*/
uint16_t abn_lock_time;
} gw_app_lock_time_data_t;
typedef struct _gw_app_lock_time_hdr {
/* version */
uint32_t ver :6,
/* header length, except length of fn */
header_len :6,
/* packet sequence */
seq :8,
/* data lenght, include length of fn */
data_len :12;
/* fn, see GW_APP_LOCK_TIME_FN_XXX */
uint8_t fn;
/* payload data. only fn is GW_APP_LOCK_TIME_FN_SET, data is valid */
uint8_t data[0];
} gw_app_lock_time_hdr_t;
/* rtc time struct */
typedef struct _gw_app_rtc_time {
/* time stamp, BCD code to represent */
uint8_t sec;
uint8_t min;
uint8_t hour;
uint8_t day;
uint8_t month;
uint8_t year;
} gw_app_rtc_time_t;
typedef struct _gw_app_rtc_timer_sync_dl {
/* version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
rsvd :4;
/* rtc time, little endian */
gw_app_rtc_time_t rtc_time;
/* NTB time, unit is 1NTB */
uint32_t ntb_time;
} gw_app_rtc_timer_sync_dl_t;
typedef struct _gw_app_sta_join_check_data {
/* sta join certification state, 0 - disabled, 1 - enable */
uint8_t check_enable;
} gw_app_sta_join_check_data_t;
typedef struct _gw_app_sta_join_check_hdr {
/* version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved */
rsvd :4;
/* packet sequence */
uint16_t seq;
/* certification data */
uint8_t data[0];
} gw_app_sta_join_check_hdr_t;
/* minute collect report function header */
typedef struct _gw_app_min_clct_rpt_hdr {
/* protocol version */
uint32_t ver :6,
/* header length */
header_len :6,
/* flag of response, 0 mean no ack, 1 mean ack/nack */
flag_resp :4,
/* data type. see GW_APP_DATA_TYPE_XXX */
data_type :4,
/* data length */
data_len :12;
/* packet sequence */
uint16_t seq;
/* funtion code, see GW_APP_MIN_CLCT_RPT_FN_XXX */
uint16_t fn;
/* data */
uint8_t data[0];
} gw_app_min_clct_rpt_hdr;
/* minute collect report function set configuration */
typedef struct _gw_app_min_clct_rpt_cfg_info {
/* dst address, little-endian */
uint8_t addr[IOT_MAC_ADDR_LEN];
/* collection interval, unit is 1 minute */
uint8_t interval;
/* flag of cfg, see GW_APP_MIN_CLCT_RPT_CFG_FLAG_XXX */
uint8_t flag;
/* proto data type. see GW_APP_DATA_TYPE_XXX */
uint8_t data_type;
/* master di, master di is 698 protocol frozen data di */
uint32_t m_di;
/* secondary di cnt */
uint8_t cnt;
/* secondary di, secondary di is 698 protocol data di */
uint32_t s_di[0];
} gw_app_min_clct_rpt_cfg_info;
/* minute collect report function report data structure */
typedef struct _gw_app_min_clct_rpt_data {
/* proto data type. GW_APP_DATA_TYPE_69845 */
uint8_t data_type;
/* reserved */
uint8_t rsvd;
/* length from cnt to data */
uint16_t len;
/* report msg cnt */
uint8_t cnt;
/* report data */
uint8_t data[0];
} gw_app_min_clct_rpt_data;
/* minute collect report function query data req/resp structure */
typedef struct _gw_app_min_clct_rpt_query_req_resp {
/* proto data type. GW_APP_DATA_TYPE_69845 */
uint8_t data_type;
/* reserved */
uint8_t rsvd;
/* data length */
uint16_t len;
/* data */
uint8_t data[0];
} gw_app_min_clct_rpt_query_req_resp;
/* production test cmd structure, for GW_APP_ID_PRODUCTION_TEST */
typedef struct _gw_app_production_test {
/* protocol version */
uint16_t ver :6,
/* header length */
header_len :6,
/* reserved for future */
reserved :4;
/* function code */
uint8_t fn;
/* data length */
uint16_t data_len;
/* sequence */
uint16_t seq;
/* data */
uint8_t data[0];
} gw_app_production_test_t;
/* node address and mac address structure for production test cmd */
typedef struct _gw_app_product_test_mac_addr {
/* node address, little-endian */
uint8_t node_addr[IOT_MAC_ADDR_LEN];
/* mac address, big-endian */
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
} gw_app_product_test_mac_addr_t;
/* chip id info structure for production test cmd */
typedef struct _gw_app_product_test_chip_info {
/* node address, little-endian */
uint8_t node_addr[IOT_MAC_ADDR_LEN];
/* device type, see IOT_PLC_DEV_TYPE_XXX */
uint8_t dev_type;
/* chip info */
uint8_t info[GW_APP_PRODUCT_TEST_CHIP_LEN];
/* chip version */
uint8_t chip_ver[GW_APP_PRODUCT_TEST_VER_LEN];
} gw_app_product_test_chip_info_t;
/* module id info structure for production test cmd */
typedef struct _gw_app_product_test_mod_info {
/* node address, little-endian */
uint8_t node_addr[IOT_MAC_ADDR_LEN];
/* module info length */
uint8_t len;
/* mode info */
uint8_t info[GW_APP_PRODUCT_TEST_MODE_LEN];
} gw_app_product_test_mod_info_t;
/* version info structure for production test cmd */
typedef struct _gw_app_product_test_ver_info {
/* node address, little-endian */
uint8_t node_addr[IOT_MAC_ADDR_LEN];
/* version */
uint8_t ver[GW_APP_PRODUCT_TEST_VER_LEN];
/* version date, BCD format */
uint8_t module_ver_day;
uint8_t module_ver_month;
uint8_t module_ver_year;
/* vendor id. BCD format. */
uint16_t vendor_id;
/* chip code. BCD format. */
uint16_t chip_code;
} gw_app_product_test_ver_info_t;
/* internal version info structure for production test cmd */
typedef struct _gw_app_product_test_inter_ver {
/* node address, little-endian */
uint8_t node_addr[IOT_MAC_ADDR_LEN];
/* day of version, BCD, eg. 27 */
uint8_t day;
/* mon of version, BCD, eg. 07 */
uint8_t mon;
/* year of version, BCD, eg. 23 */
uint8_t year;
/* version, BCD, little-endian, eg. 0102 -> 02 01 */
uint16_t ver;
} gw_app_product_test_inter_ver_t;
#pragma pack(pop)/* restore the pack status */
#ifdef __cplusplus
}
#endif
#endif /* PROTO_GW_APP_H */