Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conexão da camêra com o WebThings - Diário #2

Open
LucasFerrazBR opened this issue Nov 16, 2021 · 19 comments
Open

Conexão da camêra com o WebThings - Diário #2

LucasFerrazBR opened this issue Nov 16, 2021 · 19 comments

Comments

@LucasFerrazBR
Copy link
Collaborator

Aqui serão publicas as atualizações sobre a câmera.

@LucasFerrazBR
Copy link
Collaborator Author

Dia 02/11/2021

Me encontrei com o Daniel para pegar a câmera, permitindo que eu trabalhe para realizar a conexão dela com o WebThings.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Nov 16, 2021

Dia 03/11/2021

Após obter a câmera, segui para a instalação do gateway WebThingsIO para realizar a conexão entre os componentes.

O gateway WebThings necessita ser instalado em um computador que opera sobre um sistema operacional que é suportado por ele (a lista de sistemas disponíveis pode ser encontrada na página da Mozilla WebThings Gateway), o meu computador pessoal utiliza do sistema operacional Windows 10, que não faz parte dos sistemas suportados.

Para resolver este problema, decidi criar uma máquina virtual para simular um computador em outro sistema operacional.

O sistema operacional escolhido para a máquina virtual foi o Ubuntu, pois ele é suportado pelo gateway.

Para montar a máquina virtual, utilizei de um software que permite a criação de máquinas virtuais em ambientes Windows, o VMware Workstation 16 Pro.

Após a instalação do software, criei uma nova máquina utilizando a imagem do Ubuntu, que possui as seguintes especificações:
image

Depois de iniciar a máquina tentei realizar a instalação do gateway de imediato, porém, não obtive sucesso, pois o meu notebook não estava aguentando rodar a máquina virtual Ubuntu.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Nov 16, 2021

04/11/2021

Após uma tentativa frustrada no dia anterior, decidi mudar a minha máquina virtual para um computador com mais poder de processamento, realizando todo o processo de instalação da VMware Workstation e montagem da imagem Ubuntu novamente.

Desta vez, a máquina virtual estava funcionando sem travamentos, o que me possibilitou começar a instalação do gateway.

Após várias tentativas de instalar o gateway através do download do projeto do GitHub e instalação de sua imagem, cheguei a conclusão que a maneira mais fácil de instala-lo é através dos comandos via terminal do Ubuntu, estes comandos podem ser encontrados no arquivo README.md na página do projeto WenThingsIO no GitHub, seção gateway. Através deles, será possível instalar as dependências para o gateway para que ele seja instalado sem problemas (começar pela seção "Prerequisites for Building").

O início da instalação ("Download and Build Gateway"):
image

O gateway é uma aplicação Node.js. Durante a instalação do gateway, o Node.js acusou a falta de algumas bibliotecas em meu sistema, porém, consegui realizar a instalação delas facilmente através das sugestões de comandos para o terminal que o próprio Node disponibiliza.

Após fazer o download e instalação do gateway e Node.js, dei início a aplicação através do comando npm start dentro da pasta do gateway via terminal.
image

O primeiro passo que foi necessário ser realizado após iniciar o gateway pela primeira vez foi configurar algumas coisas através do link http://localhost:8080, que incluem nome de usuário, email, domínio e etc. O domínio escolhido para a aplicação foi: https://eachcompfisica.webthings.io

Depois de configurar, verifiquei que o gateway estava ativo e operante, através do link https://localhost:4443
image

Agora que a parte do gateway estava pronta, parti para as configurações da câmera. Primeiro tirei a câmera da caixa e verifiquei se ela dava sinais de vida, ao coloca-la na tomada, não havia encontrado nenhum sinal de que ela estava ligada. Após procurar e ler um pouco sobre, descobri que é possível reiniciar a câmera utilizando uma agulha (no caso, utilizei uma chave para abrir caixas de cartões SIM de celulares), pressionando-a no botão RESET da câmera por 15 segundos.
image
Acredito que este passo deve ser realizado sempre que a câmera precisar ser instalada em uma nova rede.

Quando a câmera é inserida na tomada, ela leva um tempo para inicializar (fica sem dar sinais de vida).

Após reiniciar a câmera, ela começou a fazer uns sons e a se mover sozinha, acreditei que já estava pronta para ser configurada.

Seguindo o manual da câmera, comecei a instalação a partir do aplicativo Yoosee, disponível no Google Play para aparelhos Android.

