1 /**
2  * @file aiot_sysdep_api.h
3  * @brief SDK Core系统依赖头文件, 所有Core中的系统依赖均在此文件中列出
4  * @date 2019-12-27
5  *
6  * @copyright Copyright (C) 2015-2018 Alibaba Group Holding Limited
7  *
8  */
9 
10 #ifndef _AIOT_SYSDEP_API_H_
11 #define _AIOT_SYSDEP_API_H_
12 
13 #if defined(__cplusplus)
14 extern "C" {
15 #endif
16 
17 #include <stdint.h>
18 
19 typedef enum {
20     AIOT_SYSDEP_NETWORK_CRED_NONE,
21     AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA,
22     AIOT_SYSDEP_NETWORK_CRED_SVRCERT_PSK,
23     AIOT_SYSDEP_NETWORK_CRED_MAX
24 } aiot_sysdep_network_cred_option_t;
25 
26 typedef struct {
27     aiot_sysdep_network_cred_option_t option;  /* 安全策略 */
28     uint32_t      max_tls_fragment;
29     uint8_t       sni_enabled;
30     const char   *x509_server_cert;     /* 必须位于静态存储区, SDK内部不做拷贝 */
31     uint32_t      x509_server_cert_len;
32     const char   *x509_client_cert;     /* 必须位于静态存储区, SDK内部不做拷贝 */
33     uint32_t      x509_client_cert_len;
34     const char   *x509_client_privkey;  /* 必须位于静态存储区, SDK内部不做拷贝 */
35     uint32_t      x509_client_privkey_len;
36     char         *tls_extend_info;
37 } aiot_sysdep_network_cred_t;
38 
39 typedef enum {
40     CORE_SYSDEP_SOCKET_TCP_CLIENT,
41     CORE_SYSDEP_SOCKET_TCP_SERVER,
42     CORE_SYSDEP_SOCKET_UDP_CLIENT,
43     CORE_SYSDEP_SOCKET_UDP_SERVER
44 } core_sysdep_socket_type_t;
45 
46 typedef struct {
47     char *psk_id;
48     char *psk;
49 } core_sysdep_psk_t;
50 
51 typedef enum {
52     CORE_SYSDEP_NETWORK_SOCKET_TYPE,             /* 需要建立的socket类型  数据类型: (core_sysdep_socket_type_t *) */
53     CORE_SYSDEP_NETWORK_HOST,                    /* 用于建立网络连接的域名地址或ip地址, 内存与上层模块共用  数据类型: (char *) */
54     CORE_SYSDEP_NETWORK_BACKUP_IP,               /* 当建联DNS解析失败时, 使用此备用ip重试 */
55     CORE_SYSDEP_NETWORK_PORT,                    /* 用于建立网络连接的端口号  数据类型: (uint16_t *) */
56     CORE_SYSDEP_NETWORK_CONNECT_TIMEOUT_MS,      /* 建立网络连接的超时时间  数据类型: (uint32_t *) */
57     CORE_SYSDEP_NETWORK_CRED,                    /* 用于设置网络层安全参数  数据类型: (aiot_sysdep_network_cred_t *) */
58     CORE_SYSDEP_NETWORK_PSK,                     /* 用于配合PSK模式下的psk-id和psk  数据类型: (core_sysdep_psk_t *) */
59     CORE_SYSDEP_NETWORK_MAX
60 } core_sysdep_network_option_t;
61 
62 typedef struct {
63     char addr[16]; /* ipv4地址点分十进制字符串, 最大长度15字节.  */
64     uint16_t port; /* 端口号 */
65 } core_sysdep_addr_t;
66 
67 /* 这不是一个面向用户的编译配置开关, 多数情况下, 不必用户关心 */
68 
69 /**
70  * @brief 用以向SDK描述其运行硬件平台的资源如何使用的方法结构体
71  */
72 typedef struct {
73     /**
74      * @brief 申请内存
75      */
76     void    *(*core_sysdep_malloc)(uint32_t size, char *name);
77     /**
78      * @brief 释放内存
79      */
80     void (*core_sysdep_free)(void *ptr);
81     /**
82      * @brief 获取当前的时间戳,SDK用于差值计算
83      */
84     uint64_t (*core_sysdep_time)(void);
85     /**
86      * @brief 睡眠指定的毫秒数
87      */
88     void (*core_sysdep_sleep)(uint64_t time_ms);
89     /**
90      * @brief 创建1个网络会话(L3层)
91      */
92     void    *(*core_sysdep_network_init)(void);
93 
94     /**
95      * @brief 配置1个网络会话的连接参数
96      */
97     int32_t (*core_sysdep_network_setopt)(void *handle, core_sysdep_network_option_t option, void *data);
98     /**
99      * @brief 建立1个网络会话, 作为MQTT/HTTP等协议的底层承载
100      */
101     int32_t (*core_sysdep_network_establish)(void *handle);
102     /**
103      * @brief 从指定的网络会话上读取
104      */
105     int32_t (*core_sysdep_network_recv)(void *handle, uint8_t *buffer, uint32_t len, uint32_t timeout_ms,
106                                         core_sysdep_addr_t *addr);
107     /**
108      * @brief 在指定的网络会话上发送
109      */
110     int32_t (*core_sysdep_network_send)(void *handle, uint8_t *buffer, uint32_t len, uint32_t timeout_ms,
111                                         core_sysdep_addr_t *addr);
112     /**
113      * @brief 销毁1个网络会话
114      */
115     int32_t (*core_sysdep_network_deinit)(void **handle);
116     /**
117      * @brief 随机数生成方法
118      */
119     void (*core_sysdep_rand)(uint8_t *output, uint32_t output_len);
120     /**
121      * @brief 创建互斥锁
122      */
123     void    *(*core_sysdep_mutex_init)(void);
124     /**
125      * @brief 申请互斥锁
126      */
127     void (*core_sysdep_mutex_lock)(void *mutex);
128     /**
129      * @brief 释放互斥锁
130      */
131     void (*core_sysdep_mutex_unlock)(void *mutex);
132     /**
133      * @brief 销毁互斥锁
134      */
135     void (*core_sysdep_mutex_deinit)(void **mutex);
136 } aiot_sysdep_portfile_t;
137 
138 void aiot_sysdep_set_portfile(aiot_sysdep_portfile_t *portfile);
139 aiot_sysdep_portfile_t *aiot_sysdep_get_portfile(void);
140 
141 #if defined(__cplusplus)
142 }
143 #endif
144 
145 #endif
146 
147