Modificación del módulo de barrera GSM Doorhan para control de Internet



Recientemente, se decidió instalar una barrera con control a través de GSM en un edificio de apartamentos. Las razones y la necesidad de esta solución están más allá del alcance del artículo, pero quiero escribir sobre cómo, "de rodillas", hice una interfaz para controlar el módulo a través de Internet. E incluso un poco con blackjack, manejando la base de autos desde un teléfono móvil y fotos de momentos de entrada desde una cámara de calle. Tal vez alguien quiera presentarlo en casa.

Le advertiré que el artículo no describe una solución lista para usar, sino una prueba de concepto.

Parte 1. Por qué tal controlador


Antes de instalar el módulo GSM, se realizó una revisión de mercado de dichos sistemas. Quería obtener una solución económica, confiable y probada. Bueno, para que los "instaladores" tuvieran los instaladores, tenían algo de experiencia trabajando con él, etc.

Los instaladores para elegir ofrecían ESIM 110/120 para ~ 12000r con acceso a Internet, o Doorhan GSM para ~ 6000r con control SMS o configuración a través de un cable USB.

No se consideró la opción de "crear su dispositivo desde el módulo arduino + gsm por $ 3", por lo que la solución debe ser exactamente confiable y probada. ¿Imagina que alguien no puede llamar a casa? Entonces obtendrás todos los problemas.

Tampoco quería una lotería con la compra de un dispositivo en China en Ali , nuevamente para evitar problemas de confiabilidad. Aunque los precios comienzan en 1500r.

La desventaja de ESIM120, además del costo de x2, fue que se utilizó Internet GPRS para acceder a Internet. Para algunos, esto puede ser una ventaja, pero en nuestro caso conlleva el costo de las comunicaciones móviles: tendrá que pagar una tarifa con Internet. Ahora, una tarifa sin una tarifa mensual está conectada a la tarjeta SIM, y para evitar que se bloquee el número, planeo conectar algún tipo de suscripción paga desde el área personal del operador cada 2-3 meses por 2-3 rublos por día, durante un día. Por ejemplo, "clima", "bromas" o qué más hay útil para la barrera)

Sobre Doorhan GSM, sabía que además de administrar por SMS (no muy interesante), se conecta por USB a una computadora y a través de su propio software le permite administrar la base de números.

Parte 2. Control de reenvío


Como se planeó instalar la unidad de control de barrera a 20 metros de la sala donde se encuentran la grabadora de video IP doméstica y el centro de comunicación del proveedor local de Internet, se decidió tomar Doorhan y "construir" USB a través de un enrutador como TP-Link MR3020 por valor de 1200 rublos, OpenWRT y programas del proyecto USBIP

Resultó ser incluso un poco más simple con el enrutador: encontré el viejo ASUS WL500gP en los contenedores, que no es muy adecuado para Internet según los estándares actuales, pero tiene 2 puertos USB. El lo usó.

Para usbip, tuve que instalar la versión anterior de OpenWRT, el 12 de septiembre, porque este módulo del kernel no funciona en las nuevas. No describiré la conexión del enrutador a la red. Si alguien no lo tiene en la red local, hay opciones con reenvío de puertos, UPNP o configurar una VPN a su gusto.

Instale kmod-usbip-server y verifique que puede exportar desde nosotros

root@OpenWrt:~# opkg install kmod-usbip-server root@OpenWrt:~# usbip list -l Local USB devices ================= - busid 1-1 (0424:2502) 1-1:1.0 -> hub - busid 1-1.1 (1a86:7523) 1-1.1:1.0 -> ch341 

Necesitamos un dispositivo busid, 1-1.1 en el que se encuentra nuestro controlador GSM conectado. Mirando hacia el futuro, resultó que este es un convertidor banal COM-> USB en un chip CH341

Realizamos:

 root@OpenWrt:~#usbipd -D root@OpenWrt:~#usbip bind -b 1-1.1 bind device on busid 1-1.1: complete 

