/**
 * @file        xieneng_can_mqtt.h
 * @brief
 * @details
 * @author      JHC
 * @date        2022-10-21
 * @version     V1.0
 * @copyright   Copyright (C) 2001-2022 BMSER Technology
********************************************************************************
 * @attention
 * 系统平台: LINUX4.15 \n
 * @par :
 * <table>
 * <tr><th>Date        <th>Version  <th>Author    <th>Description
 * <tr><td>2022-10-21  <td>1.0      <td>JHC  <td>
 * </table>
 *
********************************************************************************
*/
#ifndef XIENENG_CAN_MQTT_H_
#define XIENENG_CAN_MQTT_H_

#include <string.h>
#include <syslog.h>
#include "xieneng_can_component.h"

/***************OLD TOPIC****************/
#define TOPIC_UP_RAW_DATA "raw_data"
#define TOPIC_RT_PROPERTIES_REPORT "Evt_Rpt_Data"
#define TOPIC_RT_EVENT_REPORT "Rsp_EventData"
#define TOPIC_RT_SERVICE_REPORT "Rsp_ServiceData"
#define TOPIC_SET_NODES_CFG "Set_NodesCfg"
#define TOPIC_GET_NODES_CFG "Get_NodesCfg"
#define TOPIC_SET_TEMPL_CFG "Set_NodesTemplate"
#define TOPIC_GET_TEMPL_CFG "Get_NodesTemplate"
#define TOPIC_SET_OBJ_CFG "Set_ObjectModel"
#define TOPIC_GET_OBJ_CFG "Get_ObjectModel"
#define TOPIC_SET_RS485_CFG "Set_RS485Cfg"
#define TOPIC_GET_RS485_CFG "Get_RS485Cfg"
#define TOPIC_SET_VPORTCFG "Set_VPortCfg"
#define TOPIC_GET_VPORTCFG "Get_VPortCfg"
#define TOPIC_SET_HUAYUN_CFG "Set_HuayunCfg"
#define TOPIC_GET_HUAYUN_CFG "Get_HuayunCfg"
#define TOPIC_SET_COMMON_SOCKET_CFG "Set_CommonSocketCfg"
#define TOPIC_GET_COMMON_SOCKET_CFG "Get_CommonSocketCfg"
#define TOPIC_GET_VERSION_ALL "Get_Version_All"
#define TOPIC_SET_GATEWAYSTATUSINTV "Set_GatewayStatusIntv"
#define TOPIC_EVT_NETWORKINFO "Get_NetworkInfo"
#define TOPIC_EVT_CPUMEMINFO "Get_CpuMemInfo"
#define TOPIC_EVT_LORAINFO "Get_LoRaInfo"
#define TOPIC_EVT_RADIOSTATUS "Get_RadioStatus"
#define TOPIC_EVT_WIRELESSSTATIONSTATUS "Get_WirelessStationStatus"
#define TOPIC_EVT_SET_RGLT "Set_Rglt"
#define TOPIC_RSP_RGLT "Rsp_Rglt"
#define TOPIC_SEND_RGLT_SIGNAL_RAW_DATA "Set_Rglt_Raw"
#define TOPIC_SEND_RGLT_SIGNAL_RAW_DATA_7FF "Set_Rglt_7FF_Raw"
#define TOPIC_EVT_NODESSTATUS "Evt_NodesStatus"
#define TOPIC_SET_LORAWANCFG "Set_LoRaWANCfg"
#define TOPIC_GET_LORAWANCFG "Get_LoRaWANCfg"
#define TOPIC_SET_LORACFG "Set_LoRaCfg"
#define TOPIC_GET_LORACFG "Get_LoRaCfg"
#define TOPIC_SET_RULESENGINECFG "Set_RulesEngineCfg"
#define TOPIC_GET_RULESENGINECFG "Get_RulesEngineCfg"
#define TOPIC_SET_GATEWAYWANTEST "Set_GatewayWANTest"
#define TOPIC_RSP_GATEWAYWANTEST "Get_GatewayWANTest"
#define TOPIC_SET_GATEWAYWANCFG "Set_GatewayWANCfg"
#define TOPIC_GET_GATEWAYWANCFG "Get_GatewayWANCfg"
#define TOPIC_SET_GATEWAYLANCFG "Set_GatewayLANCfg"
#define TOPIC_GET_GATEWAYLANCFG "Get_GatewayLANCfg"
#define TOPIC_SET_GATEWAYUPGRADECMD "Set_GatewayUpgradeCmd"
#define TOPIC_RSP_GATEWAYUPGRADECMD "Set_GatewayUpgradeCmd"
#define TOPIC_SET_NODESUPGRADECMD "Set_NodesUpgradeCmd"
#define TOPIC_RSP_NODESUPGRADECMD "Set_NodesUpgradeCmd"
#define TOPIC_EVT_NODESUPGRADESTATUS "Evt_NodesUpgradeStatus"
#define TOPIC_SET_MACIPBIND "Set_MacIpBind"
#define TOPIC_GET_MACIPBIND "Get_MacIpBind"
#define TOPIC_GET_LANDEVICESTATUS "Get_LanDeviceStatus"
#define TOPIC_RSP_LANDEVICESTATUS "Get_LanDeviceStatus"
#define TOPIC_SET_RADIOCFG "Set_RadioCfg"
#define TOPIC_GET_RADIOCFG "Get_RadioCfg"
#define TOPIC_SET_GATEWAYVAPCFG "Set_GatewayVAPCfg"
#define TOPIC_GET_GATEWAYVAPCFG "Get_GatewayVAPCfg"
#define TOPIC_GET_WIRELESSSCANRESULT "Get_WirelessScanResult"
#define TOPIC_RSP_WIRELESSSCANRESULT "Get_WirelessScanResult"
#define TOPIC_GET_APPSLIST "Get_AppsList"
#define TOPIC_RSP_APPSLIST "Get_AppsList"
#define TOPIC_SET_APPINSTALL "Set_AppInstall"
#define TOPIC_SET_APPREMOVE "Set_AppRemove"
#define TOPIC_SET_DEPENDAPPINSTALL "Set_DependAppInstall"
#define TOPIC_SET_DEPENDAPPREMOVE "Set_DependAppRemove"
#define TOPIC_SET_RULESDEBUG "Set_RulesDebug"
#define TOPIC_EVT_RULESSTACKS "Evt_RulesStacks"
#define TOPIC_SET_CANCFG "Set_CanCfg"
#define TOPIC_GET_CANCFG "Get_CanCfg"
#define TOPIC_SET_LOGSERVERCFG "Set_LogServerCfg"
#define TOPIC_GET_LOGSERVERCFG "Get_LogServerCfg"
#define TOPIC_CMD_RESULT "CmdResult"
#define TOPIC_LORAWAN_DOWN "LoRaWAN_Down"
#define TOPIC_LORAWAN_UP "LoRaWAN_Up"
#define TOPIC_UPGRADE_NODE "Upgrade_Node"
#define TOPIC_NOTIFY_UPGRADE "Notify_Upgrade"
#define TOPIC_GET_WIFISTATUS "Get_WiFiStatus"
#define TOPIC_RSP_WIFISTATUS "Get_WiFiStatus"
#define TOPIC_EXE_RUN "Exe_Run"
#define TOPIC_RSP_RUN "Rsp_Run"
#define START_UPGRADE "start_upgrade"
#define STOP_UPGRADE "stop_upgrade"
#define TOPIC_RSP_VERSION_ALL "Get_Version_All"
#define TOPIC_GATEWAY_CONFIG "gateway"
#define TOPIC_SET_SERVERREDIRECT "Set_ServerRedirect"
#define TOPIC_GET_SERVERREDIRECT "Get_ServerRedirect"
#define TOPIC_SET_MULTI_MQTT_CLD "Set_Multi_Cloud_Mqtt"
#define TOPIC_GET_MULTI_MQTT_CLD "Get_Multi_Cloud_Mqtt"
#define TOPIC_SET_NTPSERVERCFG "Set_NTPServerCfg"
#define TOPIC_GET_NTPSERVERCFG "Get_NTPServerCfg"
#define TOPIC_GET_TEMPLATE_LIST "Get_TemplateList"
#define TOPIC_WEBUI_LOGIN "Login"
#define TOPIC_SET_USERNAME_PASS "Set_UsernamePassword"
#define TOPIC_SET_MQTT_BROKER_TEST "Set_BrokerTest"
#define TOPIC_ADD_UPDATE_NODE "Set_AddUpdateNode"
#define TOPIC_DELETE_NODE "Set_DeleteNode"
#define TOPIC_GET_GWINFO "Get_GatewayInfo"
#define TOPIC_SET_SIM_CARD "Set_SimCard"
#define TOPIC_UPGRADE_FIRMWARE "Upgrade_Firmware"
#define TOPIC_SCRIPT_HB "heartbeat"
#define TOPIC_SCRIPT "script"
#define TOPIC_SET_SUPOS_CFG "Set_SupOS_cfg"
#define TOPIC_GET_SUPOS_CFG "Get_SupOS_cfg"
#define TOPIC_TROUBLESHOOOTING_4G "Troubleshooting_4G"
#define TOPIC_SET_DEBUG_INFO "Set_DebugInfo"
#define TOPIC_REPORT_DEBUG_INFO "Report_DebugInfo"
#define TOPIC_COLLECT_DIAG_INFO "Diag_Run"
#define TOPIC_GET_HISTORY_DATA "Get_HistoryData"
#define TOPIC_SET_PROJECT_PARA "systemParameterConfig"
#define TOPIC_BINARY_FLOW "binaryFlow"
#define TOPIC_BINARY_CMD "binaryCmd"
#define TOPIC_CANRBUS_VER "CanrbusGetVer"   // 获取canrbus版本
/****************************************************/

