C SDK V1.x版开发指南

更新时间:

LinkFace SDK封装了设备与物联网云平台的通讯协议,实现了人员信息增删查,人脸信息增删查和人脸检测/识别事件上云等功能。SDK采用C语言开发,对外提供静态库和动态库版本。

版本历史

详见发布记录

SDK头文件

源码如下:

#ifndef __LINKFACE_H_V1__
#define __LINKFACE_H_V1__

#include <stdint.h>

#ifdef __cplusplus
extern "C"
{
#endif

/// 人员角色。
typedef enum AliPersonRole {
    /*! 未知。 */
    ALI_PERSON_ROLE_UNKNOWN = -2,

    /*! 所有角色。 */
    ALI_PERSON_ROLE_ALL = -1,

    /*! 普通人员。 */
    ALI_PERSON_ROLE_NORMAL = 0,

    /*! 白名单人员。 */
    ALI_PERSON_ROLE_WHITE = 1,

    /*! 黑名单人员。 */
    ALI_PERSON_ROLE_BLACK = 2,

    /*! 非普通人员。 */
    ALI_PERSON_ROLE_NOT_NORMAL = 3,

    /*! 非白名单人员。 */
    ALI_PERSON_ROLE_NOT_WHITE = 4,

    /*! 非黑名单人员。 */
    ALI_PERSON_ROLE_NOT_BLACK = 5
} AliPersonRole;

/*注册人脸需要的字段*/
struct AliPerson {
    /*! 人员ID。 */
    char id[64];

    /*! 人员姓名。 */
    char name[1024];

    /*! 人员角色。 */
    enum AliPersonRole role;

    /*! 人脸图片数据大小。单位:字节。 */
    int faceimg_size;

    /*! 人脸图像数据。 */
    unsigned char *faceimg;

    /*! 人脸特征数据 */
    unsigned char **face_feature;

    /*! 人脸特征数据个数 */
    int face_feature_size;

    /*! 当wg_card_id为0时,使用此字段作为韦根门禁卡号 */
    int64_t long_card_id;

    /*! 身份证号码 */
    char id_card[36];

    /*! 有效期起始时间。从1970年1月1日0时0分0秒到截止时间的秒数(0表示不使用)。 */
    unsigned int term_start;

    /*! 有效期截止时间。从1970年1月1日0时0分0秒到截止时间的秒数(-1表示无限期,0表示永久失效)。 */
    unsigned int term;
};

/// 人脸比对状态。
enum AliMatchStatus {
    /*! 比对失败。 */
    ALI_MATCH_STATUS_FAILED = -1,

    /*! 未进行比对。 */
    ALI_MATCH_STATUS_NULL = 0,

    /*! 比对成功。 */
    ALI_MATCH_STATUS_SUCCESS = 1,
};

/// 图片格式。
enum AliPictureFormat {
    /*! 未知 */
    ALI_PICTURE_FORMAT_NULL = -1,

    /*! Jpg。 */
    ALI_PICTURE_FORMAT_JPG = 0,
};

/// 性别。
enum AliSex {
    /*! 未知 */
    ALI_SEX_NULL = -1,

    /*! 男。 */
    ALI_SEX_MALE = 0,

    /*! 女。 */
    ALI_SEX_FEMALE = 1,
};

/*人脸对比上报*/
/*注册人脸需要的字段*/
struct AliMatcheResult {
    /*! 点位编号。 */
    char addr_id[32];

    /*! 点位名称。 */
    char addr_name[96];

    /*! 设备编号。 */
    char device_id[32];

    /*! 抓拍时间(毫秒)。 */
    uint64_t time_msec;

    /*! 实时抓拍标志,历史识别事件传递参数0。[0:非实时抓拍][1:实时抓拍] */
    int is_realtime;

    /*! 比对状态。 必要字段。*/
    enum AliMatchStatus match_status; //对比成功才会有人脸(即person_id,person_name,person_role,match_score)的值才有意义

    /*! 人脸比对到的人员ID。 抓拍成功时,必要字段。*/
    char person_id[64];

    /*! 人脸比对到的人员姓名。 抓拍成功时,必要字段。*/
    char person_name[255];

    /*! 人员角色。 抓拍成功时,必要字段。*/
    int person_role;

    /*! 对比相似度。 抓拍成功时,必要字段。*/
    int match_score;

    /*! 全景图大小。 */
    int panorama_img_size; //大小大于0时全景图的数据才有意义,否则全景图所有数据全部置空

    /*! 全景图格式。 */
    enum AliPictureFormat panorama_format;

    /*! 人脸位于全景图像的X坐标。 */
    unsigned short panorama_face_x;

    /*! 人脸位于全景图像的Y坐标。 */
    unsigned short panorama_face_y;

    /*! 人脸位于全景图像的宽度。 */
    unsigned short panorama_face_w;

    /*! 人脸位于全景图像的高度。 */
    unsigned short panorama_face_h;

    /*! 全景图数据。必要字段。 */
    char *panorama_img;

    /*! 全景图名称。 必要字段。 */
    char *panorama_img_name;

    /*! 特写图大小。 */
    int closeup_size; //大小大于0时特写图的数据才有意义,否则特写图所有数据全部置空

    /*! 特写图格式。 */
    enum AliPictureFormat closeup_format;

    /*! 人脸位于特写图像的X坐标。 */
    unsigned short closeup_face_x;

    /*! 人脸位于特写图像的Y坐标。 */
    unsigned short closeup_face_y;

    /*! 人脸位于特写图像的宽度。 */
    unsigned short closeup_face_w;

    /*! 人脸位于特写图像的高度。 */
    unsigned short closeup_face_h;

    /*! 特写图数据。 */
    char *closeup_img;

    /*! 性别。 */
    enum AliSex sex;

    /*! 年龄。 */
    unsigned char age;

    /*! 是否佩戴安全帽 */
    unsigned char hat;

    /*! 安全帽颜色 */
    unsigned char hat_color;

    /*! 人脸扭转角度。 */
    unsigned char turn_angle;

    /*! 人脸平面旋转角度。 */
    unsigned char rotate_angle;

    /* 备用字段*/
    unsigned char resv[3];

    /*! 注册图大小。 */
    int register_size;

    /*! 注册图格式。 */
    enum AliPictureFormat register_format;

    /*! 注册图数据。 */
    char *register_img;

    /*! 设备序列号,唯一标识符。 */
    char device_sn[32];

    /*! 身份证信息标志。 */
    int idcard_mark; //值为1才表示身份证信息相关的数据才有意义

    /*! 号码。 */
    char idcard_number[36];

    /*! 姓名。 */
    char idcard_name[64];

    /*! 出生日期。 */
    char idcard_data[18];

    /*! 性别。 */
    enum AliSex idcard_sex;

    /*! 民族。 */
    char idcard_nation[20];

    /*! 住址。 */
    char idcard_address[120];

    /*! 签发机关。 */
    char idcard_issue[44];

    /*! 有效期起始时间。 */
    char idcard_validityterm_start[18];

    /*! 有效期截止时间。 */
    char idcard_validityterm_end[18];

    /*! 韦根门禁卡号 */
    uint64_t long_card_id;
};

/* SDK日志等级 */
enum LinkfaceLogLevel {
    /*! debug level */
    ALI_LF_LOG_DEBUG = 0,

    /*! info level */
    ALI_LF_LOG_INFO = 1,

    /*! warn level */
    ALI_LF_LOG_WARN = 2,

    /*! error level */
    ALI_LF_LOG_ERROR = 3,
};

/* SDK日志输出类型 */
enum LinkfaceLogDest {
    /*! 标准输出 */
    ALI_LF_STDOUT = 0,

    /*! 文件 */
    ALI_LF_FILE = 1,
};

/* 日志配置 */
struct LinkfaceLogCfg {

    /* 日志等级 */
    enum LinkfaceLogLevel lvl;

    /* 日志输出类型 */
    enum LinkfaceLogDest dst;

    /*! 日志文件保存路径 */
    char *logpath;

    /*! 日志存储目录大小Mb */
    int max_size_log_mb;
};

/* sdk配置信息 */
struct LinkfaceConfig {

    /*! productKey: 三元组之一, 详见物联网平台官方文档. */
    char *productKey;

    /*! productSecret: 产品密钥,一型一密时使用,否则填"", 详见物联网平台官方文档. */
    char *productSecret;

    /*! deviceName: 三元组之一, 详见物联网平台官方文档. */
    char *deviceName;

    /*! deviceSecret: 三元组之一, 详见物联网平台官方文档. */
    char *deviceSecret;

    /*! filePath: sdk会本地缓存一些配置信息,厂商需要确保此目录已存在且可写,预计占用物理空间2M以内。 */
    char *filePath;

    /*! 日志配置 */
    struct LinkfaceLogCfg cfg_log;

};

/** 云端下发底库同步请求时,sdk会调用该接口将人脸底图信息逐个传递给厂商,厂商需要将该人脸添加到数据库中以
 * 进行人脸识别。
 * @brief   注册人脸数据接收回调函数格式定义。
 * @param   注册人脸结构体。
 * @param   user 用户参数,用户设置回调时指定的参数通过该参数再次回传给用户。
 */
typedef int (*Ali_AddPersonDataCallback)(const struct AliPerson *person, void *user);

/** 云端需要删除某个人脸底库时,sdk会调用该接口将人脸信息逐个传递给厂商,厂商需要将该人脸从数据库中删除,
 * 下次人脸检测时,该用户会因底库不存在该用户信息导致识别。
 * @brief   删除人脸数据接收回调函数格式定义。
 * @param   人脸id。
 * @param   user 用户参数,用户设置回调时指定的参数通过该参数再次回传给用户。
 */
typedef int (*Ali_DeletePersonDataCallback)(const char *person_id, void *user);

/** sdk调用本接口后,厂商需要清空人脸数据库。
 * @brief   全量删除人脸回调函数。
 * @param   用户数据。
 * @param   user 用户参数,用户设置回调时指定的参数通过该参数再次回传给用户。
 */
typedef int (*Ali_DeleteAllDataCallback)(void *user);

/** 注册添加人脸回调接口。
 * @param   callback 厂商需要实现的函数。
 * @param   user 用户参数,用户设置回调时指定的参数通过该参数再次回传给用户。
 */
void Ali_RegisterAddPerson(Ali_AddPersonDataCallback callback, void *user);

/** 注册删除人脸回调接口。
 * @param   callback 厂商需要实现的函数。
 * @param   user 用户参数,用户设置回调时指定的参数通过该参数再次回传给用户。
 */
void Ali_RegisterDeletePerson(Ali_DeletePersonDataCallback callback, void *user);

/** 注册全量删除人脸回调接口。
 * @param   callback 厂商需要实现的函数。
 * @param   user 用户参数,用户设置回调时指定的参数通过该参数再次回传给用户。
 */
void Ali_DeleteAll(Ali_DeleteAllDataCallback callback, void *user);

/**  当人脸门禁机检测到人脸后,无论是否能正确识别出该人脸,均需要调用本接口将识别结果上报到云端。
 * @param   result 识别结果,如果识别成功,需要包含已识别的人的基本信息。
 *
 * @return 成功返回0,其他值均为失败。
 */
int Ali_UploadMatchResult(const struct AliMatcheResult *result);

/**  init 接口,必须首先调用,如果初始化失败,请sleep 1s后重试,直到成功。
 * @param   cfg: sdk配置信息
 * 成功返回1,失败返回-1。
 * */
int Ali_Init(struct LinkfaceConfig *cfg);

/** 进程退出前,释放sdk资源。
 */
void Ali_DeInit();

#ifdef __cplusplus
}
#endif

