获取代码
gitlab地址: http://****/star-atlas-world/atlas-embedded-sdk
联系人: 林寻
流程以及接口介绍

其中上图中黄颜色的代码逻辑需要开发者实现.(因为牵扯到存储问题)
设备激活
通过激活URL获取设备凭证
/*** 函数功能:使用激活url注册** 参数:* url 动态注册的url,从管理控制台获取.* device_type 设备类型* device_name 设备名称* policy 设备凭证信息* error_msg_buff 错误buff,放回错误信息* msg_len buff长度** 返回:* CNIOT_STATUS_CODE 执行结果code*/CNIOT_STATUS_CODE cniot_atlas_register_byActiveUrl(const char *url,const char *device_type,const char *device_name,cniot_policy_t *policy,char *error_msg_buff,int buff_len);
通过局域网mdns能力自发现激活
/*** 函数功能: 使用mdns自发现注册* 限制条件局域网内部开启注册APP功能的设备* 参数:* device_type 设备类型* device_name 设备名称* policy 设备凭证* error_msg_buff 错误buff,可NULL* msg_len buff长度* 返回:* 结果code*/CNIOT_STATUS_CODE cniot_atlas_auto_register_by_mdns(const char *device_type,const char *device_name,cniot_policy_t *policy,char *error_msg_buff,int buff_len);
一型一密获取设备凭证
/*** 函数功能:使用一型一密,获取设备信息* 星图老平台接口,新平台请使用以下两种方式.* 参数:* device_type 设备类型* device_name 设备名称* type_secret 一型一密* policy 设备凭证* error_msg_buff 错误buff* msg_len buff长度** 返回:* CNIOT_STATUS_CODE 返回code*/CNIOT_STATUS_CODE cniot_atlas_query_policy(const char *device_type,const char *device_name,const char *type_secret,cniot_policy_t *policy,char *error_msg_buff,int buff_len);
初始化设备资源
前置条件: 获取到设备凭证信息
/** 函数功能: 初始化总线资源* 备注:线程不安全, 必须保证一个线程初始化* 参数:* cniot_policy_t policy 地址* 返回:* CNIOT_STATUS_CODE*/CNIOT_STATUS_CODE cniot_atlas_initialize(cniot_policy_t *policy);
注册设备方法回调
注意设备方法体内不能执行长时间方法,会导致超时等问题。
如果要执行耗时操作,需要开发开线程处理。
/** 函数功能: 服务注册* 参数:* server_name 服务名称, 最大长度128字符* fun 回调函数* ptr 参数 可为空* 返回:* CNIOT_STATUS_CODE*/CNIOT_STATUS_CODE atlas_thing_service_register(char *server_name, atlas_service_callback_fun_t fun, void *ptr);
注册设备状态回调
/** 函数功能: 监听状态变化信息* 参数:* fun callback函数* user_data 用户数据* 返回:* CNIOT_STATUS_CODE*/CNIOT_STATUS_CODE atlas_register_status_callback(atlas_status_callback_fun_t fun, void *user_data);
事件状态如下:
typedef enum {CNIOT_EVENT_CONNECTING = 1,CNIOT_EVENT_CONNECTED = 2,CNIOT_EVENT_DISCONNECT = 3,CNIOT_EVENT_RELEASE = 4,CNIOT_EVENT_EDGE_ERROR = 5,CNIOT_DNS_RESOLVER_SUCCESS = 6,CNIOT_DNS_RESOLVER_FAILED = 7,CNIOT_TCP_SEND_TIMEOUT = 8,CNIOT_TCP_CONNECT_TIMEOUT = 9,CNIOT_TCP_OPEN_SOCKET_FAILED = 10,CNIOT_TCP_SET_SOCKET_OPT_FAILED = 11,CNIOT_TCP_CONNECT_SOCKET_SUCCESS = 12,CNIOT_TCP_CONNECT_SOCKET_FAILED = 13,CNIOT_TSL_HANDSHAKE_SUCCESS = 14,CNIOT_TSL_HANDSHAKE_FAILED}CNIOT_EVENT_T;
启动SDK
/** 函数功能: 启动星图服务* 说明: 首先需要调用cniot_atlas_initialize接口* 参数:* 返回:* CNIOT_STATUS_CODE*/CNIOT_STATUS_CODE cniot_atlas_startup();
物模型操作
事件上报
/** 函数功能: 星图物实体事件上报* 参数:* event 事件名称* data 事件参数json 如果没有参数,输入{}* time uninx 时间戳,单位毫秒* 返回:* CNIOT_STATUS_CODE* 错误码:* 同上设置接口*/CNIOT_STATUS_CODE atlas_thing_event_post(const char *event, const char *data, unsigned long long time);
属性上报
/** 函数功能: 设备属性上报* 参数:* property: json 格式的属性字符* time : uninx 时间戳,单位毫秒* 返回:* CNIOT_STATUS_CODE* 失败错误码* CNIOT_STATUS_NOT_INITIALIZE 没有初始化* CNIOT_STATUS_CONNECTING 正在连接服务器* CNIOT_STATUS_MQTT_DISCONNECT mqtt连接断开* CNIOT_STATUS_MQTT_PUBLISH_FAILED mqtt 发送消息失败* CNIOT_STATUS_BUFFER_OVERFLOW 缓冲区过小* CNIOT_STATUS_MSG_TIMEOUT 服务调用超时* CNIOT_STATUS_RSP_NOT_SUCCESS 调用服务出错,请检测云服务* CNIOT_STATUS_JSON_NOT_FORMAT 返回数据不是个json(可能是数据量超过了缓存)* CNIOT_STATUS_JSON_NOT_FOUND_KEY json中没有状态key**/CNIOT_STATUS_CODE atlas_thing_post_properties(const char *property, unsigned long long time);
上行服务调用
/** 函数功能: 上行服务调用** 参数:* service 服务名* method 方法名* params 参数 json object* bizKey 业务key* traceId 链路跟踪Id 不能为NULL 长度不能小于C_MAX_ID_LEN 如果为空会随机生成* sessionId 会话Id 不能为NULL 长度不能小于C_MAX_ID_LEN rpc应用会话ID,服务端生成** rspBuff 返回数据buff* rspBuffLen 返回数据长度** 返回:* CNIOT_STATUS_CODE* CNIOT_STATUS_CODE_OK 调用成功* 失败错误码:* CNIOT_STATUS_NOT_INITIALIZE 没有初始化就调用* CNIOT_STATUS_MSG_NOT_FOUND service填写错误* CNIOT_STATUS_NO_MEMORY 内存申请失败,没有内存了* CNIOT_STATUS_CONNECTING 正在连接服务器...* CNIOT_STATUS_MQTT_DISCONNECT 与服务器断开连接.* CNIOT_STATUS_BUFFER_OVERFLOW 缓冲区过小* CNIOT_STATUS_MSG_TIMEOUT 服务调用超时* CNIOT_STATUS_RSP_NOT_SUCCESS 调用服务出错,请检测云服务* CNIOT_STATUS_JSON_NOT_FORMAT 返回数据不是个json(可能是数据量超过了缓存)* CNIOT_STATUS_JSON_NOT_FOUND_KEY json中没有状态key*/CNIOT_STATUS_CODE atlas_thing_service_invoking_v4(const char *service,const char *method,const char *params,const char *bizKey,char *traceId,char *sessionId,char *rspBuff,int rspBuffLen);
停止服务
停止SDK
/** 函数功能: 停止SDK服务* 说明: 无* 参数:* 返回:* CNIOT_STATUS_CODE*/CNIOT_STATUS_CODE cniot_atlas_shutdown();
释放资源
/** 函数功能: 释放资源* 备注: 线程不安全,* 如果模块已经启动,必须先停止(调用cniot_atlas_shutdown)* 参数:** 返回:* CNIOT_STATUS_CODE*/CNIOT_STATUS_CODE cniot_atlas_finalize();
完整实例代码
CNIOT_STATUS_CODE status_callback(void *ptr, CNIOT_EVENT_T event, char *msg) {printf("--->>> event=%d msg=%s cost_time=%lld\n", event, msg, atlas_boot_uptime() - startup_time);return CNIOT_STATUS_CODE_OK;}CNIOT_STATUS_CODE pushMessageCallBack(void *ptr, const char *parm, int parm_length, char **rsp) {*rsp = atlas_malloc(64);atlas_snprintf(*rsp, 64, "{\"result\":\"just for sdk test %llu\"}", atlas_abs_time());printf("receive %s\n", parm);return CNIOT_STATUS_CODE_OK;}int main() {char data[8192] = {0};char msg[8192] = {0};char deviceName[32] = {"test_device"};char deviceType[32] = {"LEMO"};char errorMsg[1024] = {0};CNIOT_STATUS_CODE ret = CNIOT_STATUS_CODE_OK;cniot_policy_t policy;//使用激活码激活,以下激活URLret = cniot_atlas_register_byActiveUrl("https://zb-devops.loginx.cainiao.com/p/k2Fpz?expire=1637055747522",deviceType, deviceName, &policy, msg, 1024);printf("ret=%d %s\n", ret, errorMsg);if (ret != CNIOT_STATUS_CODE_OK) {printf("ret=%d\n", ret);return -1 ;}//初始化ret = cniot_atlas_initialize(&policy);printf("cniot atlas initalize ret=%x \n", ret);//通道状态回调atlas_register_status_callback(status_callback, NULL); //事件状态回调//注册方法回调, 方法回调需要在物模型配置。atlas_thing_service_register("pushMessage", pushMessageCallBack, NULL);//启动sdkret = cniot_atlas_startup();printf("cniot atlas startup ret=%x \n", ret);// 因为需要链接上,所有等待一段时间进行业务操作atlas_usleep(6000);atlas_snprintf(data, 8192, "{\"otaVersion\":\"x.x.x.abc\"}");//属性上报,属性物模型需要在控制台配置ret = atlas_thing_post_properties(data, atlas_abs_time());if (ret != CNIOT_STATUS_CODE_OK) {printf("post properties failed %d\n", ret);}atlas_usleep(3000);atlas_snprintf(data, 8192, "{\"data\":\"this is a event test\",\"time\":123213213}");//事件上报,事件物模型需要在控制台配置ret = atlas_thing_event_post("logReport", data, atlas_abs_time());if (ret != CNIOT_STATUS_CODE_OK) {printf("post event failed %d\n", ret);}//获取设备属性ret = atlas_thing_get_properties(&policy, msg, 8192);if (ret != CNIOT_STATUS_CODE_OK) {printf("get properties failed %d\n", ret);} else {printf("cniot get properties success ret=%x msg=%s\n", ret, msg);}return 0;}
编译调试相关
使用cmake编译,前置条件安装cmake 版本大于 2.6
mkdir build
cmake ../
make
如果软件中已有mbedtls库的,需要将C SDK中的mbedtls库适配到统一库上,两个版本交叉使用会导致各种异常行为。
