QQ登录

只需一步,快速开始

威纶通触摸屏如何设置运行期限密码?实现延期付款功能

[ 复制链接 ]
提问:
大家好,我是新手,请大家多多指教,我手头有个工程,就是程序要做3期付款密码,想单独在触摸屏做。
例如2015年3月3日弹出一个输入密码窗口,只有正确的输入密码才能跳转回操作画面,否则一直处于输入密码画面,请问大家该怎么做。
有什么方法比较方便的?如果是用到宏指令,请举个例子分享一下 谢谢。

回答:
这是一个很实用的功能,当前工业环境就是这样,客户都会以预付款加尾款的方式来采购设备。
这样我们做设备的就得适应环境,设计程序来分段催款。
其实威纶通官方也提供有相似功能,只是我没用过,不知道效果如何。

这里我编写一个实例供大家参考使用。

先看下界面与功能:

威纶通触摸屏如何设置运行期限密码?实现延期付款功能

威纶通触摸屏如何设置运行期限密码?实现延期付款功能

正常使用时,会在界面上显示剩余使用时间。
当前这个显示功能也仅是演示效果用。
可以选择使用,或自己完善一下,通过宏格式化时间数据,通过字符元件显示会好些。
界面时间每隔一秒会减少,直到0,立马会跳转到密码输入界面,输入密码延长设备使用时间。也就是锁定使用,在没有延期操作,触摸屏都会直接锁定在此界面,不管重启与否。
密码输入延期界面如下:

威纶通触摸屏如何设置运行期限密码?实现延期付款功能

威纶通触摸屏如何设置运行期限密码?实现延期付款功能

界面分为上,下两部分,下部分用于生成密码用,供我们自己设备厂家使用。
发给用户的设备程序,界面上要去除。
设备到期后,生弹出这一窗口,生成有续期信息,信息得由用户提交给我们用来生成密码。
提交的续期信息直到衔接的作用,是关键的部分。
包含随机码与设备版本号。

我们会通过续期信息来生成密码。
密码为双字长度,由三部分组成。
随机码+版本号+时间模式+时间数量:FF,FF,FF,FF

随机码:
由宏代码随机生成,占用一字节,重启触摸屏或到期后,进行密码输入界面都会随机更新此数据。
版本号:
为我们发送给用户使用设备的版本号,占用一字节,为固定数值,比如254,已在宏指令里以常数形式使用。
时间模式:
占用一个字节秒,有6个选项,
秒:01
分:02
时:03
日:04
月:05
年:06
可以在生成的密码中表示要延长哪种时间,这样我们将生成的密码交给用户使用时,
用户端的程序就知道如何延长程序使用时间。
时间数量:
紧跟着时间模式的数值为延时时间的时间数量,也占用一个格式。

可以看到我们生成密码中的随机码与版本号就是提取续期信息。
生成的密码经过异或后显示,由我们交给用户使用。
这样用户将我们提供的密码输入后,程序就会将密码进行解析提取随机码与版本号。
两者都正确后,就会根据时间模式+时间数量来延长设备使用时间。

另外为了防止用户暴力破解,逐一测试密码。
我们宏代码也实现了3次密码输入错误就得重启触摸屏功能。
当然你也可以通过延时功能来加长密码输入错误后的等待时间。

当用户全款支付后,我们这些限制也就不需要了。
当然你可以准备另一没有限制的版本供用户重新下载使用。
为了体现我们设备厂商的专业性,自然会选择更加便捷的方法来解除限制。
为此我们在宏代码里面留了一个超级密码:3838438438
只要用户输入了这个密码,检测使用权限的宏指令就会停止工作,让设备正常使用。
我们检测权限的宏为macro_0,在编辑这个宏时,我们添加了启用执行条件。
界面设置如下:

威纶通触摸屏如何设置运行期限密码?实现延期付款功能

威纶通触摸屏如何设置运行期限密码?实现延期付款功能

这样我们只要设置了RW8为0XFFFF就可以去除限制功能。
配方寄存器RW8为一个字长度有16位,我们这里仅使用第0位。
虽有点浪费,但也只有配方寄存器为断电保持功能。
要注意,
界面里还设置了宏每隔一秒执行一次,这样才能够让时间递减。
这里没有通过两日期差来减少时间,而是通过时间秒的背叛实现。

此宏的代码如下:
macro_command main()
bool bOn=true
GetData(bOn, "Local HMI", LB, 0, 1)
if bOn==true then
return
end if
//使用到期,切换到输入密码窗口。
int nSecond=0
GetData(nSecond, "Local HMI", RW, 0, 1)
if nSecond<=0 then
//生成随机码显示在界面供用户提供来生成密码,254为版本号
short nTemp
RAND(nTemp)
int nRand
nRand = (nTemp<<16)|254
SetData(nRand, "Local HMI", RW, 2, 1)
//
short nIndex=11
SetData(nIndex, "Local HMI", LW, 10, 1)
bOn=true
SetData(bOn, "Local HMI", LB, 0, 1)
//
nSecond = 0
SetData(nSecond, "Local HMI", RW, 0, 1)
return
end if
//RW0储存试用时间
nSecond = nSecond-1
SetData(nSecond, "Local HMI", RW, 0, 1)