O aplicativo disponibiliza 3 tipos de instalação para câmeras, o primeiro é a instalação "Adicionar ponto de acesso", este tipo de instalação, infelizmente, não parece funcionar para o modelo de câmera escolhido para o projeto, pois ela precisaria ter um tipo de rede Wi-Fi própria, o que parece não ocorrer.

Existem dois outros tipos de instalação, a "Conexão com fio" e "Adição inteligente". A conexão com fio necessita inserir um cabo de rede na câmera, contudo, a câmera escolhida não suporta este tipo de conexão. Então, como estava buscando conecta-la na minha rede Wi-Fi, segui para a adição inteligente (como também sugere o manual):
image

A adição inteligente consiste em apontar a câmera para o seu dispositivo celular, que estará com um QR Code na tela, para que ela possa ler e se conectar. Esta etapa demorou cerca de 1 hora e meia para mim. Após inúmeras tentativas alinhando o QR Code da tela do celular com a câmera e procurando métodos alternativos no YouTube, quando estava prestes a desistir, a conexão foi feita.

Já é possível controla-la pela rede Wi-Fi local após concluir a instalação através do aplicativo:
image

Depois de instalar a câmera na rede e obter acesso via aplicativo. Parti para realizar a sua conexão via gateway, a princípio, tentei da maneira mais simples, que seria buscar componentes WebThings dentro da rede através do botão adicionar (+) do gateway:
image
Contudo, não obtive sucesso:
image

Como sugerido pelo gateway, pesquisei sobre extensões para dispositivos ONVIF.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Nov 16, 2021

05/11/2021

Encerrei o dia 04 pesquisando sobre extensões ONVIF para o gateway WebThingsIO e sobre o prórpio ONVIF. Encontrei a extensão onvif-adapter que pode ser instalada no gateway:
image

Logo após adicionar a extensão no gateway, foi necessário instalar a biblioteca de vídeo FFMPEG no sistema, a pedido da própria extensão, para que as suas funcionalidades de vídeo funcionem sem problemas. Após pesquisar sobre como realizar a instalação, encontrei o melhor tutorial no blog do Edivaldo Brito. Seguindo cada comando para terminal deixado por ele, consegui concluir a instalação do FFMPEG sem problemas.

Depois de instalar a extensão e o FFMPEG, tentei conectar a câmera ao WebThings utilizando a extensão, mas não obtive sucesso:
image

Tentei realizar a conexão através do endereço de IP dado pela câmera no aplicativo:
image

Muitas combinações de possíveis logins foram testadas, mas o erro foi sempre o mesmo:

