
Recentemente, foi decidido instalar uma barreira com controle via GSM em um prédio de apartamentos. Os motivos e a necessidade desta solução estão além do escopo do artigo, mas quero escrever sobre como, "de joelhos", fiz uma interface para controlar o módulo via Internet. E até um pouco com o blackjack, gerenciando a base de carros de um telefone celular e fotos dos momentos de entrada de uma câmera de rua. Talvez alguém queira apresentá-lo em casa.
Avisarei que o artigo não descreve uma solução pronta para uso imediato, mas uma prova de conceito.
Parte 1. Por que esse controlador
Antes de instalar o módulo GSM, foi realizada uma análise de mercado desses sistemas. Eu queria obter uma solução barata, confiável e comprovada. Bem, para que os "instaladores" tivessem os instaladores, eles tinham alguma experiência em trabalhar com ele, etc.
Os instaladores a escolher ofereceram o ESIM 110/120 para ~ 12000r com acesso à Internet ou o Doorhan GSM para ~ 6000r com controle ou configuração de SMS via cabo USB.
A opção "tornar seu dispositivo a partir do módulo arduino + gsm por US $ 3" não foi considerada, portanto a solução deve ser exatamente confiável e testada. Imagine que alguém não poderia ligar para casa? Então você terá todos os problemas.
Eu também não queria uma loteria com a compra de um dispositivo
na China em Ali , novamente para evitar problemas de confiabilidade. Embora os preços começam em 1500r.
A desvantagem do ESIM120, além do custo de x2, foi que a Internet GPRS foi usada para acessar a Internet. Para alguns, isso pode ser uma vantagem, mas, no nosso caso, traz o custo das comunicações móveis - você terá que pagar uma tarifa com a Internet. Agora, uma tarifa sem uma taxa mensal está conectada ao cartão SIM e, para evitar que o número seja bloqueado, planejo conectar algum tipo de assinatura paga da conta pessoal da operadora a cada 2-3 meses por 2-3 rublos por dia, durante um dia. Por exemplo, "clima", "piadas" ou o que mais há útil para a barreira)
Sobre o Doorhan GSM, eu sabia que, além de gerenciar via SMS (não muito interessante), ele se conecta via USB a um computador e, por meio de seu próprio software, permite gerenciar a base de números.
Parte 2. Controle de Encaminhamento
Como a unidade de controle da barreira foi planejada para ser instalada a 20 metros da sala onde está localizado o gravador de vídeo IP doméstico e o centro de comunicação do provedor de Internet local, foi decidido pegar o Doorhan e "construir" o USB através de um roteador como o TP-Link MR3020, no valor de 1200 rublos, OpenWRT e programas do projeto
USBIPAcabou sendo um pouco mais simples com o roteador - encontrei o antigo ASUS WL500gP nos compartimentos, o que não é muito adequado para a Internet pelos padrões atuais, mas tem 2 portas USB. Ele usou isso.
Para o usbip, tive que instalar a versão antiga do OpenWRT, 12 de setembro, porque esse módulo do kernel não funciona em novos. Não descreverei a conexão do roteador à rede. Se alguém não o tiver na rede local, há opções com encaminhamento de porta, UPNP ou configuração de uma VPN ao seu gosto.
Instale o kmod-usbip-server e verifique se você pode exportar de nós
root@OpenWrt:~
Precisamos de um dispositivo busid, 1-1.1, no qual nosso controlador GSM conectado esteja localizado. Olhando para o futuro, verificou-se que este é um conversor banal COM-> USB em um chip CH341
Realizamos:
root@OpenWrt:~
e em dmesg
usbip-host 1-1.1:1.0: usbip-host: register new device (bus 1 dev 57 ifn 0)
Em um computador com Windows, instale os drivers USBIP e execute
usbip -a 10.16.19.19 1-1.1
onde 10.16.19.19 endereço IP do nosso roteador com o OpenWRT. Obviamente, primeiro você precisa abrir o acesso do seu IP ao roteador no firewall ou conectar-se a partir da rede local ou de qualquer uma das 1000 outras opções de VPN para P2P.
Se tudo correu bem, o Windows declara com satisfação que um novo dispositivo USB-Serial Converter CH340 foi detectado, fornecemos um driver e uma porta COM aparece no sistema.
Agora podemos executar o programa a partir do kit com o controlador e gerenciar os números no banco de dados enquanto estamos sentados em casa no sofá

