我的小工具-远程读卡器web客户端(nodejs+websocket实现实时指令交互)

原创 2017年07月05日 14:14:06

    之前的小工具,远程读卡器web客户端,实现原理是把读写卡服务装在远程(现场)的电脑上,这样有一些缺点,比如现场电脑必须开启端口映射,让客户端能否访问到。只能写好脚本,执行结束后才能看到结果。必能实时的看到指令与卡片的交互过程。

    这次用nodejs的express web框架,实现一个简易的读写卡客户端,并且做成聊天室的样式(其实就是在聊天室的demo上改造而来),且允许多人观看和操作执行结果。 读写卡服务不再装在了现场,所以现场网络只需要能访问外网即可,无需开端口映射。

    现场电脑只需要装一个客户端,这个客户端完成功能是串口操作读卡器,通过socket连接服务端。等于是服务端放到了公司这边来了。只需公司这边开启一个外网映射,全国各地的终端读卡器都可以接入进来。看到的效果就是 “读卡器XXX进入了聊天室”,就可以发指令和它聊天啦

 附:运行结果截图


截图2:


截图3:客户端的显示




客户端用python实现,完成串口转TCP。

#coding=utf-8
#author:yangyongzhen
#QQ:534117529
#'CardTest TcpServer  - Simple Test Card Tool 1.00' 

import sys,threading,time;
import serial;
import binascii,encodings;
import re;
import os;
from socket import *
from struct import *;
#from myutil import *;
#name: myutil.py

mylock = threading.RLock() 

Server_IP = ''
Srever_Port = ''

def print_hex1(s,prev='0x'):
    for c in s:
        print '%s%02x' %(prev,ord(c)),
    print
def print_hex(s):
    for c in s:
    	print '%02x' %(ord(c)),
    print

def hexto_str(s):
	r =''
	for c in s:
		r += '%02x' %(ord(c))
	return r
def strto_hex(s):
	r = s.decode('hex')
	return r
#''代表服务器为localhost

#在一个非保留端口号上进行监听


class ComThread:
    def __init__(self, Port=0):
        self.l_serial = None;
        self.alive = False;
        self.waitEnd = None;
        self.port = Port;

        #TCP部分
        #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connection = None
        #数据
        self.snddata = ''
        self.rcvdata = ''

    def waiting(self):
        if not self.waitEnd is None:
            self.waitEnd.wait();


    def SetStopEvent(self):
        if not self.waitEnd is None:
            self.waitEnd.set();
        self.alive = False;
        self.stop();


    def start(self):
        self.l_serial = serial.Serial();
        self.l_serial.port = self.port;
        self.l_serial.baudrate = 115200;
        self.l_serial.timeout = 2;  #秒
        self.l_serial.open();

        if self.l_serial.isOpen():
            self.waitEnd = threading.Event();
            self.alive = True;
            print 'open serial port %d ok!\n' %(self.port+1)
            print 'baudrate:115200 \n'
            self.thread_read = None;
            self.thread_read = threading.Thread(target=self.FirstReader);
            self.thread_read.setDaemon(1);
            self.thread_read.start();

            self.thread_write = None;
            self.thread_write = threading.Thread(target=self.FirstWriter);
            self.thread_write.setDaemon(1);
            self.thread_write.start();

            #TCP部分
            self.thread_TcpClient = None;
            self.thread_TcpClient = threading.Thread(target=self.TcpClient);
            self.thread_TcpClient.setDaemon(1);
            self.thread_TcpClient.start();

            self.thread_TcpSend = None;
            self.thread_TcpSend = threading.Thread(target=self.TcpSend);
            self.thread_TcpSend.setDaemon(1);
            self.thread_TcpSend.start();

            return True;
        else:
            return False;


    def FirstReader(self):
        while self.alive:
            # 接收间隔
            time.sleep(0.1);
            try:
                data = '';
                n = self.l_serial.inWaiting();
                if n:
                    data = data+self.l_serial.read(n);
                    #for l in xrange(len(data)):
                        #print '%02X' % ord(data[l]),
                    # 发送数据
                    print u'->请求:'
                    print data;
                    mylock.acquire() 
                    self.snddata = data
                    mylock.release()
                    #print_hex(data);
                
                    
                # 判断结束
               
            except Exception, ex:
                print str(ex);

        self.waitEnd.set();
        self.alive = False;

    def FirstWriter(self):
        while self.alive:
            # 接收间隔
            time.sleep(0.1);
            try:
                #snddata = raw_input('\nenter data send:\n')
                if self.rcvdata!='':
                    self.l_serial.write(self.rcvdata); 
                    print u'-<应答:'
                    print self.rcvdata;
                    mylock.acquire() 
                    self.rcvdata = '';
                    mylock.release()
                #print_hex(snddata);
                
            except Exception, ex:
                print str(ex);
        self.waitEnd.set();
        self.alive = False;

    def TcpClient(self):
        while True:
            # 接收间隔
            time.sleep(0.1);
            self.connection = socket(AF_INET, SOCK_STREAM);
            self.connection.connect((Server_IP, int(Server_Port)));
            print 'Connect to Server OK!';
            self.snddata = ''
            self.rcvdata = ''
            while True:
		        #读取客户端套接字的下一行
		        data = self.connection.recv(1024)
		        #如果没有数量的话,那么跳出循环
		        if not data: break
		        #发送一个回复至客户端
		        mylock.acquire() 
		        self.snddata = ''
		        self.rcvdata = data
		        mylock.release()
		        #connection.send('Echo=>' + data)
            self.connection.close()

        self.waitEnd.set();
        self.alive = False;

    def TcpSend(self):
        while True:
            # 接收间隔
            time.sleep(0.1);
            while True:
	            time.sleep(0.1);
	            try:
	            	if not self.connection is None:
	            		if self.snddata != '':
	            			self.connection.send(self.snddata)
	            			mylock.acquire() 
	            			self.rcvdata = ''
	            			self.snddata = ''
	            			mylock.release()
	            except Exception, ex:
			    	pass    		
    def stop(self):
        self.alive = False;
        self.thread_read.join();
        if self.l_serial.isOpen():
            self.l_serial.close();



