Files
ninlight-w600/sdk/Include/App/wm_cloud.h
Michael Sauer 1b0501179d build: W600-SDK importiert, Firmware-Build und Hello am EVK
Docker-Build mit gcc-arm-none-eabi 4.9-2014q4 (statt Homebrew-Cask) verwendet,
Dockerfile/tools/docker.sh dafür aus Task 13 vorgezogen. cmake/sdk.cmake schont
gcc 4.9 (kennt -fcommon/-Wno-error=... nicht). Zwei zusätzliche SDK-Stubs
(EarlyInit, pre_gpio_config) in src/sys/sdk_stubs.c ergänzt, siehe sdk/PATCHES.md.
2026-09-11 12:52:26 +02:00

482 lines
14 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file wm_cloud.h
*
* @brief Cloud Interface API
*
* @author winnermicro
*
* Copyright (c) 2015 Winner Microelectronics Co., Ltd.
*/
#ifndef __WM_CLOUD_H__
#define __WM_CLOUD_H__
#include "wm_config.h"
#if TLS_CONFIG_CLOUD
#include "wm_sockets.h"
#if TLS_CONFIG_HTTP_CLIENT_SECURE
#include "matrixsslApi.h"
#endif
#define SERVER_STATE_OFFLINE 0
#define SERVER_STATE_ONLINE 1
#define SOCKET_TCP 1
#define SOCKET_CLINET 2
#define SOCKET_SSL 4
/**
* 开发者自定义socket的信息,目前sock_type不支持Tcp server,
* 可支持udp、tcp client以及ssl的tcp连接
*/
typedef struct _SOCKET{
int socket_num; /**< socket号,socket建立成功后,系统填入,
开发者初始化时不必填写 */
struct sockaddr * sock_addr;/**< socket地址,udp时,表示本地地址,
tcp时,表示对端地址 */
u8 sock_type; /**< socket类型定义,目前仅低三个bit有效,
具体查看SOCKET_xxx定义 */
u8 connected; /**< socket连接标志,仅tcp client有效,
为1表示连接成功 */
void * user_param; /**< 开发者自定义信息,用来区分是否为开发者
自定义socket */
#if TLS_CONFIG_HTTP_CLIENT_SECURE
ssl_t * ssl; /**< ssl连接信息,仅SOCKET_SSL时有效 */
#endif
}SOCKET;
/** 开发者自定义socket接收数据的格式 */
typedef struct CReadData{
SOCKET *socket; /**< socket相关信息 */
char * read_data; /**< 接收的数据 */
u32 data_len; /**< 接收数据长度 */
struct sockaddr_in sin_recv;/**< 对端socket地址,仅udp时有效 */
}CloudReadData;
#if TLS_CONFIG_CLOUD_KII
/** 云端回调数据格式 */
typedef struct _Cloud_Callback_data
{
char* bucketName;/**< bucket名称 */
char* objectId; /**< 对象id */
char* jsonObject;/**< 对象数据,通常用json格式表示 */
} CloudCallbackData, *PCloudCallbackData;
/** 设置上传云端回调,errcode为0表示上传成功,data为上传数据,
如果上传成功,可以从data->objectId得到上传云的数据对象id */
typedef void (*upload_callback)(PCloudCallbackData data, int errcode);
/** 上传云端的数据格式 */
typedef struct _CloudData
{
char* bucketName; /**< bucket名称 */
char* jsonObject; /**< 对象数据,通常用json格式表示 */
upload_callback cb; /**< 上传结果回调 */
} CloudData,*PCloudData;
/** 初始化云参数定义 */
typedef struct _Cloud_Init_arg
{
char* site; /**< 服务器地址,目前可传入"CN" "US" "JP" "SG" */
char* appId; /**< 应用ID */
char* appKey; /**< 应用Key */
char* deviceType; /**< 设备类型 */
char* venderId; /**< 设备ID,通常为设备的MAC地址 */
char* modelName; /**< 模块名称,自定义字符串,OTA推送的bucketName格式为 */
char* password; /**< 设备密码 */
char* recvDataBucket; /**< 设备推送的bucketName */
} CloudInitArg, *PCloudInitArg;
#endif
#if TLS_CONFIG_CLOUD_JD
/** 云操作类型枚举 */
enum cloud_opt_type
{
UPLOAD_REQ, /**< 上传数据请求 */
UPLOAD_RESP, /**< 上传数据响应 */
CONTROL_REQ, /**< 云端控制命令请求 */
CONTROL_RESP, /**< 控制命令响应 */
SNAPSHOT_REQ, /**< 云端抓取快照(状态)请求 */
SNAPSHOT_RESP /**< 快照(状态)响应 */
};
/**
* 云端通信数据结构,需要注意一下两点:
* 1)作为tls_cloud_upload_data方法参数:
* 上传数据请求、控制命令响应、快照(状态)响应接口,
* 对于上传数据请求,如果此接口返回后,data->opt为UPLOAD_RESP,
* 则实际上同步响应了上传命令,此时data->result即为上传数据后云端返回结果。
* CloudData需要调用者自己分配内存,自己释放。
* 2)作为cloud_callback回调参数:
* 上传数据响应、云端控制命令下达、云端抓取快照(状态)请求时,
* cloud_callback回调接口被调用。
* 对于云端控制命令请求、云端抓取快照请求,如果在此回调接口返回后,
* data->opt为CONTROL_RESP或SNAPSHOT_RESP,则实际上同步响应了此命令,
* 此时data->result即为控制命令响应结果,data->values中包含了快照响应结果。
* 同步响应SNAPSHOT_RESP时,names和values部分的内存以及同步响应CONTROL_RESP时,
* data->control_resp部分的内存由开发者申请,在云实现中释放。
*/
typedef struct _CloudData
{
enum cloud_opt_type opt;/**< 操作类型枚举 */
int result; /**< 云端响应上传数据或设备响应云端控制结果 */
char* control_resp; /**< 云端控制命令失败原因 */
char** names; /**< 上传数据请求、云端控制请求、
云端快照请求或快照响应的字段名 */
char** values; /**< 上传数据请求、云端控制请求、快照响应的值 */
int cnt; /**< 字段个数 */
void * arg; /**< 云端发送过来的参数,需要原封不动回传给云端 */
} CloudData,*PCloudData, CloudCallbackData, *PCloudCallbackData;
/** 初始化云参数定义,应该传入product_uuid */
typedef struct _Cloud_Init_arg
{
char *product_uuid; /**< 产品UUID */
} CloudInitArg, *PCloudInitArg;
#endif
#if TLS_CONFIG_CLOUD_GAGENT
/** 云端通信数据结构 */
typedef struct _CloudData
{
int32 totalcap; /**< 全局缓存区的大小 4k+128byte */
int32 remcap; /**< 数据包头的冗余长度 128byte */
uint8 *allbuf; /**< 数据起始地址 */
int32 bufcap; /**< 数据区域的大小 4K */
uint32 type; /**< 消息体类型 */
uint8 *phead; /**< 数据包头起始地址 */
uint8 *ppayload; /**< 业务逻辑头起始地址 */
uint8 *pend; /**< 数据结束地址 */
} CloudData,*PCloudData, CloudCallbackData, *PCloudCallbackData;
/** 初始化云参数定义 */
typedef struct _Cloud_Init_arg
{
char* product_key; /**< 产品标识码 */
char* wifi_soft_ver; /**< 软件版本号 */
char* wifi_hard_ver; /**< 硬件版本号 */
} CloudInitArg, *PCloudInitArg;
#endif
#if TLS_CONFIG_CLOUD_360
/**
* 设置上传云端回调,errcode为0表示上传成功,user_param为
* 调用tls_cloud_upload_data时传入的CloudData中的user_param
*/
typedef void (*upload_callback)(void* user_param, int errcode);
/** 云端回调数据格式 */
typedef struct _Cloud_Callback_data
{
const uint8_t* data; /**< 数据 */
size_t datalen; /**< 数据长度 */
}CloudCallbackData, *PCloudCallbackData;
/** 上传云端的数据格式 */
typedef struct _CloudData
{
void* user_param; /**< 用户参数,在上传回调中传入此参数 */
const uint8_t* data; /**< 数据 */
size_t datalen; /**< 数据长度 */
upload_callback cb; /**< 上传结果回调 */
} CloudData,*PCloudData;
/** 初始化云参数定义 */
typedef struct _Cloud_Init_arg
{
int product_id; /**< 产品ID */
unsigned char product_aes[16]; /**< 产品AES密钥 */
char *device_name; /**< 设备名称 */
} CloudInitArg, *PCloudInitArg;
#endif
#if TLS_CONFIG_CLOUD_QQ
/**
* 设置上传云端回调,errcode为0表示上传成功,cookie为自增
* 的序号,和在调用tls_cloud_upload_data时得到的CloudData中
* 的pCookie相同
*
*/
typedef void (*upload_callback)(int32_t err_code, uint32_t cookie);
/** 云端回调数据格式 */
typedef struct _Cloud_Callback_data {
uint32_t property_id; /**< 属性ID */
uint8_t *property_value; /**< 属性value,类型为字节数组 */
uint32_t property_value_len; /**< 属性value的长度 */
uint32_t seq; /**< 操作序号 */
int32_t ret_code; /**< 收到cc datapoint,回复ACK时设置此值供H5页面使用 */
} CloudCallbackData, *PCloudCallbackData;
/** 上传云端的数据格式 */
typedef struct _CloudData
{
CloudCallbackData *datapoints; /**< 数据结构 */
uint32_t datapoints_count; /**< 个数 */
upload_callback cb; /**< 上传结果回调 */
uint32_t *pCookie; /**< 自增的序号 */
}CloudData,*PCloudData;
/** 初始化云参数定义 */
typedef struct _Cloud_Init_arg{
/* 硬件信息 */
char* device_name; /**< 设备名称,'\0'结尾字符串长度不超过32字节,
nettype为1时必须与网站注册的devicename一致 */
char* sn; /**< 设备序列号,'\0'结尾字符串长度必须是16字节 */
char* license; /**< 设备LICENSE */
int32_t product_id; /**< 每一个厂商的每一种类型的设备对应的一个id */
int32_t product_version; /**< 产品的版本信息,用于OTA,默认填0 */
/** 密钥信息 */
uint8_t* client_pub_key; /**< client公钥,每台设备生成后烧录到设备 */
int32_t client_pub_key_len;
uint8_t* auth_key; /**< authkey,每台设备生成后烧录到设备 */
int32_t auth_key_len;
} CloudInitArg, *PCloudInitArg;
#endif
#if TLS_CONFIG_CLOUD_ABLECLOUD
/** ABLECLOUD云端通信数据结构 */
typedef struct _CloudData
{
u8 msg_id; /**< 消息ID,响应消息同云端下发的消息邋ID,主动上传任意 */
u8 msg_code; /**< 消息Code,响应消息同云端下发的消息code,
主动上传需要大于200 */
u8 *data; /**< 数据 */
uint32 datalen; /**< 数据长度 */
} CloudData,*PCloudData, CloudCallbackData, *PCloudCallbackData;
/** 初始化云参数定义 */
typedef struct _Cloud_Init_arg
{
u32 major_domain; /**< 主域ID */
u16 sub_domain; /**< 子域ID */
u8 private_key[112]; /**< 产品私钥 */
u32 product_version; /**< 产品的版本信息,用于OTA */
} CloudInitArg, *PCloudInitArg;
#endif
#if TLS_CONFIG_CLOUD_ELIAN
enum
{
DATA_TYPE_BINARY = 0, /**< 二进制 */
DATA_TYPE_TEXT = 1, /**< 文本格式 */
DATA_TYPE_NV = 2, /**< 以空格分离的命令加参数的格式,
如:power 34。 */
DATA_TYPE_EL_CMD = 3, /**< 为4字节整数命令Id+4字节整数的值,
如:140 (电源状态上报,14为整数;
0也为整数,表示状态)。 */
DATA_TYPE_INFRA = 6, /**< 红外格式 */
DATA_TYPE_STATUS_REQ = 7,/**< 设备状态请求 */
DATA_TYPE_EL_CMD2 = 8 /**< 为4字节整数命令Id+字符串格式的值,
如:140 (电源状态上报,14为整数;
0为字符串,表示状态)。 */
};
/** 云端通信数据结构 */
typedef struct _CloudData
{
const uint8_t* data; /**< 数据 */
size_t datalen; /**< 数据长度 */
u8 datatype;
} CloudData,*PCloudData, CloudCallbackData, *PCloudCallbackData;
/** 初始化云参数定义 */
typedef struct _Cloud_Init_arg
{
char* sn; /**< 设备序列号,'\0'结尾字符串长度
必须是13字节 */
} CloudInitArg, *PCloudInitArg;
#endif
/** 设备在云端注册后得到的关于设备的信息 */
typedef struct _Cloud_Dev_info{
u8* device_id; /**< 设备ID */
u8* access_token; /**< 设备token,和设备ID一起构成设备访问云的凭证 */
}CloudDeviceInfo, *PCloudDeviceInfo;
/**
* @brief 设置云的回调
*
* @param[in] data
*
* @retval 0 success
* @retval other failed
*
* @note None
*/
typedef int (*cloud_callback)(PCloudCallbackData data);
/**
* @brief 设置云状态的回调,status为1表示设备在线,status为0表示
设备不在线
*
* @param[in] status
*
* @retval 0 表示设备不在线
* @retval 1 表示设备在线
*
* @note None
*/
typedef void (*cloud_online_status_callback)(int status);
/**
* @defgroup APP_APIs APP APIs
* @brief APP APIs
*/
/**
* @addtogroup APP_APIs
* @{
*/
/**
* @defgroup cloud_APIs cloud APIs
* @brief cloud APIs
*/
/**
* @addtogroup cloud_APIs
* @{
*/
/**
* @brief 初始化云,user task初始化时调用,
对京东云,arg为product_uuid,
对其它云arg请查看CloudInitArg结构定义
*
* @param[in] arg
*
* @retval 0 success
* @retval other failed
*
* @note None
*/
int tls_cloud_init(PCloudInitArg arg);
/**
* @brief 注销云,设备下线时调用,销毁资源。block为0时,此函数立
即返回,注销云在后台执行,block为1时,云注销完成后此函数
返回。
*
* @param[in] block 是否阻塞,为1表示,直到云注销完成返回,
为0表示,立即返回,云注销在后台执行完成
*
* @return None
*
* @note None
*/
void tls_cloud_finish(u8 block);
/**
* @brief 设备向云上传数据,包括对控制命令的响应,上传状态以及设
备快照等
*
* @param[in] data
*
* @retval 0 success
* @retval other failed
*
* @note None
*/
int tls_cloud_upload_data(PCloudData data);
/**
* @brief 设置云的回调接口,是设备接收云的控制命令,推送消息等的
唯一接口
*
* @param[in] callback
*
* @retval 0 success
* @retval other failed
*
* @note None
*/
int tls_cloud_set_callback(cloud_callback callback);
/**
* @brief 设置云状态的回调接口,设备上线,下线时回调此接口
*
* @param[in] callback
*
* @return None
*
* @note None
*/
void tls_cloud_set_online_status_callback(cloud_online_status_callback callback);
/**
* @brief 获得设备在云端注册后的设备相关信息,
具体查看CloudDeviceInfo结构定义
*
* @param[in] info
*
* @retval 0 success
* @retval other failed
*
* @note None
*/
int tls_cloud_get_device_info(PCloudDeviceInfo info);
/*
* 以下extern开头的函数,需要开发者实现,具体实现查看wm_lsd_device_found.c,此为我们写的一个局域网设备发现的简单实现,
* 开发者可以根据需要,写自己的设备发现实现,或者是局域网通信控制等。
*/
/**
* @brief 获得开发自定义的socket信息,count为最大支持的socket数,
根据不同的云此参数有所不同
*
* @param[in] sockets
* @param[in] count
*
* @retval 0 success
* @retval other failed
*
* @note None
*/
extern int tls_cloud_get_custom_sockets(SOCKET** sockets, int count);
/**
* @brief 开发者自定义socket接收数据的处理函数,此函数在socket接
收到数据时被调用,
开发者可根据SOCKET中的user_param判断是否为自定义socket
,然后做相应的处理
*
* @param[in] data
*
* @retval 0 success
* @retval other failed
*
* @note None
*/
extern int tls_cloud_socket_data_handler(CloudReadData* data);
/**
* @brief 通过socket发送数据,其中to和tolen只有udp时有效并且必须
,tcp时to参数传入NULL
*
* @param[in] *sock
* @param[in] *data
* @param[in] size
* @param[in] flags
* @param[in] *to
* @param[in] tolen
*
* @retval 0 success
* @retval other failed
*
* @note None
*/
int tls_cloud_socket_sendto(SOCKET *sock, const void *data, size_t size, int flags,
const struct sockaddr *to, socklen_t tolen);
/**
* @}
*/
/**
* @}
*/
#endif //TLS_CONFIG_CLOUD
#endif