Nodejs使用http模块创建Web服务器接收解析RFID读卡器刷卡数据

news2024/11/28 8:29:37

本示例使用设备: https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.1d292c1buHvw58&ft=t&id=22173428704

Javascript源码

//引用http模块创建web服务器,监听指定的端口获取以GET、POST、JSON等方式上传的数据,并回应驱动读卡器显示文字、蜂鸣响声、播报语音、开启继电器等操作。 
const http = require('http');
const url = require('url');
const querystring=require('querystring');

const hostname = '192.168.1.211';       //本机IP
const port = 88;                        //监听端口

let info="";            //接收到的数据包号,需回应该包号
let jihao="";           //设备自编机号
let cardtype="";        //刷卡标志,卡类型
let scantype="";        //扫码标志
let heartbeattype="";   //心跳包标志  
let card="";            //接收到的原始16进制卡号,可根据需要自行转换成其他卡号
let data="";            //扇区内容 或 扫码信息  
let input="";           //输入标识
let output="";          //输出标识  
let rand="";            //设备随机数
let dn="";              //设备硬件序列号,出厂时已固化,全球唯一
let status="";          //读卡状态,如12表示卡密码认证失败  
let RepStr="";

const server = http.createServer((request, response) => {
    console.log(request.method);
    console.log(request.url);
    console.log(request.httpVersion);
    console.log(request.headers);
    console.log(request.headers.host);
    
    if(request.method=="GET"){              //解析GET方式提交的数据
        let res = url.parse(request.url, true);
        info=res.query.info;
        jihao=res.query.jihao;
        cardtype=res.query.cardtype;
        scantype=res.query.scantype;
        heartbeattype=res.query.heartbeattype;
        card=res.query.card;
        data=res.query.data;
        input=res.query.input;
        output=res.query.output;
        rand=res.query.rand;
        dn=res.query.dn;
        status=res.query.status;
		if (info !="" && dn !=""){          //通过解析获取到了数据包信息info 和设备硬件信息, 表示确为HTTP 网络读卡器上传的信息,立即回应
			RepStr="Response=1";            //Response=1 固定前缀,我们的设备以此来检索返回信息,表示 驱动设备显示和响声            
			RepStr = RepStr + "," + info;   //提交的信息序号,一定要对应
			RepStr = RepStr + ",Cardno:"+ card+"  welcome to use!";   //读卡器上显示文字,显示中文要转换编码,显示信息不能有半角符逗号
			RepStr = RepStr + ",5";         //显示时长,单位为秒
			RepStr = RepStr + ",2";         //蜂鸣器发声种类,取值范围0-12
			RepStr = RepStr + ",";          //播报的TTS语音,中文语音要转换编码
			RepStr = RepStr + ",20";        //第1继电器开启延时单位,每1个单位延时25mm,20*25表示500mm,取值为0表示关闭继电器
			RepStr = RepStr + ",30";        //第2继电器开启延时单位,以,分隔,总计可以控制8个继电器
			response.end(RepStr);
			console.log(RepStr+"\n\n");
		} 

    }else if(request.method=="POST"){
        let body = '';
        request.on('data', chunk => {
             body += chunk.toString();
        });

        request.on('end', () => {
            console.log(body);       
            let obj=querystring.parse(body);    //解析POST方式提交的数据
            info=obj.info;
            jihao=obj.jihao;
            cardtype=obj.cardtype;
            scantype=obj.scantype;
            heartbeattype=obj.heartbeattype;
            card=obj.card;
            data=obj.data;
            input=obj.input;
            output=obj.output;
            rand=obj.rand;
            dn=obj.dn;
            status=obj.status;

            if (info ==undefined ){
                var jsonParsed = JSON.parse(body);    //解析POST JSON方式提交的数据  
                //console.log(jsonParsed);
                info=jsonParsed.info;
                jihao=jsonParsed.jihao;
                cardtype=jsonParsed.cardtype;
                scantype=jsonParsed.scantype;
                heartbeattype=jsonParsed.heartbeattype;
                card=jsonParsed.card;
                data=jsonParsed.data;
                input=jsonParsed.input;
                output=jsonParsed.output;
                rand=jsonParsed.rand;
                dn=jsonParsed.dn;
                status=jsonParsed.status;
            }

			if (info !="" && dn !=""){          //通过解析获取到了数据包信息info 和设备硬件信息, 表示确为HTTP 网络读卡器上传的信息,立即回应
				RepStr="Response=1";            //Response=1 固定前缀,我们的设备以此来检索返回信息,表示 驱动设备显示和响声            
				RepStr = RepStr + "," + info;   //提交的信息序号,一定要对应
				RepStr = RepStr + ",Cardno:"+ card+"  welcome to use!";   //读卡器上显示文字,显示中文要转换编码,显示信息不能有半角符逗号
				RepStr = RepStr + ",5";         //显示时长,单位为秒
				RepStr = RepStr + ",2";         //蜂鸣器发声种类,取值范围0-12
				RepStr = RepStr + ",";          //播报的TTS语音,中文语音要转换编码
				RepStr = RepStr + ",20";        //第1继电器开启延时单位,每1个单位延时25mm,20*25表示500mm,取值为0表示关闭继电器
				RepStr = RepStr + ",30";        //第2继电器开启延时单位,以,分隔,总计可以控制8个继电器
				response.end(RepStr);
				console.log(RepStr+"\n\n");
			} 
        });        
    }   
})

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像梯度-Sobel算子、scharrx算子和lapkacian算子

文章目录 一、认识什么是图像梯度和Sobel算子二、Sobel算子的具体使用三、scharrx算子与lapkacian(拉普拉斯)算子 一、认识什么是图像梯度和Sobel算子 图像的梯度是指图像亮度变化的空间导数,它描述了图像在不同方向上的强度变化。在图像处理和计算机视觉中&#x…

