package com.netsdk.demo.customize;
|
|
import java.io.File;
|
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.sun.jna.Memory;
|
import com.sun.jna.NativeLong;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
import com.netsdk.lib.NetSDKLib.*;
|
|
public class SmartLockOld {
|
static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE;
|
static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE;
|
|
private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
|
|
// 登录句柄
|
private static LLong loginHandle = new LLong(0);
|
|
// 登录参数
|
String address = "172.5.1.37";
|
int port = 37777;
|
String username = "admin";
|
String password = "admin";
|
|
// 断线回调,设备断线后,回调会收到数据
|
private static class DisconnectCallback implements NetSDKLib.fDisConnect {
|
private static DisconnectCallback instance = new DisconnectCallback();
|
private DisconnectCallback() {}
|
public static DisconnectCallback getInstance() {
|
return instance;
|
}
|
|
public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){
|
System.out.printf("Device[%s:%d] Disconnect!\n" , pchDVRIP , nDVRPort);
|
}
|
}
|
|
// 重连回调,设备断线后,设备会自动重连,重连成功后,回调会收到信息
|
private static class HaveReconnectCallback implements NetSDKLib.fHaveReConnect {
|
private static HaveReconnectCallback instance = new HaveReconnectCallback();
|
private HaveReconnectCallback() {}
|
public static HaveReconnectCallback getInstance() {
|
return instance;
|
}
|
|
public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){
|
System.out.printf("Device[%s:%d] HaveReconnected!\n" , pchDVRIP , nDVRPort);
|
}
|
}
|
|
public void EndTest() {
|
System.out.println("End Test");
|
if( loginHandle.longValue() != 0)
|
{
|
netsdkApi.CLIENT_Logout(loginHandle);
|
loginHandle.setValue(0);
|
}
|
System.out.println("See You...");
|
|
// 释放SDK资源,在关闭工程时调用
|
netsdkApi.CLIENT_Cleanup();
|
System.exit(0);
|
}
|
|
public void InitTest() {
|
// 初始化SDK库, 设置断线回调
|
netsdkApi.CLIENT_Init(DisconnectCallback.getInstance(), null);
|
|
// 设置断线自动重连功能
|
netsdkApi.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null);
|
|
// 设置登录超时时间和尝试次数,可选
|
int waitTime = 5000; //登录请求响应超时时间设置为5S
|
int tryTimes = 3; //登录时尝试建立链接3次
|
netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes);
|
|
// 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime
|
// 接口设置的登录设备超时时间和尝试次数意义相同,可选
|
NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
|
netParam.nConnectTime = 10000; //登录时尝试建立链接的超时时间
|
netsdkApi.CLIENT_SetNetworkParam(netParam);
|
|
// 打开日志,可选
|
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
|
|
File path = new File(".");
|
String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\" + System.currentTimeMillis() + ".log";
|
|
setLog.bSetFilePath = 1;
|
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
|
|
setLog.bSetPrintStrategy = 1;
|
setLog.nPrintStrategy = 0;
|
boolean bLogopen = netsdkApi.CLIENT_LogOpen(setLog);
|
if (!bLogopen) {
|
System.err.println("Failed to open NetSDK log !!!");
|
}
|
|
// 向设备登入
|
int nSpecCap = 0;
|
IntByReference nError = new IntByReference(0);
|
loginHandle = netsdkApi.CLIENT_LoginEx2(address, port, username, password,
|
nSpecCap, null, deviceInfo, nError);
|
|
if(loginHandle.longValue() == 0) {
|
System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port, netsdkApi.CLIENT_GetLastError());
|
|
EndTest();
|
return;
|
}
|
|
System.out.printf("Login Device [%s:%d] Success. \n", address, port);
|
}
|
|
/**
|
* 获取接口错误码
|
* @return
|
*/
|
public static String getErrorCode() {
|
return " { error code: ( 0x80000000|" + (netsdkApi.CLIENT_GetLastError() & 0x7fffffff) +" ). 参考 NetSDKLib.java }";
|
}
|
|
/**
|
* 查询智能锁序列号
|
*/
|
public void QueryDevSerialNo() {
|
// 智能锁网关最多可以连6个
|
int nCount = 6;
|
|
NET_CODEID_INFO[] codeid = new NET_CODEID_INFO[nCount];
|
for(int i = 0; i < nCount; i++) {
|
codeid[i] = new NET_CODEID_INFO();
|
}
|
|
// 查询命令
|
int nType = NetSDKLib.NET_DEVSTATE_GET_CODEID_LIST;
|
|
// 入参结构体
|
NET_GET_CODEID_LIST msg = new NET_GET_CODEID_LIST();
|
msg.nStartIndex = 0;
|
msg.nQueryNum = nCount;
|
|
// 申请内存
|
msg.pstuCodeIDInfo = new Memory(codeid[0].size() * nCount);
|
msg.pstuCodeIDInfo.clear(codeid[0].size() * nCount);
|
|
ToolKits.SetStructArrToPointerData(codeid, msg.pstuCodeIDInfo);
|
|
IntByReference intRetLen = new IntByReference();
|
|
msg.write();
|
boolean bRet = netsdkApi.CLIENT_QueryDevState(loginHandle, nType, msg.getPointer(), msg.size(), intRetLen, 5000);
|
msg.read();
|
|
if(bRet) {
|
// 将获取的信息输出到对应的结构体数组
|
ToolKits.GetPointerDataToStructArr(msg.pstuCodeIDInfo, codeid);
|
|
// 打印具体信息
|
for(int i = 0; i < msg.nRetCodeIDNum; i++) {
|
// 老版本的智能锁,用的是通道号来区分锁
|
System.out.println("nChannel:" + (codeid[i].nChannel - 1));
|
}
|
} else {
|
System.err.println("查找序列号失败, " + getErrorCode());
|
}
|
}
|
|
/**
|
* 卡编号
|
*/
|
private int cardRecordNo = 0;
|
|
/**
|
* 添加智能锁用户
|
*/
|
public void AddSmartLock() {
|
NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD cardInsert = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD();
|
|
/// 卡号是唯一标识
|
final String cardNo = "7FF4F45E";
|
System.arraycopy(cardNo.getBytes(), 0, cardInsert.szCardNo,
|
0, cardNo.getBytes().length);
|
|
/// 密码
|
final String passwd = "1234567";
|
System.arraycopy(passwd.getBytes(), 0, cardInsert.szPsw,
|
0, passwd.getBytes().length);
|
|
// 卡状态
|
cardInsert.emStatus = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_NORMAL;
|
|
// 卡类型
|
cardInsert.emType = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_GENERAL;
|
|
// 使用次数
|
cardInsert.nUserTime = 255;
|
|
/// 创建时间
|
cardInsert.stuCreateTime.dwYear = 2018;
|
cardInsert.stuCreateTime.dwMonth = 11;
|
cardInsert.stuCreateTime.dwDay = 16;
|
cardInsert.stuCreateTime.dwHour = 11;
|
cardInsert.stuCreateTime.dwMinute = 11;
|
cardInsert.stuCreateTime.dwSecond = 11;
|
|
/// 设置有效时间
|
cardInsert.stuValidStartTime.dwYear = 2018;
|
cardInsert.stuValidStartTime.dwMonth = 11;
|
cardInsert.stuValidStartTime.dwDay = 16;
|
cardInsert.stuValidStartTime.dwHour = 11;
|
cardInsert.stuValidStartTime.dwMinute = 11;
|
cardInsert.stuValidStartTime.dwSecond = 11;
|
|
cardInsert.stuValidEndTime.dwYear = 2018;
|
cardInsert.stuValidEndTime.dwMonth = 11;
|
cardInsert.stuValidEndTime.dwDay = 18;
|
cardInsert.stuValidEndTime.dwHour = 11;
|
cardInsert.stuValidEndTime.dwMinute = 11;
|
cardInsert.stuValidEndTime.dwSecond = 11;
|
|
///-- 设置权限
|
// 如果有三把锁,对应的通道是 0 1 2,在第一次添加的时候,全部添加。
|
// 如果修改,删除2,只需要重新下发,对应通道填 0 1,卡号跟之前的一样即可
|
// 不管添加、删除都有事件返回,收到事件了,才是真正的设置成功
|
cardInsert.nDoorNum = 2;
|
cardInsert.sznDoors[0] = 0; // 填写通道号,对应网关里的智能锁
|
cardInsert.sznDoors[0] = 1; // 填写通道号,对应网关里的智能锁
|
|
cardInsert.nTimeSectionNum = 1;
|
cardInsert.sznTimeSectionNo[0] = 255; // 填写通道号,对应网关里的智能锁
|
|
NetSDKLib.NET_CTRL_RECORDSET_INSERT_PARAM insert = new NetSDKLib.NET_CTRL_RECORDSET_INSERT_PARAM();
|
insert.stuCtrlRecordSetInfo.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; // 门禁卡
|
insert.stuCtrlRecordSetInfo.pBuf = cardInsert.getPointer();
|
|
cardInsert.write();
|
insert.write();
|
boolean success = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_INSERT,
|
insert.getPointer(), 5000);
|
insert.read();
|
cardInsert.read();
|
|
if(!success) {
|
System.err.printf("Insert Card Failed. %x \n", netsdkApi.CLIENT_GetLastError());
|
return;
|
}
|
|
// 返回的为CardNo 的10进制:即插入卡号3344 成功, 返回13124
|
cardRecordNo = insert.stuCtrlRecordSetResult.nRecNo;
|
System.out.println(cardRecordNo);
|
}
|
|
/**
|
* 删除智能锁用户
|
*/
|
public void RemoveSmartLock() {
|
NetSDKLib.NET_CTRL_RECORDSET_PARAM remove = new NetSDKLib.NET_CTRL_RECORDSET_PARAM();
|
remove.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD;
|
remove.pBuf = new IntByReference(2146759774).getPointer(); // 记录集编号
|
|
remove.write();
|
boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle,
|
CtrlType.CTRLTYPE_CTRL_RECORDSET_REMOVE, remove.getPointer(), 5000);
|
remove.read();
|
|
if(!result){
|
System.err.println("删除智能锁用户失败, " + getErrorCode());
|
return;
|
} else {
|
System.out.println("删除智能锁用户成功!");
|
}
|
}
|
|
/**
|
* 根据记录集编号,查询对应的锁
|
*/
|
public void GetSmartLock() {
|
NET_RECORDSET_ACCESS_CTL_CARD condition = new NET_RECORDSET_ACCESS_CTL_CARD();
|
// 记录集编号
|
condition.nRecNo = 2146759774;
|
|
int nType = NetSDKLib.NET_DEVSTATE_DEV_RECORDSET;
|
NetSDKLib.NET_CTRL_RECORDSET_PARAM record = new NetSDKLib.NET_CTRL_RECORDSET_PARAM();
|
record.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD;
|
record.pBuf = condition.getPointer();
|
|
IntByReference intRetLen = new IntByReference();
|
|
condition.write();
|
record.write();
|
boolean bRet = netsdkApi.CLIENT_QueryDevState(loginHandle, nType, record.getPointer(), record.size(), intRetLen, 3000);
|
record.read();
|
condition.read();
|
|
if(bRet) {
|
if(condition.nDoorNum != 0) {
|
for(int i = 0; i < condition.nDoorNum; i++) {
|
System.out.println("Chn:" + String.valueOf(condition.sznDoors[i])); // 对应智能锁
|
}
|
} else {
|
System.out.println("不存在");
|
}
|
} else {
|
System.err.println("QueryDev Failed!" + netsdkApi.CLIENT_GetLastError());
|
}
|
}
|
|
/**
|
* 订阅
|
* @return
|
*/
|
public void startListen() {
|
// 设置报警回调函数
|
netsdkApi.CLIENT_SetDVRMessCallBack(fAlarmDataCB.getCallBack(), null);
|
|
// 订阅报警
|
boolean bRet = netsdkApi.CLIENT_StartListenEx(loginHandle);
|
if (!bRet) {
|
System.err.println("订阅报警失败! LastError = 0x%x\n" + netsdkApi.CLIENT_GetLastError());
|
}
|
else {
|
System.out.println("订阅报警成功.");
|
}
|
}
|
|
/**
|
* 取消订阅
|
* @return
|
*/
|
public void stopListen() {
|
// 停止订阅报警
|
boolean bRet = netsdkApi.CLIENT_StopListen(loginHandle);
|
if (bRet) {
|
System.out.println("取消订阅报警信息.");
|
}
|
}
|
|
/**
|
* 报警信息回调函数原形,建议写成单例模式
|
*/
|
private static class fAlarmDataCB implements NetSDKLib.fMessCallBack{
|
private fAlarmDataCB(){}
|
|
private static class fAlarmDataCBHolder {
|
private static fAlarmDataCB callback = new fAlarmDataCB();
|
}
|
|
public static fAlarmDataCB getCallBack() {
|
return fAlarmDataCBHolder.callback;
|
}
|
|
public boolean invoke(int lCommand, LLong lLoginID, Pointer pStuEvent, int dwBufLen, String strDeviceIP, NativeLong nDevicePort, Pointer dwUser){
|
// System.out.printf("command = %x\n", lCommand);
|
switch (lCommand)
|
{
|
case NetSDKLib.NET_ALARM_ACCESS_CTL_EVENT: { // 门禁事件
|
NetSDKLib.ALARM_ACCESS_CTL_EVENT_INFO msg = new NetSDKLib.ALARM_ACCESS_CTL_EVENT_INFO();
|
ToolKits.GetPointerData(pStuEvent, msg);
|
|
System.out.println("开门失败的原因:" + msg.nErrorCode); // 见注释
|
|
// 密码开锁
|
if (msg.emOpenMethod == NetSDKLib.NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_PWD_ONLY) {
|
System.out.println("密码开锁");
|
}
|
// 刷卡开锁
|
else if (msg.emOpenMethod == NetSDKLib.NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD) {
|
System.out.println("刷卡开锁");
|
}
|
// 信息开锁
|
else if(msg.emOpenMethod == NetSDKLib.NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT) {
|
System.out.println("信息开锁");
|
}
|
|
System.out.println("智能锁序列号:" + new String(msg.szSN).trim());
|
break;
|
}
|
case NetSDKLib.NET_ALARM_ACCESS_CARD_OPERATE: { // 门禁卡数据操作事件,插入、删除等操作会有事件上报
|
NetSDKLib.ALARM_ACCESS_CARD_OPERATE_INFO msg = new NetSDKLib.ALARM_ACCESS_CARD_OPERATE_INFO();
|
ToolKits.GetPointerData(pStuEvent, msg);
|
|
System.out.println("卡号:" + new String(msg.szCardNo).trim());
|
|
if(msg.emActionType == 1) {
|
System.out.println("插入!");
|
} else if(msg.emActionType == 2) {
|
System.out.println("修改!");
|
} else if(msg.emActionType == 3) {
|
System.out.println("删除!");
|
}
|
|
if(msg.emResult == 0) {
|
System.out.println("失败!");
|
} else if(msg.emResult == 1) {
|
System.out.println("成功!");
|
}
|
|
System.out.println("通道:" + msg.nChannelID);
|
|
break;
|
}
|
case NetSDKLib.NET_ALARM_MODULE_LOST: { // 扩展模块掉线事件,通过此事件来获取锁有没有掉线
|
ALARM_MODULE_LOST_INFO msg = new ALARM_MODULE_LOST_INFO();
|
ToolKits.GetPointerData(pStuEvent, msg);
|
|
System.out.println("上报时间:" + msg.stuTime.toStringTimeEx());
|
System.out.println("在线情况:" + (msg.bOnline == 1? "在线":"离线"));
|
System.out.println("锁序号:" + new String(msg.szSN).trim());
|
break;
|
}
|
default:
|
break;
|
}
|
return true;
|
}
|
}
|
|
|
public void RunTest() {
|
CaseMenu menu = new CaseMenu();
|
|
menu.addItem(new CaseMenu.Item(this , "查询智能锁序列号", "QueryDevSerialNo"));
|
|
menu.addItem(new CaseMenu.Item(this , "添加智能锁用户", "AddSmartLock"));
|
menu.addItem(new CaseMenu.Item(this , "删除智能锁用户", "RemoveSmartLock"));
|
|
// 事件订阅
|
menu.addItem(new CaseMenu.Item(this , "订阅事件", "startListen"));
|
menu.addItem(new CaseMenu.Item(this , "取消订阅", "stopListen"));
|
|
// 获取和修改目前暂未实现
|
menu.addItem(new CaseMenu.Item(this , "获取智能锁用户", "GetSmartLock"));
|
menu.addItem(new CaseMenu.Item(this , "修改智能锁用户", "ModifySmartLock"));
|
|
menu.run();
|
}
|
|
|
public static void main(String[]args) {
|
SmartLockOld demo = new SmartLockOld();
|
demo.InitTest();
|
demo.RunTest();
|
demo.EndTest();
|
}
|
}
|