获取代码

gitlab地址: http://****/star-atlas-world/atlas-embedded-sdk
联系人: 林寻

流程以及接口介绍

image.png
其中上图中黄颜色的代码逻辑需要开发者实现.(因为牵扯到存储问题)

设备激活

通过激活URL获取设备凭证

  1. /*
  2. *
  3. * 函数功能:使用激活url注册
  4. *
  5. * 参数:
  6. * url 动态注册的url,从管理控制台获取.
  7. * device_type 设备类型
  8. * device_name 设备名称
  9. * policy 设备凭证信息
  10. * error_msg_buff 错误buff,放回错误信息
  11. * msg_len buff长度
  12. *
  13. * 返回:
  14. * CNIOT_STATUS_CODE 执行结果code
  15. */
  16. CNIOT_STATUS_CODE cniot_atlas_register_byActiveUrl(const char *url,
  17. const char *device_type,
  18. const char *device_name,
  19. cniot_policy_t *policy,
  20. char *error_msg_buff,
  21. int buff_len);

通过局域网mdns能力自发现激活

  1. /*
  2. *
  3. * 函数功能: 使用mdns自发现注册
  4. * 限制条件局域网内部开启注册APP功能的设备
  5. * 参数:
  6. * device_type 设备类型
  7. * device_name 设备名称
  8. * policy 设备凭证
  9. * error_msg_buff 错误buff,可NULL
  10. * msg_len buff长度
  11. * 返回:
  12. * 结果code
  13. */
  14. CNIOT_STATUS_CODE cniot_atlas_auto_register_by_mdns(const char *device_type,
  15. const char *device_name,
  16. cniot_policy_t *policy,
  17. char *error_msg_buff,
  18. int buff_len);

一型一密获取设备凭证

  1. /*
  2. *
  3. * 函数功能:使用一型一密,获取设备信息
  4. * 星图老平台接口,新平台请使用以下两种方式.
  5. * 参数:
  6. * device_type 设备类型
  7. * device_name 设备名称
  8. * type_secret 一型一密
  9. * policy 设备凭证
  10. * error_msg_buff 错误buff
  11. * msg_len buff长度
  12. *
  13. * 返回:
  14. * CNIOT_STATUS_CODE 返回code
  15. */
  16. CNIOT_STATUS_CODE cniot_atlas_query_policy(const char *device_type,
  17. const char *device_name,
  18. const char *type_secret,
  19. cniot_policy_t *policy,
  20. char *error_msg_buff,
  21. int buff_len);

初始化设备资源

前置条件: 获取到设备凭证信息

  1. /*
  2. * 函数功能: 初始化总线资源
  3. * 备注:线程不安全, 必须保证一个线程初始化
  4. * 参数:
  5. * cniot_policy_t policy 地址
  6. * 返回:
  7. * CNIOT_STATUS_CODE
  8. */
  9. CNIOT_STATUS_CODE cniot_atlas_initialize(cniot_policy_t *policy);

注册设备方法回调

注意设备方法体内不能执行长时间方法,会导致超时等问题。
如果要执行耗时操作,需要开发开线程处理。

  1. /*
  2. * 函数功能: 服务注册
  3. * 参数:
  4. * server_name 服务名称, 最大长度128字符
  5. * fun 回调函数
  6. * ptr 参数 可为空
  7. * 返回:
  8. * CNIOT_STATUS_CODE
  9. */
  10. CNIOT_STATUS_CODE atlas_thing_service_register(char *server_name, atlas_service_callback_fun_t fun, void *ptr);

注册设备状态回调

  1. /*
  2. * 函数功能: 监听状态变化信息
  3. * 参数:
  4. * fun callback函数
  5. * user_data 用户数据
  6. * 返回:
  7. * CNIOT_STATUS_CODE
  8. */
  9. CNIOT_STATUS_CODE atlas_register_status_callback(atlas_status_callback_fun_t fun, void *user_data);

事件状态如下:

  1. typedef enum {
  2. CNIOT_EVENT_CONNECTING = 1,
  3. CNIOT_EVENT_CONNECTED = 2,
  4. CNIOT_EVENT_DISCONNECT = 3,
  5. CNIOT_EVENT_RELEASE = 4,
  6. CNIOT_EVENT_EDGE_ERROR = 5,
  7. CNIOT_DNS_RESOLVER_SUCCESS = 6,
  8. CNIOT_DNS_RESOLVER_FAILED = 7,
  9. CNIOT_TCP_SEND_TIMEOUT = 8,
  10. CNIOT_TCP_CONNECT_TIMEOUT = 9,
  11. CNIOT_TCP_OPEN_SOCKET_FAILED = 10,
  12. CNIOT_TCP_SET_SOCKET_OPT_FAILED = 11,
  13. CNIOT_TCP_CONNECT_SOCKET_SUCCESS = 12,
  14. CNIOT_TCP_CONNECT_SOCKET_FAILED = 13,
  15. CNIOT_TSL_HANDSHAKE_SUCCESS = 14,
  16. CNIOT_TSL_HANDSHAKE_FAILED
  17. }CNIOT_EVENT_T;

