Contagem por Câmera

Para demonstrar como recuperar as câmeras e a contagem de pessoas, criamos um conveniente script para ser executado pelo NodeJS.

script.js
// importa a biblioteca de manipulação do sistema de arquivos
const fileSystem = require('fs')
// importa a biblioteca para requisições https
const https = require('https')

// algumas variáveis externas necessárias
// HOSTNAME do ambiente de produção
const hostname = 'api.cyberlabs.ai'
// credenciais que são cedidas pela cyberlabs
// explicado em Referências de Autorização
const clientId = '<your Client Id>'
const clientSecret = '<your Client Secret>'
// dados que são recuperados ao conseguir credenciais
// Conseguindo Credenciais
const token = '<your token>'
const customerId = '<your customer id>'
const username = '<your user>'

const secret = `${clientId}:${clientSecret}`
const authorization = Buffer.from(secret).toString('base64')

// executa o script para recuperar as cameras
// o primeiro argumento é o fator de agregação
// o segundo é o início do intervalo de tempo
// o terceiro é o término do intervalo
// '[1-60]', 'YYYY-MM-DD HH:MI:SS', 'YYYY-MM-DD HH:MI:SS')
run('1', '2020-01-20 08:00:00', '2020-01-20 10:00:00')

// função para recuperar os dados que precisamos
async function run (aggregation, startTime, endTime) {
  const START = microTime()
  // recupera as cameras
  const response = await get('cameras')
  if (!response.status) {
    throw new Error('Invalid cameras answer')
  }
  const all = []
  const cameras = response.data

  // percorre a lista de cameras
  for (let camera of cameras) {
    let cameraId = camera.id
    let cameraName = camera.name

    console.log('~> cameraId [start]: ', cameraId)

    const COUNTER_START = microTime()
    // recupera a contagem
    let counter = await get(
      'charts/people/counter',
      `camera=${cameraId}&customer=${customerId}&aggregation=${aggregation}&startTime=${startTime}&endTime=${endTime}`
    )

    const { chart } = counter
    if (!Array.isArray(chart)) {
      throw new Error('Invalid people counter answer')
    }

    // percorre a contagem agrupando os dados
    const map = (item) => {
      return {
        ...item,
        username,
        customerId,
        cameraId,
        cameraName
      }
    }
    all.push(...chart.map(map))

    const COUNTER_END = microTime()
    console.log('###### TIME', (COUNTER_END - COUNTER_START) / 1000, 'seconds')
    console.log('~> cameraId [finish]: ', cameraId, ' [', chart.length, ']')
  }
  // escreve um JSON com os dados recuperados
  fileSystem.writeFileSync('script.json', JSON.stringify(all))

  const END = microTime()
  console.log('## TIME', (END - START) / 1000, 'seconds')
}

// pega o momento atual em milisegundos
function microTime () {
  return new Date().getTime()
}

// função para executar os requests
function get (path, queryString = '') {
  return new Promise((resolve, reject) => {
    const options = {
      method: 'GET',
      hostname: hostname,
      port: 443,
      path: `/rest/api/v1/${path}?token=${token}&${encodeURI(queryString)}`,
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `insight ${authorization}`
      }
    }
    let answer = ''
    const request = https.request(options, function (response) {
      response.setEncoding('utf8')
      response.on('data', function (chunk) {
        answer += chunk
      })
      response.on('end', () => {
        resolve(JSON.parse(answer))
      })
      response.on('error', function (error) {
        reject(error)
      })
    })
    request.end()
  })
}

Last updated