#测试用部分
if __name__ == '__main__':
    print 'Serial to Tcp Tool 1.00\n' 
    print 'Author:yangyongzhen\n'
    print 'QQ:534117529\n'
    print 'Copyright (c) ***** 2015-2016.\n'

    Server_IP = raw_input('please enter ServerIP:')
    print 'Server_IP: %s' %(Server_IP)
    Server_Port = raw_input('please enter ServerPort:')
    print 'Server_Port: %s' %(Server_Port)
    com =raw_input('please enter com port(1-9):')
    rt = ComThread(int(com)-1);
    try:
        if rt.start():
            rt.waiting();
            rt.stop();
        else:
            pass;            
    except Exception,se:
        print str(se);

    if rt.alive:
        rt.stop();
    os.system("pause")

    print '';
    print 'End OK .';
    del rt;




版权声明:本文为博主原创文章,未经博主允许不得转载。

基于 websocket 实现远程实时日志 在浏览器中查看设备的运行日志

本文介绍一个基于websocket实现的远程实时日志系统,可以通过浏览器查看远程移动设备的实时运行日志。 系统由三个部分组成: 1. 服务器:与移动设备和浏览器建立websocket连接,将移动设...
  • e28sean
  • e28sean
  • 2013年02月01日 15:18
  • 11883

我的小工具,用C和python实现远程读卡器,远程读写消费卡片

晚上睡不着,想着白天工作上的事,让现场同事配合抓包,读取一下卡上数据,但现场同事连串口助手都没听说过。想到可以做一个远程读卡器。 尽管可能行不成产品,但是对调试现场读卡之类的程序太有用了。这个远程读卡...
  • qq8864
  • qq8864
  • 2016年05月24日 14:59
  • 1432

通过Socket.IO与nodeJs实现即时消息推送

http://book.mixu.net/ch13.html 很早开始就想用WebSocket完成即时消息推送功能。之前本打算用WebSocket + C#实现的,结果人上了年纪变笨...
  • zeng_84_long
  • zeng_84_long
  • 2013年07月09日 17:13
  • 12054

websocket html5 客户端测试代码

测试 websocket 客户端的连接、发送消息和断开,生成一个面板用于显示 log,代码功能单一,便于测试。 index.html WebSoket Demo ...
  • M348915654
  • M348915654
  • 2016年12月13日 23:08
  • 395

tomcat8 实现的websock,可以跨域哦

tomcat8实现websocket的例子
  • wwwlgy
  • wwwlgy
  • 2015年12月17日 17:12
  • 7224

我的小工具,用C和python实现远程读卡器,远程读写消费卡片

晚上睡不着,想着白天工作上的事,让现场同事配合抓包,读取一下卡上数据,但现场同事连串口助手都没听说过。想到可以做一个远程读卡器。 尽管可能行不成产品,但是对调试现场读卡之类的程序太有用了。这个远程读卡...
  • qq8864
  • qq8864
  • 2016年05月24日 14:59
  • 1432

C#读卡器实现

申明:该代码适用于网页形式的读卡器功能实现。 直接上代码:
  • zhongxinhua0123
  • zhongxinhua0123
  • 2017年03月09日 18:46
  • 582

网页调用智能IC卡读写器的解决方案

一、 把智能IC卡读写器的开发接口做成OCX或ActiveX控件           和几家做IC卡读写设备的厂商的工程师沟通过,通常的做法是把IC卡读写器的开发接口封装成OCX控件或Acti...
  • wokuaile123321
  • wokuaile123321
  • 2014年09月15日 15:28
  • 1952

ubuntu--访问PC/SC读卡器

因为PC/SC是Windows的体系,以系统API的层面服务应用。所以一直以来智能卡相关的读卡器和工具都集中在Windows上,而在 unix体系下则一直水土不服。值得庆幸的是随着开源组织M.U.S....
  • fouweng
  • fouweng
  • 2016年12月02日 15:53
  • 872

在web浏览器页面使用IC卡读卡器

在web浏览器中要嵌入IC卡读卡器,如果使用IE浏览器,那么只能使用OCX控件,不管这个OCX后缀是dll还是ocx。 然后在网页端 通过javascript或者vbscript脚本调用ocx的接口...
  • codercodercode
  • codercodercode
  • 2016年06月07日 15:21
  • 3569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的小工具-远程读卡器web客户端(nodejs+websocket实现实时指令交互)
举报原因:
原因补充:

(最多只允许输入30个字)