启动SDK

  1. /*
  2. * 函数功能: 启动星图服务
  3. * 说明: 首先需要调用cniot_atlas_initialize接口
  4. * 参数:
  5. * 返回:
  6. * CNIOT_STATUS_CODE
  7. */
  8. CNIOT_STATUS_CODE cniot_atlas_startup();

物模型操作

事件上报

  1. /*
  2. * 函数功能: 星图物实体事件上报
  3. * 参数:
  4. * event 事件名称
  5. * data 事件参数json 如果没有参数,输入{}
  6. * time uninx 时间戳,单位毫秒
  7. * 返回:
  8. * CNIOT_STATUS_CODE
  9. * 错误码:
  10. * 同上设置接口
  11. */
  12. CNIOT_STATUS_CODE atlas_thing_event_post(const char *event, const char *data, unsigned long long time);

属性上报

  1. /*
  2. * 函数功能: 设备属性上报
  3. * 参数:
  4. * property: json 格式的属性字符
  5. * time : uninx 时间戳,单位毫秒
  6. * 返回:
  7. * CNIOT_STATUS_CODE
  8. * 失败错误码
  9. * CNIOT_STATUS_NOT_INITIALIZE 没有初始化
  10. * CNIOT_STATUS_CONNECTING 正在连接服务器
  11. * CNIOT_STATUS_MQTT_DISCONNECT mqtt连接断开
  12. * CNIOT_STATUS_MQTT_PUBLISH_FAILED mqtt 发送消息失败
  13. * CNIOT_STATUS_BUFFER_OVERFLOW 缓冲区过小
  14. * CNIOT_STATUS_MSG_TIMEOUT 服务调用超时
  15. * CNIOT_STATUS_RSP_NOT_SUCCESS 调用服务出错,请检测云服务
  16. * CNIOT_STATUS_JSON_NOT_FORMAT 返回数据不是个json(可能是数据量超过了缓存)
  17. * CNIOT_STATUS_JSON_NOT_FOUND_KEY json中没有状态key
  18. *
  19. */
  20. CNIOT_STATUS_CODE atlas_thing_post_properties(const char *property, unsigned long long time);

上行服务调用

  1. /*
  2. * 函数功能: 上行服务调用
  3. *
  4. * 参数:
  5. * service 服务名
  6. * method 方法名
  7. * params 参数 json object
  8. * bizKey 业务key
  9. * traceId 链路跟踪Id 不能为NULL 长度不能小于C_MAX_ID_LEN 如果为空会随机生成
  10. * sessionId 会话Id 不能为NULL 长度不能小于C_MAX_ID_LEN rpc应用会话ID,服务端生成
  11. *
  12. * rspBuff 返回数据buff
  13. * rspBuffLen 返回数据长度
  14. *
  15. * 返回:
  16. * CNIOT_STATUS_CODE
  17. * CNIOT_STATUS_CODE_OK 调用成功
  18. * 失败错误码:
  19. * CNIOT_STATUS_NOT_INITIALIZE 没有初始化就调用
  20. * CNIOT_STATUS_MSG_NOT_FOUND service填写错误
  21. * CNIOT_STATUS_NO_MEMORY 内存申请失败,没有内存了
  22. * CNIOT_STATUS_CONNECTING 正在连接服务器...
  23. * CNIOT_STATUS_MQTT_DISCONNECT 与服务器断开连接.
  24. * CNIOT_STATUS_BUFFER_OVERFLOW 缓冲区过小
  25. * CNIOT_STATUS_MSG_TIMEOUT 服务调用超时
  26. * CNIOT_STATUS_RSP_NOT_SUCCESS 调用服务出错,请检测云服务
  27. * CNIOT_STATUS_JSON_NOT_FORMAT 返回数据不是个json(可能是数据量超过了缓存)
  28. * CNIOT_STATUS_JSON_NOT_FOUND_KEY json中没有状态key
  29. */
  30. CNIOT_STATUS_CODE atlas_thing_service_invoking_v4(const char *service,
  31. const char *method,
  32. const char *params,
  33. const char *bizKey,
  34. char *traceId,
  35. char *sessionId,
  36. char *rspBuff,
  37. int rspBuffLen);

