技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 326
|
用Access做套“一卡通”管理(續(xù))
續(xù)上一篇:http://ctxi.cn/forum.php?mod=viewthread&tid=47942
五. 讀卡器的以太網(wǎng)接口
上次簡單介紹了Access通過電腦串口連接讀卡器的例子。一般RS232傳輸距離不過數(shù)米,通常就用RS232轉(zhuǎn)換為RS485作長距離傳輸這樣可以達(dá)到一千米左右。由于以太網(wǎng)傳輸更為方便,傳輸距離更遠(yuǎn),所以讀卡器一般在RS232的基礎(chǔ)上加裝一個(gè)TCP/IP轉(zhuǎn)換組件,讀卡器的數(shù)據(jù)就非常方便地通過網(wǎng)絡(luò)傳給電腦終端了。近來這種以太網(wǎng)通訊傳輸數(shù)據(jù)的讀卡器就成為讀卡器的主流發(fā)展方向了。
六. Access、Winsocket控件、TCP/IP協(xié)議
在Access中使用網(wǎng)絡(luò)通訊最簡單有效的辦法就是引用 Winsocket控件 ——Mswinsck.ocx 。Winsocket是個(gè)常用通訊控件,在Access2002控件引用列表中存在但需要版權(quán)注冊,那么安裝一次VB6.0,就算安裝后再卸載也行,版權(quán)問題就自然解決了。(有關(guān)Winsockt控件的應(yīng)用資料在安裝MSDN中有詳細(xì)說明。)
在Access程序中將Winsockve設(shè)定工作在TCP/IP協(xié)議模式 ,通過握手應(yīng)答機(jī)制數(shù)據(jù)可以可靠地得以傳遞。每個(gè)讀卡器都設(shè)置有一個(gè)IP地址。每次讀卡后通過設(shè)定端口向網(wǎng)絡(luò)的特定IP地址發(fā)送讀卡器的設(shè)備號、IP地址號和卡號;Access編程中將其中一個(gè)控件-Winsocket0設(shè)定為偵聽狀態(tài),當(dāng)偵聽到有關(guān)讀卡器連接請求即轉(zhuǎn)由下一控件Winsocket(n)負(fù)責(zé)連接,Winsocket0再次偵聽。當(dāng)已經(jīng)連接的控件接受到讀卡器傳來的數(shù)據(jù)后隨即發(fā)送接受確認(rèn)應(yīng)答,讀卡器收到接受完成確認(rèn)后進(jìn)入處理下次刷卡。
七. ACCESS用TCP/IP協(xié)議連接的一個(gè)例子:
1.引用MicroSoft Winsock Control 6.0 '引用Mswinsck.ocx
2.在窗口中新建n個(gè)Winsock控件——Winsock0(偵聽) 和 Winsock1……n(接受)
Private Sub Form_Load() '加載窗體
Winsock0.LocalPort = 3000 '讀卡器設(shè)定端口
Winsock0.Listen 'Socket在程序啟動(dòng)時(shí)監(jiān)聽端口
End Sub
'偶發(fā)故障后繼續(xù)偵聽
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 '關(guān)閉連接后繼續(xù)監(jiān)聽
End Sub
Private Sub Winsock0_ConnectionRequest(ByVal requestID As Long) '當(dāng)讀卡器請求連接時(shí)出現(xiàn)事件
On Error GoTo Err_錯(cuò)誤
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")
'與相應(yīng)終端重新建立連接
If Me("winsock" & sID).State <> sckClosed Then Me("winsock" & sID).Close
Me("winsock" & sID).Accept requestID
'保持偵聽狀態(tài)
If Winsock0.State <> sckClosed Then Winsock0.Close: Winsock0.Listen
Me.狀態(tài).Selected(sID) = True '顯示讀卡器已經(jīng)上線連接
Exit_錯(cuò)誤:
Exit Sub
Err_錯(cuò)誤:
Winsock0.Close
Winsock0.Listen
Resume Exit_錯(cuò)誤
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '1 (數(shù)據(jù)抵達(dá)事件)
Dim rb As Byte
Dim B As Integer
Dim Content As String
For B = 1 To Winsock1.BytesReceived
Winsock1.GetData rb, vbByte, 1 '接收內(nèi)容并指定類型
Content = Content + " " + String(2 - Len(Hex(rb)), "0") + Hex(rb)
Next B
Content = Trim(Content) '去掉前后空格
'…… 此處按各自的要求處理獲得的數(shù)據(jù)包 Content
Me("Winsock1").SendData &HFF '記錄收到后向讀卡器發(fā)送確認(rèn)應(yīng)答
End Sub
如果連接讀卡器不多,在窗體上多用 |
|