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.
This commit is contained in:
@@ -0,0 +1,481 @@
|
||||
/**
|
||||
* @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
|
||||
|
||||
Reference in New Issue
Block a user