热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

    之前的小工具,远程读卡器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;





推荐阅读
  • 目录1、将mysql数据导出到SQL文件中(数据库存在的情况)2、将现有的sql文件数据导入到数据库中(前提数据库存在) 3、利用Navicat导出SQL文件和导入SQL文件1)从 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 本文详细介绍了在Linux虚拟化部署中进行VLAN配置的方法。首先要确认Linux系统内核是否已经支持VLAN功能,然后配置物理网卡、子网卡和虚拟VLAN网卡的关系。接着介绍了在Linux配置VLAN Trunk的步骤,包括将物理网卡添加到VLAN、检查添加的VLAN虚拟网卡信息以及重启网络服务等。最后,通过验证连通性来确认配置是否成功。 ... [详细]
  • 感谢大家对IT十八掌大数据的支持,今天的作业如下:1.实践PreparedStament的CRUD操作。2.对比Statement和PreparedStatement的大批量操作耗时?(1 ... [详细]
  • Yii framwork 应用小窍门
    Yiiframework应用小窍门1.YiiFramework]如何获取当前controller的名称?下面语句就可以获取当前控制器的名称了!Php代码 ... [详细]
  • SQL Server 2017 Express限制研究
    MicrosoftSQLServer2017Express是一个功能强大且可靠的免费数据管理系统,它为轻量级网站和桌面应用程序提供丰富和可靠的数据存储。版本ÿ ... [详细]
  • 小白的Python 学习笔记(八)推导式详解
    大家好,今天我总结一下Python的推导式,首先让我们来看定义推导式(comprehensions)是Python的一种独有特性,是可以从一个数据序列构建另一个新的数据序列的结构体 ... [详细]
  • Mosquitto常用命令
    1mosquitto服务器的搭建服务器这里使用了阿里云的服务器,mosquitto默认需要1883的TCP入端口。需要在安全策略里设置一下。端口当然也可以选其他端口进 ... [详细]
author-avatar
手机用户2502878283
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有