//显示剩余时间,可选
short y,m,d,H,M1,S
S=nSecond%60
M1=nSecond/60%60
H=nSecond/3600%24
d=nSecond/86400%30
m=nSecond/2592000%12
y=nSecond/31104000
SetData(S, "Local HMI", LW, 205, 1)
SetData(M1, "Local HMI", LW, 204, 1)
SetData(H, "Local HMI", LW, 203, 1)
SetData(d, "Local HMI", LW, 202, 1)
SetData(m, "Local HMI", LW, 201, 1)
SetData(y, "Local HMI", LW, 200, 1)
end macro_command



在我们自己的电脑上可以生成供用户使用的密码,
也就是界面<生成密码>调用的宏指令gen,如下:
macro_command main()
int n1
short n3,n4
GetData(n1, "Local HMI", LW, 100, 1)
GetData(n3, "Local HMI", LW, 102, 1)
GetData(n4, "Local HMI", LW, 103, 1)
//
int nTemp
nTemp = ((n1&0x00FF0000)<<8)|((n1&0x000000FF)<<16)|((n3&0xFF)<<8)|(n4&0xFF)
nTemp = nTemp^0XFFFFFFFF
SetData(nTemp, "Local HMI", LW, 14, 1)
end macro_command

从界面获取的信息由我们手动输入,有3部分内容。
用户提供的续期信息,时间模式,时间数量。
宏指令将这些信息处理打包后异或显示在界面上。
我们就可以将显示的密码提供给用户使用。

当用户将我们提供的密码输入,点击<延期后>,
会调用宏指令get,代码如下:
macro_command main()
//密码输入3次错误,重启屏才能再次输入
short nIndex=0
bool bOn=false
GetData(nIndex, "Local HMI", LW, 12, 1)
if nIndex >=3 then
return
end if
//获取输入密码
int nPw
GetData(nPw, "Local HMI", RW, 4, 1)
//判断是否为解除限制的我们预留的超级密码。
if(nPw==3838438438) then
nIndex = 0xFFFF
SetData(nIndex, "Local HMI", RW, 8, 1)
nIndex = 0
SetData(nIndex, "Local HMI", LW, 12, 1)
nPw=0
SetData(nPw, "Local HMI", RW, 4, 1)
bOn=false
SetData(bOn, "Local HMI", LB, 0, 1)
nIndex=10
SetData(nIndex, "Local HMI", LW, 10, 1)
return
end if
nPw = nPw^0XFFFFFFFF
//获取版本等信息
int nTemp,nTemp1
GetData(nTemp, "Local HMI", RW, 2, 1)
//核对随机信息
nTemp  = ((nTemp&0x00FF0000)<<8)
nTemp1 = nPw&0xFF000000
if (nTemp<>nTemp1)then
GetData(nIndex, "Local HMI", LW, 12, 1)
nIndex = nIndex+1
SetData(nIndex, "Local HMI", LW, 12, 1)
nPw=0
SetData(nPw, "Local HMI", RW, 4, 1)
return
end if
//核对版本信息
nTemp = ((nTemp&0x000000FF)<<16)
nTemp1 =  nPw&0x00FF000000
if (nTemp<>nTemp) then
GetData(nIndex, "Local HMI", LW, 12, 1)
nIndex = nIndex+1
SetData(nIndex, "Local HMI", LW, 12, 1)
nPw=0
SetData(nPw, "Local HMI", RW, 4, 1)
return
end if
//
short nTimeMode
int   nSecond
nTimeMode= (nPw&0xFF00)>>8
nSecond=nPw&0xFF
select case(nTimeMode)
case 0x1//秒延期
break
case 0x2//分延期
nSecond = nSecond*60
break
case 0x3//时延期
nSecond=nSecond*3600
break
case 0x4//日延期
nSecond =nSecond*86400
break
case 0x5//月延期
nSecond = nSecond*2592000
break
case 0x6//年延期
nSecond = nSecond*31104000
break
end select
//延期
SetData(nSecond, "Local HMI", RW, 0, 1)
//复位并返回初始界面
bOn=false
SetData(bOn, "Local HMI", LB, 0, 1)
nIndex=10
SetData(nIndex, "Local HMI", LW, 10, 1)
end macro_command

宏指令会解析用户输入的密码。提取随机码,版本号,时间模式与时间数量。
在随机码与版本号都一致时才根据时间模式与时间数量延长设备使用时间。
并进入欢迎界面,让设备可继续使用。
如果不对,计数输错次数。输错3次,锁定!
得重启触摸屏才能继续延期操作。
重启触摸屏仍旧进入锁定界面,让用户输入延期密码。
此时随机码也会更新,使之前我们提供的密码失效,得再次由我们提供帮助。
这样就实现了我们提供的密码仅能测试3次,用户也不能够随意测试密码,能够有效的防止用户暴力破解密码。
当然前提是用户不能够得到程序的源文件。
这样我们就得设置禁止上传,禁止反编译,宏加密等多重保护来预防了。
以上就是对问题的回答。
例程可以下载参考学习:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:威纶通触摸屏如何设置运行期限密码?实现延期付款功能.rar 
文件大小:337.05 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


如初次使用威纶通触摸屏的话,也可以下载我录制的两套教程。

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索