/****************************************************/
#define BINARY_WRITE_REPLY_TOPIC "binary_write_reply"
#define BINARY_DATA_TOPIC "binary_data"
#define BINARY_CMD_TOPIC "binary_cmd"

/****************************************************/
#define MQTT_QOS_LEVLE0     1
#define MQTT_QOS_LEVLE1     1
#define MQTT_QOS_LEVLE2     2
#define MAX_CLIENT_ID_LEN   128
#define MAX_DEV_SN_LEN      16

/**
 * @brief       xieneng_can建立与内部broker之间的MQTT连接
 * @param[in]   sn_str sn号
 * @return      int
 * @retval      0:success; -1:fail
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023/07/06       XXXXX        创建初始版本     \n
 */
int xieneng_can_mqtt_client_init(char *sn_str);

/**
 * @brief       产测7ff BINARY_CMD_TOPIC publish
 * @param[in]   
 * @return      int
 * @retval      0
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023/07/06       XXXXX        创建初始版本     \n
 */
#ifdef WITH_BMSER_PRODUCT_TEST
int publish_cmd_binary_data_7ff(uint32_t canObjId, unsigned char *buf, int len, unsigned char cmdreply);
#endif

/**
 * @brief       TOPIC_BINARY_CMD publish
 * @param[in]   sn_str       sn号
 * @param[in]   canObjId    CAN 对象 ID
 * @param[in]   bankId      bankId
 * @param[in]   rackId      rackId
 * @param[in]   start_addr  起始地址
 * @param[in]   reg_cnt     数量
 * @param[in]   buf        存储数据buf
 * @param[in]   len         长度
 * @param[in]   cmdreply   BMS_FUNC_CODE_E
 * @return      int
 * @retval      0
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023/07/06       XXXXX        创建初始版本     \n
 * 2023/12/16       JHC          多堆重构         \n
 */
