設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 1733|回復(fù): 0
打印 上一主題 下一主題

[Access本身] [討論] (續(xù)) 用Access做套“一卡通”管理

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2006-9-25 15:55:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
                                                     用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

   如果連接讀卡器不多,在窗體上多用
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 10:31 , Processed in 0.114304 second(s), 24 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表