概述

基于Linux 的SDK主要完成对小米手环广播数据的解析和华米云之间的交互,以实现ID识别、位置检测以及运动步数读取等功能。

SDK需运行在基于Linux内核的操作系统上,SDK最终封装为动态链接库文件(.so),并提供相关函数接口给第三方调用。第三方需要有自己的蓝牙设备来扫描手环的广播数据并输入到SDK中,第三方、SDK、华米云之间的交互如下图所示:

依赖

第三方开发者需要提供以下工具以编译出所需的SDK:

  • 交叉编译工具链 (e.g. mips-unkonw-linux-uclibc-gcc )

  • 交叉编译开发环境 (e.g. Ubuntu 12.04.5 LTS )

  • SDK依赖的函数库 (e.g. libcurl.so libjson-c.so )

SDK需要以下函数库的支持:

  • libcurl
  • json-c
  • pthread
  • openssl

确认CURL 是否支持https 协议: #curl-config --protocols

配置文件和LOG文件

SDK会在本地当前目录生成 “hbeaconservice.config” 的 配置文件,“年-月-日.log” 的日志文件。

SDK功能设计

主要数据结构

1. 状态代码:每次操作返回的代码

typedef enum {
    HBeaconStatusOk = 0,
    HBeaconError,
    HBeaconErrorObjNull,
    HBeaconErrorCurlInit,
    HBeaconErrorMalloc,
    HBeaconErrorInitLen,
    HBeaconErrorThread,
    HBeaconErrorNOTAUTH,
    HBeaconErrorDataFormat,
    HBeaconErrorWhiteList,
    HBeaconErrorAuth,
    HBeaconErrorNoCacheMem,
    HBeaconStatusDataCached,
    HBeaconErrorJson,
} HBeaconStatusCode;

2. 数据包类型:

typedef enum {
    HBeaconAdvDateType = 0, // 广播包
    HBeaconScanRspDataType = 4, // 扫描响应包
} HBeaconAdvPacketType;

3. 解析出的数据

typedef struct _hbeacon_data{
    uint8_t openID[128]; //open id
    uint32_t steps;   // 实时步数
    uint8_t userStatus; //用户状态
}HBeaconData;

4. 白名单更新策略

typedef enum{
    UpdateManually, //手动更新
    UpdateAuto1m, //自动更新每1min
    UpdateAuto5m,
    UpdateAuto10m,
    UpdateAuto60m,
}HBeaconWLUpdatePolicy;

主要函数指针

1. SDK实例:

typedef struct _hbeacon_service {
        ParseData_t parseData;
        AddtoWhiteList_t addtoWhiteList;
        UpdateWhiteList_t updateWhiteList;
} HBeaconService;

1. 处理数据:

typedef HBeaconStatusCode (*ParseData_t)(HBeaconAdvPacketType type,
                    uint8_t length,
                    uint8_t rawdata[0],
                    uint8_t macAddr[6]);

2. 添加白名单:

typedef HBeaconStatusCode (*AddtoWhiteList_t)(
                        uint8_t openidlen, 
                        uint8_t openid[0],
                        uint16_t authtime);

3. 更新白名单:

typedef HBeaconStatusCode (*UpdateWhiteList_t)(
                        uint8_t openidlen, 
                        uint8_t openid[0],
                        uint16_t authtime);

主要函数接口

1. 初始化HbeaconScanService 服务

HBeaconStatusCode HBeaconServiceInit(HBeaconService *service,
                uint8_t sdkid[0],  //SDK ID
                uint8_t username[0], //用户名
                uint8_t passwd[0], //密码
                HBeaconWLUpdatePolicy policy, //更新策略
                void (*onStatus)(uint8_t,uint8_t*), //SDK 状态回调函数 
                void (*onData)(HBeaconData *data));// SDK 数据回调函数

2. 关闭HBeaconScanService服务:

HBeaconStatus HBeaconScanServiceShutdown(HBeaconScanService *service);

使用示例

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <stdbool.h>
#include "hbeaconservice.h"


#define USER "xxxxxxxxxxxxxx"  
#define PSW "xxxxxxxxxxxxxxx"  


void onstatus(uint8_t code,uint8_t *message)
{
      printf("status back code :%d \t message:%s\n",code ,message);
}

void ondata(HBeaconData *data)
{
    uint8_t openID[128];    
    memcpy(openID,data->openID,128);

    printf("openid:%s\n",openID);
    printf("steps:%d\n",data->steps);
    printf("userstatus:%d\n",data->userStatus);
}


uint8_t adv1[31] = {0x02,0x01,0x06,0x1b,0xff,0x57,0x01,0x00,0x51,0xa1,0xa9,0x3f,0x09,0xd6,0xb5,0x7a,0x9a,0x33,0xad,0xaa,0x48,0x47,0xaa,0xcf,0xff,0x88,0x0f,0x10,0x45,0x6d,0x55};
uint8_t adv2[31] = {0x05,0x09,0x4d,0x49,0x31,0x53,0x05,0x02,0xe0,0xfe,0xe7,0xfe,0x07,0x16,0xe0,0xfe,0xc3,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t mac[6] = {0x88,0x0f,0x10,0x45,0x6d,0x55};


int main()
{

    printf("==============THIS IS A TEST CASE===============\n\n");


    uint8_t user[] = USER;
    uint8_t passwd[] = PSW;
    HBeaconService service;
    uint8_t *sdkid = "210235A1PRC161000536-1\0"; 

    HBeaconStatusCode status =  HBeaconServiceInit(&service,sdkid,user,passwd,UpdateAuto1m,onstatus,ondata);
    printf("service init code:\t%d \n",status);

    if(status != HBeaconStatusOk) return 0;

    for(int i=0 ; i < 50; i++)
    {
        status =  service.parseData(HBeaconAdvDataType,31,adv1,mac);
        printf("=============process code:\t%d\n",status);

        printf("\n\n\n");
        status =  service.parseData(HBeaconScanRspDataType,31,adv2,mac);
        printf("=============process code:\t%d\n",status);
    }
    while(1);
    HBeaconServiceShutdown(&service);
    return 0;
}

results matching ""

    No results matching ""