y en dmesg

  usbip-host 1-1.1:1.0: usbip-host: register new device (bus 1 dev 57 ifn 0) 

En una computadora con Windows, instale los controladores USBIP y ejecute

 usbip -a 10.16.19.19 1-1.1 

donde 10.16.19.19 dirección IP de nuestro enrutador con OpenWRT. Por supuesto, primero debe abrir el acceso desde su IP al enrutador en el firewall, o conectarse desde la red local, o cualquiera de las otras 1000 opciones de VPN a P2P.

Si todo salió bien, Windows felizmente declara que se ha detectado un nuevo dispositivo convertidor de USB a serie CH340, le damos un controlador y aparece un puerto COM en el sistema.

Ahora podemos ejecutar el programa desde el kit con el controlador y administrar los números en la base de datos mientras estamos sentados en casa en el sofá



Parte 3. Control de entrada


Después de configurar el trabajo con el controlador en la computadora de mi casa y registrar los números de usuario, decidí profundizar un poco más con lo que está disponible en el puerto COM.

Resulta que el módulo GSM del controlador envía periódicamente comandos AT con el nivel de señal a la consola, y también escribe el número de teléfono desde el que se recibe la llamada al hacer una llamada. No funcionó para administrar el módulo AT, aparentemente no se transmiten desde el módulo controlador al módulo módem.



Es bastante interesante de todos modos. Mientras resolvía la idea con el controlador GSM, esperaba que estas llamadas se registraran en los detalles del operador. Pero como no se produce ninguna conexión, no hay registros en el desglose. Ahora puede directamente desde el controlador para recopilar los registros del que abrió la barrera. O quién intentó hacer esto.

Para hacer esto, instale kmod-usb-serial-ch341 en OpenWRT, apague la traducción USBIP con el comando usbip unbind -b 1-1.1 y haga insmod ch341.

Después de eso, directamente en el enrutador, puede conectarse a / dev / ttyUSB0 y ver qué sucede con las llamadas en el controlador.

Para procesar los datos, para empezar, escribí un script simple que usaba curl para enviar datos sobre una llamada entrante a un servidor externo con PHP para procesar y guardar en la base de datos. Puede escribir en el archivo local con el mismo éxito, aunque la memoria en el enrutador no es gruesa.

 #!/bin/sh cat /dev/ttyUSB0 | while read DATA; do if echo $DATA | grep -q CLIP ; then curl --silent --output /dev/null --data "data=$DATA" http://1.2.3.4:8081/border.php fi done 

En el servidor, creé una base de datos en mysql y un par de placas: con los números de teléfono de nuestros residentes y con el registro de llamadas. Se hizo posible comparar quién abrió la barrera a qué hora y si están tratando de usarla a partir de números desconocidos.

La segunda idea que se me ocurrió fue establecer un vínculo entre el evento de abrir la barrera y una foto de este evento. La cuestión es que, como mencioné anteriormente, en la casa hay cámaras AHD que escriben en la grabadora con acceso a la transmisión a través de IP. Además, una de las cámaras estaba especialmente puesta en la barrera, anticipando que la romperían.

No pude encontrar cómo eliminar jpeg de nuestro registrador chino, aunque en muchas cámaras hay una URL de vista previa. Por lo tanto, fui de frente: en el momento de la llamada recibo RTSP y lo convierto en JPG.

 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 

Con el mismo éxito, fue posible escribir pequeños clips en mp4, pero esto me pareció superfluo.
Las fotos decidieron almacenar blobs en MySQL. La solución de rendimiento es regular, pero "arrastrar" el proyecto será más fácil, no necesita copiar la base de datos y los archivos, todo está en la base de datos. Y la carga sobre él es esencialmente ninguna.

Como resultado, el registro de entrada se ve así:



Parte 4. Carga de números de la base de datos SQL en el sitio al controlador


