这种根据摄像头协议文档做做接口的,有操作过的吗?
协议文件截取了一部分,另外有一份httppost的脚本,
"use strict";
const express = require('express');
const http = require('http');
const https = require('https')
const bodyParser = require('body-parser');
const logger = require('morgan');
const path = require('path');
const fs = require('fs');
const iconv = require('iconv-lite');
const colors = require('colors');
const cors = require('cors');
const crypto = require('crypto')
const md5 = crypto.createHash('md5')
var app = express();
app.use(cors());
app.use(logger("dev"));
app.use(bodyParser.json({limit: 1024 * 1024 * 40}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({limit:1024*1024,extended: true}));
//app.use(bodyParser.urlencoded({extended: true}));
//update('')引号内的文字为相机密码
var passwd = md5.update('123abc').digest().toString('base64');
const options = {
key: fs.readFileSync('./server.pem'),
cert: fs.readFileSync('./cert.pem'),
requestCert:false,
rejectUnauthorized:false
};
var count = 0; //post请求计数
var port = 8888; //http端口
var sslport = 8889 //https端口
var send_flag = 0; //黑白名单下发控制标志位
var picType_full = 1;
var picType_closeup = 2;
var plate;
var date;
var ip;
var whitelistData = readTxt('whitelist.txt') //模式2黑白名单数据
var model4_add_whitelistData = readTxt('model4-addwhitelist.txt'); //模式4添加黑白名单数据
var model4_del2_whitelistData = readTxt('model4-del2whitelist.txt'); //模式4删除2条黑白名单数据
var model4_delall_whitelistData = readTxt('model4-delallwhitelist.txt'); //模式4删除全部黑白名单数据
function readTxt(filePath){
var fr = fs.readFileSync(filePath)
return fr;
}
function savePic(picObj,picType){
if (picObj){
picObj = picObj.replace(/ /g,"+");
picObj = new Buffer(picObj,'base64');
if (picType == 1){
fs.writeFile(ip+'\\'+date+"_"+plate+"_"+'full.jpg',picObj,function(err){
if (null != err){
console.log("全景图写入失败")
}else{
console.log("全景图写入成功")
}
});
}else if (picType == 2){
fs.writeFile(ip+'\\'+date+"_"+plate+"_"+'closeup.jpg',picObj,function(err){
if (null != err){
console.log("特写图写入失败")
}else{
console.log("特写图写入成功")
}
});
}
}
}
app.post("/ais", function (req, res, next) {
ip = req.connection.remoteAddress; //获取客户端ip
ip = ip.replace(/[^0-9]/ig, ' '); //将非数字替换为空格
ip = ip.replace(/\s/ig,''); //去掉全部空格
let conType = req.get("Content-type"); //获取post请求头中声明的请求体数据类型
let doc = req.body || {};
let t_type = doc.type;
let t_mode = doc.mode;
console.log(res);
var d = new Date();
date = (d.getFullYear()) + "" +
(d.getMonth() + 1) + "" +
(d.getDate()) + "" +
(d.getHours()) + "" +
(d.getMinutes()) + "" +
(d.getSeconds());
//检查目录是否存在,不存在则以客户端ip为目录名在当前根目录下创建子目录
if (fs.existsSync(ip+'\\')){
//console.log("目录已存在")
}
else {
fs.mkdir(".\\"+ip+"\\",function(err){
if (err){
console.log("创建目录失败");
}
else{
console.log("创建目录成功");
}
});
}
switch(conType)
{
//请求体数据类型为浏览器原生表单或json,bodyParser中间件自动调用对应方法解析
case ('application/x-www-form-urlencoded'): //对应模式2和5
if (t_type == 'HeartBeat' && typeof(t_mode) == 'undefined'){ //模式2和4的心跳应答
console.log("当前时间:"+date,'119');
if (send_flag == 0){
res.json({"status": 200, "PostServer": "OK",
"whitelist_opt_data":JSON.parse(iconv.decode(whitelistData,'gbk'))
})
send_flag = 1;
}
else if (send_flag == 1){
console.log('heart server proc');
res.json({"PostServer": "OK","passwd":passwd})
}
}
else if (t_type == 'heartbeat' && t_mode == '5'){ //模式5的心跳应答
console.log('heart server proc:mode 5');
if (send_flag == 0){
res.json({"error_num":0,"error_str":"no error","passwd":passwd,"whitelist_data":JSON.parse(iconv.decode(whitelistData,'gbk'))}) //下发黑白名单
console.log("心跳下发黑白名单")
send_flag = 1;
}
else if (send_flag == 1){
res.json({"error_num":0,"error_str":"no error","passwd":passwd,"triger_data":{"action":"on"}}) //应答软触发
console.log("心跳软触发")
send_flag = 2;
}
else if (send_flag == 2){
res.json({"error_num":0,"error_str":"no error","passwd":passwd})
}
}
else if (t_type == 'online' || t_type == 'offline' || t_type == 'ioinput'){ //IO事件上报
if (t_mode == 5){
plate = doc.plate_num;
}else{
plate = doc.car_plate;
}
let full_pic = doc.picture;
let closeup_pic = doc.closeup_pic;
let start_time = doc.start_time;
++count; //post请求计数
console.log("---------------------------------- 相机ip:"+ip+" 计数:"+count+" ----------------------------------");
//遍历输出key、value
for(var key in doc){
if (key.indexOf("pic")==-1){
if (key.indexOf("start_time")==0){
//cosole.log(key,date)
console.log("start_time:"+date)
}else{
console.log("%s:%s",key,doc[key])
}
}
}
savePic(full_pic,picType_full); //保存模式2或5的全景图
savePic(closeup_pic,picType_closeup); //保存模式2或5的特写图
if (t_mode == 5){ //模式5循环应答
if (1 == count % 4){
res.json({"error_num":0,"error_str":"no error","passwd":passwd,"gpio_data":
[{"ionum":"io1","action":"on"},{"ionum":"io2","action":"on"}]})
console.log("模式5应答开闸")
}else if (2 == count % 4){
res.json({"error_num":0,"error_str":"no error","passwd":passwd,"rs485_data":
[{"encodetype":"hex2string","data":"73646B2831292073656E64207273323332206461746120746F2063616D6572612E00"},{"encodetype":"base64","data":"5qyi6L+O5YWJ5Li0"}]})
console.log("模式5串口透传")
}else if (0 == count % 4){
res.json({"error_num":0,"error_str":"no error","passwd":passwd,"triger_data":{"action":"on"}})
console.log("模式5软触发")
}
else if (3 == count % 4){
res.json({"error_num":0,"error_str":"no error","passwd":passwd,"whitelist_data":
[{"Action":"add","PlateNumber":"粤B23456","Type":"W","Start":"2019/01/01 00:00:00","End":"2019/10/10 23:59:59"}]})
console.log("下发黑白名单")
}
}else{ //模式2循环应答
doc.park_id=parseInt(doc.park_id);
let sign = doc.park_id % 2; //摄像机id,约定奇数为进口,偶数为出口
if (t_type == 'online' && typeof(t_mode) == 'undefined'){
if (sign == 1) {
if (1 == count % 5){ //轮流发送应答指令
res.json({"status": 200, "speed": 1, "verified": true, "postfix": "欢迎光临," + doc.car_plate})
console.log("模式2入口反馈开闸")
}else if (2 == count % 5){
res.json({"ext": {"name": "test", "type": 0, "device":"IO1", "data": "ON"}})
console.log("模式2应答开闸")
}else if (3 == count % 5){
res.json({"ext": {"name": "test", "type": 0, "device":"IO2", "data": "ON"}})
}else if (4 == count % 5){
res.json({"code":100,"state":"open","msg":"条件符合,道闸开启"})
}else if (0 == count %5){
res.json({"ext": {"name": "test", "type": 0, "device": "RS485", "data": "JXU3Q0E0QjhXNTQldUZGMEMldTZCMjIldThGQ0UldTUxNDkldTRFMzQldUZGMDE="}})
console.log("模式2串口透传")
}
}else {
res.json({"status": 200, "totol_fee": 0.000000, "is_paid": true,"display": "一路顺风," + doc.car_plate})
console.log("模式2出口反馈开闸")
}
}
}
}
break;
}
//res.json({code: '0000123',data: doc, 'row': '326'})
res.send({code: '0000123',data: doc, 'row': '326'}) //获取不到数据
console.log(doc) //打印有数据
})
app.use(function (req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
app.use(function (err, req, res, next) {
//res.status(err.status || 500);
//res.json(err.message);
});
//启用http服务器在指定端口监听
var httpServer = http.createServer(app);
var httpsServer = https.createServer(options,app)
httpServer.listen(port, function () {
console.log('http服务器开始监听端口[%d]'.magenta, port);
});
httpsServer.listen(sslport,function(){
console.log('https服务器开始监听端口[%d]'.magenta,sslport);
});
代码中用res.send取出的DOC为空值,console打印有值的。哪位做过车牌识别摄像头的请联系,费用另外谈
需要:1 : 前端DIV中显示摄像头镜头
根据协议进行API调用即可,这个API还是比较清楚的。
Node.js实现车牌识别
看看这个呢
https://blog.csdn.net/qq_48930989/article/details/129476209
摄像头厂家都有配套的SDK,通过厂家SDK来调用api来进行识别
不知道你这个问题是否已经解决, 如果还没有解决的话:上一节,我们根据不同的url地址,对不同的请求,做出了不同的响应。但这些请求都是GET方式的请求,如果浏览器使用POST方式向服务器发送了一次请求,又该如何处理呢?
POST请求一般会提交数据给服务器,服务器在接收数据的时候也是分块接收的
var http = require('http')
// 1. 创建服务器,得到 Server 实例
var server = http.createServer()
// 2. 监听客户端的 request 请求事件,设置请求处理函数
server.on('request', function (req, res) {
// 假设 /add 是POST方式的请求
if (req.url === '/add') {
// 注册req的data事件,分块接收数据
let str = '';
req.on('data', (chunk) => {
str += chunk; // chunk 是块的意思,这里将分块接收到的数组拼接到str字符串中
});
// 注册req的end事件,当数据都接收到了,会触发end事件
req.on('end', () => {
// 这里处理用户提交的数据
console.log(str);
});
}
})
// 3. 绑定端口号,启动服务器
server.listen(3000, function () {
console.log('Server is running at port 3000.')
})
从你提供的图片和相关信息来看,api文档挺详细的啊,根据提供的SDK直接上手就可以了啊。你是遇到什么问题了吗,比如报了什么具体的错误什么的,描述清楚下。其次一般基于官方文档给定的示例程序,结合文档一般没有啥问题,如果你没看懂文档,那你再找找其他资料看看别人是怎么调用的:
Node.js实现车牌识别:https://blog.csdn.net/qq_48930989/article/details/129476209
没做过根据协议实现接口的,做过车牌识别。