获取代码
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;
//使用激活码激活,以下激活URL
ret = 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);
//启动sdk
ret = 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库适配到统一库上,两个版本交叉使用会导致各种异常行为。