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()
})
}