Files
huangping f94f03bcc2 feat(sdk): AuthConfigs, JSON Schema, examples, and release checksum CI
Add craftlabs-auth-config.schema.json, Java AuthConfigs model with tests,
example configs aligned to BP-10, C/Java/auth-config documentation,
native header notes, RELEASING guide, and workflow to verify SDK
artifact checksums on release tags.

Made-with: Cursor
2026-04-06 21:05:12 +08:00

1942 lines
106 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 比特授权云 · C 语言接口定义(离线摘录)
> 本文档由官网页面离线摘录并整理排版,便于本地检索。官方地址:[https://doc.bitanswer.cn/docs/client-api/c-interface-definitions-v2/](https://doc.bitanswer.cn/docs/client-api/c-interface-definitions-v2/)
---
## 认证
### Bit_Login / Bit_LoginEx
```c
BIT_STATUS Bit_Login(
BIT_PCSTR szURL,
BIT_PCSTR szSN,
BIT_UCHAR *pApplicationData,
BIT_HANDLE *pHandle,
LOGIN_MODE mode);
BIT_STATUS Bit_LoginEx(
BIT_PCSTR szURL,
BIT_PCSTR szSN,
BIT_UINT32 featureId,
BIT_PCSTR szReserved,
BIT_UCHAR *pApplicationData,
BIT_HANDLE *pHandle,
LOGIN_MODE mode);
```
授权登录。初始化运行环境,获取操作句柄。必须在除升级函数之外的其它操作前执行。根据登录模式的不同可能需要连接授权服务器。
Bit_Login 等价于 Bit_LoginEx(…, featureId=0szReserved=NULL, …),当需要登录包含指定特征项的授权时才需要调用Bit_LoginEx。
### 参数
- **szURL** - [IN] 自定义授权服务地址,包括端口,如未使用自定义授权服务器则为NULL。授权服务地址可以是网络地址、本地授权目录以及License串。
| **类型** | **格式** | **说明** |
| ------------- | -------------------------------- | ------------------------------------------------------------------------------ |
| **授权服务器地址** | `bit://ip:port``http://ip:port` | “`bit://`”开头表示集团授权服务地址 “`http://`”开头表示授权服务中心地址,一般是E3系统或者比特授权云的地址 |
| **授权文件路径** | `root://xxx` | 传入授权文件所在路径,Login就只会在该路径下查找授权,该设置等同于调用Bit_SetRootPath接口 |
| **License文件** | `lic://xxx` | 传入文件路径:读取文件内容,并加载到内存里使用 传入目录:自动加载该目录下的*.lic的授权文件 传入License串:将该License串加载到内存里使用 |
允许设置多个授权路径,通过“,”拆分。
如下:
```c
lic:///tmp,lic:///data,bit://127.0.0.1:8273
/tmp,/data,127.0.0.1:8273 // 等价第1条
```
> 注意:该接口支持通过[配置文件](https://doc.bitanswer.cn/docs/client-api/examples-of-using-the-sdk/#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6)和[环境变量](https://doc.bitanswer.cn/docs/client-api/examples-of-using-the-sdk/#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F)来设置该值,如果同时设置优先级为:环境变量 > API传入 > 配置文件。
- **szSN** - [IN] 授权码(SN)字符串。如果为空(空串或NULL)则尝试寻找所有当前本机可用的SN。
| **类型** | **格式** | **说明** |
| -------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| **授权码** | 比特授权云平台产生的SN 示例:`JNLTGZSE******`** | 检查指定SN的License |
| **BIT-IDBIT-ID硬件,类似于加密的USB设备)** | 格式:#`<序号>`#bitid:`<序号>` 说明:`<序号>` 为 BIT-ID 的索引号,从 0 开始递增 示例:#0#1、#`bitid:0、#bitid:1` | 使用BIT-ID授权 |
| **激活口令(帐号授权密码或SN激活口令)** | <`xxx`> 通过“<>”包裹起来,中间部分为密码 示例:<1234>, <1233>65447> | 激活口令,是指授权码激活时,需要输入的一种口令,激活后不再需要,目前仅支持浮动授权 使用帐号授权时保存的是帐号授权的密码(已经不推荐),其它授权代表激活口令 |
| **既输入SN又输入激活口令** | `xxx<password>`,授权码后边紧跟“<>” 示例:`JNLTGZSE******`**<123> | |
- **featureId** - [IN] 登录授权所需要包含的特征项ID。
- **szReserved** - [IN] 一个xml串,表示登录的SN范围。
xml格式如下:
```xml
<scope>
<feature id="" name="" ver=""/>
</scope>
```
- **pApplicationData** - [IN] 产品识别码,在Bitanswer SDK头文件里。
- **pHandle** - [OUT] 通过Login函数返回的上下文句柄。
- **mode** - [IN] 登录模式,按位操作。
| **值** | **说明** |
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| **BIT_MODE_LOCAL(0x01)** | 只检查本地授权(单机授权、BIT-ID授权、内存授权) |
| **BIT_MODE_REMOTE(0x02)** | 只检查远端授权(云授权、帐号授权、集团授权) |
| **BIT_MODE_AUTO(0x03)** | 既检查本地授权,也检查远端授权(配置了远端IP的条件下) 优先级:本地授权 > 远端授权 |
| **BIT_MODE_CACHE(0x4)** | 云授权缓存 由于云授权SN比较难记,但登录时又必须传输,则可以使用该选项将SN串缓存起来,下次使用Login登录时可以不输入SN |
| **BIT_MODE_USB(0x8)** | USB授权 |
| **LOGIN_MODE_PROCESS(0x10)** | 按进程模式登录 **集团授权**:普通模式一台机器占用一个用户数,进程模式是一个进程占用一个用户数 **其它授权**:不生效 |
| **LOGIN_MODE_SESSION(0x40)** | Session模式登录 **集团授权**:该模式比LOGIN_MODE_PROCESS控制的更细,一次会话占用一个点 **其它授权**:不生效 |
| **LOGIN_MODE_HIGH_PRIORITY(0x20)** | 高优先级登录 **云授权:**用户可以通过高优先级登录来挤掉普通登录。如果登录模式都是高优先级或者普通优先级则不生效 **其它授权:**不生效 |
| **LOGIN_MODE_NO_NETWORK0x200** | 禁用网络 禁止库联网时使用 |
| **LOGIN_MODE_CHECK_USERNAME(0x800)** | 检查当前设备的用户名 **集团授权:**默认情况下:一台的设备用户名不一样,会被识别为同一个机器,加了该模式,会识别为不同的设备。即:原来一台设备占用一个点,加了这个选项,“一台设备 + 用户名”占用一个点 **其它授权**:不生效 |
| **LOGIN_MODE_USE_SESSIONID(0x1000)** | Logout时不释放点数,并由第三方程序维护心跳 |
| **LOGIN_MODE_HIGH_PERFORMANCE(0x2000)** | 使用高性能模式登录 **集团授权:**将Login的两次请求转化为一次请求,可以减少服务负载 **其它授权:**不支持 |
| **LOGIN_MODE_PERSISTENT_CONN(0x4000)** | 使用长连接模式登录,只有集团授权支持,其它授权不支持 通过长连接可以减少TCP的频繁创建带来的性能损耗,但是会增加服务的socket连接数 |
| **LOGIN_MODE_CREATE_HANDLE_ONLY(0x10000)** | 仅创建handle,不检查License **集团授权:**Login默认情况下会连接集团服务并占用一个用户数,加了该模式之后,在调用Query相关接口时才会连接服务器 **其它授权:**Login默认情况下会检查授权的可用性,加了该模式之后,在Query时才会检查 |
| **LOGIN_MODE_CREATE_NEW_HANDLE(0x20000)** | 创建新handle,每次创建的handle唯一 Login的请求默认都发pid 可以针对每一个handle进行设置属性,不会相互影响 |
| **LOGIN_MODE_MID(0x40000)** | 按设备占点(当没有设置LOGIN_MODE_ACCOUNT和LOGIN_MODE_GROUP时,默认按设备扣点) |
| **LOGIN_MODE_ACCOUNT(0x80000)** | 按帐号占点 |
| **LOGIN_MODE_GROUP(0x100000)** | 按分组名占点 |
### 示例
```c
// 使用高性能模式检查集团授权
BIT_HANDLE handle = NULL;
BIT_STATUS status = Bit_Login(
NULL, NULL, application_data,
&handle, LOGIN_MODE(BIT_MODE_REMOTE | LOGIN_MODE_HIGH_PERFORMANCE ));
if (status == BIT_SUCCESS) {
// 校验成功
}
// 使用Session + 长连接模式检查集团授权
BIT_HANDLE handle = NULL;
BIT_STATUS status = Bit_Login(
NULL, NULL, application_data,
&handle, LOGIN_MODE(BIT_MODE_REMOTE | LOGIN_MODE_SESSION | LOGIN_MODE_PERSISTENT_CONN ));
if (status == BIT_SUCCESS) {
// 校验成功
}
// 使用内存License
BIT_HANDLE handle = NULL;
BIT_CHAR *pLicense = "lic://xxxxxxx";
BIT_STATUS status = Bit_Login(pLicense, NULL, application_data, &handle, BIT_MODE_AUTO);
if (status == BIT_SUCCESS) {
// 校验成功
}
// 先检查单机授权吗,如果没有再检查集团授权或云授权
BIT_HANDLE handle = NULL;
BIT_STATUS status = Bit_Login(NULL, NULL, application_data, &handle, BIT_MODE_AUTO);
if (status == BIT_SUCCESS) {
// 校验成功
}
// 检查包含指定特征项的授权
BIT_HANDLE handle = NULL;
BIT_UINT32 featureId = 1;
BIT_STATUS status = Bit_LoginEx(NULL, NULL, featureId, NULL, application_data, &handle, BIT_MODE_AUTO);
if (status == BIT_SUCCESS) {
// 校验成功
}
```
### Bit_LoginByToken
```c
BIT_STATUS Bit_LoginByToken(
BIT_PCSTR pUrl,
BIT_PCSTR pToken,
BIT_UCHAR *pApplicationData,
BIT_HANDLE *pHandle)
```
帐号授权的登录接口。仅支持两种认证方式,这里是使用比特授权云平台自己产生的access_token进行认证。
### 参数
- **pUrl** - [IN] 服务器地址,可以为空。
- **pToken** - [IN] 第三方身份源颁发的token或id_token,通过前缀区分。
| **值** | **说明** |
| ----------------- | ---------------- |
| **token:xxx或xxx** | 使用access_token登录 |
- **pApplicationData** - [IN] 产品识别码,记录在接口定义文件中,与产品一一对应。
- **pHandle** - [OUT] 通过Login函数返回的上下文句柄。
### Bit_LoginByTokenEx
```c
BIT_STATUS Bit_LoginByTokenEx(
BIT_PCSTR pUrl,
BIT_PCSTR pBusinessGuid,
BIT_PCSTR pToken,
BIT_PCSTR pIdpGuid,
BIT_PCSTR pGrantType,
BIT_UCHAR *pApplicationData,
BIT_HANDLE *pHandle)
```
帐号授权的登录接口。仅支持两种认证方式,这里是使用OIDC协议产生的id_token认证。
### 参数
- **pUrl** - [IN] 服务器地址,可以为空。
- **pBussinessGuid** - [IN] 业务guid,在比特授权云平台获取。
- **pToken** - [IN] 第三方身份源颁发的token或id_token,通过前缀区分。
| **值** | **说明** |
| ---------------- | ------------ |
| **id_token:xxx** | 使用id_token登录 |
- **pIdpGuid** - [IN] 第三方身份源guid,在比特授权云平台获取。参数为空表示使用比特授权云平台产生的token进行登录,即Bit_LoginByToken。
- **pGrantType** - [IN] 授权类型。固定值为“bitanswer:idp:oidc:id_token”。
- **pApplicationData** - [IN] 产品识别码,记录在接口定义文件中,与产品一一对应。
- **pHandle** - [OUT] 通过Login函数返回的上下文句柄。
### Bit_LoginByPassword
```c
BIT_STATUS Bit_LoginByPassword(
BIT_PCSTR szURL,
BIT_PCSTR szBusinessGuid,
BIT_PCSTR szBusinessSecret,
BIT_PCSTR szAccount,
BIT_PCSTR szPassword,
BIT_UCHAR *pApplicationData,
BIT_HANDLE *pHandle);
```
通过用户名和密码登录帐号授权。
### 参数
- **szURL** - [IN] 服务器地址,可以为空。
- **pBussinessGuid** - [IN] 业务编号,在比特授权云平台获取。
- **szBusinessSecret** [IN] 业务密钥,在比特授权云平台获取。
- **szAccount** - [IN] 用户帐号。
- **szPassword** - [IN] 用户密码。
- **pApplicationData** - [IN] 产品识别码,记录在接口定义文件中,与产品一一对应。
- **pHandle** - [OUT] 通过Login函数返回的上下文句柄。
### Bit_Logout
```c
BIT_STATUS Bit_Logout (
BIT_HANDLE handle)
```
此函数用于释放上下文句柄,退出登录状态,与Login相关接口一一对应。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
### Bit_Revoke
```c
BIT_STATUS Bit_Revoke (
BIT_PCSTR szURL,
BIT_PCSTR szSN,
BIT_UCHAR *pApplicationData,
BIT_CHAR *pRevocationInfo,
BIT_UINT32 *pRevocationInfoSize)
```
从客户端迁出已激活的浮动授权码。授权码迁出后,可以用于其它的客户端。根据输入参数的不同,本函数可用于在线或离线迁出。
### 参数
- **szURL** - [IN] 自定义授权服务器地址,包括端口。如未使用自定义授权服务器则为NULL。
- **szSN** - [IN] 授权码(SN)字符串。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pRevocationInfo** - [OUT] 迁出请求码的存储区地址。为NULL表示进行在线迁出,否则API将执行手工离线迁出,请求码应发给服务器进行确认。
- **pRevocationInfoSize** - [IN/OUT] 输入时为请求码存储区大小,输出时为请求码长度。如此参数为NULL,函数将选择在线迁出。
### Bit_RemoveSn
```c
BIT_STATUS Bit_RemoveSn (
BIT_PCSTR szSN,
BIT_UCHAR *pApplicationData)
```
删除指定授权码在本机的授权数据。
### 参数
- **szSN** - [IN] 授权码(SN)字符串。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
### Bit_Heartbeat
```c
BIT_STATUS Bit_Heartbeat(
BIT_HANDLE handle,
BIT_UINT32 *pReconnectsNum)
```
手动心跳,可以无限次调用,10s只会触发一次。
注:当自动心跳停止后,调用该接口可以尝试恢复自动心跳。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **pReconnectsNum** - [OUT] 保存心跳失败次数,开发上可以根据该次数决定是否退出程序。
### Bit_SessionControl
```c
BIT_STATUS Bit_SessionControl(
BIT_PCSTR szURL,
BIT_PCSTR pSessionId,
BIT_UINT32 type,
BIT_UCHAR *pApplicationData,
BIT_CHAR *pValue,
BIT_UINT32 *pValueLen)
```
控制或设置session的信息。具体使用场景可参考《浏览器并发控制》文档。
### 参数
- **szURL** - [IN] 自定义授权服务器地址,包括端口。如未使用自定义授权服务器则为NULL。
- **pSessionId** - [IN] Login后的sessionId,通过[Bit_GetSessionInfo](https://doc.bitanswer.cn/docs/client-api/c-interface-definitions-v2/#Bit_GetSessionInfo)可以获取。
- **type** - [IN] 类型。
| **类型** | **说明** |
| --------------------------- | ------------------ |
| **SESSION_CTL_LOGOUT(0x1)** | 释放session |
| **SESSION_CTL_CHECK(0x2)** | 触发心跳并获取sessionId状态 |
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pValue** - [OUT] 数据缓存区。
- **pValueLen** - [IN/OUT] 输入时是数据缓存区的大小,输出时是实际数据长度。
### Bit_SetSessionState
```c
BIT_STATUS Bit_SetSessionState (
BIT_HANDLE handle,
BIT_UINT32 state,
BIT_VOID *pReserved)
```
设置客户端的状态为空闲状态或繁忙状态或激活状态。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **state** - [IN] 设置客户端的状态选项。
| **值** | **说明** |
| ------------------------ | -------------------------------------------------- |
| **SESSION_STATE_UNSET** | 默认值,表示不设置客户端的状态,服务端根据心跳状态来维护session,心跳断开则释放session |
| **SESSION_STATE_IDLE** | 表示设置客户端为空闲态,服务端会在空闲时间超过设10分钟后自动释放session |
| **SESSION_STATE_BUSY** | 表示设置客户端为繁忙状态,服务端不会自动释放,直到心跳断开或者客户端主动释放 |
| **SESSION_STATE_ACTIVE** | 表示设置客户端为活跃状态,重新计算空闲时间 |
- **pReserved** - [OUT] 目前保留必须传NULL。
### 示例
```c
BIT_STATUS status = BIT_SUCCESS;
BIT_UINT32 reserved = 0;
if () {
status = Bit_SetSessionState (handle, SESSION_STATE_ACTIVE, &reserved);
} else if () {
status = Bit_SetSessionState (handle, SESSION_STATE_IDLE, &reserved);
}
```
## 激活升级
### Bit_UpdateOnline
```c
BIT_STATUS Bit_UpdateOnline (
BIT_PCSTR szURL,
BIT_PCSTR szSN,
BIT_UCHAR *pApplicationData)
```
此函数用于与授权服务器在线连接,自动完成本地授权的升级操作。本函数需要进行网络连接。
### 参数
- **szURL** - [IN] 自定义授权服务器地址,包括端口。如未使用自定义授权服务器则为NULL。
- **szSN** - [IN] 该参数可以传入授权码;激活口令;帐号密码;BIT-ID序号。传入方式参考[Bit_Login](https://doc.bitanswer.cn/docs/client-api/c-interface-definitions-v2/#Bit_LoginBit_LoginEx)的szSN参数说明。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
### 示例
```c
BIT_CHAR *pSn = "<授权码>";
BIT_STATUS status = Bit_UpdateOnline("", pSn, application_data);
if (status == BIT_SUCCESS) {
// 激活或升级成功
}
```
### Bit_GetRequestInfo
```c
BIT_STATUS Bit_GetRequestInfo (
BIT_PCSTR szSN,
BIT_UCHAR *pApplicationData,
BINDING_TYPE type,
BIT_CHAR *pRequestInfo,
BIT_UINT32 *pRequestInfoSize)
```
获取当前运行环境的升级请求码,用于发起本地授权激活及升级请求。如果第一次调用返回错误码260,说明传入的pRequestInfoSize太小,可传入返回的pRequestInfoSize再重新调用一次。
### 参数
- **szSN** - [IN] 授权码(SN)字符串。如果为空(空串或NULL)则尝试寻找所有当前本机可用的SN。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **type** - [IN] 获取请求码的类型。
| **类型** | **说明** |
| -------------------- | ----------------------- |
| **BINDING_EXISTING** | 使用当前绑定类型,对已激活授权码进行升级时使用 |
| **BINDING_LOCAL** | 使用本机指纹进行绑定 |
| **REQ_TYPE_MID** | 获取设备码 |
- **pRequestInfo** - [OUT] 用于存储请求码的存储区地址。
- **pRequestInfoSize** - [IN/OUT] 输入时为请求码存储区大小,输出时为请求码长度。
### 示例
```c
// 获取请求串
BIT_CHAR *pSn = "<授权码>";
BIT_CHAR buff[1024] = { 0 };
BIT_UINT32 len = sizeof(buff);
BIT_STATUS status = Bit_GetRequestInfo (pSn, application_data, BINDING_LOCAL, buff, &len);
if (status == BIT_SUCCESS) {
// 请求串保存在buff里
}
// 获取设备码
BIT_STATUS status = Bit_GetRequestInfo (NULL, application_data, REQ_TYPE_MID, buff, &len);
if (status == BIT_SUCCESS) {
// 设备码保存在buff里
}
```
### Bit_ApplyUpdateInfo
```c
BIT_STATUS Bit_ApplyUpdateInfo(
BIT_UCHAR *pApplicationData,
BIT_PCSTR pUpdateInfo,
BIT_CHAR *pReceipt,
BIT_UINT32 *pReceiptSize)
```
应用升级码完成本地授权激活或升级。本函数必须在获取请求码的同一环境下执行。
### 参数
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pUpdateInfo** - [IN] 由授权服务器获得的本地授权升级码。
- **pReceiptInfo** - [OUT] 确认码,记录升级状态,可在控制台上解析。
- **pReceiptInfoSize** - [IN/OUT] 输入时为存储区大小,输出时为确认码长度。
### 示例
```c
// 获取请求串
BIT_CHAR *pUpdateInfo = "<升级串>";
BIT_CHAR buff[1024] = { 0 };
BIT_UINT32 len = sizeof(buff);
BIT_STATUS status = Bit_ApplyUpdateInfo(application_data, pUpdateInfo, buff, &len);
if (status == BIT_SUCCESS) {
// 升级串使用成功,Buff里保存的是确认串
}
```
### Bit_ApplyUpdateInfoEx
```c
BIT_STATUS Bit_ApplyUpdateInfoEx(
BIT_CHAR *pScope,
BIT_UCHAR *pApplicationData,
BIT_PCSTR pUpdateInfo,
BIT_CHAR *pReceipt,
BIT_UINT32 *pReceiptSize);
```
应用升级码完成远程集团授权激活或升级。一般不建议使用。
### 参数
- **pScope** - [IN] 集团服务的URL。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pUpdateInfo** - [IN] 由授权服务器获得的本地授权升级码。
- **pReceiptInfo** - [OUT] 确认码,记录升级状态,可在控制台上解析。pReceiptInfoSize - [IN/OUT] 输入时为存储区大小,输出时为确认码长度。
### Bit_GetUpdateInfo
```c
BIT_STATUS Bit_GetUpdateInfo (
BIT_PCSTR szURL,
BIT_PCSTR szSN,
BIT_UCHAR *pApplicationData,
BIT_PCSTR pRequestInfo,
BIT_CHAR *pUpdateInfo,
BIT_UINT32 *pUpdateInfoSize)
```
使用请求码与授权服务器进行连接,获取升级码。本函数需要进行网络连接。
### 参数
- **szURL** - [IN] 自定义授权服务器地址,包括端口。如未使用自定义授权服务器则为NULL。
- **szSN** - [IN] 授权码(SN)字符串。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pRequestInfo** - [IN] 由获取请求码函数得到的请求码。
- **pUpdateInfo** - [OUT] 由授权服务器获得的本地授权升级码。
- **pUpdateInfoSize** - [IN/OUT] 输入时为存储区大小,输出时为升级码长度。
## 特征项操作
### Bit_BatchBegin
```c
BIT_STATUS Bit_BatchBegin(
BIT_HANDLE handle,
BIT_UINT32 mode)
```
开启批量Query模式,调用此API后调用的所有Query相关API,全部由Bit_BatchEnd接口批量提交连接集团服务。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **mode** - [IN] 批量请求的行为模式。
| **类型** | **说明** |
| --------------------------------- | ----------------------------- |
| **BIT_BATCH_MODE_CONTINUE (0x0)** | 批量提交过程中,遇到失败的接口会记录错误信息,并且继续执行 |
| **BIT_BATCH_MODE_BREAK (0x01)** | 批量提交过程中,遇到失败的接口会记录错误信息,直接返回错误 |
### Bit_BatchEnd
```c
BIT_STATUS Bit_BatchEnd(
BIT_HANDLE handle,
BIT_UINT32 *pResultList,
BIT_UINT32 *pResultListSize)
```
批量提交Query请求。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **pResultList** - [OUT] 按顺序返回每个接口的错误码,0表示成功,非0表示失败,传NULL表示清理添加的批量数据。
- **pResultListSize** - [OUT] 返回调用接口的数量。
### 示例
```c
// 开启批次
Bit_BatchBegin(handle, BIT_BATCH_MODE_CONTINUE);
BIT_UINT32 result[3] = { 0 };
BIT_UINT32 resultNum = 3;
BIT_TICKET ticket = NULL;
BIT_UINT32 capacity = 0;
Bit_QueryFeature(handle, 1, &capacity);
Bit_QueryFeatureEx2(handle, "test", 0, 10, "1.0", &ticket);
// 批量提交
Bit_BatchEnd(handle, result,& resultNum) ;
if (result[0] == BIT_SUCCESS)
{
// Bit_QueryFeature(1) success
}
if (result[1] == BIT_SUCCESS)
{
// Bit_QueryFeatureEx2 ("test") success}
}
```
### Bit_QueryFeature
```c
BIT_STATUS Bit_QueryFeature (
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_UINT32 *pCapacity)
```
开发商可以对软件的某个功能进行单独授权,当程序运行该模块时,可以通过该接口检查是否可用。
对于单机授权:只检查特征项是否可用。
云/帐号/集团授权:调用该接口将占用一个用户数,用户数占满时,调用该接口会报错。开发商可以通过该方式来控制并发。(当客户端断开连接后,服务端会自动释放占用的用户数)
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 特征项ID。
- **pCapacity** - [OUT] 当不为NULL时,获取特征项当前可用用户数。
重复调用引用会+1,通过Bit_ReleaseFeature来减少引用,当引用减少到0时,释放占用的用户数。
### 示例
```c
BIT_UINT32 featureId = 1;
BIT_UINT32 capacity = 0;
BIT_STATUS status = Bit_QueryFeature(handle, featured, &capacity);
if (status == BIT_SUCCESS) {
// 特征项1有效
}
```
### Bit_ReleaseFeature
```c
BIT_STATUS Bit_ReleaseFeature (
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_UINT32 *pCapacity)
```
释放所占用的用户数,该函数和Bit_QueryFeature一一对应。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 特征项ID。
- **pCapacity** - [OUT] 当不为NULL时,获取特征项当前可用用户数。
### 示例
```c
BIT_UINT32 capacity = 0;
BIT_STATUS status = Bit_QueryFeature(handle, 1, capacity);
if (status != BIT_SUCCESS) {
return;
}
// 执行业务逻辑
// 执行后,进行释放
status = Bit_ReleaseFeature(handle, 1, &capacity);
```
### Bit_QueryFeatureEx
```c
BIT_STATUS Bit_QueryFeatureEx (
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_UINT32 mode,
BIT_UINT32 required,
BIT_UINT32 *pCapacity,
BIT_PCSTR xmlScope)
```
集团授权专用,该接口支持占用指定用户数,支持通过特征项版本进行检查。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 特征项ID。
- **mode** - [IN]
| **类型** | **说明** |
| ----------------------------- | ------------------------------------------------------------------------------------- |
| **BIT_QUERY_DEFAULT(0x0)** | 非阻塞占用required个用户数,如果用户数不够将返回错误 |
| **BIT_QUERY_AVAILABLE(0x01)** | 尽可能的占用required个用户数,如果用户数不够将占用剩余用户数 例如:Feature剩余10个用户数。Required需要占用20个,则返回成功,并占用10个用户数 |
| **BIT_QUERY_CHECK(0x02)** | 获取当前session占用的用户数 |
| **BIT_QUERY_TEST(0x100)** | 该类型可以与上面的选项组合使用,检查操作是否可以成功,但并不占用用户数 例如:(BIT_QUERY_DEFAULT |
- **required** - [IN] 请求的用户数,该接口可以调用多次,实际的占用的用户数为,每次调用的最大值。
 示例:
 第一次:required了10个。
  第二次:required了8个,此时总共占用10个。
 第三次:required了15个,此时总共占用15个。
- **pCapacity** - [OUT] 当不为NULL时,获取特征项当前可用用户数。
- **xmlScope** - [IN] 可以传入特征项版本。示例“1.0”,“2.0”,如果为空,则匹配任意版本的特征项。
### 示例
```c
// 占用特征项ID为8的10个用户数:
BIT_UINT32 capacity = 0;
BIT_STATUS status = Bit_QueryFeatureEx (
handle,
8,
BIT_QUERY_DEFAULT,
10,
&capacity,
NULL);
if (status == BIT_SUCCESS) {
// 特征项“8”用户数占用成功
// 执行业务逻辑代码
}
```
### Bit_ReleaseFeatureEx
```c
BIT_STATUS Bit_ReleaseFeatureEx (
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_UINT32 consumed,
BIT_UINT32 *pCapacity,
BIT_PCSTR xmlScope)
```
集团授权专用,释放指定的用户数。该接口与Bit_QueryFeatureEx对应。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 特征项ID。
- **consumed** - [IN] 释放指定用户数,如果为0,表示释放全部用户数。
- **pCapacity** - [OUT] 返回剩余用户数。
- **xmlScope** - [IN] 可以传入特征项版本。注意:必须与Bit_QueryFeatureEx的输入的版本一致,才可以释放。
### 示例
```c
// 释放占用特征项ID为8的2个用户数:
BIT_UINT32 capacity = 0;
BIT_STATUS status = Bit_ReleaseFeatureEx (
handle,
8,
2,
&capacity,
NULL)
if (status == BIT_SUCCESS) {
// 用户数释放成功
}
```
### Bit_QueryFeatureEx2
```c
BIT_STATUS Bit_QueryFeatureEx2 (
BIT_HANDLE handle,
BIT_PCSTR featureName,
BIT_UINT32 mode,
BIT_UINT32 required,
BIT_PCSTR xmlScope,
BIT_TICKET *pTicket)
```
可以使用“特征项名称 + 特征项版本”进行用户数占用,支持队列模式。
对于单机授权:只检查特征项是否可用。
云/帐号/集团授权:调用该接口将占用一个用户数,用户数占满时,调用该接口会报错。开发商可以通过该方式来控制并发。(当客户端断开连接后,服务端会自动释放占用的用户数)
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureName** - [IN] 特征项名称。
- **mode** - [IN]
| **类型** | **说明** |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **BIT_QUERY_DEFAULT(0x00)** | 非阻塞占用required个用户数,如果用户数不够将返回错误 **注意:**云/帐号授权仅支持该模式 |
| **BIT_QUERY_AVAILABLE(0x01)** | 尽可能的占用required个用户数,如果用户数不够将占用剩余用户数。 例如:Feature剩余10个用户数。Required需要占用20个,则返回成功,并占用10个用户数。 |
| **BIT_QUERY_WAIT(0x03)** | 加入等待队列,可以设置超时,超时后,将自动返回 |
| **BIT_QUERY_QUEUE(0x04)** | 加入队列,通过Bit_GetTicketInfo可以查看队列状态 |
| **BIT_QUERY_TEST(0x100)** | 该类型可以与上面的选项组合使用,检查操作是否可以成功,但并不占用用户数 例如:(BIT_QUERY_DEFAULT |
| **BIT_QUERY_SHARED_USERS(0x200)** | User用户数共享。 默认情况下调用该接口的用户数是不共享的,即:第一次QueryFeatureEx2了10个用户数,第二次QueryFeatureEx2了10个用户数,总共占用20个用户数。 当设置了该属性,如果两次QueryFeature的特征项名称、版本都一致,则用户数是可以合并的,例如:两次各QueryFeatureEx2了10个用户数,则总共占用10用户数。 |
| **BIT_QUERY_SERVICE_RANDOM(0x400)** | IP随机。 该模式需要与Login的LOGIN_MODE_CREATE_HANDLE_ONLY配合使用。 设置了该模式后,当Login的handle没有登录过,则在连接服务器时会随机轮询IP。 默认情况下,客户端会按配置的IP顺序挨个查找,设置了该模式会随机轮询,从而减少排在前面的IP负载。 |
| **BIT_QUERY_USE_ID(0x800)** | 使用featureId占用feature。 设置了该模式后,featureName参数必须传入纯数字的字符串,例如“1”,客户端会将该字符串转化为featureId发送给服务端来占用featureId为1的feature。 |
| **BIT_QUERY_MID_ONLY(0x1000)** | 按MID占用特征项。 - 未指定MID_ONLY时:默认优先占用已绑定MID的特征项;若不存在,则占用未绑定MID的特征项。- 指定MID_ONLY时:仅允许占用已绑定MID的特征项,具体场景及返回结果如下: - 若集团服务的所有特征项均未绑定MID,返回错误码1924。 - 若集团服务存在绑定MID的特征项,但客户端传入的MID与集团授权绑定的MID不匹配,返回错误码416。 - 若集团服务存在绑定MID的特征项,且客户端传入的MID与集团授权绑定的MID匹配,正常占用特征项。**版本支持:**14.5.0及以上版本新增类型,需配合14.5.0及以上版本的集团服务和客户端库使用 |
- **required** - [IN] 请求的用户数。
- **xmlScope** - [IN] 可以传入特征项版本。示例:“1.0”,“2.1”。
- **pTicket** - [OUT]
### 示例
```c
// 占用特征项A 1.0版本,5个用户数:
BIT_TICKET ticket = NULL;
BIT_STATUS status = Bit_QueryFeatureEx2 (
handle,
"特征项A",
BIT_QUERY_DEFAULT,
5,
"1.0",
&ticket);
if (status == BIT_SUCCESS) {
// 占用成功,执行业务逻辑
}
```
### Bit_ReleaseFeatureEx2
```c
BIT_STATUS Bit_ReleaseFeatureEx2 (
BIT_TICKET ticket,
BIT_UINT32 consumed)
```
释放ticket所占用的用户数。该函数和Bit_QueryFeatureEx2一一对应。
### 参数
- **ticket** - [IN] 通过QueryFeatureEx2返回的句柄。
- **consumed** - [IN] 保留值,必须是0。
### 示例
```c
BIT_STATUS status = Bit_ReleaseFeatureEx2 (ticket, 0);
if (status == BIT_SUCCESS) {
// 释放ticket占用的用户数
}
```
**特征项Query相关接口比较**
| **函数** | **特征项ID** | **特征项名称** | **特征项版本** | **一次Query多个用户数** | **队列** | **用户数递增/递减** |
| ----------------------- | --------- | --------- | --------- | ---------------- | ------ | ------------ |
| **Bit_QueryFeature** | 支持 | | | | | |
| **Bit_QueryFeatureEx** | 支持 | | 支持 | 支持 | | 支持 |
| **Bit_QueryFeatureEx2** | 支持 | 支持 | 支持 | 支持 | 支持 | |
### Bit_GetFeatureInfo2
```c
BIT_STATUS Bit_GetFeatureInfo2 (
BIT_HANDLE handle,
BIT_PCSTR featureName,
BIT_PCSTR xmlScope,
BIT_INT32 *pExpired)
```
检查特征项是否存在,不会占用授权码或特征项的用户数,获取特征项的剩余有效期。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureName** - [IN] 产品的特征项名称。
- **xmlScope** - [IN] 查找范围,可以通过 xml 格式传入版本,也可以直接传入版本的字符串。
```xml
<scope>
<featureVersion>1.1</featureVersion>
</scope>
<!-- 或者直接输入:'1.1' -->
```
- **pExpired** - [OUT] 返回该特征项的剩余有效期,正数代表剩余有效期,负数代表过期天数,36500代表永久有效。
### Bit_GetFeatureInfoEx2
```c
BIT_STATUS Bit_GetFeatureInfoEx2(
BIT_HANDLE handle,
BIT_PCSTR featureName,
BIT_PCSTR xmlScope,
BIT_CHAR *pFeatureInfo,
BIT_UINT32 *pFeatureInfoSize);
```
获取指定feature的信息,以XML格式返回。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureName** - [IN] 产品的特征项名称。
- **xmlScope** - [IN] 查找范围,可以通过 xml 格式传入版本,也可以直接传入版本的字符串。
```xml
<scope>
<featureVersion>1.1</featureVersion>
</scope>
<!-- 或者直接输入:'1.1' -->
```
- **pFeatureInfo** - [OUT] feature信息存储区地址。
- **pFeatureInfoSize** - [IN/OUT] 会话存储区大小。
### Bit_GetTicketInfo
```c
BIT_STATUS Bit_GetTicketInfo(
BIT_TICKET ticket,
BIT_UINT32 type,
BIT_CHAR *pXmlInfo,
BIT_UINT32 *pSize)
```
获取ticket信息。
### 参数
- **ticket** - [IN] Bit_QueryFeatureEx2产生的句柄。
- **type** - [IN] 类型。
| **类型** | **说明** |
| ------------------------------ | -------------- |
| **BIT_TICKET_TYPE_USERS(0x1)** | 获取ticket占用的用户数 |
| **BIT_TICKET_TYPE_CHECK(0x2)** | 检查当前ticket的状态 |
| **BIT_TICKET_TYPE_INFO(0x3)** | 获取当前ticket的信息 |
- **pXmlInfo** - [OUT] ticket信息存储区地址。
- **pSize** - [IN/OUT] 输入时为存储区长度,输出时为返回信息的长度。
BIT_TICKET_TYPE_INFO返回的xml信息如下
```c
<?xml version='1.0' encoding='UTF-8'?>
<ticketInfo>
<requestInfo>
<fId>1</fId> <!-- feature的id -->
<fName>test</fName> <!-- feature的名称 -->
<requestUserNumber>10</requestUserNumber> <!-- feature的点数 -->
<requestFversion>1.0</requestFversion> <!-- feature的版本 -->
</requestInfo>
<occupationInfos>
<occupationInfo>
<snInfo>
<sn>4HAYJUOA********</sn> <!-- sn下的feature -->
<controlType>Local/group</controlType> <!-- feature类型 -->
</snInfo>
<occFversion>1.0</occFversion> <!-- feature的版本 -->
<occUserNumber>3</occUserNumber> <!-- feature的点数 -->
</occupationInfo>
<occupationInfo>
<snInfo>
<sn>4HAYJUOA********</sn> <!-- sn下的feature -->
<controlType>Local/group</controlType> <!-- feature类型 -->
</snInfo>
<occFversion>2.0</occFversion> <!-- feature的版本 -->
<occUserNumber>7</occUserNumber> <!-- feature的点数 -->
</occupationInfo>
</occupationInfos>
</ticketInfo>
```
### Bit_ConvertFeature
```c
BIT_STATUS Bit_ConvertFeature(
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_UINT32 para1,
BIT_UINT32 para2,
BIT_UINT32 para3,
BIT_UINT32 para4,
BIT_UINT32 *pResult);
```
使用“算法”类型的特征项对输入参数进行变换操作,得到唯一对应的4字节结果。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 产品的特征项ID。
- **para1** - [IN] 变换输入因子1。
- **para2** - [IN] 变换输入因子2。
- **para3** - [IN] 变换输入因子3。
- **para4** - [IN] 变换输入因子4。
- **pResult** - [OUT] 变换结果。
### 示例
```c
BIT_HANDLE handle = xx,
BIT_UINT32 featureId = xx;
BIT_UINT32 par1 = 0x1234;
BIT_UINT32 par2 = 0x2234;
BIT_UINT32 par3 = 0x3234;
BIT_UINT32 par4 = 0x4234;
BIT_UINT32 convertResult;
BIT_STATUS status = Bit_ConvertFeature(handle, featureId, par1, par2, par3, par4, &convertResult);
```
### Bit_EncryptFeature
```c
BIT_STATUS Bit_EncryptFeature(
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_VOID *pPlainBuffer,
BIT_VOID *pCipherBuffer,
BIT_UINT32 dataBufferSize);
```
使用“密钥”类型的特征项对输入的明文进行加密,返回密文结果。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 产品的特征项ID。
- **pPlainBuffer** - [IN] 数据缓存区地址,用于存储明文数据。
- **pCipherBuffer** - [OUT] 数据缓存区地址,用于存储密文数据。
- **bufferSize** - [IN] 数据长度,最大长度为256字节。
### 示例
```c
BIT_HANDLE handle = xx,
BIT_UINT32 featureId = xx;
BIT_UCHAR plainbuffer[256] = "this is plain data";
BIT_UCHAR cipherbuffer[256] = { 0 };
BIT_UINT32 dataLen = strlen(plainbuffer);
BIT_STATUS status = Bit_EncryptFeature(handle, featureId, plainbuffer, cipherbuffer, dataLen);
```
### Bit_DecryptFeature
```c
BIT_STATUS Bit_DecryptFeature(
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_VOID *pCipherBuffer,
BIT_VOID *pPlainBuffer,
BIT_UINT32 dataBufferSize);
```
使用“密钥”类型的特征项对输入的密文进行解密,返回明文结果。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 产品的特征项ID。
- **pCipherBuffer** - [IN] 数据缓存区地址,用于存储密文数据。
- **pPlainBuffer** - [OUT] 数据缓存区地址,用于存储明文数据。
- **bufferSize** - [IN] 数据长度,最大长度为256字节。
### 示例
```c
BIT_HANDLE handle = xx,
BIT_UINT32 featureId = xx;
BIT_UCHAR plainbuffer[256] = { 0 };
BIT_UCHAR cipherbuffer[256] ="xxxxxxxxx";
BIT_UINT32 dataLen = 16;
BIT_STATUS status = Bit_DecryptFeature(handle, featureId, cipherbuffer, plainbuffer, dataLen);
```
### Bit_ReadFeature
```c
BIT_STATUS Bit_ReadFeature(
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_UINT32 *pFeatureValue);
```
读取特征项的数据内容,可用于“只读”和“读写”特征类型。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 产品的特征项ID。
- **pFeatureValue** - [OUT] 特征项数据缓存区地址,用于存储读出的数据。
### Bit_WriteFeature
```c
BIT_STATUS Bit_WriteFeature(
BIT_HANDLE handle,
BIT_UINT32 featureId,
BIT_UINT32 featureValue);
```
更新“读写”类型的特征项的数据内容。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **featureId** - [IN] 产品的特征项ID。
- **featureValue** - [IN] 特征项数据值。
## 配置项操作
### Bit_GetDataItem
```c
BIT_STATUS Bit_GetDataItem (
BIT_HANDLE handle,
BIT_PCSTR szDataItemName,
BIT_VOID *pDataItemValue,
BIT_UINT32 *pDataItemValueSize)
```
读取指定的配置项数据。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **szDataItemName** - [IN] 数据项名称,名称最大长度为128字节。
- **pDataItemValue** - [OUT] 数据缓存区地址,数据最大长度为1024字节。
- **pDataItemValueSize** - [IN/OUT] 数据项长度。
### Bit_SetDataItem
```c
BIT_STATUS Bit_SetDataItem (
BIT_HANDLE handle,
BIT_PCSTR szDataItemName,
BIT_VOID *pDataItemValue,
BIT_UINT32 dataItemValueSize)
```
创建或更新配置项。如果相同名称的配置项存在,则会更新其中的数据;否则将添加新的授权码配置项。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **szDataItemName** - [IN] 数据项名称,名称最大长度为128字节。
- **pDataItemValue** - [IN] 数据项数据缓存区地址,数据最大长度为1024字节。
- **dataItemValueSize** - [IN] 数据项长度。
### Bit_GetDataItemNum
```c
BIT_STATUS Bit_GetDataItemNum (
BIT_HANDLE handle,
BIT_UINT32 *pNum)
```
此函数用于获取可访问配置项的数量,一般用于配置项的枚举操作。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **pNum** - [OUT] 可访问的数据项总数,包括了所有可以访问到的产品、模版及授权码的数据项。
### Bit_GetDataItemName
```c
BIT_STATUS Bit_GetDataItemName (
BIT_HANDLE handle,
BIT_UINT32 index,
BIT_CHAR *pDataItemName,
BIT_UINT32 *pDataItemNameSize)
```
根据配置项索引获取其名称,一般用于配置项的枚举操作。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **index** - [IN] 数据项索引。
- **pDataItemName** - [OUT] 用于存储数据项名称的存储区地址。
- **pDataItemNameSize** - [IN/OUT] 数据项名称存储区大小。
### Bit_RemoveDataItem
```c
BIT_STATUS Bit_RemoveDataItem (
BIT_HANDLE handle,
BIT_PCSTR szDataItemName)
```
删除指定的配置项。该操作无法删除通过控制台设置的产品配置项或模版配置项。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **szDataItemName** - [IN] 数据项名称,名称最大长度为128字节。
## 信息获取
### Bit_GetSessionInfo
```c
BIT_STATUS Bit_GetSessionInfo (
BIT_HANDLE handle,
SESSION_TYPE type,
BIT_CHAR *pSessionInfo,
BIT_UINT32 *pSessionInfoSize)
```
获取当前会话信息,以字符串形式返回。根据获取的内容不同,返回结果可能是XML格式或非XML格式。返回数据中的日期项已根据客户端的本地时区进行调整。如果Login时未指定SN,返回串为当前系统所有可用SN的综合结果。
当函数返回BIT_ERR_BUFFER_SMALL时,pSessionInfoSize保存的是实际数据的大小。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。
- **type** - [IN] 获取会话信息类型。
| 类型 | 说明 |
| ----------------------------- | ------------------------------------------------------------------------------------------------ |
| **XML_TYPE_SN_INFO** | 获取当前会话中授权码的授权信息,以XML形式返回。未做限制的授权项将不会返回 |
| **XML_TYPE_FEATURE_INFO** | 获取当前会话中授权码的特征项信息,以XML形式返回 |
| **XML_TYPE_SN_FEATURE_INFO** | 获取当前会话中授权码及授权码特征项的授权信息,以XML形式返回 **版本支持:**14.5.2及以上版本客户端库和集团服务支持返回MID信息(设置时才显示)、特征项的index(用于唯一标识) |
| **XML_TYPE_DATA_INFO** | 获取当前会话中授权码的配置项信息,以XML形式返回 |
| **BIT_SERVER_ADDRESS** | 授权服务器IP地址。单机授权不支持 |
| **BIT_SERVER_TIME** | 授权服务器系统时间。如果是本地授权,将返回本机系统时间 |
| **BIT_CONTROL_TYPE** | 授权类型。是以逗号分隔的以下几种类型的组合:Group(集团授权), Smart(智能连接), Float(可浮动), Demo(演示授权), USB(U盘授权), Force(强制认证) |
| **BIT_VOLUME_NUMBER** | 允许使用的机器数量 |
| **BIT_START_DATE** | 授权开始日期,Unlimited表示无限制 |
| **BIT_END_DATE** | 授权结束日期,Unlimited表示无限制 |
| **BIT_EXPIRATION_DAYS** | 授权有效期,单位为天。有效期从激活时间算起,Unlimited表示无限制 |
| **BIT_USAGE_NUMBER** | 最大使用次数 |
| **BIT_CONSUMED_USAGE_NUMBER** | 对于设定最大使用次数的授权码,返回当前使用次数 |
| **BIT_ACTIVATE_DATE** | 授权码激活时间 |
| **BIT_USER_LIMIT** | 集团授权用户数,返回纯数字。对其它方式的授权返回0 |
| **BIT_LAST_UPDATE_DATE** | 最后与服务器连接时间 |
| **BIT_MAX_OFFLINE_MINUTES** | 强制认证最大离线时间(分钟),返回Unlimited表示无强制认证 |
| **BIT_SESSION_ID** | 获取当前会话的字符串sessionId |
| **BIT_SERVER_HB_STATUS** | 获取心跳状态,pSessionInfo无数据,状态通过函数返回值区分 |
| **BIT_TICKET_LIST_BIN** | 获取TICKET列表 |
- **pSessionInfo** - [OUT] 会话信息存储区地址。可以为NULL,此时仅用于获取存储区大小。
- **pSessionInfoSize** - [IN/OUT] 会话存储区大小。
### 示例
```c
BIT_UINT32 buffSize = 10240;
BIT_CHAR *pBuff = (BIT_CHAR *)malloc(buffSize);
if (pBuff == NULL) {
return;
}
memset(pBuff, 0, buffSize);
BIT_STATUS status = Bit_GetSessionInfo (handle,
XML_TYPE_SN_INFO,
pBuff,
& buffSize);
if (status == BIT_ERR_BUFFER_SMALL) {
free(pBuff);
pBuff = malloc(buffSize + 1);
memset(pBuff, 0, buffSize + 1);
status = Bit_GetSessionInfo (handle,
XML_TYPE_SN_INFO,
pBuff,
&buffSize);
}
if (status == BIT_SUCCESS) {
// pBuff 保存的是需要查找的数据
}
free(pBuff);
```
### Bit_GetInfo
```c
BIT_STATUS Bit_GetInfo (
BIT_PCSTR szSN,
BIT_UCHAR *pApplicationData,
INFO_TYPE type,
BIT_CHAR *pInfo,
BIT_UINT32 *pInfoSize)
```
获取本地授权信息。
如果要获取集团授权的信息,则szSN输入“`@bit://ip:port`”,会获取集团授权信息(仅支持type=BIT_INFO_SN)。
由于集团授权需要登录才能获取信息,而登录需要占用用户数,此方式提供了一个在不登录的情况下来获取集团授权信息。
### 参数
- **szSN** - [IN] 输入要检索的SN,如果为NULL,表示获取所有SN。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **type** - [IN] 类型。
| **类型** | **说明** |
| --------------------------- | --------------------------------------- |
| **BIT_INFO_SERVER_ADDRESS** | 获取局域网内的集团授权服务器地址列表 |
| **BIT_INFO_SN** | 获取本机已激活的授权码列表 |
| **BIT_INFO_SN_FEATURE** | 获取本机已激活授权码的特征项列表 **版本支持:**集团授权支持返回MID信息 |
| **BIT_INFO_SN_LICENSE** | 获取本机已激活授权码的授权信息 |
| **BIT_INFO_UPDATE_ERROR** | 获取指定授权码的升级错误详细信息。是否存在详细信息由授权码类型及错误类型决定 |
| **BIT_INFO_CONFIG** | 获取当前产品的配置文件信息 |
| **BIT_INFO_TOKEN_LIST** | 获取当前机器上可用的BIT-ID列表信息 |
- **pInfo** - [OUT] 数据缓存区地址。
- **pInfoSize** - [IN/OUT] 输入时是数据缓存区大小,输出时是实际数据的长度。
### Bit_GetServerInfo
```c
BIT_STATUS Bit_GetServerInfo(
BIT_PCSTR szURL,
BIT_PCSTR szSN,
BIT_PCSTR xmlScope,
BIT_UCHAR *pApplicationData,
BIT_INFO_EX_TYPE type,
BIT_CHAR *pServerInfo,
BIT_UINT32 *pServerInfoSize);
```
获取集团服务的License信息,数据以XML格式返回。调用此函数前客户端不需要执行登录操作。
### 参数
- szURL - [IN] 指定集团授权服务器地址,包括端口。
- szSN - [IN] 授权码(SN)字符串。
- xmlScope- [IN] 查询指定特征项的信息,以XML格式传入。14.6.0及以上版本支持传入groupName指定查询分组,具体使用规则参见下文xmlScope使用说明。
- pApplicationData - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- type- [IN] 获取信息类型。
| **类型** | **说明** |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **BIT_SERVER_INFO_SN** | 获取集团服务的授权码列表 |
| **BIT_SERVER_INFO_SN_FEATURE** | 获取集团服务的授权码的特征项列表 **版本支持:**14.5.2及以上版本客户端库和集团服务支持返回MID信息(设置时才显示)、特征项的index(用于唯一标识) |
| **BIT_SERVER_INFO_SN_LICENSE** | 获取集团服务的授权码的授权信息 |
| **BIT_SERVER_INFO_FEATURE_LICENSE** | 获取集团服务的特征项的授权信息 **版本支持:**14.5.2及以上版本客户端库和集团服务支持返回MID信息(设置时才显示)、特征项的index(用于唯一标识) |
| **BIT_SERVER_INFO_SN_USERS** | 获取集团服务被占用的SN的用户信息 **版本支持:**14.6.0及以上版本支持通过xmlScope传入groupName指定查询分组,需配合14.6.0及以上版本集团服务使用 |
| **BIT_SERVER_INFO_FEATURE_USERS** | 获取集团服务被占用的feature的用户信息 **版本支持:**14.6.0及以上版本支持通过xmlScope传入groupName指定查询分组,需配合14.6.0及以上版本集团服务使用 |
| **BIT_SERVER_INFO_FEATURE_USERS_EX** | 获取集团服务被占用的feature的用户信息 **版本支持:**- 14.5.2及以上版本:新增类型,在BIT_SERVER_INFO_FEATURE_USERS基础上,额外多返回属性,包含idversionindex(值为name名称)- 14.6.0及以上版本:支持通过xmlScope传入groupName指定查询分组,需配合14.6.0及以上版本集团服务使用 |
- pServiceLicenseInfo - [OUT] 用于存储返回XML信息数据的存储区地址。
- pServiceLicenseInfoSize - [IN/OUT] 输入的存储区长度。
### xmlScope使用说明
支持指定特征项查询和指定分组查询两种方式,暂不支持同时指定特征项和分组信息。
1. 指定特征项(feature)查询
适用于所有BIT_INFO_EX_TYPE类型,通过id、name、version限定待查询的特征项。
```xml
<features>
<feature id="xxxx" name="xxxx" version="xxxx"/> # xxxx处替换为实际特征项参数
<feature id="xxxx" name="xxxx" version="xxxx"/> # 允许设置多个
……
</features>
```
1. 指定分组(group)查询
仅支持BIT_SERVER_INFO_SN_USERS、BIT_SERVER_INFO_FEATURE_USERS、BIT_SERVER_INFO_FEATURE_USERS_EX三种类型,通过name限定待查询的分组。
```c
<groups>
<group name="xxxx"/> # xxxx处替换为实际分组名称
<group name="xxxx"/> #
</groups>
```
> 说明:通过Bit_SetCustomInfo的CUSTOM_GROUP_NAME(0xA)设置分组。
### 返回XML数据说明
传入分组名称,仅返回当前分组内的用户信息;不传入分组名称,默认返回所有用户信息。如果客户端调用Bit_SetCustomInfo指定group后,返回的XML数据中,userInfo节点会新增groupName字段。
XML返回示例:
```c
<?xml version="1.0" encoding="UTF-8"?>
<serverInfo timeZone="+08:00">
<userInfo>
<sn>CLMDMJDR********</sn>
<userName>98001</userName>
<machineName>bit</machineName>
<ip>127.0.0.1</ip>
<loginTime>2026-02-26 01:49:28</loginTime>
<groupName>bit</groupName>
</userInfo>
</serverInfo>
```
### Bit_GetVersion
```c
BIT_STATUS Bit_GetVersion (
BIT_UINT32 *pVersion)
```
获取客户端安全库版本号。
### 参数
- **pVersion** - [OUT] 客户端安全库版本号。
### Bit_GetNextHandle
```c
BIT_STATUS Bit_GetNextHandle(
BIT_HANDLE handle,
BIT_HANDLE *pNextHandle)
```
用来遍历当前进程内的handle。
### 参数
- **handle** [IN] 当前handle。如果传NULLpNextHandle返回第一个handle。
- **pNextHandle** [OUT] 返回handle指向的下一个handle,如果返回为NULL,则表示已经到了末尾。
### 示例
```c
BIT_HANDLE nextHandle = NULL;
while (Bit_GetNextHandle(nextHandle , &nextHandle) == BIT_SUCCESS && nextHandle != NULL) {
// 使用nextHandle处理业务逻辑
}
```
### Bit_TestBitService
```c
BIT_STATUS Bit_TestBitService (
BIT_PCSTR szURL,
BIT_PCSTR szSN,
BIT_UINT32 featureId,
BIT_UCHAR *pApplicationData)
```
测试集团授权的特征项是否可用,不会占用授权码或特征项的用户数。
### 参数
- **szURL** - [IN] 自定义授权服务器地址,需包括端口。如未使用自定义授权服务器则为NULL。
- **szSN** - [IN] 授权码(SN)字符串。如果为空(空字符串""或NULL)则尝试寻找所有当前本机可用的SN。
- **featureId** - [IN] 登录授权所需要包含的特征项ID。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
> **注意:szSN和featureId为二选一互斥关系**,需遵循以下规则
>
> - 指定授权码:当szSN不为NULL或空字符串("")时,featureId必须设为0。
> - 指定特征项:当featureId不为0时,szSN必须设为NULL或空字符串("")。
> - 特殊情况:允许szSN为NULL或空字符串,且featureId为0。
### Bit_GetProductPath
```c
BIT_STATUS Bit_GetProductPath(
BIT_UCHAR *pApplicationData,
BIT_CHAR *pPath,
BIT_UINT32 lenPath);
```
获取授权存储目录。
### 参数
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pPath** - [OUT] 授权存储目录。
- **lenPath** - [IN] 指定授权目录pPath数据长度。建议值:WindowsPATH_MAX (260) Linux/UnixPATH_MAX (4096)。
### Bit_GetLastError
```c
BIT_STATUS Bit_GetLastError();
```
获取上一个API调用返回的错误码。
### 参数
## 属性设置
### Bit_SetAttr
```c
BIT_STATUS Bit_SetAttr (
BIT_HANDLE handle,
BIT_UINT32 type,
BIT_VOID *pValue)
```
设置全局配置或当前会话的配置。
### 参数
- **handle** - [IN] 通过Login函数返回的上下文句柄。如果传NULL,表示设置全局,不为NULL表示设置该会话。
- **type** - [IN] 类型。
| **类型** | **值** | **说明** |
| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **ATTR_HB_STOPED_CALLBACK0x1** | void (*T_HbStopedCallback)(BIT_HANDLE, void* pData) | 心跳停止回调函数 心跳停止后会回调该函数,可检测与授权服务的连接状态 **注意事项:**handle不能为NULL |
| **ATTR_WAIT_TIMEOUT(0x2)** | BIT_UINT32 * | 队列等待超时时间 最小16秒,最大15天,默认0表示无限等待 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_RETRY_COUNT(0x3)** | BIT_UINT32 * | 心跳连接重试次数 当心跳时候,总的重试次数 **取值说明:** 0:表示无限重试,直到客户端超时或授权失效,才会停止,默认是0 -1:表示无限重试,无论客户端是否超时或授权失效,都会重试 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_RETRY_INTERVAL(0x4)** | BIT_UINT32 * | 心跳连接重试间隔 心跳失败后下次重试的间隔 最小10秒,最大4小时,默认10秒 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_CONNECT_TIMEOUT(0x5)** | BIT_UINT32 * | 建立连接超时时间 最小1秒,最大32秒,默认32秒 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_CONNECT_RETRY_COUNT(0x6)** | BIT_UINT32 * | 连接重试次数 最小0次,最大10次,默认3次 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_HB_INTERVAL(0x8)** | BIT_UINT32 * | 心跳间隔 最小30秒,默认由服务端控制 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_HB_AUTO_ENABLE(0x9)** | BIT_UINT32 * | 是否启动自动心跳 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_HB_TIMEOUT(0x10)** | BIT_UINT32 * | 心跳周期(超过则被踢出) 集团服务端也可以设置心跳周期,该周期会覆盖服务端的设置 最小60秒,最大30天,默认由服务端控制 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_HB_STOPED_CALLBACK_DATA(0x12)** | void * | 心跳停止回调函数自定义数据 触发心跳停止回调时,会将该值传递到ATTR_HB_STOPED_CALLBACK回调函数的最后一个参数 **注意事项:**handle不能为NULL |
| **ATTR_HB_STOPED_CALLBACK_EX(0x13)** | void (*T_HbStopedCallbackEx)(BIT_HANDLE, BIT_TICKET, BIT_STATUS, void* pData); | 特征项的心跳停止回调函数 **参数说明:** - BIT_HANDLE handlelogin接口返回的handle- BIT_TICKET ticketquery接口返回的ticket- BIT_STATUS status:心跳停止返回的错误码- void *pData:开发商自定义数据,需通过ATTR_HB_STOPED_CALLBACK_EX_DATA传入**注意事项:**handle不能为NULL |
| **ATTR_HB_STOPED_CALLBACK_EX_DATA(0x14)** | void * | 特征项的心跳停止回调函数自定义数据 触发特征项的心跳停止回调时,会将该值传递到ATTR_HB_STOPED_CALLBACK_EX回调函数的最后一个参数 **注意事项:**handle不能为NULL |
| **ATTR_HB_RETRY_CALLBACK_EX(0x15)** | void (*T_HbRetryFailedCallbackEx)(BIT_HANDLE, BIT_TICKET, BIT_STATUS, void* pData); | 心跳重试回调函数 **参数说明:** - BIT_HANDLE handlelogin接口返回的handle- BIT_TICKET ticketquery接口返回的ticket- BIT_STATUS status:心跳重试返回的错误码- void *pData:开发商自定义数据,需通过ATTR_HB_RETRY_CALLBACK_EX_DATA传入**注意事项:**handle不能为NULL |
| **ATTR_HB_RETRY_CALLBACK_EX_DATA(0x16)** | void * | 心跳重试回调函数自定义数据 触发心跳重试回调时,会将该值传递到ATTR_HB_RETRY_CALLBACK_EX回调函数的最后一个参数 **注意事项:**handle不能为NULL |
| **ATTR_SET_LOGIN_MODE(0x17)** | BIT_UINT32 * | 设置Login的mode值 **注意事项:**handle不能为NULL |
| **ATTR_UNSET_LOGIN_MODE(0x18)** | BIT_UINT32 * | 取消Login的mode值 **注意事项:**handle不能为NULL |
| **ATTR_DISABLE_ENV(0x19)** | BIT_BOOL * | 禁用环境变量 传1表示禁用,设置禁用后客户端库将不再读取环境变量 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_REQUEST_TIMEOUT(0x1A)** | BIT_UINT32 * | 自定义receiveTimeout 最小16秒,最大64秒,默认32秒 **注意事项:**handle可为NULL,也可不为NULL |
| **ATTR_HB_RETRY_FAILED_CALLBACK(0x7)** | void (*T_HbRetryFailedCallback)(BIT_HANDLE, BIT_STATUS, void* pData) | 心跳重试失败回调函数 **参数说明:** - BIT_HANDLE handlelogin接口返回的handle- BIT_STATUS status:心跳失败返回的错误码- void *pData:开发商自定义数据,需通过ATTR_HB_RETRY_FAILED_CALLBACK_DATA传入**注意事项:**handle不能为NULL |
| **ATTR_HB_RETRY_FAILED_CALLBACK_DATA(0x11)** | void * | 心跳重试失败回调函数自定义数据 触发心跳失败回调时,会将该值传递到ATTR_HB_RETRY_FAILED_CALLBACK回调函数的最后一个参数 **注意事项:**handle不能为NULL |
| **ATTR_HB_RETRY_FAILED_CALLBACK_EX2(0x1B)** | void (*T_HbRetryFailedCallback)(BIT_HANDLE, BIT_TICKET, BIT_STATUS, BIT_UINT32, BIT_UINT32, BIT_UINT32* pData)) | 心跳重试失败回调函数(Ex2) **参数说明:** - BIT_HANDLE handlelogin接口返回的handle- BIT_TICKET ticketquery接口返回的ticket- BIT_STATUS status:心跳失败返回的错误码- BIT_UINT32 currentNumber:当前回调次数- BIT_UINT32 maxNumber:最大回调次数- BIT_UINT32 interval:回调间隔(单位:秒)- void *pData:开发商自定义数据,需通过ATTR_HB_RETRY_FAILED_CALLBACK_EX2_DATA传入**注意事项:**handle不能为NULL |
| **ATTR_HB_RETRY_FAILED_CALLBACK_EX2_DATA(0x1C)** | void * | 心跳重试失败回调自定义数据(Ex2 触发QueryFeatureEx2的心跳失败回调时,会将该值传递到ATTR_HB_RETRY_FAILED_CALLBACK_EX2回调函数的最后一个参数 **注意事项:**handle不能为NULL |
| **ATTR_HB_RETRY_SUCCESS_CALLBACK(0x1D)** | void (*T_HbRetrySuccessCallbackEx2)(BIT_HANDLE, BIT_TICKET, BIT_UINT32, BIT_UINT32, BIT_UINT32 *pDate) | 心跳重试成功回调函数 **参数说明:** - BIT_HANDLE handlelogin接口返回的handle- BIT_TICKET ticketquery接口返回的ticket- BIT_UINT32 currentNumber:当前回调次数- BIT_UINT32 maxNumber:最大回调次数- BIT_UINT32 interval:回调间隔(单位:秒)- void *pData:开发商自定义数据,需通过ATTR_HB_RETRY_SUCCESS_CALLBACK_DATA传入**注意事项:**handle不能为NULL |
| **ATTR_HB_RETRY_SUCCESS_CALLBACK_DATA(0x1E)** | void * | 心跳重试成功回调自定义数据 触发心跳成功回调时,会将该值传递到ATTR_HB_RETRY_SUCCESS_CALLBACK回调函数的最后一个参数 **注意事项:**handle不能为NULL |
| **ATTR_QUEUE_WAIT_CALLBACK(0x21)** | void (*QueueWaitCallback)(BIT_HANDLE, BIT_TICKET, BIT_STATUS, BIT_UINT32, BIT_UINT32 *pUserData) | 排队回调函数 **生效前提(满足其一即可):** - Bit_QueryFeatureEx2接口已设置BIT_QUERY_WAIT(等待模式)- 环境变量BITANSWER_MODE已配置为wait(排队等待模式)**参数说明:** - BIT_HANDLE handlelogin接口返回的handle- BIT_TICKET ticketquery接口返回的ticket- BIT_STATUS statusBIT_SUCCESS(表示排队中),其他(表示排队失败)- BIT_UINT32 queueLength:前面排队长度- BIT_UINT32 waitSecond:预计等待总秒数(不足1秒部分会被舍去)- void *pUserData:开发商自定义数据,需通过ATTR_QUEUE_WAIT_CALLBACK_DATA传入**注意事项:**handle不能为NULL **版本支持:**14.5.2及以上版本新增类型,需配合14.5.2及以上版本的集团服务和客户端库使用 |
| **ATTR_QUEUE_WAIT_CALLBACK_DATA(0x22)** | void * | 排队回调自定义数据 触发QueryFeatureEx2的排队回调时,会将该值传递到ATTR_QUEUE_WAIT_CALLBACK回调函数的最后一个参数 **注意事项:**handle不能为NULL |
| **ATTR_ENABLE_DIAGS_LOG(0x1F)** | BIT_UINT32 * | 控制诊断log的生成 **取值说明:**- 0:表示禁用(默认,禁用后环境变量不生效)- 1:表示启动**注意事项:**handle必须为NULL |
| **ATTR_HB_DEFAULT_STOPED_CALLBACK(0x20)** | BIT_BOOL * | 控制心跳停止程序自动退出功能 **取值说明:**- 0:表示禁用(默认)- 1:表示启动,若经过最大次重试次数后仍未重新建立连接,应用程序会默认终止运行,并输出错误信息:“许可证丢失,无法重新连接”(UNIX系统输出至stderr,Windows系统弹出对话框)**注意事项:**- 如果注册了ATTR_HB_STOPED_CALLBACK或ATTR_HB_STOPED_CALLBACK_EX默认退出行为将不再生效- handle不能为NULL**版本支持:**14.5.0及以上版本新增类型 |
| **ATTR_LOGIN_URL_SCOPE0x23** | BIT_UINT32 * | 控制Login连接的服务器类型 **取值说明:**- ATTR_LOGIN_URL_UNKNOW (0x0) - 默认行为,加载配置中所有类型的服务器- ATTR_LOGIN_URL_WS (0x1) - 表示仅连接ws类型服务(云授权服务器)- ATTR_LOGIN_URL_BIT (0x2) - 表示仅连接bit类型服务(集团授权服务器)**注意事项:**- 调用SetAttr接口时,第一个参数handle必须传入NULL,表示该配置全局生效;若传入非NULL值,接口会返回错误码259- handle必须为NULL**示例:**- 场景:环境变量中配置了混合类型的服务器地址:`bit://127.0.0.1:8273,ws:bitanswer.cn`,需仅连接bit类型服务器- API调用:SetAttr(NULL, ATTR_LOGIN_URL_SCOPE0x23, 2)- 执行结果:程序仅加载并连接`bit://127.0.0.1:8273`bit类型服务器),忽略ws类型的`ws:bitanswer.cn`**版本支持:**14.5.4及以上版本新增类型 |
- **pValue** - [IN] 不同类型,对应了不同的值。
### 示例
```c
// 设置队列等待超时为20秒
BIT_UINT32 value = 20;
BIT_STATUS status = Bit_SetAttr (handle, ATTR_WAIT_TIMEOUT, &value);
if (status == BIT_SUCCESS) {
// 设置成功
}
```
### Bit_SetProxy
```c
BIT_STATUS Bit_SetProxy (
BIT_UCHAR *pApplicationData,
BIT_PCSTR szHostName,
BIT_UINT32 nPort,
BIT_PCSTR szUserID,
BIT_PCSTR szPassword)
```
设置代理服务的地址和端口。
### 参数
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **szHostName** - [IN] 代理服务所在机器的IP地址。
> 说明:
>
> - 14.3.0及以上版本,将该参数扩展为支持`Type:HostName`格式,其中Type表示服务器类型,可取值为ws或bit,ws表示云授权服务器,bit表示集团授权服务器。
> - 为保持向后兼容,若不指定`Type://前缀`,则默认视为ws类型。
- **nPort** - [IN] 代理服务开启的通讯端口。
- **szUserID** - [IN] 代理服务所在机器的用户名。
- **szPassword** - [IN] 代理服务所在机器的密码。
### Bit_SetCustomInfo
```c
BIT_STATUS Bit_SetCustomInfo (
BIT_UINT32 infoId,
BIT_VOID *pInfoData,
BIT_UINT32 infoDataSize)
```
设置客户端运行自定义信息,需要在程序的最开始调用。
### 参数
- **infoId** - [IN] 自定义信息类型。
| **类型** | **值** | **说明** |
| --------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **CUSTOM_CLIENT_ID0x1** | 字符串 | 自定义终端标识,配置后该自定义标识会发送给服务器并用于今后的机器指纹匹配 **注意:**必须同时将CUSTOM_OPTION_CLOUD_CLIENTID选项设置为启用状态,此配置才能生效 |
| **CUSTOM_ACCOUNT_LOCAL(0x2)** | 字符串 | 自定义客户端用户帐号,用于集团服务标识客户端用户 |
| **CUSTOM_COMMENT(0x3)** | 字符串 | 自定义客户端登录注释,用于集团服务管理员获取用户登录请求信息 |
| **CUSTOM_OPTION(0x4)** | BIT_UINT32 | 按位进行操作 - CUSTOM_OPTION_SD1_FIRST (0x1) - 仅限Android选项,只检查第一张SD卡- - CUSTOM_OPTION_HIDE_FOLDER (0x2) - 隐藏默认的BitAnswer文件夹- CUSTOM_OPTION_SOAP_USERNAME (0x4) - 机器用户信息添加到soap头中- CUSTOM_OPTION_CONFINED_LINK (0x8) - 取消连接次数限制(1800)- CUSTOM_OPTION_BINARY_NAME(0x10) 客户向集团服务发送进程名- CUSTOM_OPTION_DOCKER_INFO(0x40) 客户端向服务端发送设备运行于Docker环境时的标识信息- CUSTOM_OPTION_CLOUD_CLIENTID(0x20) 用于启用CUSTOM_CLIENT_ID(自定义终端标识)功能,开启后,系统会将已设置的CUSTOM_CLIENT_ID作为该设备的唯一标识,用于今后的机器指纹匹配与管理(需配合14.5.0及以上版本的集团服务和客户端库使用)**示例:** 既要取消连接次数限制,又要隐藏BitAnswer目录,则传入:(CUSTOM_OPTION_HIDE_FOLDER |
| **CUSTOM_PRODUCT_CODE(0x6)** | 字符串 | 自定义授权目录名称 |
| **CUSTOM_ACCOUNT_DEVELOPER(0x7)** | 字符串 | 自定义登录帐号,用于帐号授权 (既使用account登录,又设置了此选项,则直接忽略) |
| **CUSTOM_VENDOR_CODE(0x8)** | 字符串 | 自定义开发商信息目前仅用于自定义环境变量名称 |
| **CUSTOM_HTTP_HEADER(0x9)** | 字符串 类似于“`auth:xxxx`”,普遍用于自定义认证信息 | 自定义HTTP头,所有联网的请求都会自带这个请求头 |
| **CUSTOM_GROUP_NAME(0xA)** | 字符串 | 设置自定义分组名 当开发商需要按照自定义的分组扣点(比如:部门,角色,窗口名等),可以设置此选项,并结合Bit_Login的LOGIN_MODE设置扣点方式 |
- **pInfoData** - [IN] 自定义信息的存储地址。
- **infoDataSize** - [IN] 自定义信息长度。针对CUSTOM_OPTION类型,该参数应为BIT_UINT32类型大小。
### 示例
```c
// 设置字符串类型
// 自定义终端标识
BIT_PCSTR clientID = "Machine-123";
BIT_STATUS status = Bit_ SetCustomInfo (CUSTOM_CLIENT_ID, clientID, strlen(clientID));
if (status == BIT_SUCCESS) {
// 设置成功
}
// 设置BIT_UINT32类型
// 机器用户信息添加到soap头中
BIT_UINT32 optSoapUserName = 4;
BIT_STATUS status = Bit_ SetCustomInfo (CUSTOM_OPTION, & optSoapUserName, sizeof(optSoapUserName));
if (status == BIT_SUCCESS) {
// 设置成功
}
```
### Bit_SetRootPath
```c
BIT_STATUS Bit_SetRootPath (
BIT_PCSTR szPath)
```
设置授权文件的存储路径。
### 参数
- **szPath** - [IN] 数据缓存区地址,用于存储授权文件的路径。
### Bit_SetLocalServer
```c
BIT_STATUS Bit_SetLocalServer (
BIT_UCHAR *pApplicationData,
BIT_PCSTR szHostName,
BIT_UINT32 nPort,
BIT_UINT32 nTimeoutSecondes)
```
设置集团服务的地址和端口。
### 参数
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **szHostName** - [IN] 集团服务所安装机器的IP地址。
- **nPort** - [IN] 客户端应用程序的通讯端口,默认为8273。
- **nTimeoutSecondes** - [IN] 客户端超时秒数。
## 借出操作
### Bit_GetBorrowRequest
```c
BIT_STATUS Bit_GetBorrowRequest(
BIT_PCSTR szSN,
BIT_UCHAR *pApplicationData,
BIT_UINT32 nDurationDays,
BIT_CHAR *pRequestInfo,
BIT_UINT32 *pRequestInfoSize)
```
获取借出请求串,用来离线借出。
### 参数
- **szSN** - [IN] 指定要借出的SN,如果为NULL,找满足条件的第一个SN。
- **pApplicationData** - [IN] 产品识别码,在Bitanswer SDK头文件里。
- **nDurationDays** - [IN] 借出时间。100年代表永久借出(分发),0表示产生归还串。
- **pRequestInfo** - [OUT] 借出请求串缓存区地址。
- **pRequestInfoSize** - [IN/OUT] 输入的是缓存区大小,输出的是示例数据的大小。
### Bit_GetBorrowFeatureRequest
```c
BIT_STATUS Bit_GetBorrowFeatureRequest(
BIT_PCSTR pReserve,
BIT_UCHAR *pApplicationData,
BIT_UINT32 nDurationDays,
BIT_PCSTR pBorrowScope,
BIT_CHAR *pRequestInfo,
BIT_UINT32 *pRequestInfoSize)
```
获取借出请求串,该接口支持指定特征项借出。
### 参数
- **pReserve** - [IN] 保留,必须是NULL。
- **pApplicationData** - [IN] 产品识别码,在Bitanswer SDK头文件里。
- **nDurationDays** - [IN] 借出时间。
- **pBorrowScope** - [IN] xml结构。
- **pRequestInfo** - [OUT] 借出请求串缓存区地址。
- **pRequestInfoSize** - [IN/OUT] 输入的是缓存区大小,输出的是示例数据的大小。
### Scope示例
```xml
<features>
<feature id='' days=''/>
<feature id='' days=''/>
</features>
```
### Bit_CheckOutSn / Bit_CheckOutSnEx
```c
BIT_STATUS Bit_CheckOutSn(
BIT_PCSTR szURL,
BIT_UINT32 featureId,
BIT_UCHAR *pApplicationData,
BIT_UINT32 nDurationDays);
BIT_STATUS Bit_CheckOutSnEx(
BIT_PCSTR szURL,
BIT_UINT32 featureId,
BIT_PCSTR pScope,
BIT_UCHAR *pApplicationData,
BIT_UINT32 nDurationDays);
```
从授权服务器在线借出一个完整的授权码,以允许客户端服务器单独使用。被借出的授权码必须具有可借出属性,并在客户端成功借出后减少一个可用用户数。被借出的用户数在到期后将自动返还给服务器。
### 参数
- **szURL** - [IN] 集团授权服务器地址,包括端口。如输入NULL,则使用配置文件地址;如输入 * 号,则使用广播查找地址。
- **featured** - [IN] 指定借出授权码需要包含的特征项ID,为0则寻找第一个可借出授权码。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pScope** - [IN] xml结构,允许传NULL。
- **nDurationDays** - [IN] 借出时间,单位为天。借出时间不能超过被借出集团授权的强制认证周期或有效期。
### Scope示例
```xml
<scope>
<type>ws</type>
<sn>xxx</sn>
<featureVersion>xxx</featureVersion>
</scope>
<!--
说明:
type:借出类型。目前仅支持ws,表示从外网借出(针对云授权和集团授权)
featureVersion:借出的特征项版本
sn:指定借出的SN
-->
```
### Bit_CheckOut
```c
BIT_STATUS Bit_CheckOut(
BIT_PCSTR szURL,
BIT_PCSTR pScope,
BIT_PCSTR pFeatureList,
BIT_UCHAR *pApplicationData,
BIT_UINT32 nDurationDays)
```
从授权服务器在线借出授权码或者特征项。
### 参数
- **szURL** 集团授权服务器地址,包括端口。如输入NULL,则从本地配置文件或者环境变量读取服务地址。
- **pScope** xml结构,允许传NULL。
```xml
<scope>
<type>ws</type>
<sn>xxx</sn>
</scope>
<!--
说明:
type:借出类型。目前仅支持ws,表示从外网借出(针对云授权和集团授权)
sn:指定借出的SN
-->
```
- **pFeatureList** xml结构,指定借出的特征项列表,如果不传则借出整个SN。
```xml
<features>
<feature id='1' ver='2.0' days='10' required='0|1'/>
<!-- id:特征项编号,ver:特征项版本,days:借出时间, required:0可选,1必选(默认是1) -->
<feature id='10'/>
</features>
```
当feature指定了借出时间,则会覆盖nDurationDays该时间,没有指定,则借出nDurationDays天。
借出feature时,如果指定了版本,则直接大于等于借出版本的特征项,只借一个,如果没有指定版本,则该特征项的所有版本都借出一个。
- **pApplicationData** 产品识别码。记录在接口定义文件中,与产品一一对应。
- **nDurationDays** 借出时间,单位为天,最大不超过100年。
```c
// 借出特征项1和特征项2,各借10天
BIT_STATUS status = Bit_CheckOut(
"bit://127.0.0.1:8273",
NULL,
"<features><feature id=\"1\"/><feature id=\"2\"/></features>",
application_data,
10);
if (status == BIT_SUCCESS) {
// 借出成功
}
// 借出特征项1(5天) 和 特征项2(2天)
BIT_STATUS status = Bit_CheckOut(
"bit://127.0.0.1:8273",
NULL,
"<features><feature id=\"1\" days=\"5\"/><feature id=\"2\" days=\"2\"/></features>",
application_data,
5);
if (status == BIT_SUCCESS) {
// 借出成功
}
```
### Bit_CheckOutFeatures
```c
BIT_STATUS Bit_CheckOutFeatures(
BIT_PCSTR szURL,
BIT_UCHAR *pApplicationData,
BIT_UINT32 *pFeatureList,
BIT_UINT32 nFeatureInList,
BIT_UINT32 nDurationDays);
```
从集团授权服务器借出一组特征项,这些特征项必须包含在同一个授权码中。被借出的集团授权码必须具有可借出属性,并在客户端成功借出后减少一个可用用户数。被借出的用户数在到期后将自动返还给集团服务器。
### 参数
- **szURL** - [IN] 集团授权服务器地址,包括端口。如输入NULL,则使用配置文件地址;如输入 * 号,则使用广播查找地址。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pFeatureList** - [IN] 要借出的特征项列表。
- **nFeatureInList** - [IN] 要借出的特征项数量。
- **nDurationDays** - [IN] 借出时间,单位为天,最大不超过100年。
### 示例
```c
// 借出特征项1和特征项2,借3天
BIT_UINT32 borrowFeature[2] = { 0 };
borrowFeature[0] = 1;
borrowFeature[1] = 2;
BIT_STATUS status = Bit_CheckOutFeatures("bit://127.0.0.1:8273",
application_data,
borrowFeature,
2,
3);
if (status == BIT_SUCCESS) {
// 借出成功
} else {
// 借出失败
}
```
### Bit_CheckIn
```c
BIT_STATUS Bit_CheckIn(
BIT_PCSTR szURL,
BIT_UINT32 featureId,
BIT_UCHAR *pApplicationData)
```
提前返还从集团授权服务器借出的授权。要提前返还授权,该授权码必须具有允许提前返还属性。
### 参数
- **szURL** - [IN] 集团授权服务器地址,包括端口。如输入NULL,则使用配置文件地址;如输入 * 号,则使用广播查找地址。
- **featureId** - [IN] 指定要返还授权码需要包含的特征项ID,为0则寻找第一个可返还授权码。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
### Bit_CheckInEx
```c
BIT_STATUS Bit_CheckInEx(
BIT_PCSTR szURL,
BIT_UINT32 featureId,
BIT_PCSTR szScope,
BIT_UCHAR *pApplicationData)
```
提前返还从授权服务器借出的授权。要提前返还授权,该授权码必须具有允许提前返还属性。
### 参数
- **szURL** - [IN] 集团授权服务器地址,包括端口。如输入NULL,则使用配置文件地址;如输入 * 号,则使用广播查找地址。
- **featureId** - [IN] 指定要返还授权码需要包含的特征项ID,为0则寻找第一个可返还授权码。
- **xmlScope** - [IN] xml结构,允许传NULL。
```xml
<scope>
<type>ws</type> <!-- type:归还类型,ws表示归还到云授权服务,默认是归还到集团授权服务 -->
</scope>
```
用于指定借出的参数,格式:wsxxxx,type设定为ws时表示从云授权服务器借出和归还。
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
### Bit_ApplyBorrowInfo
```c
BIT_STATUS Bit_ApplyBorrowInfo(
BIT_UCHAR *pApplicationData,
BIT_PCSTR pBorrowInfo)
```
客户端应用离线借出串,Bit_ApplyUpdateInfo可以兼容该接口。
### 参数
- **pApplicationData** - [IN] 产品识别码。记录在接口定义文件中,与产品一一对应。
- **pBorrowInfo** - [IN] 借出请求串。