2021-11-15 18:49:37.839 INFO   : Loading add-on: onvif-adapter
2021-11-15 18:49:38.111 INFO   : onvif-adapter: Opening database: /home/lucas/.webthings/config/db.sqlite3
2021-11-15 18:49:38.124 INFO   : onvif-adapter: Ignoring https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/schema.json because it has no messageType
2021-11-15 18:49:38.545 INFO   : onvif-adapter: Ignoring https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json because it has no messageType
2021-11-15 18:49:38.595 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.604 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.614 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.708 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.816 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.822 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.829 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.872 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.882 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.885 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.929 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.934 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:38.940 ERROR  : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-11-15 18:49:39.286 INFO   : onvif-adapter: Loading add-on onvif-adapter from /home/lucas/.webthings/addons/onvif-adapter
2021-11-15 18:49:46.471 INFO   : Checking for add-on updates...
2021-11-15 18:49:48.692 INFO   : Finished updating add-ons
2021-11-15 18:50:03.227 ERROR  : onvif-adapter: { Error: connect ECONNREFUSED 192.168.15.41:888
2021-11-15 18:50:03.228 ERROR  : onvif-adapter:     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
2021-11-15 18:50:03.228 ERROR  : onvif-adapter:   errno: 'ECONNREFUSED',
2021-11-15 18:50:03.228 ERROR  : onvif-adapter:   code: 'ECONNREFUSED',
2021-11-15 18:50:03.228 ERROR  : onvif-adapter:   syscall: 'connect',
2021-11-15 18:50:03.229 ERROR  : onvif-adapter:   address: '192.168.15.41',
2021-11-15 18:50:03.229 ERROR  : onvif-adapter:   port: 888 }
2021-11-15 18:50:03.229 ERROR  : onvif-adapter: { Error: connect ECONNREFUSED 192.168.15.41:888
2021-11-15 18:50:03.229 ERROR  : onvif-adapter:     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
2021-11-15 18:50:03.229 ERROR  : onvif-adapter:   errno: 'ECONNREFUSED',
2021-11-15 18:50:03.230 ERROR  : onvif-adapter:   code: 'ECONNREFUSED',
2021-11-15 18:50:03.230 ERROR  : onvif-adapter:   syscall: 'connect',
2021-11-15 18:50:03.230 ERROR  : onvif-adapter:   address: '192.168.15.41',
2021-11-15 18:50:03.230 ERROR  : onvif-adapter:   port: 888 }
2021-11-15 18:50:03.230 ERROR  : onvif-adapter: { Error: connect ECONNREFUSED 192.168.15.41:888
2021-11-15 18:50:03.230 ERROR  : onvif-adapter:     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
2021-11-15 18:50:03.231 ERROR  : onvif-adapter:   errno: 'ECONNREFUSED',
2021-11-15 18:50:03.231 ERROR  : onvif-adapter:   code: 'ECONNREFUSED',
2021-11-15 18:50:03.231 ERROR  : onvif-adapter:   syscall: 'connect',

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Nov 16, 2021

10/11/2021

Continuando as tentativas de login no gateway, procurei pelo padrão de login dos dispositivos ONVIF, encontrei que o padrão seria: login = admin e password = admin, contudo, não obtive sucesso novamente.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Nov 16, 2021

11/11/2021

Mais tentativas de login, mas o mesmo erro permanece, abri uma Issue na página do onvif-adapter com uma descrição bem simples do caso para ver se consigo entrar em contato com algum desenvolvedor ou usuário que já passou pelo mesmo problema.

@LucasFerrazBR
Copy link
Collaborator Author

15/11/2021

Criação do diário para a tarefa de conexão da câmera com o gateway.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Dec 7, 2021

06/12/2021

Seguindo as orientações do professor, tentei a solução proposta por um usuário deste fórum, que seria se conectar ao gateway (ou outra aplicação) através da porta 8999. Infelizmente, esta solução não resolveu o problema anterior, por isso, a descartei.

Para saber se a câmera realmente é um dispositivo ONVIF, pensei em tentar conecta-la a um software comum para a visualização de câmeras (utilizados em lojas, condomínios e etc.), que sirva para conexões ONVIF. Seguindo uma dica do professor, testei o software ONVIF Device Manager, este software é utilizado para testar conexões ONVIF (este software também pode ser utilizado como um visualizador comum), neste link é possível encontrar um breve tutorial.
Este software tem a funcionalidade de encontrar câmeras ONVIF automaticamente dentro da sua rede local. Tive uma boa surpresa ao ver a nossa câmera listada na lista de dispositivos. A minha dúvida acerca desta câmera ser realmente um dispositivo ONVIF foi sanada, por um momento.
image
A câmera esta listada como IPC_27182209, o mesmo número que pode ser encontrado nas configurações dela no aplicativo:
image

Conexões ONVIF necessitam de um login de usuário com senha (ao menos que a sua câmera possua uma configuração de acesso anônimo). Para fazer o login, utilizei o nome de usuário padrão das câmeras ONVIF: admin, e como senha, utilizei uma definida no aplicativo da câmera, no menu onde se habilita conexões via protocolo RTSP (Real Time Streaming Protocol):
image
image

Após logar no software, tive uma má surpresa ao descobrir que não é possível assistir o vídeo ao vivo da câmera (afirmação baseada nas minhas tentativas), tudo o que recebo é uma mensagem de NO SIGNAL:
image

Novamente tive a desconfiança de que a câmera não funcionava do jeito esperado. Contudo, estudando um pouco a falha de conexão com software ONVIF Device Manager, consegui descobrir como é feita a transmissão de dados da câmera, tudo acontece através do protocolo RTSP.
No Device Manager, encontrei o link de conexão com a câmera através do protocolo: rtsp://192.168.15.41:554/onvif1. É o mesmo IP citado nos registros dos dias anteriores (que também pode ser visto nos prints acima).
image
Sabendo que tudo é feito através de RTSP, procurei um software que opera como cliente para este protocolo, o que me fez chegar no Happytime RTSP & ONVIF Client / Server. O Happytime não é capaz de detectar automaticamente os dispositivos ONVIF (pelo menos não na versão que utilizei), contudo, utilizei das informações que obtive no Device Manager para fazer a conexão:
image
image
Consegui obter a transmissão de vídeo ao vivo, me surpreendendo novamente, provando que a câmera esta funcionando nos conformes:
image
Também descobri que é possível se conectar a câmera através do software VLC Media Player, utlizando uma URL do tipo: rtsp://admin:SENHA@IP/onvif1
image
image

Após isso, percebi que já tenho tudo o que é preciso para realizar a conexão definitiva com o gateway. Iniciei um novo dispositivo no add-on ONVIF utilizando as credenciais encontradas no ONVIF Device Manager:
image

Contudo, obtive mais um erro de conexão, desta vez, diferente do anterior:
2021-12-06 18:06:21.959 INFO : Loading add-on: onvif-adapter
2021-12-06 18:06:22.236 INFO : onvif-adapter: Opening database: /home/lucas/.webthings/config/db.sqlite3
2021-12-06 18:06:22.249 INFO : onvif-adapter: Ignoring https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/schema.json because it has no messageType
2021-12-06 18:06:22.680 INFO : onvif-adapter: Ignoring https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json because it has no messageType
2021-12-06 18:06:22.729 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:22.739 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:22.749 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:22.851 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:22.967 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:22.976 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:22.984 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:23.032 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:23.038 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:23.044 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:23.093 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:23.100 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:23.106 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-06 18:06:23.466 INFO : onvif-adapter: Loading add-on onvif-adapter from /home/lucas/.webthings/addons/onvif-adapter
image

Ainda não tenho ideia de como resolver isso, tentei adicionar o tipo Object no arquivo definitions.json mas não foi o suficiente. Abri um novo Issue na página do add-on no GitHub. Também percebi que alguém já passou por um problema um pouco similar, mas que não encontrou solução.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Jan 22, 2022

14/12/2021

Buscando entender melhor o problema "strict mode: missing type "object" for keyword "properties" at", encontrei que este é um problema comum não apenas no addon ONVIF, mas em outras aplicações que também foram desenvolvidas utilizando Node.js. Este erro é derivado da biblioteca Ajv JSON schema validator, é disparado quando alguma inconsistência é encontrada ao se tentar validar um arquivo JSON baseando-se no seu schema utilizando strict mode. O strict mode é utilizado quando se é esperado que o objeto JSON a ser lido tenha exatamente as propriedades do schema (uma comparação equivalente seria a leitura de um XML. Na estrutura XML, temos o arquivo XSD, que define o schema que um arquivo XML deve seguir, ao se receber um XML que não está nos padrões do XSD, um erro será disparado pois a estrutura padrão exigida pelo XSD foi quebrada).

A primeira solução que tentei foi alterar o schema JSON diretamente para incluir o type object nas keywords properties, seguindo este tutorial. O arquivo causador do erro é o definitions.json, ele pode ser encontrado no caminho ~gateway/node_modules/gateway-addon/schema/messages/definitions.json. O arquivo contém várias keyword properties, atribui o type object em algumas partes do arquivo. Ao ligar o gateway, percebi nos logs que os schemas haviam quebrado, não obtive sucesso nesta solução, acredito ter feito coisa errada ou que a solução do problema não é tão simples quanto parece. Para consertar o gateway, voltei o arquivo defitinios.json a versão original.
image

Uma outra solução que encontrei para o problema foi desativar o strict mode na inicialização do Ajv, encontrei esta solução pelo stackoverflow em diversos exemplos, mas deixarei apenas esta registrada. Buscando no código fonte do gateway, encontrei que a validação de schemas através do Ajv acontence no arquivo ipc.ts, que pode ser encontrado no caminho ~gateway/node_modules/gateway-addon/src/ipc.ts. Fiz como sugerido no stackoverlflow, adicionando o comando strictTuples:false na inicialização do Ajv:
image
Contudo, não obtive um resultado significante com essa alteração, meu gateway parou de funcionar me forçando a reinstala-lo.

@LucasFerrazBR
Copy link
Collaborator Author

19/12/2021

Voltando ao problema do strict mode, descobri que o problema não é exclusivo do add-on ONVIF, na verdade, é um problema que envolve todo o gateway. Encontrei um issue no GitHub do WebThings em que um usuário relata o problema e da exemplos de outros add-ons com o mesmo erro. Os desenvolvedores do gateway adicionaram o problema para a lista de bugs do gateway, entendo que ele será resolvido em atualizações futuras.

O nosso problema: WebThingsIO/onvif-adapter#29
Problema encontrado no Gateway WebThings: WebThingsIO/gateway#2887

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Jan 22, 2022

23/12/2021

Recebi uma sugestão do professor para testar o add-on ONVIF a partir de um aplicativo Android que transforma o celular em um dispositivo ONVIF, o IP Webcam. Realizei a instalação e inicializei o aplicativo, o seu funcionamento baseia-se na criação de um servidor HTTP para a transmissão da imagem da câmera do celular:
image
Visualização através do computador:
image

Contudo, ao tentar conectar ao gateway, sofri um erro de conexão:
2021-12-23 16:31:12.692 INFO : onvif-adapter: Loading add-on onvif-adapter from /home/lucas/.webthings/addons/onvif-adapter
2021-12-23 16:31:25.623 INFO : Opened a new things socket
2021-12-23 16:31:25.643 INFO : About to call startPairing on OnvifAdapter
2021-12-23 16:32:25.647 INFO : Pairing timeout
2021-12-23 16:32:42.139 INFO : Unloading OnvifAdapter
2021-12-23 16:32:42.141 INFO : Unloading plugin onvif-adapter
2021-12-23 16:32:45.144 INFO : Killing onvif-adapter plugin.
2021-12-23 16:32:45.695 INFO : Loading add-on: onvif-adapter
2021-12-23 16:32:45.973 INFO : onvif-adapter: Opening database: /home/lucas/.webthings/config/db.sqlite3
2021-12-23 16:32:45.987 INFO : onvif-adapter: Ignoring https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/schema.json because it has no messageType
2021-12-23 16:32:46.445 INFO : onvif-adapter: Ignoring https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json because it has no messageType
2021-12-23 16:32:46.496 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.511 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.522 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.621 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.731 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.746 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.752 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.798 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.807 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.822 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.870 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.878 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:46.884 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-23 16:32:47.277 INFO : onvif-adapter: Loading add-on onvif-adapter from /home/lucas/.webthings/addons/onvif-adapter
2021-12-23 16:32:48.327 INFO : onvif-adapter: Unhandled Rejection
ERRO NOVO____
2021-12-23 16:32:48.327 ERROR : onvif-adapter: TypeError: Cannot read property 'map' of undefined
2021-12-23 16:32:48.327 ERROR : onvif-adapter: at camera.core.getScopes.then (/home/lucas/.webthings/addons/onvif-adapter/lib/onvif-adapter.js:66:52)
2021-12-23 16:32:48.328 ERROR : onvif-adapter: at process._tickCallback (internal/process/next_tick.js:68:7)

O professor não recebeu este erro em seu teste.

@LucasFerrazBR
Copy link
Collaborator Author

27/12/2021

Através da troca de alguns e-mails com o professor nos últimos dias, verificando informações de log entre as nossas máquinas e algumas informações disponíveis na internet, comecei a desconfiar seriamente que há um problema na minha máquina virtual Ubuntu. Fiz a reinstalação do sistema algumas vezes e percebi que continuo tendo os mesmos erros.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Jan 22, 2022

28/12/2021

Desta vez decidi partir para a criação de uma nova máquina virtual, utilizando o sistema operacional Debian, que é suportado pelo gateway juntamente com o Ubuntu (a lista de sistemas suportados está nos relatos dos dias anteriores), o sistema pode ser baixado pelo site oficial do Debian.

Depois de várias tentativas demoradas, percebi que há algum problema de instalação do Debian na VMWare, não obtive sucesso na instalação.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Jan 22, 2022

29/12/2021

Consegui realizar a instalação do Debian seguindo a risca este tutorial disponível no YouTube.

Trocando o sistema operacional da máquina virtual para o Debian e instalando o gateway (também instalei o gateway com o Docker, mas não consegui realizar o login após finalizar a instalação, abri uma Issue no GitHub para ver se é um problema ou sou eu que estou fazendo errado mesmo). Desta vez, o meu gateway está se comportando melhor do que na máquina Ubuntu (com menos erros).

Com este gateway melhor, a câmera que nós compramos e a câmera Android são encontradas automaticamente pelo add-on. Primeiramente, tentei a conexão com a câmera Android que é criada pelo aplicativo (IP Webcam Pro) que o professor recomendou, consegui adicionar ela como Thing e ver os comandos de stream, snapshot e etc. Mas, não consegui visualizar o vídeo através do stream nem do snapshot.
image
Ao se inicializar o stream, o gateway não consegue transmitir o vídeo da câmera, deixando uma janela de vídeo vazia:
image
Para deixar registrado, este problema também ocorreu com o professor, ele abriu uma thread no forúm da Mozilla para discutir o problema .

Agora, sobre a câmera do projeto, o gateway foi capaz de detectar várias informações sobre ela, como nome, local de fabricação, IP e etc. Contudo, a conexão não funciona, como mencionei em um dos encontros da disciplina, há um Issue listado no GitHub de um usuário falando que a câmera dele não funciona, por conta de ser uma câmera chinesa genérica (que acredito ser o nosso caso também rs). No encontro, mencionei que o erro dele era diferente, mas, com o gateway funcionando melhor, descobri que o problema dele é o mesmo que o nosso, que esta registrado nesse Issue.
image

Aqui está o log com informações sobre a câmera que o gateway capturou:
2021-12-29 23:15:11.262 INFO : Loading add-on: onvif-adapter
2021-12-29 23:15:11.579 INFO : onvif-adapter: Opening database: /home/lucas/.webthings/config/db.sqlite3
2021-12-29 23:15:11.593 INFO : onvif-adapter: Ignoring https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/schema.json because it has no messageType
2021-12-29 23:15:12.056 INFO : onvif-adapter: Ignoring https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json because it has no messageType
2021-12-29 23:15:12.115 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.124 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.133 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.245 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.366 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.373 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.379 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.426 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.434 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.439 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.497 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.503 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
2021-12-29 23:15:12.509 ERROR : onvif-adapter: strict mode: missing type "object" for keyword "properties" at "https://raw.githubusercontent.com/WebThingsIO/gateway-addon-ipc-schema/master/messages/definitions.json#/allOf/1" (strictTypes)
Agora é possível ver algumas informações de fabricação_______________________________________
2021-12-29 23:15:12.905 INFO : onvif-adapter: Loading add-on onvif-adapter from /home/lucas/.webthings/addons/onvif-adapter
2021-12-29 23:15:16.265 INFO : onvif-adapter: { urn: 'urn:uuid:2419d68a-2dd2-21b2-a205-68B9D35669C0',
2021-12-29 23:15:16.265 INFO : onvif-adapter: name: 'IPC 27182209',
2021-12-29 23:15:16.265 INFO : onvif-adapter: address: '192.168.15.41',
2021-12-29 23:15:16.265 INFO : onvif-adapter: service: 'http://192.168.15.41:5000/onvif/device_service',
2021-12-29 23:15:16.265 INFO : onvif-adapter: hardware: '',
2021-12-29 23:15:16.266 INFO : onvif-adapter: location: 'China',
2021-12-29 23:15:16.266 INFO : onvif-adapter: types: [ 'tdn:NetworkVideoTransmitter' ],
2021-12-29 23:15:16.266 INFO : onvif-adapter: xaddrs: [ 'http://192.168.15.41:5000/onvif/device_service' ],
2021-12-29 23:15:16.267 INFO : onvif-adapter: scopes:
2021-12-29 23:15:16.268 INFO : onvif-adapter: [ 'onvif://www.onvif.org/type/NetworkVideoTransmitter',
2021-12-29 23:15:16.268 INFO : onvif-adapter: 'onvif://www.onvif.org/name/IPC_27182209',
2021-12-29 23:15:16.268 INFO : onvif-adapter: 'onvif://www.onvif.org/location/Country/China' ] }
2021-12-29 23:15:16.268 INFO : onvif-adapter: { urn: 'urn:uuid:97EAD713-33A1-463F-999F-16BEDE4F0A6E',
Camera Android________________________________________________________
2021-12-29 23:15:16.269 INFO : onvif-adapter: name: 'IP Webcam',
2021-12-29 23:15:16.269 INFO : onvif-adapter: address: '192.168.15.31',
2021-12-29 23:15:16.269 INFO : onvif-adapter: service: 'http://192.168.15.31:8888/onvif/device_service',
2021-12-29 23:15:16.269 INFO : onvif-adapter: hardware: 'BUILD_783',
2021-12-29 23:15:16.271 INFO : onvif-adapter: location: 'global',
2021-12-29 23:15:16.271 INFO : onvif-adapter: types: [ 'dn:NetworkVideoTransmitter' ],
2021-12-29 23:15:16.271 INFO : onvif-adapter: xaddrs: [ 'http://192.168.15.31:8888/onvif/device_service' ],
2021-12-29 23:15:16.271 INFO : onvif-adapter: scopes:
2021-12-29 23:15:16.272 INFO : onvif-adapter: [ 'onvif://www.onvif.org/name/IP_Webcam',
2021-12-29 23:15:16.272 INFO : onvif-adapter: 'onvif://www.onvif.org/type/video_encoder',
2021-12-29 23:15:16.272 INFO : onvif-adapter: 'onvif://www.onvif.org/type/audio_encoder',
2021-12-29 23:15:16.272 INFO : onvif-adapter: 'onvif://www.onvif.org/hardware/BUILD_783',
2021-12-29 23:15:16.272 INFO : onvif-adapter: 'onvif://www.onvif.org/location/global' ] }


2021-12-29 23:15:16.566 ERROR : onvif-adapter: { Error: socket hang up
2021-12-29 23:15:16.566 ERROR : onvif-adapter: at createHangUpError (_http_client.js:332:15)
2021-12-29 23:15:16.567 ERROR : onvif-adapter: at Socket.socketOnEnd (_http_client.js:435:23)
2021-12-29 23:15:16.567 ERROR : onvif-adapter: at Socket.emit (events.js:203:15)
2021-12-29 23:15:16.567 ERROR : onvif-adapter: at endReadableNT (_stream_readable.js:1145:12)
2021-12-29 23:15:16.568 ERROR : onvif-adapter: at process._tickCallback (internal/process/next_tick.js:63:19) code: 'ECONNRESET' }
2021-12-29 23:15:16.568 ERROR : onvif-adapter: { Error: socket hang up
2021-12-29 23:15:16.568 ERROR : onvif-adapter: at createHangUpError (_http_client.js:332:15)
2021-12-29 23:15:16.568 ERROR : onvif-adapter: at Socket.socketOnEnd (_http_client.js:435:23)
2021-12-29 23:15:16.568 ERROR : onvif-adapter: at Socket.emit (events.js:203:15)
2021-12-29 23:15:16.569 ERROR : onvif-adapter: at endReadableNT (_stream_readable.js:1145:12)
2021-12-29 23:15:16.569 ERROR : onvif-adapter: at process._tickCallback (internal/process/next_tick.js:63:19) code: 'ECONNRESET' }
2021-12-29 23:15:16.570 ERROR : onvif-adapter: { Error: socket hang up
2021-12-29 23:15:16.570 ERROR : onvif-adapter: at createHangUpError (_http_client.js:332:15)
2021-12-29 23:15:16.570 ERROR : onvif-adapter: at Socket.socketOnEnd (_http_client.js:435:23)
2021-12-29 23:15:16.570 ERROR : onvif-adapter: at Socket.emit (events.js:203:15)
2021-12-29 23:15:16.571 ERROR : onvif-adapter: at endReadableNT (_stream_readable.js:1145:12)
2021-12-29 23:15:16.571 ERROR : onvif-adapter: at process._tickCallback (internal/process/next_tick.js:63:19) code: 'ECONNRESET' }
2021-12-29 23:15:16.571 ERROR : onvif-adapter: Failed to initialize device at undefined: Error: socket hang up
Continuo trabalhando para ver se consigo me conectar sem esse erro.

Curiosamente, tentando conectar a câmera a um código Node.js (mesma linguagem do gateway), obtive o mesmo erro de socket hang up (a porta 554 que está na imagem é a porta que eu consigo me conectar via VLC e é a porta que aquele programa para testar ONVIF que o senhor me passou se conecta, curioso é que no gateway eu deixei a porta como 554, mas nos logs parece que ele está tentando se conectar na 5000, estou investigando):
image

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Jan 23, 2022

06/01/2022

Após discussões com o professor via e-mail sobre os problemas e limitações do add-on ONVIF. Buscamos entender mais o funcionamento do player de vídeo do gateway e conexão ONVIF, chegando a informações que o add-on utiliza do DASH para realizar a transmissão do vídeo para a interface do gateway, conectando-se a transmissão de vídeo através do FFmpeg.

Como o add-on já possui uma linha de conexão com o FFmpeg, chegamos a uma ideia de tentar criar um add-on para a transmissão de vídeo via protocolo RTSP. A câmera ONVIF também possui uma URL RTSP que possibilita assistir o vídeo ao vivo, o FFmpeg é capaz de se conectar a streams RTSP, a ideia então é trocar o código do add-on ONVIF para fazer uma conexão diretamente RTSP, pulando a parte do protocolo ONVIF. Através disso, conseguiríamos assistir o vídeo pelo gateway, contudo, não seria possível enviar comando ONVIF (mexer a posição da câmera).

Estou entendendo como funciona o processo de inicializar o ffmpeg via Node, ele usa esta biblioteca child_process que cria um novo processo no SO, é possível passar o nome do processo e os argumentos, basicamente, é como se estivessemos escrevendo o comando do terminal via código.
image
Fiz um HTML para tentar pegar o vídeo do servidor Node mas não obtive sucesso.

@LucasFerrazBR
Copy link
Collaborator Author

10/01/2022

Enquanto trabalho no add-on do RTSP, atualmente tentando adicionar ele no gateway (os tutoriais para a criação de add-ons não são tão bons, na minha opnião). Encontrei este Issue que abriram na página de addon-list, nesta página é possível requisitar addons para a equipe do WebThings. Parece que já haviam requisitado um Add-on RTSP antes. Uma grande coincidência é que o autor da thread queria um add-on RTSP para um projeto de campainha com câmera, assim como nós. O pessoal do gateway pediu para ele utilizar o add-on ONVIF no lugar.

Nesta thread é possível ver que o usuário flatsiedatsie conseguiu fazer um add-on para isso (ou parecido), perguntei se ele consegue disponibilizá-lo.

@LucasFerrazBR
Copy link
Collaborator Author

13/01/2022

Após conseguir criar um add-on e faze-lo rodar no gateway, gravei um pequeno vídeo para mostrar o avanço ao professor.

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Jan 23, 2022

Informações úteis:

  • A norma ONVIF não é tão exigente para que produtos possam obter o seu selo, ela possui defeitos. Os fabricantes, para lançar o produto, podem contornar ou preencher esses defeitos, gerando interpretações possíveis da norma, fazendo com que nem todos os produtos que são identificados como ONVIF tenham o mesmo funcionamento.

  • O professor fez uma documentação bem legal e informativa sobre o uso do FFmpeg e da criação de uma câmera Android, neste link.

  • O FFmpeg se conecta a URL de transmissão de vídeo, sendo capaz de transformar os seus bytes de dados em arquivos de vídeos de diferentes formatos. No caso do gateway, os arquivos de vídeos são transformados em chuncks temporários de stream de vídeo. Estes arquivos são indexados em um único vídeo através da configuração de um arquivo .mpd, para a leitura ser realizada pelo DASH.

  • O professor me passou informações incríveis sobre o funcionamento do gateway e do add-on ONVIF em geral, com elas, fui capaz de compreender o gateway como um sistema bem grande e integrado, uma visão que não tinha antes e que me trouxe a clareza de alguns problemas, irei deixar aqui o texto e um diagrama:

No nível físico, câmera, gateway, sistema de desenvolvimento e navegador para depuração ficam na mesma rede local. Neste rede trabalha o desenvolvedor e os usuário locais podem acessar o gateway através de navegador. Por fazerem parte de uma mesma rede local, a câmera pode ser acessada facilmente através do navegador ou através de outras ferramentas como ffplay, contornando o gateway.

Para acessar o gateway através da internet, é necessário "mapeá-lo" em um domínio existente. Mozilla Web of Things faz isso através de um servidor proxy. Acredito que este servidor proxy receba pacotes do gateway local através de uma conexão SSH. Provavelmente é um proxy reverso, e pressupõe que os pacotes enviados pelo gateway local sejam enviados/recebidos por uma porta específica (8080).
FisicoProcessosCompProtocolos

@LucasFerrazBR
Copy link
Collaborator Author

LucasFerrazBR commented Jan 24, 2022

18/01/2022. 19/01/2022, 20/01/2022

Durante esses dias tentei fazer o FFmpeg transformar o vídeo da câmera em vários formatos diferentes para que fossem lidos por uma página web. Os formatos que utilizei foram mp4, mpd e m3u8. Tentei descobrir se o código HTML5 padrão (ou com auxilio de JavaScript) consegue de alguma maneira ler esses arquivos. Tive muitos problemas com erros do Firefox sobre requisições CORS (um erro que é lançado quando uma página HTML página não tem permissão para ler arquivos do SO, podendo apenas ler arquivos vindo de um servidor HTTP).

Tentei vários tutoriais, alguns que são:
https://docs.microsoft.com/en-us/azure/media-services/previous/media-services-embed-mpeg-dash-in-html5
http://v1-6-2.shaka-player-demo.appspot.com/docs/tutorial-player.html

Além de tentativas próprias seguindo a documentação dos softwares utilizados.
Também tentei contornar o erro das requisições CORS criando servidores HTTP utilizando a biblioteca http-server do NPM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant