Ao aceitar, você acessará um serviço fornecido por terceiros externos a https://userful.com/

Tamanho da fonte: &mais; -

Como o Userful ajuda as organizações a integrar câmeras térmicas | Parte 2

Na parte 1 deste blog, descrevemos como as câmeras térmicas e outras novas tecnologias se tornarão uma segunda natureza no mundo pós-COVID. Nesta parte, mostraremos um exemplo de configuração.

Usamos um servidor de gerenciamento de vídeo (VMS) com uma plataforma de software que se integra a câmeras de centenas de diferentes fornecedores - incluindo câmeras que suportam análises na câmera e / ou imagens térmicas. Os usuários podem configurar eventos na plataforma VMS ou no mecanismo de regras de uma câmera inteligente. Esses eventos podem ser gatilhos de distância do objeto (ou seja, detecção de objetos a uma distância menor que 1.5 metro entre eles), gatilhos de contagem de objetos (ou seja, detecção de um certo número de visitantes em um local) ou gatilhos de temperatura (ou seja, detecção de objetos com temperatura acima de 38 graus centígrados).

Qualquer um desses eventos pode acionar uma chamada HTTP para a API Userful, permitindo que o Userful Server altere automaticamente o conteúdo em um video wall, em uma exibição individual ou em um grupo de exibições. Quão simples é implantar? São necessários apenas três etapas:

  1. Configure os eventos no mecanismo de análise embutido da câmera ou na plataforma VMS baseada em software.
  2. Configure um ouvinte HTTP; para monitorar chamadas HTTP recebidas provenientes de sensores externos.
  3. Configure um comutador de origem; um conjunto de instruções de software para a API Userful sobre o conteúdo a ser exibido nas diferentes telas com base no acionador externo. Podem ser avisos de texto, um vídeo de instruções, feeds de câmera ao vivo, um slide do powerpoint ou qualquer outro tipo de conteúdo que o cliente decida exibir.

O resultado final (usando Python) contém 26 linhas de código no aplicativo principal:

if __name__ == '__main__': # Ligue o soquete à porta sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) server_address = ('192.168.1.100', 8081) print ('iniciando na% s porta% s '% server_address) sock.bind (server_address) # Escute as conexões recebidas sock.listen (1) enquanto True: # Aguarde uma conexão proveniente da conexão de impressão externa do sensor (' aguardando uma conexão '), client_address = sock.accept () try: print ('connection from', client_address) # Receba os dados em pequenos blocos e leia-os enquanto True: data = connection.recv (512) if data: # extraia os dados provenientes da chamada HTTP da câmera. camera = extract (data) # faça logon no Userful Server para recuperar o cookie de sessão session_header = login () # determine o que está sendo reproduzido atualmente nos displays current_source = is_playing (session_header, 'Shop-Floor') # alterne o conteúdo dos displays para uma configuração prévia source (neste exemplo, uma mensagem de aviso em HTML switch_source (session_header, 'shop-Floor', 'HTML Warning') # aguarde 5 segundos time.sleep (5) # volte para o conteúdo que estava reproduzindo originalmente switch_source (session_header, 'Shop-Floor', current_source) #delete_source (session_header, 'PIP_Dynamic') time.sleep (5) break else: print (sys.stderr, 'não há mais dados de', customer_address) break finalmente: # Limpe a conexão de conexão .Fechar()
 

Então, vamos percorrer este projeto passo a passo.

Etapa 1: configurando eventos na câmeraera ou VMS

Neste exemplo, usamos o mecanismo de análise integrado de nossa plataforma VMS de terceiros que recebe e grava os feeds de várias câmeras. Os administradores podem configurar diferentes eventos dentro do mecanismo de regras da câmera ... Esse pode ser um gatilho de movimento ou analítico, pelo qual o software VMS analisa os feeds de vídeo recebidos e detecta eventos para cada câmera, por exemplo:

  1. Uma pessoa que entra em uma área específica da janela gravada.
  2. Uma pessoa que cruza uma linha virtual de A -> B (contador de visitantes)
  3. Uma pessoa que cruza uma linha virtual de B -> A (contador de visitantes)
  4. Uma pessoa com temperatura corporal elevada (> 38 graus)

Cada evento tem um plano de ação; por exemplo, um PEDIDO HTTP para nosso ouvinte da Web em 192.168.1.100:8081 com conteúdo de mensagem como o nome da câmera e a qualificação do evento. Um exemplo de regra de evento é mostrado na figura abaixo.

Etapa 2: o ouvinte HTTP

Um servidor da Web HTTP é um processo simples que está sendo executado em sua máquina e faz exatamente duas coisas:

  1. Escuta solicitações HTTP recebidas em um endereço de soquete TCP específico (endereço IP e um número de porta)
  2. Lida com essa solicitação e age quando uma mensagem é recebida no endereço do soquete.