CUDA error: out of memory问题

加载模型时,模型也不大,GPU内存也完全够,但就是出现这个CUDA内存溢出问题。 究其原因,在于model.load_state_dict(torch.load(‘pretrain-model.pth’, map_locationdevice))这个代码省略了map_locationdevice 通过torch.load加载…

YOLOv11来了 | 自定义目标检测

概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布:https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本,结合了尖端的准确性、速度和效率,用于目标检测、分割、分类、定向边界框和…

问题清除指南|alimama-creative/FLUX-Controlnet-Inpainting 运行注意事项

前言:近日验证想法需要用到inpainting技术,选择了https://github.com/alimama-creative/FLUX-Controlnet-Inpainting进行测试,在实现过程中遇到几个小问题,在此分享一下解决经验。 1. 下载预训练模型到本地 由于在huggingface官网…

React Agent 自定义实现

目录 背景 langchin 中的 agent langchin 中 agent 的问题 langchain 的 agent 案例 自定义 React Agent 大模型 工具定义 问题设定 问题改写,挖掘潜在意图 React Prompt 下一步规划 问题总结 代码 背景 之前使用过 langchian 中的 agent 去实现过一些…

WordPress监控用户行为回放插件

在数字营销的世界里,了解用户行为是提升用户体验和转化率的关键。nicen-replay 插件,它能够让您轻松回放用户在网站上的每一步操作,从点击到滚动,再到表单填写,每一个细节都清晰可见 nicen-replay,是一款可…

C#从零开始学习(类型和引用)(4)

类型 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp 整型 byte: 0~255sbyte: -128~127short: -32768~32767int: -2147483648~2147483647long: -9223372036854775808~9223372036854775807 以u开头的无符号整数 ushort,uint,ulong 浮点 float: (6~9…

RHCE【远程连接服务器】

目录 一、远程连接服务器简介 二、加密技术简介 SSH工作过程: (1)版本协商阶段 (2)密钥和算法协商阶段 (3)认证阶段 (4)会话请求阶段 (5&#xff0…

KUKA外部自动配置(上)

通过外部PLC对机器人自动运行进程进行控制,其控制原理是:外部PLC通过外部自动运行接口向机器人控制系统发出机器人进程的相关信号(如:运行许可、故障确认、程序启动等),机器人控制系统向外部PLC系统发送有关…

STM32 I2C通信协议详解

文章目录 STM32 I2C通信协议详解一、I2C协议概述二、物理层特性总线结构:引脚定义:电平特性:地址机制: 三、协议层机制起始信号:停止信号:数据有效性:应答信号(ACK)&…

机器学习|Pytorch实现天气预测

机器学习|Pytorch实现天气预测 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 电脑系统:Windows11 显卡型号:NVIDIA Quadro P620 语言环境:python 3.9.7 编译器&#x…

【Python】selenium遇到“InvalidArgumentException”的解决方法

在使用try……except 的时候捕获到这个错误: InvalidArgumentException: invalid argument (Session info: chrome112.0.5614.0) 这个错误代表的是,当传入的参数不符合期望时,就会抛出这个异常: InvalidArgumentException: invali…

常见TCP/IP协议基础——计算机网络

目录 前言常见协议基础常见协议-基于TCP的应用层协议常见协议-基于UDP的应用层协议常见协议-网络层协议习题自测1.邮件发送协议2.接收邮件协议端口3.建立连接4.层次对应关系5.FTP服务器端口 前言 本笔记为备考软件设计师时的重点知识点笔记,关于常见TCP/IP协议基础…

Java【多线程】wait和notify

目录 wait / notify 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序. wait / notify 等待/通知 协调线程之间的执行逻辑的顺序的 可以让后执行的逻辑等待先执行的逻辑 虽然无法直接…

缓存框架JetCache源码解析-缓存定时刷新

作为一个缓存框架,JetCache支持多级缓存,也就是本地缓存和远程缓存,但是不管是使用着两者中的哪一个或者两者都进行使用,缓存的实时性一直都是我们需要考虑的问题,通常我们为了尽可能地保证缓存的实时性,都…

word取消自动单词首字母大写

情况说明:在word输入单词后首字母会自动变成大写 (1)点击菜单栏文件 (2)点击“更多”——>“选项” (3)点击“校对”——>“自动更正选项” (4)取消“句首字母大写…

WPF样式详解:行内样式、模板样式和页面样式的全方位分析

Windows Presentation Foundation (WPF) 是微软推出的一种用于构建桌面应用程序的UI框架。WPF 提供了强大的样式和模板机制,允许开发人员以声明的方式定义和复用UI元素的视觉外观。本文将深入探讨WPF的行内样式、模板样式和页面样式,帮助您在实际开发中更…

大数据linux操作系统

第一关:Linux的初体验 答案: cd / ls -a / (里面有空格要注意) 第二关:Linux的常用命令 答案: touch newfile mkdir newdir cp newfile newdir/newfileCpy 第三关:Linux查询命令帮助语句…

我在自动化测试方面犯过的3个大错误

每个人都会犯错误,但不管错误看起来有多糟糕,你都可以恢复过来,更重要的是,从错误中学习。 在软件开发过程的任何领域,从编码到测试,我们都会时不时地犯一些错误。通常,这些错误都很小&#xf…

Linux kernel 堆溢出利用方法

前言 本文还是用一道例题来讲解几种内核堆利用方法,内核堆利用手段比较多,可能会分三期左右写。进行内核堆利用前,可以先了解一下内核堆的基本概念,当然更好去找一些详细的内核堆的基础知识。 概述 Linux kernel 将内存分为 页…