#endif

接口总览

yuque_diagram

SDK包内容介绍

tree -L 4
.
├── CMakeLists.txt                              ---------演示如何链接linkface和linkkit的库,如何编译sample
├── LinkFace                                    ---------linkface的库和使用的样例
│   ├── samples                                 ---------linkface使用的样例
│   │   ├── v1                                  ---------v1版本使用的样例
│   │   │   ├── 1.jpg                           ---------模拟人脸抓拍事件上云图片
│   │   │   ├── link_face_demo_v1               ---------v1版本演示可执行文件
│   │   │   ├── linkface_demo_v1.c              ---------v1版本sample
│   │   │   ├── linkkit_adapter_v1.c            ---------v1版本自定义集成linkkit的上云能力
│   │   │   ├── log_util.c
│   │   │   └── log_util.h
│   │   └── v2                                  ---------v2版本使用的样例
│   │       ├── 1.jpg
│   │       ├── database.c                      ---------v2版本基于sqlite完成了人脸底库的本地存储
│   │       ├── database.h
│   │       ├── link_face_demo_v2               ---------v2版本演示可执行文件
│   │       ├── linkface_demo_v2.c              ---------v2版本sample
│   │       ├── linkkit_adapter_v2.c            ---------v2版本自定义集成linkkit的上云能力
│   │       └── list.h
│   └── sdk
│       ├── v1
│       │   ├── liblinkface_v1.a                ----------v1版本对外提供的动态库
│       │   ├── liblinkface_v1.so               ----------v1版本对外提供的静态库
│       │   └── linkface_sdk_v1.h               ----------v1版本对外提供的头文件
│       └── v2
│           ├── alarm_event_post_task.h
│           ├── event_cache_manager.h
│           ├── face_add_task.h
│           ├── facebase_manager.h
│           ├── face_cache_manager.h
│           ├── face_download_task.h
│           ├── liblinkface_v2.a                ----------v2版本对外提供的动态库
│           ├── liblinkface_v2.so               ----------v2版本对外提供的静态库
│           ├── linkface_sdk_v2.h               ----------v2版本对外提供的头文件
│           └── net_protocol.h
└── third_party
    ├── cJSON                                   ----------依赖的cjson库
    │   ├── cJSON.h
    │   ├── libcjson.a
    │   ├── libcjson.so
    │   ├── libcjson.so.1
    │   └── libcjson.so.1.7.7
    ├── cJSON-1.7.7.tar.gz
    ├── linkkit-sdk-c                           ----------依赖的linkkit库
    │   ├── exports
    │   │   ├── iot_export_awss.h
    │   │   ├── iot_export_coap.h
    │   │   ├── iot_export_compat.h
    │   │   ├── iot_export_errno.h
    │   │   ├── iot_export_event.h
    │   │   ├── iot_export_http2.h
    │   │   ├── iot_export_http2_stream.h
    │   │   ├── iot_export_http.h
    │   │   ├── iot_export_linkkit.h
    │   │   ├── iot_export_mqtt.h
    │   │   ├── iot_export_ota.h
    │   │   ├── iot_export_shadow.h
    │   │   ├── iot_export_state.h
    │   │   ├── linkkit_export.h
    │   │   └── linkkit_gateway_export.h
    │   ├── imports
    │   │   ├── iot_import_awss.h
    │   │   ├── iot_import_config.h
    │   │   ├── iot_import_crypt.h
    │   │   ├── iot_import_dtls.h
    │   │   ├── iot_import_ota.h
    │   │   ├── iot_import_product.h
    │   │   ├── iot_import_tcp.h
    │   │   ├── iot_import_tls.h
    │   │   └── iot_import_udp.h
    │   ├── iot_export.h
    │   ├── iot_import.h
    │   ├── libiot_hal.a
    │   ├── libiot_sdk.a
    │   └── libiot_tls.a
    ├── linkkit-sdk-c.tar.gz
    ├── release
    │   ├── apr
    │   │   ├── bin
    │   │   ├── build-1
    │   │   ├── include
    │   │   └── lib
    │   ├── apr_util
    │   │   ├── bin
    │   │   ├── include
    │   │   └── lib
    │   ├── curl
    │   │   ├── bin
    │   │   ├── include
    │   │   ├── lib
    │   │   └── share
    │   ├── expat
    │   │   ├── bin
    │   │   ├── include
    │   │   ├── lib
    │   │   └── share
    │   ├── iconv
    │   │   ├── bin
    │   │   ├── include
    │   │   ├── lib
    │   │   └── share
    │   ├── mxml
    │   │   ├── include
    │   │   ├── lib
    │   │   └── share
    │   ├── openSSL
    │   │   ├── bin
    │   │   ├── include
    │   │   └── lib
    │   ├── oss_c_sdk
    │   │   ├── include
    │   │   └── lib
    │   └── zlib
    │       ├── include
    │       ├── lib
    │       └── share
    ├── sqlite                              ----------依赖的sqlite库
    │   ├── libsqlite3.a
    │   ├── libsqlite3.so
    │   └── sqlite3.h
    └── sqlite-amalgamation-3310100.tar.gz

快速使用指南

下面来基于Ubuntu 16.04的环境来描述如何运行官方Sample。

  • 解压

tar zxvf link_face_xxx_.tar.gz
  • 编译

我们提供了CMakeLists.txt来演示如何使用sdk,若单独使用sdk,请参考CMakeLists.txt来完成库的链接。

cd link_face_xxx_

mkdir build

cd build

cmake ../

make
  • 运行

cp link_face_demo_v1 ../LinkFace/samples/v1
./link_face_demo_v1 ${Product_Key} ${Device_Name} ${Device_Secret} ./
${Product_Key} ${Device_Name} ${Device_Secret} 分别替换成在物联网平台上申请的三元组即可。