Givelink 接入
接入介绍
针对一些带网关型或无法直接连接网络的设备,格物云定义了一套 Givelink 协议。
设备使用透传型通讯模块或网关,将基于 Givelink 协议的数据包,通过 TCP/UDP 与格物云进行交互。
接入方案
初始化 Givelink
#include "givelink.h"
char product_key[] = "you_product_key";
char device_token[] = "you_device_token";
givelink_init(product_key, device_token);
givelink_t * data = givelink_new();
uint16_t id = 0;接收数据包
通过 givelink_recv 来接收来自 uart/tcp/udp/bluetooth 的数据;
uint8_t payload[200];
uint16_t len = 0;
while(true) {
// read from uart or tcp or udp or bluetooth or others
uint8_t c = some_read();
if (givelink_recv(payload, &len, c)) {
break;
}
}处理接收到的数据包
当接收到数据包后,使用 givelink_from_binary 进行处理。
givelink_from_binary(data, payload, len);注册设备
SDK 需要注册来获取地址码
发送 AUTHREQ 数据包,成功后接收到 AUTHRES 数据包,失败接收到 ERROR 数据包。
if (!givelink_authed()) {
givelink_reset(data);
givelink_set_type(data, AUTHREQ);
givelink_to_binary(data, payload);
// write to uart or tcp or udp or bluetooth or others
some_write(payload, givelink_get_length(data));
while(true) {
// read from uart or tcp or udp or bluetooth or others
uint8_t c = some_read();
if (givelink_recv(payload, &len, c)) {
givelink_from_binary(data, payload, len);
if (data -> type == AUTHRES) {
uint8_t addr = data -> data;
break;
}
if (data -> type == ERROR) {
// do error
break;
}
}
}
}处理请求数据包
当接收到 REQUEST 数据包, 必须反馈 RESPONSE 数据包
if (data -> type == REQUEST) {
givelink_reset(data);
givelink_set_type(data, RESPONSE);
givelink_set_data(data, "{\"\result": \"OK\"}", 16);
givelink_to_binary(data, payload);
// write to uart or tcp or udp or bluetooth or others
some_write(payload, givelink_get_length(data));
}发布实时数据
发送 TELEMETRY 数据包,成功后接收到 SUCCESS 数据包,失败接收到 ERROR 数据包。
id ++;
givelink_reset(data);
givelink_set_id(data, id);
givelink_set_type(data, TELEMETRY);
givelink_set_data(data, "{\"temperature\": 20.7}", 21);
givelink_to_binary(data, payload);
// write to uart or tcp or udp or bluetooth or others
some_write(payload, givelink_get_length(data));发布实时属性
发送 ATTRIBUTE 数据包,成功后接收到 SUCCESS 数据包,失败接收到 ERROR 数据包。
id ++;
givelink_reset(data);
givelink_set_id(data, id);
givelink_set_type(data, ATTRIBUTE);
givelink_set_data(data, "{\"switch_1_state\": true}", 24);
givelink_to_binary(data, payload);
// write to uart or tcp or udp or bluetooth or others
some_write(payload, givelink_get_length(data));发布心跳包
发送 PING 数据包,成功后接收到 SUCCESS 数据包,失败接收到 ERROR 数据包。
id ++;
givelink_reset(data);
givelink_set_id(data, id);
givelink_set_type(data, PING);
givelink_to_binary(data, payload);
// write to uart or tcp or udp or bluetooth or others
some_write(payload, givelink_get_length(data));