之前的小工具,远程读卡器web客户端,实现原理是把读写卡服务装在远程(现场)的电脑上,这样有一些缺点,比如现场电脑必须开启端口映射,让客户端能否访问到。只能写好脚本,执行结束后才能看到结果。必能实时的看到指令与卡片的交互过程。
这次用nodejs的express web框架,实现一个简易的读写卡客户端,并且做成聊天室的样式,且允许多人观看和操作执行结果。 读写卡服务不再装在了现场,所以现场网络只需要能访问外网即可,无需开端口映射。
现场电脑只需要装一个客户端,这个客户端完成功能是串口操作读卡器,通过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;
-------------------------------------------------------------------------------------------
成功不是追求别人眼中的最好,而是把自己能做的事情做得最好。
每个人都应该有梦想,这才是生命的意义。
做事情贵在坚持,只有这份坚持,才实践了意义。
处处留心皆学问,爱学习,爱思考。
在这里分享学习,分享感悟,共同进步。
凝聚学习的圈子,思考的圈子。
扫码关注个人微信公众号:aazhen1987
凝聚学习和思考的圈子。
--------------------------------------------------------------------------------------------