wim15013442181 2023-06-09 19:52 采纳率: 36.4%
浏览 102
已结题

车牌识别摄像镜头,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中显示摄像头镜头

  • 写回答

6条回答 默认 最新

  • 夜郎king 2022博客之星IT其它领域TOP 12 2023-06-10 06:37
    关注
    获得2.10元问题酬金

    根据协议进行API调用即可,这个API还是比较清楚的。

    评论

报告相同问题?

问题事件

  • 系统已结题 6月17日
  • 创建了问题 6月9日