Parte 3. Controle de Entrada
Depois de configurar o trabalho com o controlador no meu computador doméstico e gravar os números de usuário, decidi aprofundar um pouco mais o que está disponível na porta COM.
Acontece que o módulo GSM do controlador envia periodicamente comandos AT com o nível de sinal para o console e também grava o número de telefone do qual a chamada é recebida ao fazer uma chamada. Não funcionou para gerenciar o módulo AT, aparentemente eles não são transmitidos do módulo controlador para o módulo modem.

É bem interessante de qualquer maneira. Enquanto desenvolvia a ideia com o controlador GSM, esperava que essas chamadas fossem gravadas nos detalhes da operadora. Mas, como nenhuma conexão ocorre, não há registros na pesquisa detalhada. Agora você pode diretamente do controlador para coletar os logs de quem abriu a barreira. Ou quem tentou fazer isso.
Para fazer isso, instale o kmod-usb-serial-ch341 no OpenWRT, desative a conversão USBIP com o comando usbip unbind -b 1-1.1 e insmod ch341.
Depois disso, diretamente no roteador, você pode conectar-se ao / dev / ttyUSB0 e observar o que acontece com as chamadas no controlador.
Para processar os dados, para iniciantes, escrevi um script simples que usava curl para enviar dados sobre uma chamada recebida para um servidor externo com PHP para processar e salvar no banco de dados. Você pode gravar no arquivo local com o mesmo sucesso, embora a memória no roteador não seja espessa.
No servidor, criei um banco de dados no mysql e algumas placas: com os números de telefone de nossos residentes e com o registro de chamadas. Tornou-se possível comparar quem abriu a barreira a que horas e se eles estão tentando usá-la a partir de números desconhecidos.
A segunda idéia que me veio à mente foi fazer uma ligação entre o evento de abertura da barreira e uma foto desse evento. O problema é que, como mencionei acima, em casa são câmeras AHD que gravam no gravador com acesso ao fluxo por IP. Além disso, uma das câmeras foi especialmente virada para a barreira, antecipando que eles a quebrariam.
Não consegui encontrar como remover o jpeg do nosso registrador chinês, embora em muitas câmeras haja um URL de visualização. Portanto, fui direto - no momento da chamada, recebo o RTSP e o faço JPG a partir dele.
ffmpeg -i "rtsp://2.3.4.5:554/user=user&password=password&channel=1&stream=0.sdp?" -y -f image2 -t 0.001 -ss 00:00:3 -s 1280*720 /tmp/screenshot.jpg
Com o mesmo sucesso, foi possível escrever pequenos clipes em mp4, mas achei isso supérfluo.
As fotos decidiram armazenar blobs no MySQL. A solução de desempenho é mais ou menos, mas "arrastar" o projeto será mais fácil, você não precisará copiar o banco de dados e os arquivos, tudo estará no banco de dados. E a carga sobre ele é essencialmente nenhuma.
Como resultado, o log de entrada é mais ou menos assim:

Parte 4. Carregando números do banco de dados SQL no site para o controlador
Se você leu com atenção, provavelmente notou que, para registrar entradas, a porta USB do roteador funcionava no modo de conversor Serial-USB e para trabalhar com a base de números dentro do controlador, tive que "empurrá-lo" através do USBIP para o meu computador doméstico e, no programa Windows, fazê-lo mudanças. Isso não é muito conveniente, você tinha que desatar / ligar e até mesmo executar o console usbip no seu computador doméstico. Bem, você só pode fazer isso em casa (bem, novamente, RDP / VPN, e assim por diante) e, especialmente, em um telefone celular. Foi duplamente acalorado que o banco de dados de números tivesse que ser mantido tanto no formato mdb (o programa para o controlador pode carregar dados no Access) quanto na versão web.
Uma pesquisa fluente do protocolo GSM Doorhan não funcionou. No entanto, não excluo que este seja algum tipo de dispositivo chinês da marca Doorhan. Portanto, ele se armou com um monitor (sniffer) para a porta COM e tomou vários despejos ao trabalhar no aplicativo original.

