本示例使用设备: 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}/`);
});