Si leyó con cuidado, probablemente notó que para registrar entradas, el puerto USB del enrutador funcionaba en el modo de convertidor de serie a USB, y para trabajar con la base de números dentro del controlador, tenía que "empujarlo" a través de USBIP a la computadora de mi casa y allí, a través del programa de Windows, hacerlo cambios Esto no es muy conveniente, tenía que desenlazar / vincular e incluso ejecutar la consola usbip en la computadora de su hogar. Bueno, solo puedes hacer esto desde casa (bueno, de nuevo, RDP / VPN, y así sucesivamente), y especialmente no desde un teléfono móvil. Fue doblemente calentado que la base de datos de números tenía que mantenerse tanto en formato mdb (el programa para el controlador puede cargar datos en Access) como en la versión web.

Un google fluido del protocolo GSM de Doorhan no funcionó. Sin embargo, no excluyo que este sea algún tipo de dispositivo chino bajo la marca de Doorhan. Por lo tanto, se armó con un monitor (sniffer) para el puerto COM y realizó varios volcados al trabajar desde la aplicación original.



Tengo algo como:
Comando de aa 02 09 00 00 03 e8 01 00 00 00 00 ee memoria aa 02 09 00 00 03 e8 01 00 00 00 00 ee
La respuesta es que todo salió bien aa 20 00 ee
Equipo para registrar un número +79999999999
aa 03 10 00 01 2b 37 39 39 39 39 39 39 39 39 39 39 00 00 ee

De donde sacó las siguientes conclusiones:
comienzo de enviar AA, fin de enviar EE
La respuesta es que el equipo es aceptado 20 00
El comando para comenzar a registrar el número 03. Luego viene el número de números en el paquete. Puede ser del 1 al 5, es decir, para un paquete, puede enviar varios números a la vez, terminar el paquete con el comando EE y obtener una confirmación por bloque.

Después del comando para comenzar a grabar, hay 2 bytes (el segundo es exacto, el primero probablemente se usará cuando el número de números sea superior a 256 pero no se verificó), lo que indica el número de serie del registro en la celda. Es decir, si escribe en la memoria vacía, primero es 1, luego 2, y así sucesivamente. Luego viene 14 bytes del número de teléfono. Como nuestros números están "incluidos" en 12 bytes (+79999999999), los últimos 2 bytes están ocupados por ceros. Probablemente para todo tipo de formatos internacionales como +10. Esto no es exacto, no profundicé profundamente, porque estos datos fueron suficientes.

El envío por byte EE finaliza.

Con el número de serie de la celda, la situación no está del todo clara. Digamos que se escriben 10 números en el controlador, la memoria no se borró. Si envía el comando "escriba el número en la celda 5", el número en esta celda después de la resta de control no cambiará, pero el controlador registrará 11 números y el 11 estará vacío. Y si le da el comando "escriba el número en la celda 11", se le escribirá. Esto probablemente se deba a los comandos AGREGAR y REEMPLAZAR (agregar y cambiar), que pueden enviarse por SMS. Pero dado que la aplicación original solo completa el borrado y la posterior reescritura de la lista, la hipótesis no se puede verificar. Por lo tanto, también hizo su versión enviando un comando de escritura secuencial a un número (por simplicidad).

Entonces, hemos llegado a escribir comandos para administrar la lista de suscriptores al controlador a través del puerto serie. Pero el puerto está en el enrutador y la base de datos con usuarios en un servidor externo. Por supuesto, puedes transferirlo a un enrutador (obtienes una solución completa "lista para usar"), pero yo era demasiado vago. Fui al otro lado: lancé / dev / ttyUSB0 en tcp usando el paquete ser2net, que está en el paquete openwrt.

La configuración /etc/ser2net.conf es simple para indecentes

 3333:raw:0:/dev/ttyUSB0:9600,remctl 

Después de iniciar ser2net, puede conectarse al enrutador telnet en el puerto 3333 y verificar el resultado.

Quiero hacer una reserva: después de reiniciar el enrutador, cat / dev / ttyUSB0 no funcionó de repente. Es decir, por supuesto que funcionó, pero escribí basura en la consola. Recordé que durante los experimentos en el enrutador ejecuté minicom, que probablemente hizo la inicialización del puerto. Simplemente configurar el modo 9600 8n1 no funcionó, así que busqué con stty qué configuraciones de puerto están en el estado "funcionando" e ingresé la inicialización en rc.local

 stty -F /dev/ttyUSB0 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke 

