文檔中心
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));