我的小工具-远程读卡器web客户端(nodejs+websocket实现实时指令交互)
时间:2022-07-22
本文章向大家介绍我的小工具-远程读卡器web客户端(nodejs+websocket实现实时指令交互),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
之前的小工具,远程读卡器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.00n'
print 'Author:yangyongzhenn'
print 'QQ:534117529n'
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;
- 精彩大放送 | 腾讯云:容器架构向无服务架构的演进
- Python 数据分析学习笔记
- 如何用Fiddler抓取https
- 人工智能与大数据结合,帮助降低自杀率
- “多态”的数据库连接池实现
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
- 用js代码理解区块链,最简版本
- 谈谈IE针对Ajax请求结果的缓存
- Ajax请求过程中显示“进度”的简单实现
- ASP.NET MVC基于标注特性的Model验证:ValidationAttribute
- 【深度学习系列】卷积神经网络详解(二)——自己手写一个卷积神经网络
- 区块链钱包mMoney向GooglePay、Applepay发起挑战
- Model验证系统运行机制是如何实现的?
- CentOS 6.8 部署zookeeper集群
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- leetcode树之从翻转二叉树
- Linux常见的持久化后门汇总
- 一篇文章带你使用 Python搞定对 Excel 表的读写和处理(xlsx文件的处理)
- 从 rollup 初版源码学习打包原理
- leetcode树之相同的树
- Mysql Sql 语句练习题 (50道)
- 【每日一具16】来了!扫描图片批量漂白修正软件
- 实现一个 webpack loader 和 webpack plugin
- 万字长文带你走进 JavaScript 的世界
- windows中常见后门持久化方法总结
- Python3爬虫实战【点触验证码】 — 模拟登陆bilibili
- BOM 是个什么玩意!
- Educational Codeforces Round 81 (Rated for Div. 2) B - Infinite Prefixes
- python-利用python写一个购物小程序
- Java技巧收录一 那些你相见恨晚的快捷键和代码注释模板