|
用Access做套“一卡通”管理(续)
续上一篇:http://www.office-cn.net/forum.php?mod=viewthread&tid=47942
五. 读卡器的以太网接口
上次简单介绍了Access通过电脑串口连接读卡器的例子。一般RS232传输距离不过数米,通常就用RS232转换为RS485作长距离传输这样可以达到一千米左右。由于以太网传输更为方便,传输距离更远,所以读卡器一般在RS232的基础上加装一个TCP/IP转换组件,读卡器的数据就非常方便地通过网络传给电脑终端了。近来这种以太网通讯传输数据的读卡器就成为读卡器的主流发展方向了。
六. Access、Winsocket控件、TCP/IP协议
在Access中使用网络通讯最简单有效的办法就是引用 Winsocket控件 ——Mswinsck.ocx 。Winsocket是个常用通讯控件,在Access2002控件引用列表中存在但需要版权注册,那么安装一次VB6.0,就算安装后再卸载也行,版权问题就自然解决了。(有关Winsockt控件的应用资料在安装MSDN中有详细说明。)
在Access程序中将Winsockve设定工作在TCP/IP协议模式 ,通过握手应答机制数据可以可靠地得以传递。每个读卡器都设置有一个IP地址。每次读卡后通过设定端口向网络的特定IP地址发送读卡器的设备号、IP地址号和卡号;Access编程中将其中一个控件-Winsocket0设定为侦听状态,当侦听到有关读卡器连接请求即转由下一控件Winsocket(n)负责连接,Winsocket0再次侦听。当已经连接的控件接受到读卡器传来的数据后随即发送接受确认应答,读卡器收到接受完成确认后进入处理下次刷卡。
七. ACCESS用TCP/IP协议连接的一个例子:
1.引用MicroSoft Winsock Control 6.0 '引用Mswinsck.ocx
2.在窗口中新建n个Winsock控件——Winsock0(侦听) 和 Winsock1……n(接受)
Private Sub Form_Load() '加载窗体
Winsock0.LocalPort = 3000 '读卡器设定端口
Winsock0.Listen 'Socket在程序启动时监听端口
End Sub
'偶发故障后继续侦听
Private Sub Winsock0_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal
HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Winsock0.Close
Winsock0.Listen '关闭连接后继续监听
End Sub
Private Sub Winsock0_ConnectionRequest(ByVal requestID As Long) '当读卡器请求连接时出现事件
On Error GoTo Err_错误
Dim sID As Byte
Dim sIP As String
sIP = Winsock0.RemoteHostIP '获得终端IP地址 查询读卡器序号 sID
sID = CurrentProject.Connection.Execute("select ID from yyd where IP =" & Chr$(34) & sIP & Chr$(34))("ID")
'与相应终端重新建立连接
If Me("winsock" & sID).State <> sckClosed Then Me("winsock" & sID).Close
Me("winsock" & sID).Accept requestID
'保持侦听状态
If Winsock0.State <> sckClosed Then Winsock0.Close: Winsock0.Listen
Me.状态.Selected(sID) = True '显示读卡器已经上线连接
Exit_错误:
Exit Sub
Err_错误:
Winsock0.Close
Winsock0.Listen
Resume Exit_错误
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '1 (数据抵达事件)
Dim rb As Byte
Dim B As Integer
Dim Content As String
For B = 1 To Winsock1.BytesReceived
Winsock1.GetData rb, vbByte, 1 '接收内容并指定类型
Content = Content + " " + String(2 - Len(Hex(rb)), "0") + Hex(rb)
Next B
Content = Trim(Content) '去掉前后空格
'…… 此处按各自的要求处理获得的数据包 Content
Me("Winsock1").SendData &HFF '记录收到后向读卡器发送确认应答
End Sub
如果连接读卡器不多,在窗体上多用 |
|