Modification du module barrière GSM Doorhan pour le contrôle Internet



Récemment, il a été décidé d'installer une barrière avec contrôle via GSM dans un immeuble d'habitation. Les raisons et la nécessité de cette solution dépassent le cadre de l'article, mais je veux écrire comment, "à genoux", j'ai créé une interface pour contrôler le module via Internet. Et même un peu avec le blackjack, la gestion de la base des voitures à partir d'un téléphone mobile et des photos des moments d'entrée depuis une caméra de rue. Peut-être que quelqu'un veut le présenter à la maison.

Je vous préviens que l'article ne décrit pas une solution prête à l'emploi, mais plutôt une preuve de concept.

Partie 1. Pourquoi un tel contrôleur


Avant d'installer le module GSM, une étude de marché de ces systèmes a été réalisée. Je voulais obtenir une solution peu coûteuse, fiable et éprouvée. Eh bien, pour que les «installateurs» aient les installateurs, ils avaient une certaine expérience de travail avec, etc.

Les installateurs au choix ont proposé soit ESIM 110/120 pour ~ 12000r avec accès Internet, soit Doorhan GSM pour ~ 6000r avec contrôle SMS ou configuration via un câble USB.

L'option de "fabriquer votre appareil à partir du module arduino + gsm pour 3 $" n'a pas été envisagée, la solution doit donc être exactement fiable et testée. Imaginez que quelqu'un ne puisse pas appeler à la maison? Ensuite, vous aurez tous les problèmes.

Je ne voulais pas non plus de loterie avec l'achat d'un appareil en Chine sur Ali , là encore pour éviter les problèmes de fiabilité. Bien que les prix commencent à 1500r.

L'inconvénient d'ESIM120, en plus du coût de x2, était que l'Internet GPRS était utilisé pour accéder à Internet. Pour certains, cela peut être un plus, mais dans notre cas, cela entraîne le coût des communications mobiles - vous devrez prendre un tarif avec Internet. Maintenant, un tarif sans frais mensuels est connecté à la carte SIM, et pour éviter que le numéro ne soit bloqué, je prévois de connecter une sorte d'abonnement payant depuis l'espace personnel de l'opérateur tous les 2-3 mois pour 2-3 roubles par jour, pendant une journée. Par exemple, "météo", "blagues" ou quoi d'autre est-il utile pour la barrière)

Concernant Doorhan GSM, je savais qu'en plus de gérer via SMS (pas très intéressant), il se connecte via USB à un ordinateur et grâce à son propre logiciel vous permet de gérer la base des nombres.

Partie 2. Contrôle de retransmission


Comme il était prévu d'installer l'unité de contrôle des barrières à 20 mètres de la pièce où se trouvent l'enregistreur vidéo IP domestique et le centre de communication du fournisseur Internet local, il a été décidé de prendre Doorhan et de «construire» USB via un routeur tel que TP-Link MR3020 d'une valeur de 1200 roubles, OpenWRT et des programmes du projet USBIP

Il s'est avéré être encore plus simple avec le routeur - j'ai trouvé l'ancien ASUS WL500gP dans les bacs, ce qui n'est pas très adapté à Internet selon les normes d'aujourd'hui, mais il dispose de 2 ports USB. Il l'a utilisé.

Pour l'usbip, j'ai dû installer l'ancienne version d'OpenWRT, le 12 septembre, car ce module du noyau ne fonctionne pas sur les nouveaux. Je ne décrirai pas la connexion du routeur au réseau. Si quelqu'un ne l'a pas sur le réseau local, il existe des options avec la redirection de port, UPNP ou la configuration d'un VPN à votre goût.

Installez kmod-usbip-server et vérifiez que vous pouvez exporter depuis nous

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 

Nous avons besoin d'un appareil occupé, 1-1.1 sur lequel se trouve notre contrôleur GSM connecté. Pour l'avenir, il s'est avéré qu'il s'agit d'un banal convertisseur COM-> USB sur une puce CH341

Nous réalisons:

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

et en dmesg

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

Sur un ordinateur avec Windows, installez les pilotes USBIP et exécutez

 usbip -a 10.16.19.19 1-1.1 

où 10.16.19.19 Adresse IP de notre routeur avec OpenWRT. Bien sûr, vous devez d'abord ouvrir l'accès depuis votre IP au routeur dans le pare-feu, ou vous connecter depuis le réseau local, ou l'une des 1000 autres options du VPN au P2P.

Si tout s'est bien passé, Windows déclare avec joie qu'un nouveau périphérique USB-to-Serial Converter CH340 a été détecté, nous lui donnons un pilote et un port COM apparaît dans le système.

Maintenant, nous pouvons exécuter le programme à partir du kit avec le contrôleur et gérer les numéros dans la base de données tout en étant assis à la maison sur le canapé



Partie 3. Contrôle d'entrée


Après avoir configuré le travail avec le contrôleur sur mon ordinateur personnel et enregistré les numéros d'utilisateurs, j'ai décidé de creuser un peu plus avec ce qui est disponible sur le port COM.

