PC SDK 使用说明
当前PC SDK支持Windows XP SP3以上版本。
1. 集成SDK
1.1 SDK下载
下载 最新统计SDK 并解压缩。
1.2 导入SDK包
进入bin目录下,进入Debug
(调试版本)、Release
(正式版本)目录;
拷贝 libNDDataSdk.dll、libNDDataSdk.pdb
至指定目录;
拷贝对应环境下配置文件 CloudServer.ini
到 libNDDataSdk.dll
同级目录下;
备注事项:
压缩包中含有x64、Win32两个文件夹,接入者依据自身需求接入不同文件夹中的libNDDataSdk.dll及相关文件;
CloudServer.ini必须与dll文件同级目录且不能没有此文件;
2. 基本功能集成
2.1 配置基础属性
CloudServer.ini
文件内容如下:
[Server]
IP_PRODUCE=http://cloud-atlas-collection.oth.web.sdp.101.com/v0.1/?/action/collect
Port=80
Interval=1000
ListMaxCount=20
配置文件相关说明:
IP_PRODUCE 上传的采集服务器url
Port 采集服务器的端口号
Interval 采集线程定时轮询,本地采集数据库的时间间隔
ListMaxCount 每次拼接上传的最大记录数
3. 接入SDK
3.1 创建SDK接口实例
每个进程创建一个对应的接口实例,进程退出前要调用Release接口释放该指针,详情请看Release接口说明。
方法示例:
INDDataSdkNewNew* m_pNDDataSdk = CreateNDDataSdkNew(const char* lpszAppKey);
3.2 初始化接口
virtual bool Init(const char* lpszAppVer/*app版本*/, const char* lpszChannelId/*app渠道*/) = 0;
输入参数:
lpszAppVer
应用版本,长度大于255时会被强行截断成255,必填,格式要求UTF8格式lpszChannelId
渠道id, 必填,格式要求UTF8
格式,否则会出现乱码问题
调用示例:
if(m_pNDDataSdk)
{
m_pNDDataSdk->Init("1.0.8.5","101PPT");
}
风险:初始化接口调用后,即会立即采集本地设备信息等数据并上传数据,请大家注意接入方式。如以非法形式或非主程序接入方式产生的数据一切问题,由项目方自行承担。
### 3.3 释放接口实例
释放 `CreateNDDataSdkNew()`返回的指针
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->Release();
m_pNDDataSdk = NULL;
}
```
### 3.4 账号的统计
通常在用户登录后,调用该方法,以便统计活跃用户数,上传用户登录时的IP地址、AppKey 、Mac地址、账号ID和用户ID。
```c++
virtual void Login(const __int64 i64UserId/*用户id*/, const char* lpszAccountId =""/*账号id*/) = 0;
```
输入参数:
* `i64UserId`:用户ID,此数据为101帐号中心返回的user_id字段
* `lpszAccountId`:用户账号ID,此参数暂时无使用,可不用传入数据值
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->Login(2143423); // 旧接口:BeginSession
}
```
通常在用户登出后,调用该方法,以便统计用户活跃时长,上传用户登录时的IP地址、AppKey 、Mac地址、账号ID和用户ID。
```
virtual void Logout() = 0;//用户登出
```
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->Logout(); //旧接口:EndSession
}
```
## 4. 高级功能接入
以下功能可根据项目的情况进行接入,如无详细的接入要求可暂时不接入以下功能
### 4.1 自定义事件采集
> * 字符串参数为UTF8格式
> * int型整数为32位
#### 4.1.1 自定义事件-单个事件:
如果只需要统计某个事件发生的次数,可以只传一个事件id
```c++
virtual bool AddEvent(const char* lpszEventId) = 0;
```
输入参数:
`lpszEventId`事件ID,长度大于255时会被强行截断成255
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->AddEvent("eventShowXX");
}
```
#### 4.1.2 自定义事件-统计次数&属性:
此事件方法可以统计次数与属性,如购买事件,可能有买苹果、买梨子、买香蕉等,而且需要对每种类型的水果的购买次数分别统计,则可以使用以下方式:
```c++
virtual bool AddEvent(const char* lpszEventId, const char* lpszLabel) = 0;
```
输入参数:
`lpszEventId`:事件ID,长度大于255时会被强行截断成255
`lpszLabel`:事件属性,长度大于255时会被强行截断成255
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->AddEvent("eventBuy", "apple");
m_pNDDataSdk->AddEvent("eventBuy", "banana");
}
```
#### 4.1.3 自定义事件-多维度的统计(Map):
考虑到某些情况下,对于一个事件,我们不止有一个维度的属性要统计。如:购买事件,除了水果的类型,有时还可能需要统计门店,可以使用带Map的接口。 方法示例:
```c++
virtual bool AddEvent(const char* lpszEventId, INDDataMAP* pMap) = 0;
```
输入参数:
* `lpszEventId`:事件ID,长度大于255时会被强行截断成255
* `pMap`:事件属性集接口,事件属性的JSON串长度不能超过2048,超过部分会被抛弃,不上传;
上传的Key-Value对,排序方式是按Key字母按从小到大,依次出现在JSON串中;
调用示例:
```c++
NDDataSDK::INDDataMAP* pMap = NDDataSDK::CreateNDDataMap();//创建用户自定属性接口
if (pMap)
{
pMap->Add("type", "apple");//事件属性集接口;
pMap->Add("store", "0AD056SDSD00AS"); //最后出现在json串的 顺序依次为 {"store":"0AD056SDSD00AS","type":"apple"},这是因为"store" < "type"(符合字符串比较大小的结果)
}
if(m_pNDDataSdk)
{
m_pNDDataSdk->AddEvent("eventBuy", pMap);
}
if (pMap)
pMap->Release();//释放用户自定义属性
```
#### 4.1.4 自定义事件-多维度特殊属性的统计(Map):
```c++
virtual bool AddEvent(const char* lpszEventId, INDDataMAP* pMap, int nEventValue) = 0;
```
此接口在4.1.3接口之上,提供额外数值计算功能。如:需扩展统计购买的金额,同时需要对金额做一些数值上的计算分析,则需要调用带`int`类型value的接口。
输入参数:
* `lpszEventId`:事件ID,长度大于255时会被强行截断成255;
* `pMap`:事件属性集接口,事件属性的JSON串长度不能超过2048,超过部分会被抛弃,不上传;上传的Key-Value对,排序方式是按Key字母按从小到大,依次出现在JSON串中;
* `nEventValue`:特殊属性值;
调用示例:
```c++
NDDataSDK::INDDataMAP* pMap =NDDataSDK::CreateNDDataMap();//创建用户自定属性接口
if (pMap)
{
pMap->Add("type", "apple");//事件属性集接口;
pMap->Add("store", "0AD056SDSD00AS"); //最后出现在JSON串的 顺序依次为 {"store":"0AD056SDSD00AS","type":"apple"},这是因为"store" < "type"(符合字符串比较大小的结果)
}
if(m_pNDDataSdk)
{
m_pNDDataSdk->AddEvent("eventBuy", pMap, 2);
}
if (pMap)
pMap->Release();//释放用户自定义属性
```
## 5. 支持设置缓存条数发送功能
```c++
void SetFlushBulkSize(int nSize = 100) = 0;//支持设置缓存条数发送功能
```
参数说明:
* `nSize`每次发送的最大记录数,默认30秒。
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->SetFlushBulkSize();
}
```
## 6. 设置发送定时间隔
```c++
void SetFlushInterval(int nSeconds = 30) = 0;//设置发送定时间隔
```
参数说明:
* `nSeconds`定时发送记录的时间间隔,默认30秒。
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->SetFlushInterval()
}
```
## 7. 强制上传数据
```c++
void Flush() = 0;//强制上传数据
```
参数说明:
* `nSize`每次强制上传发送的最大记录数
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->Flush();
}
```
## 8.安装应用
```c++
virtual bool Install(const char* lpszAppVer, const char* lpszChannelId) = 0;
```
参数说明:
* `lpszAppVer`应用版本号,字符串,内容长度限制32位以下,不允许出现异常字符
* `lpszChannelId`应用渠道号,字符串,内容长度限制32位以下,不允许出现异常字符,中文请转换为UTF8格式
调用示例:
```c++
if(m_pNDDataSdk)
{
m_pNDDataSdk->Install('v1.0','baidu');
}
```
**备注:**调用安装应用无需调用Init接口,只需要调用安装接口即可
9.卸载应用
virtual bool UnInstall(const char* lpszAppVer) = 0;
参数说明:
lpszAppVer
应用版本号,字符串,内容长度限制32位以下,不允许出现异常字符
调用示例:
if(m_pNDDataSdk)
{
m_pNDDataSdk->UnInstall('v1.0');
}
10. 功能配置
10.1 环境切换
根据不同环境配置环境下的CloudServer.ini文件,打开CloudServer.ini文件后找到[Server]设置里面的[IP]为如下表格的内容:
10.2 测试过程中的日志查看
通过设置调试模式
- 调试开关,启用时,会将日志输出。我们可以在exe文件目录下找到Log目录, 进入Log目录将发现如下文件, debug.log为调试信息输入文件 data.log数采集到的记录文件, error.log:为错误输出文件(只有发生错误后才会创建)
- @param bFlag true-启用,false-关闭
方法定义:
virtual void SetDebugMode(bool bFlag) = 0;
调用示例:
if(m_pNDDataSdk)
{
m_pNDDataSdk->SetDebugMode(true);
}
注意:生产环境请不要打开调试模式,以免生成大量日志。
依据上述要求开启调试模式后,可进入 C:\Users{用户名}\AppData\Roaming\Log 目录查看实时日志内容。
11 使用案例
11.1 动态加载dll使用方法(DEMO下载)
typedef NDDataSDK::INDDataSdkNew* (*CreateNDDataSdkNew)(const char* lpszAppKey, NDDataSDK::ENV_TYPE type);
typedef NDDataSDK::INDDataMAP* (*CreateNDDataMap)();
HINSTANCE m_hModule = ::LoadLibrary(L"libNDDataSdk.dll");
if (m_hModule)
{
CreateNDDataSdkNew funCreateNDDataSdk = (CreateNDDataSdkNew)::GetProcAddress(m_hModule, "CreateNDDataSdkNew");
CreateNDDataMap funCreateNDDataMap = (CreateNDDataMap)::GetProcAddress(m_hModule, "CreateNDDataMap");
if (funCreateNDDataSdk && funCreateNDDataMap)
{
NDDataSDK::INDDataSdkPtr pSdk = funCreateNDDataSdk("appkey", type);
if (pSdk != NULL)
{
result = pSdk->Init("version", "channel");
// 设置缓存条数发送功能,达到指定条数自动上传数据
pSdk->SetFlushBulkSize(30);
// 设置发送定时间隔,默认30秒
pSdk->SetFlushInterval(30);
// 上报登录数据
pSdk->Login(123);
// 设置调试模式
pSdk->SetDebugMode(true);
**用法一:**
pSdk->AddEvent("1");
**用法二:**
pSdk->AddEvent("1", "2");
**用法四:**
NDDataSDK::INDDataMAP* pMap = funCreateNDDataMap();
if (pMap)
{
pMap->Add("tcp", "ip");
pMap->Add("age", "118");
pMap->Add("year", "2015");
pMap->Add("year", "2016");
}
pSdk->AddEvent("1", pMap);
pMap->Release();
**用法四:**
NDDataSDK::INDDataMAP* pMap = funCreateNDDataMap();
if (pMap)
{
pMap->Add("tcp", "ip");
pMap->Add("age", "118");
pMap->Add("year", "2015");
pMap->Add("year", "2016");
}
pSdk->AddEvent("1", pMap, 3);
pMap->Release();
pSdk->AddException("1", 1, "123");
pSdk->Logout();
pSdk->UnInit();
}
}
// 数据立即上传
pNDDataSdk->Flush();
// 用户登出操作
pNDDataSdk->Logout();
// 用户退出应用操作
pNDDataSdk->UnInit();
::FreeLibrary(m_hModule);
}