停止服务

包括停止SDK和释放资源

停止SDK

  1. /*
  2. * 函数功能: 停止SDK服务
  3. * 说明: 无
  4. * 参数:
  5. * 返回:
  6. * CNIOT_STATUS_CODE
  7. */
  8. CNIOT_STATUS_CODE cniot_atlas_shutdown();

释放资源

  1. /*
  2. * 函数功能: 释放资源
  3. * 备注: 线程不安全,
  4. * 如果模块已经启动,必须先停止(调用cniot_atlas_shutdown)
  5. * 参数:
  6. *
  7. * 返回:
  8. * CNIOT_STATUS_CODE
  9. */
  10. CNIOT_STATUS_CODE cniot_atlas_finalize();

完整实例代码

  1. CNIOT_STATUS_CODE status_callback(void *ptr, CNIOT_EVENT_T event, char *msg) {
  2. printf("--->>> event=%d msg=%s cost_time=%lld\n", event, msg, atlas_boot_uptime() - startup_time);
  3. return CNIOT_STATUS_CODE_OK;
  4. }
  5. CNIOT_STATUS_CODE pushMessageCallBack(void *ptr, const char *parm, int parm_length, char **rsp) {
  6. *rsp = atlas_malloc(64);
  7. atlas_snprintf(*rsp, 64, "{\"result\":\"just for sdk test %llu\"}", atlas_abs_time());
  8. printf("receive %s\n", parm);
  9. return CNIOT_STATUS_CODE_OK;
  10. }
  11. int main() {
  12. char data[8192] = {0};
  13. char msg[8192] = {0};
  14. char deviceName[32] = {"test_device"};
  15. char deviceType[32] = {"LEMO"};
  16. char errorMsg[1024] = {0};
  17. CNIOT_STATUS_CODE ret = CNIOT_STATUS_CODE_OK;
  18. cniot_policy_t policy;
  19. //使用激活码激活,以下激活URL
  20. ret = cniot_atlas_register_byActiveUrl(
  21. "https://zb-devops.loginx.cainiao.com/p/k2Fpz?expire=1637055747522",
  22. deviceType, deviceName, &policy, msg, 1024);
  23. printf("ret=%d %s\n", ret, errorMsg);
  24. if (ret != CNIOT_STATUS_CODE_OK) {
  25. printf("ret=%d\n", ret);
  26. return -1 ;
  27. }
  28. //初始化
  29. ret = cniot_atlas_initialize(&policy);
  30. printf("cniot atlas initalize ret=%x \n", ret);
  31. //通道状态回调
  32. atlas_register_status_callback(status_callback, NULL); //事件状态回调
  33. //注册方法回调, 方法回调需要在物模型配置。
  34. atlas_thing_service_register("pushMessage", pushMessageCallBack, NULL);
  35. //启动sdk
  36. ret = cniot_atlas_startup();
  37. printf("cniot atlas startup ret=%x \n", ret);
  38. // 因为需要链接上,所有等待一段时间进行业务操作
  39. atlas_usleep(6000);
  40. atlas_snprintf(data, 8192, "{\"otaVersion\":\"x.x.x.abc\"}");
  41. //属性上报,属性物模型需要在控制台配置
  42. ret = atlas_thing_post_properties(data, atlas_abs_time());
  43. if (ret != CNIOT_STATUS_CODE_OK) {
  44. printf("post properties failed %d\n", ret);
  45. }
  46. atlas_usleep(3000);
  47. atlas_snprintf(data, 8192, "{\"data\":\"this is a event test\",\"time\":123213213}");
  48. //事件上报,事件物模型需要在控制台配置
  49. ret = atlas_thing_event_post("logReport", data, atlas_abs_time());
  50. if (ret != CNIOT_STATUS_CODE_OK) {
  51. printf("post event failed %d\n", ret);
  52. }
  53. //获取设备属性
  54. ret = atlas_thing_get_properties(&policy, msg, 8192);
  55. if (ret != CNIOT_STATUS_CODE_OK) {
  56. printf("get properties failed %d\n", ret);
  57. } else {
  58. printf("cniot get properties success ret=%x msg=%s\n", ret, msg);
  59. }
  60. return 0;
  61. }

编译调试相关

使用cmake编译,前置条件安装cmake 版本大于 2.6

mkdir build

cmake ../

make

如果软件中已有mbedtls库的,需要将C SDK中的mbedtls库适配到统一库上,两个版本交叉使用会导致各种异常行为

FAQ