文档中心
DOCUMENT CENTER
Givelink 接入

接入介绍

针对一些带网关型或无法直接连接网络的设备,格物云定义了一套 Givelink 协议。

设备使用透传型通讯模块或网关,将基于 Givelink 协议的数据包,通过 TCP/UDP 与格物云进行交互。

接入方案

#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));