/**
*@file    sr_senthink.h
*@brief   贤芯X平台组件接口
*@details 提供贤芯X平台接口相关枚举、结构体
*@copyright Copyright (c) 2024 lierda. All rights reserved.
*@author  Lierda-RDC
*@date    2024-05-07
*@example ZhaoyangSDK\example\component\senthink_example.c
*/
#ifndef _SR_CLOUD_SENTHINK_H
#define _SR_CLOUD_SENTHINK_H

#include "sr_config.h"

#include "sr_net_mqtt.h"

#ifndef SR_STK_OPEN_ID
#define SR_STK_OPEN_ID               "762DF087"    //固定8位16进制
#endif

#ifndef SR_STK_PRODUCT_ID
#define SR_STK_PRODUCT_ID            "73AF9252"    //固定8位16进制
#endif

#ifndef SR_STK_PRODUCT_KEY
#define SR_STK_PRODUCT_KEY           "DF66664C20EC44DE9B7377E2A2A58EC5"
#endif



#define SR_STK_DEV_ID_LEN            20   //平台限制4~32字符，本组件限制在16字符
#define SR_STK_DEV_SECRET_LEN        32

#define SR_STK_MQTT_CLIENTID_LEN     48
#define SR_STK_MQTT_UAERNAME_LEN     48
#define SR_STK_MQTT_PASSWORD_LEN     132
#define SR_STK_MQTT_PAYLOAD_LEN      MQTT_PAYLOAD_MAX_LEN
#define SR_STK_MQTT_TOPIC_LEN        MQTT_TOPIC_MAX_LEN

 
#define SR_STK_TIMESTAMPE_TEST       1703720193

#define SR_STK_MAX_MSG_ID            65535
#define SR_STK_OTA_DEFAULT_MODULE    "default"

#define SR_STK_AUTH_SUB              "/sys/%s/%s/%s/downlink"
#define SR_STK_AUTH_PUB              "/sys/device/auth"
#define SR_STK_AUTH_DATA             "{\"MessageId\":1231,\"HeaderCtrl\":1,\"Payload\":{\"OpenID\":\"%s\",\"ProductID\":\"%s\",\"NodeEui\":\"%s\",\"Type\":0},\"Version\":\"2.0\"}"

#define SR_STK_PROP_RPT_PUB          "/sys/%s/%s/%s/model/property/report"
#define SR_STK_PROP_RPTACK_SUB       "/sys/%s/%s/%s/model/property/report_ack"
#define SR_STK_PROP_RPT_DATA         "{\"MessageId\":%d,\"HeaderCtrl\":16,\"Payload\":%s,\"Version\":\"2.0\"}"

#define SR_STK_PROP_SET_SUB          "/sys/%s/%s/%s/model/property/set"
#define SR_STK_PROP_SETACK_PUB       "/sys/%s/%s/%s/model/property/set_ack"
#define SR_STK_PROP_SETACK_DATA      "{\"MessageId\":%d,\"HeaderCtrl\":20,\"Payload\":{\"Code\":\"%d\",\"Msg\":\"%s\"},\"Version\":\"2.0\"}"


#define SR_STK_FWVER_RPT_PUB         "/sys/%s/%s/%s/firmware_report"
#define SR_STK_FWVER_RPTACK_SUB      "/sys/%s/%s/%s/firmware_report_ack"
#define SR_STK_FWVER_RPT_DATA        "{\"MessageId\":%d,\"HeaderCtrl\":8,\"Payload\":{\"HardVer\":\"%s\",\"SoftVer\":\"%s\",\"Type\":%d,\"Module\":\"%s\"},\"Version\":\"2.0\"}"


#define SR_STK_OTA_NTY_SUB           "/sys/%s/%s/%s/ota_notify"
#define SR_STK_OTA_NTYACK_PUB        "/sys/%s/%s/%s/ota_notify_ack"
#define SR_STK_OTA_NTYACK_DATA       "{\"MessageId\":%d,\"HeaderCtrl\":9,\"Payload\":{\"DownID\":\"%s\"},\"Version\":\"2.0\"}"







#define SR_STK_MQTT_CONN_DATA(keepAlive,willFlag,willTopic,willMsg)  {SR_NULL,SR_NULL,SR_NULL,keepAlive,1,willFlag,willTopic,willMsg,0,0}




/**  
* @brief 固件版本结构体
*/
typedef struct SR_STK_FWVER
{
    char *HardVer;  /*!<硬件版本*/  
    char *SoftVer;  /*!<软件版本*/
    uint8_t type;   /*!<升级方式 2:http*/
    char *module;   /*!<所属模块(SOC、模组)，默认"default"*/ 
}SR_STK_FWVER_T;



/**  
* @brief 贤芯云初始化参数结构体
*/
typedef struct
{
	char *deviceID;      /*!<NodeEui ,也即设备id*/
	char *deviceSecret;  /*!<设备密钥*/
	char *serverIP;      /*!<服务器地址*/
	uint16_t serverPort; /*!<服务器端口*/
	
	SR_MQTT_CONN_PARAMS_T mqttConnParams;  /*!<mqtt连接参数*/

}SR_STK_INIT_PARAMS_T;

 

