概述
基于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;
}