int publish_critical_binary_data(char *sn_str, uint32_t canObjId, unsigned char layer, \
                                 uint16_t bankId, uint16_t rackId, unsigned short start_addr, unsigned short reg_cnt, unsigned char *buf, \
                                 int len, unsigned char cmdreply);

/**
 * @brief       TOPIC_BINARY_FLOW publish
 * @param[in]   
 * @return      int
 * @retval      0
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023/07/06       XXXXX        创建初始版本     \n
 */
int publish_binaryFlow_data(unsigned char *buf, int len, uint32_t canId);

/**
 * @brief       TOPIC_BINARY_CMD publish(func read)
 * @param[in]   sn_str sn号
 * @return      int
 * @retval      0
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023/07/06       XXXXX        创建初始版本     \n
 */
int publish_binaryCmd_func_read(unsigned char *buf, int reg_cnt, unsigned char dev_id);

/**
 * @brief       TOPIC_BINARY_FLOW publish(td_mqtt)
 * @param[in]   data        数据
 * @param[in]   len         数据长度
 * @param[in]   bankId      堆ID
 * @param[in]   rackId      簇ID
 * @return      int
 * @retval      0
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023/07/06       QZY        创建初始版本     \n
 * 2023/12/27       QZY        适配多堆         \n
 */
int publish_binaryFlow_Data2TD(unsigned char *data, int len, uint16_t bankId, uint16_t rackId);

/**
 * @brief       发送canrbus版本至bmser_upgrade
 * @param[in]   bmser_canrbus_ver_s ver_msg canrbus版本
 * @return      int
 * @retval      0
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2023/10/30       qzy        创建初始版本     \n
 */
int publish_canrbusVer_Info(bmser_canrbus_ver_s ver_msg);

#endif 