车牌识别摄像镜头,httppost,nodejs

这种根据摄像头协议文档做做接口的,有操作过的吗?

img


img


img

协议文件截取了一部分,另外有一份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来进行识别

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: nodejs基本应用中的 处理浏览器POST方式提交的数据 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    上一节,我们根据不同的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

没做过根据协议实现接口的,做过车牌识别。