更新时间:2024-10-21 GMT+08:00
分享

代码解析

Demo代码如下,具体实现的是模拟电机设备上报数据,SDK获取上报数据做进一步分析处理。如果遇到状态为error,则调用事先在产品模型定义好的设备命令。对于未指定MOTOR_PRODUCT_ID的产品上报的数据将继续上报给云端。

#include "edge.h"

#include <stdio.h>
#include <string.h>
#include <unistd.h>

/*
 * 描述:设置总线消息回调,用于对设备上报的数据进行处理
 * 参数:
 *  input_name:消息总线输入点
 * */
EDGE_RETCODE set_bus_message_cb(const char* input_name)
{
    edge_set_bus_message_cb(input_name);
    printf("set bus message callback with input name: %s\n", input_name);

    return EDGE_SUCCESS;
}

/*
 * 描述:收到设备上报数据的回调处理,样例代码在马达设备状态错误时对马达进行重启
 * 参数:
 *  device_id:设备ID
 *  product_id: 产品ID
 *  body: 上报的数据
 *  body_len: 上报数据的大小
 * */
EDGE_RETCODE on_message_received_cb(const char* device_id, const char* product_id, const char* body, unsigned int body_len)
{
    // 设置发送设备数据的消息总线输出点,取值需在创建应用版本的outputs参数中定义
    char* output_name = "output";

    printf("start send message to output topic: %s\n", output_name);
    printf("body is: %s\nbody len is: %d\n", body, body_len);
    printf("product_id is: %s\n", product_id);
    printf("start processing device.\n");

    // 设置电机设备产品ID
    char* MOTOR_PRODUCT_ID = "product_123";

    if (strcmp(product_id, MOTOR_PRODUCT_ID) == 0)
    {
        //马达设备状态错误时对马达进行重启
        char* error = "error";
        char* is_error = strstr(body, error);

        // 设置默认超时时间
        unsigned int timeout = 5;
        ST_COMMAND command = {0};
        command.object_device_id = device_id;
        command.service_id = "power";
        command.command_name = "restart";

        // 调用设备命令重启
        if (is_error != NULL) edge_call_device_command(&command, timeout);
    }
    else {
        //其他设备数据发送到消息总线
        edge_send_bus_message(output_name, body, body_len);
    }

    printf("process ended.\n");

    return EDGE_SUCCESS;
}

/*
 * 监控APP,检视设备上报的数据,并对设备进行相应的控制
 */

void monitor_app()
{
    // 禁用缓冲区
    setvbuf(stdout, NULL, _IONBF, 0);

    printf("start monitor app\n");

    //初始化sdk,工作路径设置(工作路径下需要含有 /conf  目录(该目录下包含证书等信息))
    edge_init("../code/api_test/workdir");

    ST_MODULE_CBS module_cbs = {0};
    ST_DEVICE_CBS device_cbs = {0};

    module_cbs.pfn_on_message_received_cb = on_message_received_cb;

    // 设置回调函数
    edge_set_callbacks(&module_cbs, &device_cbs);

    printf("SDK start running!\n");

    sleep(1);
    edge_login();

    sleep(1);

    // 接收设备数据的消息总线输入点,取值需在创建应用版本的inputs参数中定义
    char* input_name = "input";
    set_bus_message_cb(input_name);

    // 这里是为了使应用能够长时间运行
    while(1)
    {
        sleep(1000);
    }

    edge_logout();
    sleep(1000);
    edge_destroy();
}


int main()
{
    // 监控app demo
    monitor_app();

    return 0;
}

Demo实现的流程如下:

  1. 通过edge_init初始化工作目录。
  2. 通过edge_set_callbacks设置回调函数。

    Demo中只使用到on_message_received_cb回调函数,只需修改on_message_received_cb即可。

  3. 通过edge_login初始化SDK,包括连接环境变量,连接Hub,订阅Topic,设置回调。
  4. 通过set_bus_message_cb调用edge_set_bus_message_cb,SDK会根据input_name订阅Topic(比如/modules/user_monitor_app/messages/inputs/input,这里user_monitor_app是SDK应用对应的模块id,最后的“input“就是Demo代码里的input_name),这个函数会将on_message_received_cb作为回调函数。
  5. 回调函数on_message_received_cb里调用edge_send_bus_message,将未处理的数据发送回消息总线,设置该函数里的output_name,边缘Hub会订阅类似/modules/user_monitor_app/messages/outputs/output的Topic(这里user_monitor_app是SDK应用对应的模块id,最后的“output“就是Demo代码里的output_name)。
  6. 调用设备命令,只有当设置的MOTOR_PRODUCT_ID的当前上报数据的设备的产品ID吻合,并且显示状态为error时,通过edge_call_device_command调用设备命令将设备重启。
  7. 处理过程结束。

修改Demo里的参数可参考修改代码

相关文档