Seguramente algo superfluo, los lectores lo corregirán posiblemente. Bueno, si especifica los parámetros del puerto en ser2net.conf, entonces no puede colocar el paquete stty en el enrutador.

Como resultado de estas manipulaciones en el servidor con la interfaz WEB, la consola del controlador estuvo disponible para nosotros. Por lo tanto, reescribiremos ligeramente el código de procesamiento de llamadas. Escribí en PHP. Es una pena mostrar todo el código (al final no soy programador, utilicé las inserciones del tutorial), así que el punto es:

  $re = '/CLIP: ".(7\d{10})"/m'; //    while (1) { $f=@fsockopen('tcp://10.16.19.19',3333, $errno, $errstr); //   while ($f && $str=fread($f, 100)) { $test=preg_match($re, $str, $matches); if ($test) process_call($matches[1]); // ,       //           ,  ,   $f sync_phones($f); } if ($f) fclose($f); //-    sleep(5); // 5     } 

Creo que todos implementan la llamada de proceso a su gusto, desde escribir información en un archivo de registro, crear una entrada de foto / video y enviarla a través de un bot de Telegram al teléfono de su cónyuge, así como a un equipo para una cafetera o para calentar borsch.

Me detendré en sync_phones con más detalle, porque implementa el algoritmo muy "no público" del controlador GSM de Doorhan. Y sí, carita, usé mysql en lugar de pdo o mysqli.

 function sync_phones($f) { /*   config   update.   -  val=1,        .     ,       mysql,     */ $result=mysql_query("SELECT * FROM config WHERE name='update' AND val=1"); if (mysql_num_rows($result)==0) return; $init = pack('H*','aa1100ee'); //-        $clear = pack('H*','aa0209000003e80100000000ee'); //    (   -) $logfile=fopen("/tmp/border.log","a"); fwrite($logfile,"Update started at ".date('Ymd H:i:s')."\n"); fwrite($f,$init); sleep(1); $ans=fread($f, 40); fwrite($logfile,"Send init. Answer ".bin2hex ( $ans )."\n"); fwrite($f,$clear); sleep(1); $ans=fread($f, 40); fwrite($logfile,"Send clear. Answer ".bin2hex ( $ans )."\n"); $result=mysql_query("SELECT * FROM phones ORDER BY pid"); //  , select     ,      $n=1; while($row=mysql_fetch_array($result)) { $start = 'aa0310'; $pos = sprintf("%04x",$n); $phone = bin2hex('+'.$row['phone']).'0000'; $end = 'ee'; // "" $send=$start.$pos.$phone.$end; $bin=pack('H*',$send); fwrite($f,$bin); $ans=fread($f, 40); fwrite($logfile,"Write {$n} phone {$row['phone']}. Answer ".bin2hex ( $ans )."\n"); $n++; } fwrite($logfile,"End update\n"); fclose($logfile); //   "" ,   ,  .   ,     mysql_query("UPDATE config SET val=0,result='".bin2hex ( $ans )."',updated=NOW() WHERE name='update'"); } ?> 

Parte 5. Conclusión


Como resultado, recibí (escribí) una interfaz WEB para la barrera, donde puedo pasar por un navegador móvil, agregar / eliminar / cambiar los números de los residentes de nuestra casa allí, tomar notas con referencia al apartamento, nombre, número de teléfono, número de automóvil. Hay fotos de un automóvil, un registro de entradas a través de la barrera con una foto. En el futuro, según los registros, veré quién crea la mayor carga en la barrera: pagará la reparación :)

Bueno, la ventaja era un punto WIFI en el estacionamiento cerca de la casa.

El precio de emisión es de 0 rublos y el día libre en la computadora.

Source: https://habr.com/ru/post/es415805/


All Articles