C语言SDK
本蓝牙协议库为嵌入式锁端提供了和自研手机APP进行蓝牙通信的解决方案,旨在简化锁端和APP蓝牙通信开发。
用户只需关注 xl_usage.h 和 xl_usage.c 文件中定义的接口,无需深入了解库内部实现细节。本文档旨在帮助开发者快速上手并正确使用蓝牙协议库。
获取库文件
库文件和头文件请联系相关人员获取。
预备知识
锁广播数据格式说明
锁蓝牙广播UUID格式: 01758824-6602-FAA8-9A34-2CAB03010000
其中:
758824表示是门锁设备- 第31、32两位:
00表示未配对,01表示已配对 - 第33、34两位:
00表示休眠,01表示唤醒 758825表示是网关设备
用户需要在开启蓝牙后广播这些数据,数据内容由LIB_EventCallback中的Event类型来选择。
API接口说明
宏定义
使用下面的宏来设置锁能支持的功能:
c
// 事件记录事件类型定义
#define LOGS_UNKNOWN 0 // 未知事件
#define LOGS_FINGERPRINT_UNLOCK 1 // 指纹解锁
#define LOGS_PWD_UNLOCK 2 // 密码解锁
#define LOGS_IC_UNLOCK 3 // IC卡解锁
#define LOGS_APP_UNLOCK 4 // 蓝牙APP解锁
#define LOGS_COMBINATION_UNLOCK 5 // 组合解锁
#define LOGS_ADD_FINGERPRINT 6 // 添加指纹
#define LOGS_ADD_PWD 7 // 添加密码
#define LOGS_ADD_IC 8 // 添加IC卡
#define LOGS_DELETE_FINGERPRINT 9 // 删除指纹
#define LOGS_DELETE_PWD 10 // 删除密码
#define LOGS_DELETE_IC 11 // 删除IC卡
#define LOGS_ERROR 12 // 错误报警
#define LOGS_TAMPER 13 // 防拆报警
#define LOGS_DELETE_ALL_USER 14 // 删除所有用户
#define LOGS_LOW_POWER 15 // 电池电量低
#define LOGS_FACE_UNLOCK 16 // 人脸开锁
#define LOGS_ADD_FACE 17 // 添加人脸
#define LOGS_DELETE_FACE 18 // 删除人脸
#define LOGS_PALM_VEIN_UNLOCK 19 // 掌静脉解锁
#define LOGS_ADD_PALM_VEIN 20 // 添加掌静脉
#define LOGS_DELETE_PALM_VEIN 21 // 删除掌静脉
#define LOGS_REMOTE_CONTROL_UNLOCK 22 // 遥控开锁
#define LOGS_ADD_REMOTE_CONTROL 23 // 添加遥控
#define LOGS_DELETE_REMOTE_CONTROL 24 // 删除遥控
#define LOGS_CLEAR_CODE_CLEAR_PWD 25 // 清空密码
#define LOGS_BACK_DOOR_KEY_UNLOCK 26 // 门内按键开锁
#define LOGS_BACK_DOOR_HANDLE_UNLOCK 27 // 门内把手开锁
#define LOGS_STAY_ALARM 28 // 逗留报警
#define LOGS_PASSAGE_MODE 29 // 常开模式
#define LOGS_DELETE_ALL_FINGERPRINT 30 // 重置指纹
#define LOGS_DELETE_ALL_PWD 31 // 重置密码
#define LOGS_RESET_IC 32 // 重置卡片
#define LOGS_RESET_FACE 33 // 重置人脸
#define LOGS_RESET_PALM_VEIN 34 // 重置掌静脉
#define LOGS_RESET_REMOTE_CONTROL 35 // 重置遥控
#define LOGS_REMOTE_KEY_UNLOCK 36 // 远程开锁
#define LOGS_GROUP_DELETE_FINGERPRINT 37 // 分组删除指纹
#define LOGS_GROUP_DELETE_PWD 38 // 分组删除密码
#define LOGS_GROUP_DELETE_IC 39 // 分组删除卡片
#define LOGS_GROUP_DELETE_FACE 40 // 分组删除人脸
#define LOGS_GROUP_DELETE_PALM_VEIN 41 // 分组删除掌静脉
#define LOGS_GROUP_DELETE_REMOTE_CONTROL 42 // 分组删除遥控
#define LOGS_HOTEL_IC_UNLOCK 43 // 酒店IC卡开锁
#define LOGS_FORCE_FINGERPRINT_UNLOCK 128 // 胁迫指纹开锁(紧急报警)
#define LOGS_FORCE_PWD_UNLOCK 129 // 胁迫密码开锁(紧急报警)
#define LOGS_FORCE_IC_UNLOCK 130 // 胁迫IC卡开锁(紧急报警)
#define LOGS_FORCE_FACE_UNLOCK 131 // 胁迫人脸开锁(紧急报警)
#define LOGS_FORCE_PALM_VEIN_UNLOCK 132 // 胁迫掌静脉开锁(紧急报警)
#define LOGS_FORCE_REMOTE_CONTROL_UNLOCK 133 // 胁迫遥控开锁(紧急报警)
#define LOGS_DOOR_NOT_CLOSED 134 // 门未关好报警
#define LOGS_TIME_SYNC 135 // 时间同步事件
#define LOGS_DOORBELL 159 // 门铃触发事件
/*锁能支持的功能配置*/
#define _SUPPORT_PASS (0)//0 支持密码 是
#define _SUPPORT_CARD (0)//1 支持IC卡 是
#define _SUPPORT_FINGER (1)//2 支持指纹 是
#define _SUPPORT_VEIN (0)//3 支持指静脉 否
#define _SUPPORT_PALM (0)//4 支持掌静脉 否
#define _SUPPORT_FACE (0)//5 支持3D人脸 否
#define _SUPPORT_QRCODE (0)//6 支持二维码 否
#define _SUPPORT_BLEREMOTE (0)//7 支持蓝牙遥控器 是
#define _SUPPORT_WIRELESSKEY 0//8 支持无线钥匙 否
#define _SUPPORT_NETGATE (1)//9 支持网关开锁 是
#define _SUPPORT_UNLOCK1 (0)//10 预留开锁方式1 否
#define _SUPPORT_UNLOCK2 (0)//11 预留开锁方式2 否
#define _SUPPORT_UNLOCK3 (0)//12 预留开锁方式3 否
#define _SUPPORT_UNLOCK4 (0)//13 预留开锁方式4 否
#define _SUPPORT_OFFLOCK (1)//14 支持闭锁指令 是
#define _SUPPORT_UPGRADE (1)//15 支持固件升级设置指令 是
#define _SUPPORT_PASSDOWNLOAD 1//16 支持密码下发 是
#define _SUPPORT_CARDDOWNLOAD (1)//17 支持卡片下发 是
#define _SUPPORT_FINGERDOWNLOAD (1)//18 支持指纹下发 是
#define _SUPPORT_VEINDOWNLOAD (0)//19 支持指静脉下发 否
#define _SUPPORT_PALMDOWNLOAD (0)//20 支持掌静脉下发 否
#define _SUPPORT_FACEDOWNLOAD (0)//21 支持3D人脸下发 否
#define _SUPPORT_DOWNLOAD1 (0)//22 预留下发特征1 否
#define _SUPPORT_DOWNLOAD2 (0)//23 预留下发特征2 否
#define _SUPPORT_FREEZE 0//24 支持冻结/解冻锁 否
#define _SUPPORT_ADMINPASS (1)//25 支持读取管理员密码 是
#define _SUPPORT_PASSMANAGE (1)//26 支持密码管理功能 是
#define _SUPPORT_PASSDELETE (1)//27 支持密码带删除功能 是
#define _SUPPORT_REMOTEUNLOCK (1)//28 支持配置远程开锁 是
#define _SUPPORT_AUTOLOCK (1)//29 支持自动闭锁设置 是
#define _SUPPORT_SETUPTAMPER (1)//30 支持防撬开关配置(启用/禁用) 是
#define _SUPPORT_SETUPRESET (1)//31 支持重置键配置(启用/禁用) 是
#define _SUPPORT_SETUPANTILOCK 1//32 支持反锁功能配置(启用/禁用) 是
#define _SUPPORT_VOICETIP (1)//33 支持语音提示管理(音量大小/禁用) 是
#define _SUPPORT_SETULANGUAGE (0)//34 支持语言设置 否
#define _SUPPORT_RTC (1)//35 支持实时时钟 是
#define _SUPPORT_WIFI (0)//36 支持WIFI 否
#define _SUPPORT_VIDEOTALK (0)//37 支持可视对讲 否
#define _SUPPORT_PASSROUND (1)//38 支持循环密码 是
#define _SUPPORT_FINGERCARDROUND (0)//39 支持循环指纹/卡 否
#define _SUPPORT_MULTI 1//40 支持双重认证 是
#define _SUPPORT_RIGHTLEFT (0)//41 支持左右开门设置 否
#define _SUPPORT_NEAR (0)//42 支持接近感应 否
#define _SUPPORT_DOORGATESTATUS (0)//43 支持门磁状态 否
#define _SUPPORT_WIREDOORGATE (1)//44 支持有线门磁 否
#define _SUPPORT_WIRELESSDOORGATE (0)//45 支持无线门磁 否
#define _SUPPORT_DOORNOTOFF (0)//46 支持门未关报警 否
#define _SUPPORT_UNLOCKTIP (0)//47 支持开锁提醒 否
#define _SUPPORT_WIRELESSKEYBOARD 1//48 支持无线键盘 否
#define _SUPPORT_SETUPLIGHTTIME (1)//49 支持照明灯时间配置 是
#define _SUPPORT_ALLOPEN (1)//50 支持某一天几点到几点常开的模式--相当于常开模式 是
#define _SUPPORT_ALLOPENAUTOUNLOCK (0)//51 支持常开模式自动开锁设置 否
#define _SUPPORT_ALLOPENAUTOLOCK (0)//52 支持常开模式及设置自动闭锁的情况下,是否支持关闭自动闭锁 否
#define _SUPPORT_ROLL (0)//53 支持考勤 否
#define _SUPPORT_HOTEL (0)//54 支持酒店锁卡系统 否
#define _SUPPORT_UNLOCKAPP (1)//55 APP开锁时需联网 是
#define _SUPPORT_BLEBROADCAST 1//56 蓝牙广播,不能实现APP点击开锁 是
#define _SUPPORT_PUSH 0//57 支持推送设置 否
#define _SUPPORT_NIULI 0//58 支持电机扭力设置 否
#define _SUPPORT_DOORSTARTER 1//59 支持开门器开锁 否
#define _SUPPORT_AUTOLCD 0//60 支持自动亮屏 否
#define _SUPPORT_STAYDECT 0//61 支持逗留警告 否
#define _SUPPORT_ABNORMAL 0//62 支持异常警告 否
#define _SUPPORT_FORCE 0//63 支持胁迫开门 否
#define _SUPPORT_CATEYE 0//64 猫眼监控功能 否
#define _SUPPORT_SPAREBAT 0//65 支持备用电池 否
#define _SUPPORT_OFFLINEPASS 1//66 离线密码算法 是
#define _SUPPORT_OFFLINEPASSMAX 1//67 离线密码算法最大个数 是
#define _SUPPORT_MULTILANGUAGE 0//68 多国语言 否
#define _SUPPORT_ISNOSUPPORTEDBLUEBROADCAST 0//69 0默认支持蓝牙广播, 1不支持蓝牙广播函数指针
以下为函数指针,需要用户自行实现并传入lib:
c
typedef void* (*btlib_malloc)(size_t size); // 动态内存分配
typedef void (*btlib_free)(void* ptr); // 释放
typedef void (*bt_send_data)(uint8_t *send_data, uint16_t send_length); // 蓝牙发送函数指针
typedef uint8_t (*lock_get_battery_value)(uint8_t battery_num); // 获取锁电池电量
typedef void (*lock_set_timestamp)(uint32_t timestamp); // 设置锁当前地区时间(按地区分,目前为北京时间UTC+8),库输入为UTC时间戳,芯片需支持RTC
typedef uint32_t (*lock_get_current_timestamp)(void); // 获取锁当前地区时间(按地区分,目前为北京时间UTC+8),芯片需支持RTC
typedef uint32_t (*lock_rand32)(void); // 生成32位随机数,要保证每次调用生成的随机数不同
typedef void (*lock_open)(void); // 开锁,电机驱动函数
typedef void (*lock_close)(void); // 关锁
typedef void (*lock_flash_write)(const uint8_t *buf, uint32_t addr, uint32_t size); // 写flash
typedef void (*lock_flash_read)(uint8_t *buf, uint32_t addr, uint32_t size); // 读
typedef void (*lock_flash_erase)(uint32_t addr, uint32_t size);枚举、结构体声明
c
typedef enum
{
_FEATURE_PASS = 0, //0 支持密码
_FEATURE_CARD, //1 支持IC卡
_FEATURE_FINGER, //2 支持指纹
_FEATURE_VEIN, //3 支持指静脉
_FEATURE_PALM, //4 支持掌静脉
_FEATURE_FACE, //5 支持3D人脸
_FEATURE_QRCODE, //6 支持二维码
_FEATURE_BLEREMOTE, //7 支持蓝牙遥控器
_FEATURE_WIRELESSKEY, //8 支持无线钥匙
_FEATURE_NETGATE, //9 支持网关开锁
_FEATURE_UNLOCK1, //10 预留开锁方式1
_FEATURE_UNLOCK2, //11 预留开锁方式2
_FEATURE_UNLOCK3, //12 预留开锁方式3
_FEATURE_UNLOCK4, //13 预留开锁方式4
_FEATURE_OFFLOCK, //14 支持闭锁指令
_FEATURE_UPGRADE, //15 支持固件升级设置指令
_FEATURE_PASSDOWNLOAD, //16 支持密码下发
_FEATURE_CARDDOWNLOAD, //17 支持卡片下发
_FEATURE_FINGERDOWNLOAD, //18 支持指纹下发
_FEATURE_VEINDOWNLOAD, //19 支持指静脉下发
_FEATURE_PALMDOWNLOAD, //20 支持掌静脉下发
_FEATURE_FACEDOWNLOAD, //21 支持3D人脸下发
_FEATURE_DOWNLOAD1, //22 预留下发特征1
_FEATURE_DOWNLOAD2, //23 预留下发特征2
_FEATURE_FREEZE, //24 支持冻结/解冻锁
_FEATURE_ADMINPASS, //25 支持读取管理员密码
_FEATURE_PASSMANAGE, //26 支持密码管理功能
_FEATURE_PASSDELETE, //27 支持密码带删除功能
_FEATURE_REMOTEUNLOCK, //28 支持配置远程开锁
_FEATURE_AUTOLOCK, //29 支持自动闭锁设置
_FEATURE_SETUPTAMPER, //30 支持防撬开关配置(启用/禁用)
_FEATURE_SETUPRESET, //31 支持重置键配置(启用/禁用)
_FEATURE_SETUPANTILOCK, //32 支持反锁功能配置(启用/禁用)
_FEATURE_VOICETIP, //33 支持语音提示管理(音量大小/禁用)
_FEATURE_SETULANGUAGE, //34 支持语言设置
_FEATURE_RTC, //35 支持实时时钟
_FEATURE_WIFI, //36 支持WIFI
_FEATURE_VIDEOTALK, //37 支持可视对讲
_FEATURE_PASSROUND, //38 支持循环密码
_FEATURE_FINGERCARDROUND, //39 支持循环指纹/卡
_FEATURE_MULTI, //40 支持双重认证
_FEATURE_RIGHTLEFT, //41 支持左右开门设置
_FEATURE_NEAR, //42 支持接近感应
_FEATURE_DOORGATESTATUS, //43 支持门磁状态
_FEATURE_WIREDOORGATE, //44 支持有线门磁
_FEATURE_WIRELESSDOORGATE, //45 支持无线门磁
_FEATURE_DOORNOTOFF, //46 支持门未关报警
_FEATURE_UNLOCKTIP, //47 支持开锁提醒
_FEATURE_WIRELESSKEYBOARD, //48 支持无线键盘
_FEATURE_SETUPLIGHTTIME, //49 支持照明灯时间配置
_FEATURE_ALLOPEN, //50 支持某一天几点到几点常开的模式--相当于常开模式
_FEATURE_ALLOPENAUTOUNLOCK, //51 支持常开模式自动开锁设置
_FEATURE_ALLOPENAUTOLOCK, //52 支持常开模式及设置自动闭锁的情况下,是否支持关闭自动闭锁
_FEATURE_ROLL, //53 支持考勤
_FEATURE_HOTEL, //54 支持酒店锁卡系统
_FEATURE_UNLOCKAPP, //55 APP开锁时需联网
_FEATURE_BLEBROADCAST, //56 蓝牙广播,不能实现APP点击开锁
_FEATURE_PUSH_SETUP, //57 支持推送设置
_FEATURE_NIULI_SETUP, //58 支持电机扭力设置
_FEATURE_DOORSTARTER, //0//59 支持开门器开锁
_FEATURE_AUTOLCD, //0//60 支持自动亮屏
_FEATURE_STAYDECT, //0//61 支持逗留警告
_FEATURE_ABNORMAL, //0//62 支持异常警告
_FEATURE_FORCEUNLOCK, //0//63 支持异常胁迫开门
_FEATURE_CATEYE, //0//64 猫眼监控功能
_FEATURE_SPAREBAT, //0//65 支持备用电池
_FEATURE_OFFLINEPASS, //1//66 离线密码算法
_FEATURE_OFFLINEPASSMAX, //1//67 离线密码算法最大个数
_FEATURE_MULTILANGUAGE, //0//68 多国语言
_FEATURE_ISNOSUPPORTEDBLUEBROADCAST, //0//69 0默认支持蓝牙广播, 1不支持蓝牙广播
_FEATURE_MAX
}BTPROTO_E_SUPPORT_IDX; // 锁能支持的功能的数组索引
typedef enum
{
LIB_SUCCESS = 0x00,
ERR_COMMON, //通用错误码
ERR_MEMORY,
ERR_INVALID_CMD,
ERR_INVALID_PARAM,
ERR_CRC,
ERR_UNKNOWN = 0xFF,
}btlock_comm_err_t;
enum
{
EVENT_STORAGE_PROFILE,
EVENT_GET_PROFILE,
EVENT_STORAGE_LOGS_RECORD,
EVENT_GET_LOGS_RECORD,
EVENT_RECOVER,
EVENT_ADD_USER,
EVENT_DELETE_USER,
EVENT_OPENLOCK_AUTO, // 开锁(自动关锁)
EVENT_OPENLOCK_MANUAL, // 开锁(手动关锁)
EVENT_CLOSELOCK, // 关锁
EVENT_UPDATE_ADVDATA, // 更新广播数据
EVENT_DELETE_FINGER, // app删除指纹事件
EVENT_START_REG_FINGER, // 开始注册指纹
EVENT_CANCAL_REG_FINGER, // 取消注册指纹
EVENT_PROCESS_REG_FINGER, // 注册指纹过程
EVENT_CONFIRM_REG_FINGER, // 注册指纹确认
EVENT_NONE = 0XFF
};
typedef union
{
char Password[20];
uint32_t CardId;
uint32_t FpAddr;
}ForceType;
typedef struct
{
char Vendor[20]; //字符串 20 厂商名称
char Model[20]; //字符串 20 产品名称
char FwVersion[20]; //字符串 20 软件版本,如1.0.0.230828
char HwVersion[20]; //字符串 20 硬件版本,如1.0.0.230828
char SerialNum0[16]; // 字符串 16 厂商序列号,如230828xxxxxx 厂商序列号,必须保证唯一,重复会覆盖之前录入的锁
char SerialNum1[16]; // 字符串 16 成品商序列号,如230928yyyyyy
char BtDeviceName[17];// 字符串 16 蓝牙名称,如TMH_c3570480da8d
char IcPartNo[10]; //字符串 10 主控芯片型号
char Mac[20]; //字符串 设备的蓝牙mac地址,必须为大写字母
uint8_t SupportFunction[_FEATURE_MAX]; // 锁能支持的功能
}lib_product_info_t;
typedef struct
{
btlib_malloc btproto_malloc;
btlib_free btproto_free;
bt_send_data bt_send_data;
lock_get_battery_value lock_get_battery_value;
lock_set_timestamp lock_set_timestamp;
lock_get_current_timestamp lock_get_current_timestamp;
lock_rand32 lib_rand32;
lock_open lock_open;
lock_close lock_close;
lock_flash_write flash_write;
lock_flash_read flash_read;
lock_flash_erase flash_erase;
}lib_func_init_t;
typedef struct
{
char bt_device_name[33];
lib_func_init_t lib_func;
}lib_init_t;
typedef struct
{
uint8_t LockMode; //门锁模式: 1表示家用模式、2表示常开模式
uint8_t LockDelay;//自动闭锁时间
uint8_t TamperEnable;
uint8_t Volume;
uint8_t AlwaysOpennRound; //Bit 0 -- 6 周日--周六 Bit7 是否循环
uint8_t AlwaysOpenIsAllDay;
uint32_t AlwaysOpenStartDate;
uint32_t AlwaysOpenEndDate;
uint16_t AlwaysOpenStartTime;
uint16_t AlwaysOpenEndTime;
}interface_LockSetting;配置文件管理
这是蓝牙库配置文件管理函数:
c
// 获取蓝牙库配置文件大小
size_t lib_get_config_file_size(void);
// 获取配置文件
uint8_t *lib_get_config_file(void);
// 设置配置文件(从flash),若cfg为NULL则配置文件将被设为初始配置
// 返回值:0成功,1配置文件大小错误,2配置文件未能初始化
uint8_t lib_set_config_file(uint8_t *cfg, size_t size);蓝牙数据处理
这是蓝牙收到一个完整的数据包后给库进行处理:
c
/**
* @brief 将收到的蓝牙数据交给库进行处理
* @param btRecvData 蓝牙接收到的数据
* @param btRecvLength 数据长度
* @return 函数处理状态
*/
btlock_comm_err_t LIB_BtRecvDeal(const uint8_t *btRecvData, uint16_t btRecvLength);本地接口
下面的接口是用于开发者需要实现某些功能可能用到的或者是事件回调需要用的函数:
c
// 本地(通过锁板)添加密码(已包含事件记录)
// 返回: -1: 无空位 -2: 密码存储已满 -3: 管理员已满 -4: 密码已存在 0成功
int interface_AddPassword(char Password[20], uint8_t IsAdmin);
// 验证开锁密码
// input: Password output: IsAdmin
// 返回: true: 密码正确 false: 密码错误
bool interface_VerifyPassword(char Password[20], uint8_t *IsAdmin);
// 本地添加指纹(已包含事件记录)
// IsAdmin: 添加的指纹是否为管理员指纹 FpAddress: 添加的指纹数据的flash存储地址
// 返回: -1: FpAddress为空 -2: 用户不存在、指纹存储已满、管理员已满 0: 添加成功
int interface_AddFingerprint(uint8_t IsAdmin , uint32_t FpAddress);
// 检查指定指纹是否为管理员指纹
// 返回: true: 是管理员指纹 false: 不是或地址指纹不存在
bool interface_isAdminFingerprint(uint32_t FpAddress);
/*注册指纹过程(按压次数)*/
/*RegStatus: 注册状态:0成功 1: 失败
RegIndex: 按压次数
*/
int interface_RegFpProcess(uint8_t RegStatus, uint8_t RegIndex);
/*注册指纹成功*/
/*RegStatus:注册完成后的状态:0: 成功 1:错误(如flash存储失败、模板生成错误等)
No:注册后指纹的编号
FpAddress: 指纹存储在falsh中的地址
返回: 0:成功 -1:FpAddress为空 -2: 指纹空间不足(MAX_USERFINGER_NUM)、管理员已满、用户不存在
*/
int interface_RegFpConfirm(uint8_t RegStatus, uint32_t FpAddress);
// 是否胁迫开锁,每次开锁时可调用判断是否胁迫(当前仅指纹、卡片开锁有胁迫)
// OpenType: 开锁类型 find: 参数
bool interface_isForceOpenLock(uint8_t OpenType, ForceType find);
// 添加一个事件记录,仅本地操作(非通过app操作)且符合 LogsType 的事件可调用
// LogsType: 事件类型
// 返回值: -1: 失败 0: 成功
int interface_AddLogsRecord(uint8_t LogsType);
// 获取锁一般配置,如关锁延时时间,防拆,音量大小等,详见 interface_LockSetting
int interface_GetLockSetting(interface_LockSetting *setting);
// 是否注册过指纹密码卡等信息,可以用于判断是否为初始状态
bool interface_IsRegedIdentity(void);事件回调处理
事件类型
库定义了以下事件类型:
| 事件 | 值 | 说明 |
|---|---|---|
| EVENT_STORAGE_PROFILE | 0 | 请求存储配置文件 |
| EVENT_GET_PROFILE | 1 | 请求读取配置文件 |
| EVENT_STORAGE_LOGS_RECORD | 2 | 请求存储日志记录 |
| EVENT_GET_LOGS_RECORD | 3 | 请求读取日志记录 |
| EVENT_RECOVER | 4 | 恢复出厂设置 |
| EVENT_OPENLOCK_AUTO | 5 | 自动关锁 |
| EVENT_OPENLOCK_MANUAL | 6 | 手动关锁 |
| EVENT_CLOSELOCK | 7 | 关锁 |
| EVENT_UPDATE_ADVDATA | 8 | 更新广播数据 |
| EVENT_DELETE_FINGER | 9 | APP删除指纹事件 |
| EVENT_START_REG_FINGER | 10 | 开始注册指纹 |
| EVENT_CANCAL_REG_FINGER | 11 | 取消注册指纹 |
| EVENT_PROCESS_REG_FINGER | 12 | 注册指纹过程 |
| EVENT_CONFIRM_REG_FINGER | 13 | 注册指纹确认 |
回调函数实现
用户需要实现 LIB_EventCallback 函数来处理库的事件通知:
c
/**
* @brief 蓝牙协议库事件回调
* @param Event 库事件
* @param param 事件参数
* @return 0表示成功,其他值表示错误
*/
uint8_t LIB_EventCallback(uint8_t Event, void *param);示例实现可参考 xl_usage.c 中的实现。
用户还需要实现 xl_adv_data_update 函数来更新蓝牙广播数据:
c
/**
* @brief 改变蓝牙广播的数据
* @param device_flag 要设置的广播位 0: 是否唤醒标志位 1:是否配对标志位
* @param operate 0: false 1:true
* @note 若芯片支持蓝牙保活,唤醒标志位可始终为1,不支持则在休眠前请复位唤醒标志位
*/
void xl_adv_data_update(uint8_t device_flag, uint8_t operate);使用示例
以下是一个简单的使用示例:
c
// 蓝牙库初始化
void bt_test_init(void)
{
int ret;
lib_init_t proto = {0};
proto.lib_func.btproto_malloc = user_malloc;
proto.lib_func.btproto_free = user_free;
proto.lib_func.lib_rand32 = my_rand;
proto.lib_func.bt_send_data = BtProto_btSend;
proto.lib_func.lock_get_battery_value = my_get_battery_value;
proto.lib_func.lock_set_timestamp = my_set_timestamp;
proto.lib_func.lock_get_current_timestamp = my_get_timestamp;
proto.lib_func.lock_open = my_door_open;
proto.lib_func.lock_close = my_door_close;
proto.lib_func.flash_write = BtProto_FlashWrite;
proto.lib_func.flash_read = BtProto_FlashRead;
proto.lib_func.flash_erase = BtProto_FlashErase;
lib_product_info_t product =
{
.Vendor = "XL",
.Model = "OM-BLE-01",
.FwVersion = "1.0.0.250303",
.HwVersion = "1.0.0.241030",
.SerialNum0 = "241030000000",
.SerialNum1 = "241030111111",
.IcPartNo = "HBS3526",
};
uint8_t tmp_mac[6] = {0};
char bt_mac[20];
char bt_device_name[17] = {'T', 'M', 'H', '_'};
ob_gap_addr_get(OB_ADV_ADDR_TYPE_PUBLIC, tmp_mac);
memrev(tmp_mac, 6);
for (int i = 0,j = 0; i < 6; i++) {
j += sprintf(&bt_mac[j], "%02X", tmp_mac[i]);
sprintf((char*)&bt_device_name[4] + i * 2, "%02x", tmp_mac[i]);
if (i < 5) {
bt_mac[j++] = ':';
}
}
bt_device_name[16] = '\0';
memcpy(product.SerialNum0, bt_device_name, sizeof(product.SerialNum0));
memcpy(product.BtDeviceName, bt_device_name, sizeof(product.BtDeviceName));
memcpy(product.Mac, bt_mac, sizeof(bt_mac));
// 设置锁能支持的功能
product.SupportFunction[_FEATURE_PASS] = _SUPPORT_PASS;
product.SupportFunction[_FEATURE_CARD] = _SUPPORT_CARD;
product.SupportFunction[_FEATURE_FINGER] = _SUPPORT_FINGER;
product.SupportFunction[_FEATURE_VEIN] = _SUPPORT_VEIN;
product.SupportFunction[_FEATURE_PALM] = _SUPPORT_PALM;
product.SupportFunction[_FEATURE_FACE] = _SUPPORT_FACE;
product.SupportFunction[_FEATURE_QRCODE] = _SUPPORT_QRCODE;
product.SupportFunction[_FEATURE_BLEREMOTE] = _SUPPORT_BLEREMOTE;
product.SupportFunction[_FEATURE_WIRELESSKEY] = _SUPPORT_WIRELESSKEY;
product.SupportFunction[_FEATURE_NETGATE] = _SUPPORT_NETGATE;
product.SupportFunction[_FEATURE_UNLOCK1] = _SUPPORT_UNLOCK1;
product.SupportFunction[_FEATURE_UNLOCK2] = _SUPPORT_UNLOCK2;
product.SupportFunction[_FEATURE_UNLOCK3] = _SUPPORT_UNLOCK3;
product.SupportFunction[_FEATURE_UNLOCK4] = _SUPPORT_UNLOCK4;
product.SupportFunction[_FEATURE_OFFLOCK] = _SUPPORT_OFFLOCK;
product.SupportFunction[_FEATURE_UPGRADE] = _SUPPORT_UPGRADE;
product.SupportFunction[_FEATURE_PASSDOWNLOAD] = _SUPPORT_PASSDOWNLOAD;
product.SupportFunction[_FEATURE_CARDDOWNLOAD] = _SUPPORT_CARDDOWNLOAD;
product.SupportFunction[_FEATURE_FINGERDOWNLOAD] = _SUPPORT_FINGERDOWNLOAD;
product.SupportFunction[_FEATURE_VEINDOWNLOAD] = _SUPPORT_VEINDOWNLOAD;
product.SupportFunction[_FEATURE_PALMDOWNLOAD] = _SUPPORT_PALMDOWNLOAD;
product.SupportFunction[_FEATURE_FACEDOWNLOAD] = _SUPPORT_FACEDOWNLOAD;
product.SupportFunction[_FEATURE_DOWNLOAD1] = _SUPPORT_DOWNLOAD1;
product.SupportFunction[_FEATURE_DOWNLOAD2] = _SUPPORT_DOWNLOAD2;
product.SupportFunction[_FEATURE_FREEZE] = _SUPPORT_FREEZE;
product.SupportFunction[_FEATURE_ADMINPASS] = _SUPPORT_ADMINPASS;
product.SupportFunction[_FEATURE_PASSMANAGE] = _SUPPORT_PASSMANAGE;
product.SupportFunction[_FEATURE_PASSDELETE] = _SUPPORT_PASSDELETE;
product.SupportFunction[_FEATURE_REMOTEUNLOCK] = _SUPPORT_REMOTEUNLOCK;
product.SupportFunction[_FEATURE_AUTOLOCK] = _SUPPORT_AUTOLOCK;
product.SupportFunction[_FEATURE_SETUPTAMPER] = _SUPPORT_SETUPTAMPER;
product.SupportFunction[_FEATURE_SETUPRESET] = _SUPPORT_SETUPRESET;
product.SupportFunction[_FEATURE_SETUPANTILOCK] = _SUPPORT_SETUPANTILOCK;
product.SupportFunction[_FEATURE_VOICETIP] = _SUPPORT_VOICETIP;
product.SupportFunction[_FEATURE_SETULANGUAGE] = _SUPPORT_SETULANGUAGE;
product.SupportFunction[_FEATURE_RTC] = _SUPPORT_RTC;
product.SupportFunction[_FEATURE_WIFI] = _SUPPORT_WIFI;
product.SupportFunction[_FEATURE_VIDEOTALK] = _SUPPORT_VIDEOTALK;
product.SupportFunction[_FEATURE_PASSROUND] = _SUPPORT_PASSROUND;
product.SupportFunction[_FEATURE_FINGERCARDROUND] = _SUPPORT_FINGERCARDROUND;
product.SupportFunction[_FEATURE_MULTI] = _SUPPORT_MULTI;
product.SupportFunction[_FEATURE_RIGHTLEFT] = _SUPPORT_RIGHTLEFT;
product.SupportFunction[_FEATURE_NEAR] = _SUPPORT_NEAR;
product.SupportFunction[_FEATURE_DOORGATESTATUS] = _SUPPORT_DOORGATESTATUS;
product.SupportFunction[_FEATURE_WIREDOORGATE] = _SUPPORT_WIREDOORGATE;
product.SupportFunction[_FEATURE_WIRELESSDOORGATE] = _SUPPORT_WIRELESSDOORGATE;
product.SupportFunction[_FEATURE_DOORNOTOFF] = _SUPPORT_DOORNOTOFF;
product.SupportFunction[_FEATURE_UNLOCKTIP] = _SUPPORT_UNLOCKTIP;
product.SupportFunction[_FEATURE_WIRELESSKEYBOARD] = _SUPPORT_WIRELESSKEYBOARD;
product.SupportFunction[_FEATURE_SETUPLIGHTTIME] = _SUPPORT_SETUPLIGHTTIME;
product.SupportFunction[_FEATURE_ALLOPEN] = _SUPPORT_ALLOPEN;
product.SupportFunction[_FEATURE_ALLOPENAUTOUNLOCK] = _SUPPORT_ALLOPENAUTOUNLOCK;
product.SupportFunction[_FEATURE_ALLOPENAUTOLOCK] = _SUPPORT_ALLOPENAUTOLOCK;
product.SupportFunction[_FEATURE_ROLL] = _SUPPORT_ROLL;
product.SupportFunction[_FEATURE_HOTEL] = _SUPPORT_HOTEL;
product.SupportFunction[_FEATURE_UNLOCKAPP] = _SUPPORT_UNLOCKAPP;
product.SupportFunction[_FEATURE_BLEBROADCAST] = _SUPPORT_BLEBROADCAST;
product.SupportFunction[_FEATURE_PUSH_SETUP] = _SUPPORT_PUSH;
product.SupportFunction[_FEATURE_NIULI_SETUP] = _SUPPORT_NIULI;
product.SupportFunction[_FEATURE_DOORSTARTER] = _SUPPORT_DOORSTARTER;
product.SupportFunction[_FEATURE_AUTOLCD] = _SUPPORT_AUTOLCD;
product.SupportFunction[_FEATURE_STAYDECT] = _SUPPORT_STAYDECT;
product.SupportFunction[_FEATURE_ABNORMAL] = _SUPPORT_ABNORMAL;
product.SupportFunction[_FEATURE_FORCEUNLOCK] = _SUPPORT_FORCE;
product.SupportFunction[_FEATURE_CATEYE] = _SUPPORT_CATEYE;
product.SupportFunction[_FEATURE_SPAREBAT] = _SUPPORT_SPAREBAT;
product.SupportFunction[_FEATURE_OFFLINEPASS] = _SUPPORT_OFFLINEPASS;
product.SupportFunction[_FEATURE_OFFLINEPASSMAX] = _SUPPORT_OFFLINEPASSMAX;
product.SupportFunction[_FEATURE_MULTILANGUAGE] = _SUPPORT_MULTILANGUAGE;
product.SupportFunction[_FEATURE_ISNOSUPPORTEDBLUEBROADCAST] = _SUPPORT_ISNOSUPPORTEDBLUEBROADCAST;
ret = lib_init(&proto);
printf("lib_init:ret: %d\n", ret);
lib_set_product_info(&product);
lib_update_param();
}
// 蓝牙接收到数据后给库处理
void ble_gatts_callback(uint8_t *data, uint16_t length)
{
LIB_BtRecvDeal(data, length);
}