libsddc
本章将介绍 libsddc 库的使用。
libsddc 使用
如果要使用 libsddc,应用程序需要链接 libsddc.a
静态库,即应用程序的 Makefile
文件 xxx.mk
的 LOCAL_DEPEND_LIB
需要添加 -lsddc
,同时 LOCAL_DEPEND_LIB_PATH
需要添加 -L"$(MSRTOS_BASE_PATH)/libsddc/$(OUTDIR)"
。为了能让应用程序的源文件找到 libsddc 的头文件,LOCAL_INC_PATH
需要添加 -I"$(MSRTOS_BASE_PATH)/libsddc/src"
。
如果使能了数据加密通信,则 LOCAL_DEPEND_LIB
需要添加 -lmbedtls
、-lmbedx509
、-lmbedcrypto
,LOCAL_DEPEND_LIB_PATH
需要添加 -L"$(MSRTOS_BASE_PATH)/mbedtls/$(OUTDIR)"
。
我们推荐使用 cJSON 作为 JSON 的解析库,LOCAL_DEPEND_LIB
需要添加 -lcjson
, LOCAL_DEPEND_LIB_PATH
需要添加 -L"$(MSRTOS_BASE_PATH)/cJSON/$(OUTDIR)"
,LOCAL_INC_PATH
需要添加 -I"$(MSRTOS_BASE_PATH)/cjson/src/cJSON"
。
详细可以参考 libsddc 示例程序的 Makefile libsddc/sddc_examples.mk
文件。
libsddc API
下表展示了 libsddc 相关的 API:
API | 功能 |
---|---|
sddc_create | 创建 SDDC |
sddc_set_uid | 设置唯一 ID |
sddc_set_token | 设置加解密 token(设备密码) |
sddc_set_invite_data | 设置 INVITE 数据 |
sddc_set_report_data | 设置 REPORT 数据 |
sddc_set_on_invite | 设置收到 INVITE 处理函数 |
sddc_set_on_invite_end | 设置 INVITE 完毕后处理函数 |
sddc_set_on_update | 设置收到 UPDATE 处理函数 |
sddc_set_on_edgeros_lost | 设置 EdgerOS 断开链接处理函数 |
sddc_set_on_message_lost | 设置消息 lost 处理函数 |
sddc_set_on_message | 设置收到 MESSAGE 处理函数 |
sddc_set_on_message_ack | 设置收到 MESSAGE ACK 处理函数 |
sddc_set_on_timestamp | 设置收到 TIMESTAMP ACK 处理函数 |
sddc_run | 运行 SDDC |
sddc_send_message | 向指定的 EdgerOS 发送 MESSAGE |
sddc_broadcast_message | 向所有链接的 EdgerOS 发送 MESSAGE |
sddc_send_timestamp_request | 向指定的 EdgerOS 发送 TIMESTAMP 请求 |
sddc_send_update | 向指定的 EdgerOS 发送 UPDATE,用于节点 IP 改变时,通知 EdgerOS |
sddc_broadcast_update | 向所有链接的 EdgerOS 发送 UPDATE,用于节点 IP 改变时,通知 EdgerOS |
sddc_connector_create | 创建一个连接到 EdgerOS 的数据连接器 |
sddc_connector_destroy | 销毁一个数据连接器 |
sddc_connector_fd | 获得数据连接器的文件描述符 |
sddc_connector_put | 发送数据到数据连接器 |
sddc_connector_get | 从数据连接器接收数据 |
sddc_create()
描述 创建 SDDC
函数原型
sddc_t *sddc_create(uint16_t port);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | port | UDP 端口 |
返回值 SDDC 对象指针
注意事项 无
示例 无
sddc_set_uid()
描述 设置 SDDC 的唯一 ID
函数原型
int sddc_set_uid(sddc_t *sddc, const uint8_t *mac_addr);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | mac_addr | MAC 地址(6 个 BYTE 的数组) |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_token()
描述 设置 SDDC 的加解密 token(设备密码)
函数原型
int sddc_set_token(sddc_t *sddc, const char *token);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | token | 加解密 token |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_invite_data()
描述 设置 SDDC 的 INVITE 数据
函数原型
int sddc_set_invite_data(sddc_t *sddc, const char *invite_data, size_t len);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | invite_data | INVITE 数据(JSON 格式) |
[in] | len | INVITE 数据长度 |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例
sddc_set_report_data()
描述 设置 SDDC 的 REPORT 数据
函数原型
int sddc_set_report_data(sddc_t *sddc, const char *report_data, size_t len);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | report_data | REPORT 数据(JSON 格式) |
[in] | len | REPORT 数据长度 |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_on_invite()
描述 设置 SDDC 收到 INVITE 处理函数
函数原型
int sddc_set_on_invite(sddc_t *sddc, sddc_on_invite_t on_invite);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | on_invite | INVITE 处理函数 |
其中 on_invite
的类型如下:
typedef sddc_bool_t (*sddc_on_invite_t)(sddc_t *sddc, const uint8_t *uid, const char *invite_data, size_t len);
SDDC 回调 on_invite
函数时会传入 EdgerOS 的 UID、INVITE 数据和长度。 on_invite
函数返回一个 sddc_bool_t
布尔类型,返回 SDDC_TRUE
意味端设备接受 EdgerOS 的邀请,SDDC_FALSE
意味端设备拒绝 EdgerOS 的邀请。
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_on_invite_end()
描述 设置 SDDC 的 INVITE 完毕后处理函数
函数原型
int sddc_set_on_invite_end(sddc_t *sddc, sddc_on_invite_end_t on_invite_end);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | on_invite_end | INVITE 完毕后处理函数 |
其中 on_invite_end
的类型如下:
typedef sddc_bool_t (*sddc_on_invite_end_t)(sddc_t *sddc, const uint8_t *uid);
SDDC 回调 on_invite_end
函数时会传入 EdgerOS 的 UID。 on_invite_end
函数一般用于向 EdgerOS 报告端设备的当前状态信息。
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_on_update()
描述 设置 SDDC 收到 UPDATE 处理函数
函数原型
int sddc_set_on_update(sddc_t *sddc, sddc_on_update_t on_update);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | on_update | 收到 UPDATE 处理函数 |
其中 on_update
的类型如下:
typedef sddc_bool_t (*sddc_on_update_t)(sddc_t *sddc, const uint8_t *uid, const char *update_data, size_t len);
SDDC 回调 on_update
函数时会传入 EdgerOS 的 UID、UPDATE 数据和长度。
on_update
函数返回一个 sddc_bool_t
布尔类型,返回 SDDC_TRUE
将会给 EdgerOS 发送回应,否则不发送回应。
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_on_edgeros_lost()
描述 设置 EdgerOS 断开链接处理函数
函数原型
int sddc_set_on_edgeros_lost(sddc_t *sddc, sddc_on_edgeros_lost_t on_edgeros_lost);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | on_edgeros_lost | EdgerOS 断开链接处理函数 |
其中 on_edgeros_lost
的类型如下:
typedef void (*sddc_on_edgeros_lost_t)(sddc_t *sddc, const uint8_t *uid);
SDDC 回调 on_edgeros_lost
函数时会传入 EdgerOS 的 UID。
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_on_message_lost()
描述 设置 SDDC 的消息 lost 处理函数
函数原型
int sddc_set_on_message_lost(sddc_t *sddc, sddc_on_message_lost_t on_message_lost);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | on_message_lost | 消息 lost 处理函数 |
其中 on_message_lost
的类型如下:
typedef void (*sddc_on_message_lost_t)(sddc_t *sddc, const uint8_t *uid, uint16_t seqno);
SDDC 回调 on_message_lost
函数时会传入 EdgerOS 的 UID 和 lost 掉的消息序列号。
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_on_message()
描述 设置 SDDC 收到 MESSAGE 处理函数
函数原型
int sddc_set_on_message(sddc_t *sddc, sddc_on_message_t on_message);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | on_message | 收到 MESSAGE 处理函数 |
其中 on_message
的类型如下:
typedef sddc_bool_t (*sddc_on_message_t)(sddc_t *sddc, const uint8_t *uid, const char *message, size_t len);
SDDC 回调 on_message
函数时会传入 EdgerOS 的 UID 和消息数据及长度。如果收到的是一个需要 ACK 的消息,并且 on_message
函数返回 SDDC_TRUE
,SDDC 将会给 EdgerOS 发送 ACK,否则不发送 ACK。
消息数据是 JSON 格式字符串,如果它里面带有 EdgerOS App Id(即带有类型为 Number 的 appid 属性),则说明此消息为 App 会话相关消息,设备端在回复这类消息时,应该在回复里加上 EdgerOS App Id(即加入类型为 Number 的 appid 属性)。 同时如果设备端需要给指定的 EdgerOS App 发送消息,也应该在消息里加上 EdgerOS App Id。
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_on_message_ack()
描述 设置 SDDC 收到 MESSAGE ACK 处理函数
函数原型
int sddc_set_on_message_ack(sddc_t *sddc, sddc_on_message_ack_t on_message_ack);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | on_message_ack | 收到 MESSAGE ACK 处理函数 |
其中 on_message_ack
的类型如下:
typedef void (*sddc_on_message_ack_t)(sddc_t *sddc, const uint8_t *uid, uint16_t seqno);
SDDC 回调 on_message_ack
函数时会传入 EdgerOS 的 UID 和消息的序列号。
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_set_on_timestamp()
描述 设置 SDDC 收到 TIMESTAMP ACK 处理函数
函数原型
int sddc_set_on_timestamp(sddc_t *sddc, sddc_on_timestamp_t on_timestamp);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | timestamp | 收到 TIMESTAMP ACK 处理函数 |
其中 on_timestamp
的类型如下:
typedef void (*sddc_on_timestamp_t)(sddc_t *sddc, const uint8_t *uid, const char *message, size_t len);
SDDC 回调 on_timestamp
函数时会传入 EdgerOS 的 UID 和消息数据及长度。消息数据内容为如下格式的 JSON 字符串:
{
"timestamp": {
"utc": 1652673207934,
"tz": -28800000
}
}
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_run()
描述 运行 SDDC
函数原型
int sddc_run(sddc_t *sddc);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_send_message()
描述 发送 MESSAGE
函数原型
int sddc_send_message(sddc_t *sddc, const uint8_t *uid,
const void *payload, size_t payload_len,
uint8_t retries, sddc_bool_t urgent,
uint16_t *seqno);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | uid | EdgerOS 的唯一 ID |
[in] | payload | 消息数据 |
[in] | payload_len | 消息数据长度 |
[in] | retries | 消息重发次数 |
[in] | urgent | 是否发送紧急消息 |
[out] | seqno | 消息序列号 |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_broadcast_message()
描述 向所有链接的 EdgerOS 发送 MESSAGE
函数原型
int sddc_broadcast_message(sddc_t *sddc,
const void *payload, size_t payload_len,
uint8_t retries, sddc_bool_t urgent,
uint16_t *seqno);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | uid | EdgerOS 的唯一 ID |
[in] | payload | 消息数据 |
[in] | payload_len | 消息数据长度 |
[in] | retries | 消息重发次数 |
[in] | urgent | 是否发送紧急消息 |
[out] | seqno | 消息序列号数组 |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_send_timestamp_request()
描述 向链接的 EdgerOS 发送 TIMESTAMP 请求
函数原型
int sddc_send_timestamp_request(sddc_t *sddc, const uint8_t *uid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | uid | EdgerOS 的唯一 ID,如果为 NULL,则使用已经链接的 EdgerOS 的唯一 ID |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_send_update()
描述 向链接的 EdgerOS 发送 UPDATE 请求,用于节点 IP 改变时,通知 EdgerOS
函数原型
int sddc_send_update(sddc_t *sddc, const uint8_t *uid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | uid | EdgerOS 的唯一 ID |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_broadcast_update()
描述 向所有链接的 EdgerOS 发送 UPDATE 请求,用于节点 IP 改变时,通知 EdgerOS
函数原型
int sddc_broadcast_update(sddc_t *sddc);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_connector_create()
描述 创建一个连接到指定的 EdgerOS 的数据连接器
函数原型
sddc_connector_t *sddc_connector_create(sddc_t *sddc, const uint8_t *uid, uint16_t port, const char *token, sddc_bool_t get_mode);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sddc | SDDC 对象指针 |
[in] | uid | EdgerOS 的唯一 ID |
[in] | port | 端口 |
[in] | token | 数据加解密 token |
[in] | get_mode | 是否为获得数据模式 |
返回值 成功返回 SDDC 数据连接器对象指针,失败返回 NULL
注意事项 无
示例 无
sddc_connector_destroy()
描述 销毁一个数据连接器
函数原型
int sddc_connector_destroy(sddc_connector_t *connector);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | connector | SDDC 数据连接器对象指针 |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_connector_fd()
描述 获得指定数据连接器的通信文件描述符
函数原型
int sddc_connector_fd(sddc_connector_t *connector);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | connector | SDDC 数据连接器对象指针 |
返回值 成功返回 通信文件描述符,失败返回 -1
注意事项 无
示例 无
sddc_connector_put()
描述 发送数据到数据连接器,连接的 EdgerOS 将收到数据
函数原型
int sddc_connector_put(sddc_connector_t *connector, const void *data, size_t len, sddc_bool_t finish);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | connector | SDDC 数据连接器对象指针 |
[in] | data | 需要发送的数据缓冲区指针(finish 时可以为 NULL) |
[in] | len | 需要发送的数据长度(finish 时可以为 0) |
[in] | finish | 是否结束数据传输 |
返回值 成功返回 0,失败返回 -1
注意事项 无
示例 无
sddc_connector_get()
描述 从数据连接器中接收数据
函数原型
ssize_t sddc_connector_get(sddc_connector_t *connector, void **data, sddc_bool_t *finish);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | connector | SDDC 数据连接器对象指针 |
[out] | data | 接收到的数据缓冲区指针 |
[out] | finish | EdgerOS 是否结束了数据传输 |
返回值 成功返回 接收到的数据长度为 0,失败返回 -1
注意事项 无
示例 无
libsddc 示例
#include <ms_rtos.h>
#include "sddc.h"
#include "cJSON.h"
/*
* handle MESSAGE
*/
static sddc_bool_t iot_pi_on_message(sddc_t *sddc, const uint8_t *uid, const char *message, size_t len)
{
cJSON *root = cJSON_Parse(message);
sddc_return_value_if_fail(root, SDDC_TRUE);
/*
* Parse here
*/
char *str = cJSON_Print(root);
sddc_goto_error_if_fail(str);
sddc_printf("iot_pi_on_message: %s\n", str);
cJSON_free(str);
error:
cJSON_Delete(root);
return SDDC_TRUE;
}
/*
* handle MESSAGE ACK
*/
static void iot_pi_on_message_ack(sddc_t *sddc, const uint8_t *uid, uint16_t seqno)
{
}
/*
* handle MESSAGE lost
*/
static void iot_pi_on_message_lost(sddc_t *sddc, const uint8_t *uid, uint16_t seqno)
{
}
/*
* handle EdgerOS lost
*/
static void iot_pi_on_edgeros_lost(sddc_t *sddc, const uint8_t *uid)
{
}
/*
* handle UPDATE
*/
static sddc_bool_t iot_pi_on_update(sddc_t *sddc, const uint8_t *uid, const char *udpate_data, size_t len)
{
cJSON *root = cJSON_Parse(udpate_data);
char *str;
sddc_return_value_if_fail(root, SDDC_FALSE);
/*
* Parse here
*/
str = cJSON_Print(root);
sddc_goto_error_if_fail(str);
sddc_printf("iot_pi_on_update: %s\n", str);
cJSON_free(str);
cJSON_Delete(root);
return SDDC_TRUE;
error:
cJSON_Delete(root);
return SDDC_FALSE;
}
/*
* handle INVITE
*/
static sddc_bool_t iot_pi_on_invite(sddc_t *sddc, const uint8_t *uid, const char *invite_data, size_t len)
{
cJSON *root = cJSON_Parse(invite_data);
char *str;
sddc_return_value_if_fail(root, SDDC_FALSE);
/*
* Parse here
*/
str = cJSON_Print(root);
sddc_goto_error_if_fail(str);
sddc_printf("iot_pi_on_invite: %s\n", str);
cJSON_free(str);
cJSON_Delete(root);
return SDDC_TRUE;
error:
cJSON_Delete(root);
return SDDC_FALSE;
}
/*
* handle the end of INVITE
*/
static sddc_bool_t iot_pi_on_invite_end(sddc_t *sddc, const uint8_t *uid)
{
return SDDC_TRUE;
}
/*
* Handle TIMESTAMP ack
*/
static void iot_pi_on_timestamp(sddc_t *sddc, const uint8_t *uid, const char *message, ms_size_t len)
{
cJSON *root = cJSON_Parse(message);
cJSON *timestamp, *utc, *tz;
char *str;
sddc_return_if_fail(root);
str = cJSON_Print(root);
sddc_goto_error_if_fail(str);
sddc_printf("iot_pi_on_timestamp: %s\n", str);
cJSON_free(str);
timestamp = cJSON_GetObjectItem(root, "timestamp");
if (cJSON_IsObject(timestamp)) {
utc = cJSON_GetObjectItem(timestamp, "utc");
if (cJSON_IsNumber(utc)) {
}
tz = cJSON_GetObjectItem(timestamp, "tz");
if (cJSON_IsNumber(tz)) {
}
}
error:
cJSON_Delete(root);
}
/*
* Create REPORT data
*/
static char *iot_pi_report_data_create(void)
{
cJSON *root;
cJSON *report;
char *str;
root = cJSON_CreateObject();
sddc_return_value_if_fail(root, NULL);
report = cJSON_CreateObject();
sddc_return_value_if_fail(report, NULL);
cJSON_AddItemToObject(root, "report", report);
cJSON_AddStringToObject(report, "name", "IoT Pi");
cJSON_AddStringToObject(report, "type", "device");
cJSON_AddBoolToObject(report, "excl", SDDC_FALSE);
cJSON_AddStringToObject(report, "desc", "翼辉 IoT Pi");
cJSON_AddStringToObject(report, "model", "1");
cJSON_AddStringToObject(report, "vendor", "ACOINFO");
/*
* Add extension here
*/
str = cJSON_Print(root);
sddc_return_value_if_fail(str, NULL);
sddc_printf("REPORT DATA: %s\n", str);
cJSON_Delete(root);
return str;
}
/*
* Create INVITE data
*/
static char *iot_pi_invite_data_create(void)
{
cJSON *root;
cJSON *report;
char *str;
root = cJSON_CreateObject();
sddc_return_value_if_fail(root, NULL);
report = cJSON_CreateObject();
sddc_return_value_if_fail(report, NULL);
cJSON_AddItemToObject(root, "report", report);
cJSON_AddStringToObject(report, "name", "IoT Pi");
cJSON_AddStringToObject(report, "type", "device");
cJSON_AddBoolToObject(report, "excl", SDDC_FALSE);
cJSON_AddStringToObject(report, "desc", "翼辉 IoT Pi");
cJSON_AddStringToObject(report, "model", "1");
cJSON_AddStringToObject(report, "vendor", "ACOINFO");
/*
* Add extension here
*/
str = cJSON_Print(root);
sddc_return_value_if_fail(str, NULL);
sddc_printf("INVITE DATA: %s\n", str);
cJSON_Delete(root);
return str;
}
/*
* IoT Pi time thread
*/
static void iot_pi_time_thread(ms_ptr_t arg)
{
sddc_t *sddc = arg;
while (1) {
ms_thread_sleep_s(5);
sddc_send_timestamp_request(sddc, NULL);
}
}
int main(int argc, char *argv[])
{
struct ifreq ifreq;
int sockfd;
struct sockaddr_in *psockaddrin = (struct sockaddr_in *)&(ifreq.ifr_addr);
sddc_t *sddc;
char *data;
int ret;
/*
* Set network implement
*/
#ifdef SDDC_CFG_NET_IMPL
ret = ms_net_set_impl(SDDC_CFG_NET_IMPL);
sddc_return_value_if_fail(ret == MS_ERR_NONE, -1);
#endif
/*
* Create SDDC
*/
sddc = sddc_create(SDDC_CFG_PORT);
sddc_return_value_if_fail(sddc, -1);
/*
* Set call backs
*/
sddc_set_on_message(sddc, iot_pi_on_message);
sddc_set_on_message_ack(sddc, iot_pi_on_message_ack);
sddc_set_on_message_lost(sddc, iot_pi_on_message_lost);
sddc_set_on_invite(sddc, iot_pi_on_invite);
sddc_set_on_invite_end(sddc, iot_pi_on_invite_end);
sddc_set_on_update(sddc, iot_pi_on_update);
sddc_set_on_edgeros_lost(sddc, iot_pi_on_edgeros_lost);
sddc_set_on_timestamp(sddc, iot_pi_on_timestamp);
/*
* Set token
*/
#if SDDC_CFG_SECURITY_EN > 0
ret = sddc_set_token(sddc, "1234567890");
sddc_return_value_if_fail(ret == 0, -1);
#endif
/*
* Set report data
*/
data = iot_pi_report_data_create();
sddc_return_value_if_fail(data, -1);
sddc_set_report_data(sddc, data, strlen(data));
/*
* Set invite data
*/
data = iot_pi_invite_data_create();
sddc_return_value_if_fail(data, -1);
sddc_set_invite_data(sddc, data, strlen(data));
/*
* Get mac address
*/
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
sddc_return_value_if_fail(sockfd >= 0, -1);
ioctl(sockfd, SIOCGIFHWADDR, &ifreq);
sddc_printf("MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
(ms_uint8_t)ifreq.ifr_hwaddr.sa_data[0],
(ms_uint8_t)ifreq.ifr_hwaddr.sa_data[1],
(ms_uint8_t)ifreq.ifr_hwaddr.sa_data[2],
(ms_uint8_t)ifreq.ifr_hwaddr.sa_data[3],
(ms_uint8_t)ifreq.ifr_hwaddr.sa_data[4],
(ms_uint8_t)ifreq.ifr_hwaddr.sa_data[5]);
/*
* Set uid
*/
sddc_set_uid(sddc, (const ms_uint8_t *)ifreq.ifr_hwaddr.sa_data);
/*
* Get and print ip address
*/
if (ioctl(sockfd, SIOCGIFADDR, &ifreq) == 0) {
char ip[sizeof("255.255.255.255")];
inet_ntoa_r(psockaddrin->sin_addr, ip, sizeof(ip));
sddc_printf("IP addr: %s\n", ip);
} else {
sddc_printf("Failed to get IP address, Wi-Fi AP not online!\n");
}
close(sockfd);
/*
* Create time thread
*/
ret = ms_thread_create("t_time",
iot_pi_time_thread,
sddc,
2048U,
30U,
70U,
MS_THREAD_OPT_USER | MS_THREAD_OPT_REENT_EN,
MS_NULL);
sddc_return_value_if_fail(ret == MS_ERR_NONE, -1);
/*
* SDDC run
*/
while (1) {
sddc_printf("SDDC running...\n");
sddc_run(sddc);
sddc_printf("SDDC quit!\n");
}
/*
* Destroy SDDC
*/
sddc_destroy(sddc);
return 0;
}