Il s'avère que le module GSM du contrôleur envoie périodiquement des commandes AT avec le niveau du signal à la console, et écrit également le numéro de téléphone à partir duquel l'appel est reçu lors de l'appel. Il n'a pas fonctionné pour gérer le module AT, apparemment ils ne sont pas diffusés du module contrôleur au module modem.



C'est assez intéressant de toute façon. En élaborant l'idée avec le contrôleur GSM, j'espérais que ces appels seraient enregistrés dans les détails de l'opérateur. Mais comme aucune connexion ne se produit, il n'y a aucun enregistrement dans l'analyse descendante. Maintenant, vous pouvez directement à partir du contrôleur pour collecter les journaux de celui qui a ouvert la barrière. Ou qui a essayé de faire ça.

Pour ce faire, installez kmod-usb-serial-ch341 sur OpenWRT, désactivez la traduction USBIP avec la commande usbip unbind -b 1-1.1 et exécutez insmod ch341.

Après cela, directement sur le routeur, vous pouvez vous connecter à / dev / ttyUSB0 et regarder ce qui se passe avec les appels dans le contrôleur.

Pour traiter les données, pour commencer, j'ai écrit un script simple qui utilisait curl pour envoyer des données sur un appel entrant à un serveur externe avec PHP pour le traitement et l'enregistrement dans la base de données. Vous pouvez écrire dans le fichier local avec le même succès, bien que la mémoire du routeur ne soit pas épaisse.

 #!/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 

Sur le serveur, j'ai créé une base de données dans mysql et quelques plaques: avec les numéros de téléphone de nos résidents, et avec le journal des appels. Il est devenu possible de comparer qui a ouvert la barrière à quelle heure et s'ils essaient de l'utiliser à partir de chiffres inconnus.

La deuxième idée qui m'est venue à l'esprit était de faire le lien entre l'événement d'ouverture de la barrière et une photo de cet événement. La chose est, comme je l'ai mentionné ci-dessus, autour de la maison sont des caméras AHD qui écrivent sur l'enregistreur avec accès au flux sur IP. De plus, l'une des caméras a été spécialement tournée vers la barrière, en prévision de sa rupture.

Je n'ai pas pu trouver comment supprimer jpeg de notre bureau d'enregistrement chinois, bien que dans de nombreuses caméras il y ait une URL de prévisualisation. Par conséquent, je suis allé de l'avant - au moment de l'appel, je reçois RTSP et en fais 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 

Avec le même succès, il a été possible d'écrire de petits clips en mp4, mais j'ai trouvé cela superflu.
Photos a décidé de stocker des objets blob dans MySQL. La solution de performance est moyenne, mais "faire glisser" le projet sera plus facile, vous n'avez pas besoin de copier la base de données et les fichiers, tout est dans la base de données. Et la charge sur lui est essentiellement nulle.

Par conséquent, le journal d'entrée ressemble à ceci:



Partie 4. Chargement des numéros de la base de données SQL sur le site vers le contrôleur


Si vous lisez attentivement, vous avez probablement remarqué que pour enregistrer les entrées, le port USB du routeur fonctionnait en mode convertisseur série-USB et pour travailler avec la base de données de numéros à l'intérieur du contrôleur, je devais le «pousser» via USBIP vers mon ordinateur personnel et l'ajouter via le programme Windows changements. Ce n'est pas très pratique, vous avez dû faire une dissociation / liaison et même exécuter la console usbip sur votre ordinateur personnel. Eh bien, vous ne pouvez le faire qu'à la maison (enfin, encore une fois, RDP / VPN, etc.), et surtout pas à partir d'un téléphone mobile. Il a été doublement chauffé que la base de données des nombres devait être maintenue à la fois au format mdb (le programme du contrôleur peut télécharger des données dans Access) et dans la version Web.

Une recherche fluide du protocole GSM Doorhan n'a pas fonctionné. Cependant, je n'exclus pas qu'il s'agisse d'une sorte d'appareil chinois sous la marque Doorhan. Par conséquent, il s'est armé d'un moniteur (renifleur) pour le port COM et a effectué plusieurs vidages lors du travail à partir de l'application d'origine.



Vous avez quelque chose comme:
Commande d' aa 02 09 00 00 03 e8 01 00 00 00 00 ee mémoire aa 02 09 00 00 03 e8 01 00 00 00 00 ee
La réponse est que tout s'est bien passé aa 20 00 ee
Équipe pour enregistrer un numéro +79999999999
aa 03 10 00 01 2b 37 39 39 39 39 39 39 39 39 39 39 00 00 ee

D'où il a tiré les conclusions suivantes:
début d'envoi AA, fin d'envoi EE
La réponse est que l'équipe est acceptée 20 00
La commande pour commencer à enregistrer le numéro 03. Vient ensuite le nombre de numéros dans le package. Cela peut aller de 1 à 5, c'est-à-dire que pour un colis, vous pouvez envoyer plusieurs numéros à la fois, en terminant le colis avec la commande EE, et obtenir une confirmation par bloc.