Tem algo como:
Comando
aa 02 09 00 00 03 e8 01 00 00 00 00 ee
Memória
aa 02 09 00 00 03 e8 01 00 00 00 00 ee
A resposta é que tudo correu bem
aa 20 00 ee
Equipe para gravar um número +79999999999
aa 03 10 00 01 2b 37 39 39 39 39 39 39 39 39 39 39 00 00 ee
A partir do qual ele tirou as seguintes conclusões:
início do envio do AA, fim do envio do EE
A resposta é que a equipe é aceita 20 00
O comando para começar a gravar o número 03. Depois vem o número de números no pacote. Pode ser de 1 a 5, ou seja, para um lote, você pode enviar vários números de uma só vez, finalizando o lote com o comando EE e obtendo uma confirmação por bloco.
Após o comando para iniciar a gravação, existem 2 bytes (o segundo é exato, o primeiro provavelmente será usado quando o número de números for superior a 256, mas não foi verificado), indicando o número de série do registro na célula. Ou seja, se você gravar na memória vazia, primeiro será 1, depois 2 e assim por diante. Em seguida, vem 14 bytes do número de telefone. Como nossos números são "incluídos" em 12 bytes (+79999999999), os últimos 2 bytes são ocupados por zeros. Provavelmente para todos os tipos de formatos internacionais, como +10. Isso não é exato, não me aprofundei profundamente, porque esses dados foram suficientes.
O envio pelo byte EE termina.
Com o número de série da célula, a situação não está totalmente clara. Digamos que 10 números sejam gravados no controlador, a memória não foi apagada. Se você enviar o comando "escreva o número na célula 5", o número nesta célula após a subtração de controle não será alterado, mas o controlador registrará 11 números e o 11º ficará vazio. E se você der o comando "escreva o número na célula 11", ele será gravado nele. Provavelmente, isso se deve aos comandos ADD e REPLACE (adicionar e alterar), que podem ser enviados via SMS. Porém, como o aplicativo original completa apenas o apagamento e a reescrita subsequente da lista, a hipótese não pode ser verificada. Portanto, ele também fez sua versão enviando um comando de apagamento e gravação sequencial para um número (para simplificar).
Portanto, passamos a escrever comandos para gerenciar a lista de assinantes do controlador através da porta serial. Mas a porta está no roteador e o banco de dados com usuários em um servidor externo. Obviamente, você pode transferi-lo para um roteador (você obtém uma solução completa "pronta para uso"), mas fiquei com preguiça. Eu fui para o outro lado - joguei / dev / ttyUSB0 no tcp usando o pacote ser2net, que está no pacote openwrt.
O config /etc/ser2net.conf é simples para indecentes
3333:raw:0:/dev/ttyUSB0:9600,remctl
Após iniciar o ser2net, você pode conectar-se ao roteador telnet na porta 3333 e verificar o resultado.
Quero fazer uma reserva: após reiniciar o roteador, cat / dev / ttyUSB0 não funcionou repentinamente. É claro que funcionou, mas escrevi lixo para o console. Lembrei-me de que durante os experimentos no roteador eu executei o minicom, o que provavelmente fez a inicialização da porta. Apenas definir o modo 9600 8n1 não funcionou, então verifiquei com stty quais configurações de porta estão no estado “trabalhando” e entrei na inicialização em rc.local
stty -F /dev/ttyUSB0 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
Certamente algo supérfluo, os leitores possivelmente corrigirão. Bem, se você especificar os parâmetros da porta no ser2net.conf, não poderá colocar o pacote stty no roteador.
Como resultado dessas manipulações no servidor com a interface WEB, o console do controlador ficou disponível para nós. Portanto, reescreveremos levemente o código de processamento de chamadas. Eu escrevi em PHP. É uma pena mostrar todo o código (não sou um programador no final, usei as inserções do tutorial), então o ponto é:
$re = '/CLIP: ".(7\d{10})"/m';
Acho que todo mundo implementa a chamada process_call como ele gosta, desde gravar informações em um arquivo de log, criar uma entrada de foto / vídeo e enviá-la através de um bot do Telegram para o telefone de sua esposa, bem como uma equipe para uma cafeteira ou para aquecer o borsch.
Vou me debruçar sobre os sync_phones com mais detalhes, porque implementa o algoritmo "não público" do controlador GSM Doorhan. E sim, carinha, usei mysql em vez de pdo ou mysqli.
function sync_phones($f) { $result=mysql_query("SELECT * FROM config WHERE name='update' AND val=1"); if (mysql_num_rows($result)==0) return; $init = pack('H*','aa1100ee');
Parte 5. Conclusão
Como resultado, recebi (escrevi) uma interface WEB para a barreira, onde posso acessar um navegador móvel, adicionar / remover / alterar os números dos moradores da casa, fazer anotações com referência ao apartamento, nome, número de telefone e número do carro. Há fotos de um carro, um registro de entradas através da barreira com uma foto. No futuro, de acordo com os registros, vou ver quem cria a maior carga na barreira - ele pagará pelo reparo :)
Bem, o bônus era um ponto WIFI no estacionamento perto da casa.
O preço de emissão é de 0 rublos e o dia de folga no computador.