IoT边缘 IoTEdge
IoT边缘 IoTEdge
- 最新动态
- 产品介绍
- 快速入门
- 用户指南
- 开发指南
- 最佳实践
- API参考
- SDK参考
- 场景代码示例
-
常见问题
- 概念相关
-
节点管理
- 安装专业版节点异常如何处理?
- 安装专业版节点,执行安装命令时失败,一直提示“edgedaemon not found"?
- 安装专业版节点失败,提示“edge_core has existed”,该如何处理?
- 专业版节点所在机器断网/断电一段时间后恢复,节点模块一直处于“部署中”怎么处理?
- 专业版节点欠费充值后,部署、升级模块仍然报错?
- MQTT设备无法接入边缘节点如何处理?专业版节点所在机器断网/断电一段时间后恢复,节点模块一直处于“部署中”怎么处理?
- 误删除IoTDA上的edge_node/modbus_server产品后,在边缘服务创建节点/添加Modbus设备失败,该怎么处理?
- 边缘节点离线排查指南
- 修改专业版(Docker)或基础版节点的云端日志级别,但没有生效?
- ubuntu系统下节点shell命令兼容性导致的安装失败
- 子设备管理
- 应用管理
- 账号与权限
- Module-SDK
- 视频帮助
- 文档下载
- 通用参考
本文导读
展开导读
链接复制成功!
C版
SDK获取和安装
1. 安装cmake开发环境。
通过命令安装,也可以手动下载。
华为云C SDK支持cmake 3.9.5 及其以上版本。
2. 使用CLion创建工程。
3. 下载ModuleSDK。
4. 开发代码
开发数据处理的代码示例,详细说明请参考开发应用集成ModuleSDK-C进行数据处理。
Demo实现的流程如下:
- 通过edge_init初始化工作目录。
- 通过edge_set_callbacks设置回调函数。
- Demo中只使用到on_message_received_cb回调函数,只需修改on_message_received_cb即可。
- 通过edge_login初始化SDK,包括连接环境变量,连接Hub,订阅Topic,设置回调。
- 通过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作为回调函数。
- 回调函数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)。
- 调用设备命令,只有当设置的MOTOR_PRODUCT_ID的当前上报数据的设备的产品ID吻合,并且显示状态为error时,通过edge_call_device_command调用设备命令将设备重启。
- 处理过程结束。
#include "edge.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/*
* 描述:收到设备上报数据的回调处理,样例代码在马达设备状态错误时对马达进行重启
* 参数:
* body:收到的消息,body格式
* {
* "device_id":"device_id",
* "product_id":"product_id",
* "services":[{
* "service_id":"service_id",
* "properties":{},
* "event_time":"12211"
* }]
* }
* body_len: 长度
* */
EDGE_RETCODE on_message_received_cb(const char* body, unsigned int body_len)
{
// 设置发送设备数据的消息总线输出点,取值需在创建应用版本的outputs参数中定义
char* output_name = "output";
printf("receive message: %s\n", body);
printf("start send message to output topic: %s\n", output_name);
char* product_id = ""; // 从body中获取
// 设置电机设备产品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 = 5000;
ST_COMMAND command = {0};
command.object_device_id = "device_id_001";
command.service_id = "power";
command.command_name = "restart";
command.paras = "my test paras";
// 调用设备命令重启
if (is_error != NULL)
{
ST_COMMAND_RSP* cmd_response = NULL;
int ret = edge_call_device_command(&command, timeout, &cmd_response);
if (ret == EDGE_SUCCESS && cmd_response) {
printf("Command success! result_code: %d, response_name: %s\n", cmd_response->result_code,cmd_response->response_name);
if (cmd_response->paras) {
// 直接打印原始 JSON 字符串
printf("Raw JSON Paras: %s\n", cmd_response->paras);
/*
// 按需解析为 cJSON 对象
cJSON* paras_json = cJSON_Parse(cmd_response->paras);
if (paras_json) {
cJSON* result = cJSON_GetObjectItem(paras_json, "result");
if (cJSON_IsString(result)) {
printf("Result from paras: %s\n", result->valuestring);
}
cJSON_Delete(paras_json);
}*/
}
edge_free_command_rsp(cmd_response); // 记得使用后释放,否则内存泄漏
}
}
}
else {
//其他设备数据发送到消息总线
edge_send_bus_message(output_name, body, body_len);
}
printf("process ended.\n");
return EDGE_SUCCESS;
}
/*
* 描述:设置总线消息回调,用于对设备上报的数据进行处理
* 参数:
* input_name:消息总线输入点
* */
EDGE_RETCODE set_bus_message_cb(const char* input_name)
{
edge_set_bus_message_cb(input_name, on_message_received_cb);
printf("set bus message callback with input name: %s\n", input_name);
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};
// 设置回调函数
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;
}