본문 바로가기
지금, 개발하기/코딩관련

[onvif] 프로토콜에 없는 focus 기능 구현하기

by Seaco :) 2022. 3. 29.

https://github.com/futomi/node-onvif

node onfiv를 이용하여 PTZ(pan, tilt, zoom) 기능을 구현하였다. focus 기능도 구현해야하는데 불행히도 focus 기능은 지원하지 않았다. 그래서 외부API를 받아서 직접 focus 기능을 구현하였다.

먼저 카메라가 연결된 사이트로 들어가자. 
카메라 ip를 입력해주고( ex) http://10.50.0.154/index.html), id와 password를 입력하고 로그인한다.

Focus 조절은 설정-고급설정-초첨에 있다.  focus모드를 바꾼뒤 url이 어떻게 바뀌는지 보려고 한다. focus모드를 아무거나 변경하자.

그리고 F12를 눌러서 개발자모드를 켠다. Network에 들어가서 왼쪽메뉴의 방금보낸 요청을 클릭하면 Request Header에서 uri를 찾을 수 있다. 

 

uri를 살펴보면... 음.. 대충 afmode가 autoFocus 같다. 포커스 모드 바꿔가면서 uri 바뀐거 확인해보면 달라지는 변수 찾기가 좀 수월하다

포커스 조절을 한번 해보자. 음.. 요렇게 uri를 만들고 접속해보면

OK메세지를 받은 걸 볼 수 있다

그리고 정상적으로 수동에서 자동으로 바뀐 것도 확인할 수있다

 

프론트단에서 버튼을 focus 버튼을 클릭을 하면 백단의 '/focuseSetting'으로 들어오게 한다. callExternalAPI함수를 이용하여 focus요청을 보낸다. 이때 주의할 게 있는데 나는 auth를 설정해주는 줄 몰라서 그냥 보냈더니 401에러가 떳다. 인증문제가 있었던 것.. 인증 문제를 해결하려면 withCredentials, headers, auth를 추가 해줘야 했다.


be>externalAPI>index.js

const express = require('express');
const axios = require("axios")
const router = express.Router();

router.use(express.json());

//camera Option Setting
router.post('/focusSetting', function (req, res) {
  let body = req.body
  let url = `http://${body.host}/vb.htm?page=setptzbasic&afmode=${body.afMode}`
  let param = {}
  let auth ={
    auth:{
      username : 'admin',
      password : '123456'
    }
  }

  callExternalAPI(req, url, param, auth).then((response) => {
    console.log(123123132)
    console.log(response)
    console.log(123123132)
  })  
});

const callExternalAPI = async (request, url, param, auth) => {
  let response
  try {
    response = await axios.post(`${url}`, param, {
      withCredentials: true,
      headers: {
        "Accept": "application/json",
        "Content-Type": "application/json"
      },
      auth: {
      username: 'admin',
      password: '123456'
    }})
  }catch (e){
    console.log('error', e)
  }
  return response
}

module.exports = router;