/**  
* @brief 贤芯云平台事件枚举
*/ 
typedef enum
{
  SR_STK_EVENT_AUTH_OK    = (1<<0),    /*!<认证成功*/
  SR_STK_EVENT_JOIN_OK    = (1<<1),    /*!<入网成功*/
  SR_STK_EVENT_DISCONNECT = (1<<2),    /*!<断开连接*/
  SR_STK_EVENT_PROP_SET   = (1<<3),    /*!<属性设置*/
  SR_STK_EVENT_OTA_NOTIFY = (1<<4),    /*!<OTA推送通知*/

  /*以下为内部事件，不通知用户*/
  SR_STK_EVENT_PROP_RPT_OK= (1<<20),  /*!<属性上报成功事件*/
  SR_STK_EVENT_FW_RPT_OK  = (1<<21),  /*!<固件上报成功事件*/
  
}SR_STK_EVENT_E;

/**  
* @brief 物模型属性设置数据，KV形式
*/  
typedef struct SR_STK_PROP_DATA
{
  union  /*!<键值中的value*/
  {
	double vNum;      /*!<数值类型*/
  	char   *vString;  /*!<string类型*/
  };

  char   *key;        /*!<键值中的key*/ 
  uint8_t vType;      /*!<value的类型 0:数值型        1:字符串类型*/

}SR_STK_PROP_DATA_T;


/**  
* @brief OTA通知信息
*/ 
typedef struct SR_STK_OTA_INFO
{
	char *softVer;       /*!<软件版本*/
	uint32_t softSize;   /*!<固件总大小*/
	char *md5;           /*!<MD5校验码*/
	char *url;           /*!<下载url地址*/
	char *fwName;        /*!<固件名称*/
	uint8_t type;        /*!<下载类型 2:http*/

}SR_STK_OTA_INFO_T;


/**
* @brief 云平台的事件回调函数类型
* 
* @param[in] event 事件类型枚举
* @param[in] data  事件携带的数据
* @param[in] dataLen  事件数据长度
* @param[in] args  用户参数
*
* @return 成功返回0，失败返回负值错误码
*/
typedef int (*StkEventCb)(SR_STK_EVENT_E event,void *data,uint16_t dataLen,void *args);

/**  
* @brief 云平台管理器结构体
*/
typedef struct SR_STK_MNG
{
	SR_NET_ADP_T *netAdapter;       /*!<网络适配器*/
	SR_MQTT_CLIENT_T *mqttc;        /*!<MQTT客户端*/
	void *event;                    /*!<事件句柄*/	
	StkEventCb eventCb;             /*!<事件回调*/	
	void *eventCbArgs;              /*!<事件回调的参数*/	
	SR_MQTT_CONN_PARAMS_T mqttConnParams;  /*!<mqtt连接参数*/
	uint16_t nextMsgId;             /*!<云平台消息ID*/
	uint8_t connectType;            /*!<连接类型，0：一型一密免注册  1：一型一密预注册  2：一机一密预注册*/
	
	char deviceID[SR_STK_DEV_ID_LEN];          /*!<设备id，也即NodeEui */
	char deviceSecret[SR_STK_DEV_SECRET_LEN];  /*!<设备密钥，认证时下发的*/
}SR_STK_MNG_T;




/***************************抽象接口*************************************************/


/**
* @brief 初始化云平台的MQTT资源
* 
* @param[in] netAdptName 网络适配器名称
* @param[in] initParams 云平台的初始化参数
*
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkMqttInit(char *netAdptName,SR_STK_INIT_PARAMS_T *initParams);


/**
* @brief 去初始化云平台的MQTT资源
* 
* @return 成功返回0,失败返回负值错误码
*/
int SR_StkMqttDeinit(void);

/**
* @brief 设置设备密钥至组件中
* 
* @param[in] secret 设备密钥
* @param[in] secretLen 设备密钥长度
*
* @return 成功返回0,失败返回负值错误码
*/
int SR_StkSetDevSecret(uint8_t *secret,uint16_t secretLen);


/**
* @brief 设备认证
*    设备首次连接云时需要；认证成功后，后续连云不需要再认证，直接入网即可
*
* @return 成功返回0,失败返回负值错误码
*/
int SR_StkMqttAuth(void);

/**
* @brief 设备入网
* 
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkMqttJoin(void);

/**
* @brief 退出云平台连接
* 
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkMqttExit(void);

/**
* @brief 通用的订阅云平台的MQTT主题
* 
* @param[in] qos 服务质量等级
* @param[in] topic 主题
*
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkMqttSub(uint8_t qos, char *topic);

/**
* @brief 通用的取消订阅云平台的MQTT主题
* 
* @param[in] topic 主题
*
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkMqttUnsub(char *topic);

/**
* @brief 订阅用于接收属性上报响应的主题
* 
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkPropReportAckSub(void);

/**
* @brief 产品物模型属性上报
* 
* @param[in] jsPayload 待发送json格式的payload数据
*
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkPropReportJs(char *jsPayload);


/**
* @brief 订阅用于接收物模型属性设置的主题
* 
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkPropSetSub(void);


/**
* @brief 订阅用于接收固件版本上报响应的主题
* 
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkFwVerReportAckSub(void);

/**
* @brief 上报设备固件版本信息
* 
* @param[in] version 固件版本信息
*
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkFwVerReportJs(SR_STK_FWVER_T *version);


/**
* @brief 订阅OTA升级通知的主题
* 
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkOtaNotifySub(void);


/**
* @brief 注册事件通知回调
* 
* @param[in] cb 事件回调函数
* @param[in] args 回调函数参数
*
* @return 成功返回0，失败返回负值错误码
*/
int SR_StkSetEventCb(StkEventCb cb, void *args);

#endif


