libsddc

更新时间:
2023-08-09
下载文档

libsddc

本章将介绍 libsddc 库的使用。

libsddc 使用

如果要使用 libsddc,应用程序需要链接 libsddc.a 静态库,即应用程序的 Makefile 文件 xxx.mkLOCAL_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-lmbedcryptoLOCAL_DEPEND_LIB_PATH 需要添加 -L"$(MSRTOS_BASE_PATH)/mbedtls/$(OUTDIR)"

我们推荐使用 cJSON 作为 JSON 的解析库,LOCAL_DEPEND_LIB 需要添加 -lcjsonLOCAL_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]portUDP 端口
  • 返回值 SDDC 对象指针

  • 注意事项

  • 示例

sddc_set_uid()

  • 描述 设置 SDDC 的唯一 ID

  • 函数原型

int sddc_set_uid(sddc_t *sddc, const uint8_t *mac_addr);
  • 参数
输入/输出参数描述
[in]sddcSDDC 对象指针
[in]mac_addrMAC 地址(6 个 BYTE 的数组)
  • 返回值 成功返回 0,失败返回 -1

  • 注意事项

  • 示例

sddc_set_token()

  • 描述 设置 SDDC 的加解密 token(设备密码)

  • 函数原型

int sddc_set_token(sddc_t *sddc, const char *token);
  • 参数
输入/输出参数描述
[in]sddcSDDC 对象指针
[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]sddcSDDC 对象指针
[in]invite_dataINVITE 数据(JSON 格式)
[in]lenINVITE 数据长度
  • 返回值 成功返回 0,失败返回 -1

  • 注意事项

  • 示例

sddc_set_report_data()

  • 描述 设置 SDDC 的 REPORT 数据

  • 函数原型

int sddc_set_report_data(sddc_t *sddc, const char *report_data, size_t len);
  • 参数
输入/输出参数描述
[in]sddcSDDC 对象指针
[in]report_dataREPORT 数据(JSON 格式)
[in]lenREPORT 数据长度
  • 返回值 成功返回 0,失败返回 -1

  • 注意事项

  • 示例

sddc_set_on_invite()

  • 描述 设置 SDDC 收到 INVITE 处理函数

  • 函数原型

int sddc_set_on_invite(sddc_t *sddc, sddc_on_invite_t on_invite);
  • 参数
输入/输出参数描述
[in]sddcSDDC 对象指针
[in]on_inviteINVITE 处理函数

其中 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]sddcSDDC 对象指针
[in]on_invite_endINVITE 完毕后处理函数

其中 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]sddcSDDC 对象指针
[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]sddcSDDC 对象指针
[in]on_edgeros_lostEdgerOS 断开链接处理函数

其中 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]sddcSDDC 对象指针
[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]sddcSDDC 对象指针
[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]sddcSDDC 对象指针
[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]sddcSDDC 对象指针
[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]sddcSDDC 对象指针
  • 返回值 成功返回 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]sddcSDDC 对象指针
[in]uidEdgerOS 的唯一 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]sddcSDDC 对象指针
[in]uidEdgerOS 的唯一 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]sddcSDDC 对象指针
[in]uidEdgerOS 的唯一 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]sddcSDDC 对象指针
[in]uidEdgerOS 的唯一 ID
  • 返回值 成功返回 0,失败返回 -1

  • 注意事项

  • 示例

sddc_broadcast_update()

  • 描述 向所有链接的 EdgerOS 发送 UPDATE 请求,用于节点 IP 改变时,通知 EdgerOS

  • 函数原型

int sddc_broadcast_update(sddc_t *sddc);
  • 参数
输入/输出参数描述
[in]sddcSDDC 对象指针
  • 返回值 成功返回 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]sddcSDDC 对象指针
[in]uidEdgerOS 的唯一 ID
[in]port端口
[in]token数据加解密 token
[in]get_mode是否为获得数据模式
  • 返回值 成功返回 SDDC 数据连接器对象指针,失败返回 NULL

  • 注意事项

  • 示例

sddc_connector_destroy()

  • 描述 销毁一个数据连接器

  • 函数原型

int sddc_connector_destroy(sddc_connector_t *connector);
  • 参数
输入/输出参数描述
[in]connectorSDDC 数据连接器对象指针
  • 返回值 成功返回 0,失败返回 -1

  • 注意事项

  • 示例

sddc_connector_fd()

  • 描述 获得指定数据连接器的通信文件描述符

  • 函数原型

int sddc_connector_fd(sddc_connector_t *connector);
  • 参数
输入/输出参数描述
[in]connectorSDDC 数据连接器对象指针
  • 返回值 成功返回 通信文件描述符,失败返回 -1

  • 注意事项

  • 示例

sddc_connector_put()

  • 描述 发送数据到数据连接器,连接的 EdgerOS 将收到数据

  • 函数原型

int sddc_connector_put(sddc_connector_t *connector, const void *data, size_t len, sddc_bool_t finish);
  • 参数
输入/输出参数描述
[in]connectorSDDC 数据连接器对象指针
[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]connectorSDDC 数据连接器对象指针
[out]data接收到的数据缓冲区指针
[out]finishEdgerOS 是否结束了数据传输
  • 返回值 成功返回 接收到的数据长度为 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;
}

文档内容是否对您有所帮助?
有帮助
没帮助