Neste exemplo; nosso ouvinte está ouvindo a porta 8081 em sua interface Ethernet externa no endereço IP 192.168.1.100. Se conexões de entrada forem detectadas, os dados recebidos na mensagem HTTP serão coletados e processados ​​sob uma rotina <call to action>. Esta é a rotina que instrui o servidor Userful o que fazer.Digite seu texto aqui ...


# Ligue o soquete à porta sock de importação de porta = socket.socket (socket.AF_INET, socket.SOCK_STREAM) server_address = ('192.168.1.100', 8081) print ('iniciando na% s porta% s'% server_address) sock .bind (server_address) # Escute as conexões de entrada sock.listen (1) enquanto True: # Aguarde uma conexão proveniente de uma conexão de impressão de sensor externo ('aguardando uma conexão'), client_address = sock.accept () try: print ('connection from', client_address) # Receba os dados em pequenos blocos e leia-os enquanto True: data = connection.recv (512) if data: <CALL TO ACTION> else: print (sys.stderr, 'não há mais dados de ', client_address) break finalmente: # Limpe a conexão connection.close ()
 

Antes de mudarmos nossa fonte nas telas, verificamos qual fonte está sendo reproduzida atualmente em uma zona (ou seja, grupo de telas). Dessa forma, podemos retornar ao conteúdo original após a passagem de um evento. O código abaixo detectará o nome da fonte atualmente em reprodução (por exemplo, nome do jogador de sinalização ou outro). Ao chamar essa função, repassamos nosso cookie de autenticação e nome da zona.

def is_playing (session_header, zone): get_url = api_url_base + '/ api / areas / byname /' + resposta da zona = orders.get (url = get_url, headers = session_header) if response.status_code == 200: data = response.content dict = json.loads (data) sourceID = dict ['playingSourceId'] sourceName = get_source_info (session_header, sourceID) print (sourceName, 'is playing') else: print (response.status_code) retorna sourceName def get_source_info (session_header, sourceID) : get_url = api_url_base + '/ api / sources /' + sourceID response = orders.get (url = get_url, headers = session_header) if response.status_code == 200: data = response.content dict = json.loads (data) : print (response.status_code) return dict ['sourceName'] 

Agora que determinamos o nome da fonte atualmente sendo reproduzida, podemos alterar a fonte dessa zona:

def switch_source (session_header, zone_name, source_name): post_url = api_url_base + '/ api / areas / byname /' + zone_name + '/ switch? destinationSourceName =' + source_name response = request.ur (url = post_url, headers = session_header) valor = Falso se response.status_code == 200: data = response.content value = json.loads (data) ["isPlaying"] print ('Source Switched') else: print (response.status_code) retorna valor 

E é isso ... A <CHAMADA PARA AÇÃO> no nosso ouvinte HTTP se torna: (1) recupera o cookie AUTH para o Userful Server, (2) detecta a fonte atual que está sendo reproduzida em uma zona específica, (3) muda o conteúdo dos monitores para um 'aviso HTML 'mensagem armazenada no servidor local (4) Pausa por algum tempo, (5) Volte para a fonte original.

# faça login no Userful Server para recuperar o cookie de autenticação session_header = login () # determine o que está sendo reproduzido atualmente nos monitores source = is_playing (session_header, 'Zone-3') # alterne o conteúdo dos monitores para uma fonte pré-configurada (neste exemplo, um Mensagem de aviso em HTML switch_source (session_header, 'Zone-3', 'HTML Warning') # aguarde 5 segundos time.sleep (5) # volte para o conteúdo que estava reproduzindo originalmente switch_source (session_header, 'Zone-3', source ) #delete_source (session_header, 'PIP_Dynamic') time.sleep (5) break 

Podemos expandir esse script observando realmente os dados que foram recebidos na chamada HTTP provenientes da câmera ou da plataforma VMS. Esses dados podem conter informações sobre a câmera e / ou a fonte de disparo e essas informações podem ser usadas para exibir diferentes tipos de conteúdo. Pense em feeds da câmera ao vivo ou - se a câmera estiver contando pessoas - exibindo quantos clientes estão na loja e quantos clientes adicionais podem entrar na loja.

Com a simplicidade da API REST, os clientes e os integradores de sistemas podem implantar soluções simples em alguns recursos tecnicamente impressionantes. Não há necessidade de soluções pontuais de diferentes fornecedores. Apenas um pouco de imaginação combinada com habilidades limitadas de codificação pode levá-lo longe. Espero que tenhamos despertado seu interesse e estamos ansiosos para participar de mais trocas de idéias e exemplos.


Robert Huijsmans

Vice-Presidente de Engenharia de Soluções

Userful Corporation, INC.

Como o Userful ajuda as organizações a integrar ...