UKEY(D8-16K)写锁及自动获取用户名

一、写锁过程
1.初始化操作加锁类
string KeyPath;
SoftKeyYT88 ytsoftkey = new SoftKeyYT88();
if(ytsoftkey.FindPort(0,ref KeyPath) != 0)
{
//未找到锁
}
2.初始化参数
byte[] buf = new byte[1];
int nlen = SoftKeyYT88.lstrlenA(InString); //InString为要写入用户名
3.写入用户名
int ret = ytsoftkey.YWriteString(InString,addr+1,"syzg","syzg",KeyPath);
参数1:要写入的用户名
参数2:写入位置,addr一般为0
参数3,4:锁密码
参数5:初始化加密锁返回的参数
if(ret != 0)
{
//写入错误,ret为错误信息
}
二、用户登录自动获取锁内ID
mylogin_onclick:function(InThis)
{
//这里使用了异步的方式,因为WEBSOCKET是异步的
return new Promise((resolve, reject) =>{
var that=InThis;
//判断是否安装了服务程序,如果没有安装提示用户安装
if(bConnect==0)
{
window.alert ( "未能连接服务程序,请确定服务程序是否安装。");return false;
}

var DevicePath,ret,n,mylen,ID_1,ID_2,addr;
try
{

//由于是使用事件消息的方式与服务程序进行通讯,
//好处是不用安装插件,不分系统及版本,控件也不会被拦截,同时安装服务程序后,可以立即使用,不用重启浏览器
//不好的地方,就是但写代码会复杂一些
var s_simnew1=new SoftKey3W(); //创建UK类

s_simnew1.Socket_UK.onopen = function() {
s_simnew1.ResetOrder();//这里调用ResetOrder将计数清零,这样,消息处理处就会收到0序号的消息,通过计数及序号的方式,从而生产流程
}


//写代码时一定要注意,每调用我们的一个UKEY函数,就会生产一个计数,即增加一个序号,较好的逻辑是一个序号的消息处理中,只调用我们一个UKEY的函数
s_simnew1.Socket_UK.onmessage =function got_packet(Msg)
{
var UK_Data = JSON.parse(Msg.data);
// alert(Msg.data);
if(UK_Data.type!="Process")return ;//如果不是流程处理消息,则跳过
switch(UK_Data.order)
{
case 0:
{
s_simnew1.FindPort(0);//发送命令取UK的路径
}
break;//!!!!!重要提示,如果在调试中,发现代码不对,一定要注意,是不是少了break,这个少了是很常见的错误
case 1:
{
if( UK_Data.LastError!=0){window.alert ( "未发现加密锁,请插入加密锁");s_simnew1.Socket_UK.close();return false;}
DevicePath=UK_Data.return_value;//获得返回的UK的路径
s_simnew1.GetID_1(DevicePath); //发送命令取ID_1
}
break;
case 2:
{
if( UK_Data.LastError!=0){ window.alert("返回ID号错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
ID_1=UK_Data.return_value;//获得返回的UK的ID_1
s_simnew1.GetID_2(DevicePath); //发送命令取ID_2
}
break;
case 3:
{
if( UK_Data.LastError!=0){ window.alert("取得ID错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
ID_2=UK_Data.return_value;//获得返回的UK的ID_2

that.KeyID=toHex(ID_1)+toHex(ID_2);

s_simnew1.ContinueOrder();//为了方便阅读,这里调用了一句继续下一行的计算的命令,因为在这个消息中没有调用我们的函数,所以要调用这个
}
break;
case 4:
{
//获取设置在锁中的用户名
//先从地址0读取字符串的长度,使用默认的读密码"FFFFFFFF","FFFFFFFF"
addr=0;
s_simnew1.YReadEx(addr,1,"ffffffff","ffffffff",DevicePath);//发送命令取UK地址0的数据
}
break;
case 5:
{
if( UK_Data.LastError!=0){ window.alert("读数据时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
s_simnew1.GetBuf(0);//发送命令从数据缓冲区中数据
}
break;
case 6:
{
if( UK_Data.LastError!=0){ window.alert("调用GetBuf时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
mylen=UK_Data.return_value;//获得返回的数据缓冲区中数据

//再从地址1读取相应的长度的字符串,,使用默认的读密码"FFFFFFFF","FFFFFFFF"
addr=1;
s_simnew1.YReadString(addr,mylen, "ffffffff", "ffffffff", DevicePath);//发送命令从UK地址1中取字符串
}
break;
case 7:
{
if( UK_Data.LastError!=0){ window.alert("读取字符串时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
that.UserName=UK_Data.return_value;//获得返回的UK地址1的字符串

//获到设置在锁中的用户密码,
//先从地址20读取字符串的长度,使用默认的读密码"FFFFFFFF","FFFFFFFF"
addr=20;
s_simnew1.YReadEx(addr,1,"ffffffff","ffffffff",DevicePath);//发送命令取UK地址20的数据
}
break;
case 8:
{
if( UK_Data.LastError!=0){ window.alert("读数据时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
s_simnew1.GetBuf(0);//发送命令从数据缓冲区中数据
}
break;
case 9:
{
if( UK_Data.LastError!=0){ window.alert("调用GetBuf时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
mylen=UK_Data.return_value;//获得返回的数据缓冲区中数据

//再从地址21读取相应的长度的字符串,,使用默认的读密码"FFFFFFFF","FFFFFFFF"
addr=21;
s_simnew1.YReadString(addr,mylen,"ffffffff", "ffffffff", DevicePath);//发送命令从UK地址21中取字符串
}
break;
case 10:
{
if( UK_Data.LastError!=0){ window.alert("读取字符串时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
that.Password=UK_Data.return_value;//获得返回的UK中地址21的字符串

//这里返回对随机数的HASH结果
s_simnew1.EncString(that.myrnd,DevicePath);//发送命令让UK进行加密操作

}
break;
case 11:
{
if( UK_Data.LastError!=0){ window.alert("进行加密运行算时错误,错误码为:"+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
that.return_EncData=UK_Data.return_value;//获得返回的加密后的字符串


//所有工作处理完成后,关掉Socket
s_simnew1.Socket_UK.close();
resolve(true);
}
break;
}
}
s_simnew1.Socket_UK.onclose = function(){

}
}
catch (e)
{
alert(e.name + ": " + e.message);
resolve(false);
}
})
}
case 7时返回锁内用户名

posted @ 2022-09-21 13:58  zwbsoft  阅读(274)  评论(0编辑  收藏  举报