Après la commande de démarrage de l'enregistrement, il y a 2 octets (le second est exact, le premier sera probablement utilisé lorsque le nombre de nombres est supérieur à 256 mais n'a pas été vérifié), indiquant le numéro de série de l'enregistrement dans la cellule. Autrement dit, si vous écrivez dans une mémoire vide, il s'agit d'abord de 1, puis de 2, etc. Vient ensuite 14 octets du numéro de téléphone. Puisque nos nombres sont «inclus» dans 12 octets (+79999999999), les 2 derniers octets sont occupés par des zéros. Probablement pour toutes sortes de formats internationaux comme +10. Ce n'est pas exact, je n'ai pas approfondi, car ces données étaient suffisantes.

L'envoi par octet EE se termine.

Avec le numéro de série de la cellule, la situation n'est pas entièrement claire. Disons que 10 nombres sont écrits sur le contrôleur, la mémoire n'a pas été effacée. Si vous envoyez la commande "écrivez le nombre dans la cellule 5", le nombre dans cette cellule après la soustraction de contrôle ne changera pas, mais le contrôleur enregistrera 11 nombres et le 11 sera vide. Et si vous donnez la commande "écrivez le nombre dans la cellule 11", alors il y sera écrit. Cela est probablement dû aux commandes ADD et REPLACE (ajouter et modifier), qui peuvent être envoyées par SMS. Mais puisque la demande originale ne fait que l'effacement complet et la réécriture ultérieure de la liste, l'hypothèse ne peut pas être vérifiée. Par conséquent, il a également fait sa version en envoyant une commande d'effacement et d'écriture séquentielle à un numéro (pour plus de simplicité).

Nous sommes donc venus pour écrire des commandes pour gérer la liste des abonnés au contrôleur via le port série. Mais le port est dans le routeur et la base de données avec les utilisateurs sur un serveur externe. Bien sûr, vous pouvez le transférer sur un routeur (vous obtenez une solution complète "prête à l'emploi"), mais j'étais trop paresseux. Je suis allé dans l'autre sens - j'ai jeté / dev / ttyUSB0 sur tcp en utilisant le paquet ser2net, qui est dans le paquet openwrt.

La configuration /etc/ser2net.conf est simple pour indécent

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

Après avoir démarré ser2net, vous pouvez vous connecter au routeur telnet sur le port 3333 et vérifier le résultat.

Je veux faire une réservation: après le redémarrage du routeur, cat / dev / ttyUSB0 n'a pas fonctionné soudainement. C'est, bien sûr, cela a fonctionné, mais j'ai écrit des ordures sur la console. Je me suis souvenu que lors des expériences sur le routeur, j'ai exécuté minicom, qui a probablement fait l'initialisation du port. Le simple fait de régler le mode 9600 8n1 n'a pas fonctionné, j'ai donc regardé avec stty les paramètres de port qui étaient à l'état "de travail" et entré l'initialisation dans rc.local

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

Sûrement quelque chose de superflu, les lecteurs le corrigeront peut-être. Eh bien, si vous spécifiez les paramètres de port dans ser2net.conf, vous ne pouvez pas mettre le paquet stty sur le routeur.

À la suite de ces manipulations sur le serveur avec l'interface WEB, la console du contrôleur est devenue disponible pour nous. Par conséquent, nous réécrirons légèrement le code de traitement des appels. J'ai écrit en PHP. C'est dommage de montrer tout le code (je ne suis pas programmeur au final, j'ai utilisé les insertions du tutoriel), donc le point est:

  $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     } 

Je pense que tout le monde met en œuvre le processus_call comme il le souhaite, de l'écriture d'informations dans un fichier journal, à la création d'une entrée photo / vidéo et à son envoi via un robot Telegram vers le téléphone de son conjoint, ainsi qu'une équipe vers une cafetière ou pour réchauffer un bortsch.

Je m'attarderai plus en détail sur sync_phones, car il implémente l'algorithme très «non public» du contrôleur GSM Doorhan. Et oui, petit visage, j'ai utilisé mysql au lieu de pdo ou 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'"); } ?> 

Partie 5. Conclusion


En conséquence, j'ai reçu (écrit) une interface WEB pour la barrière, où je peux passer par un navigateur mobile, ajouter / supprimer / modifier les numéros des résidents de notre maison, prendre des notes, en référence à l'appartement, nom, numéro de téléphone, numéro de voiture. Il y a des photos d'une voiture, un journal des entrées à travers la barrière avec une photo. À l'avenir, selon les journaux, je verrai qui crée la plus grande charge sur la barrière - il paiera la réparation :)

Eh bien, le bonus était un point WIFI dans le parking près de la maison.

Le prix d'émission est de 0 roubles et le jour de congé à l'ordinateur.

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


All Articles