
Kürzlich wurde beschlossen, in einem Mehrfamilienhaus eine Barriere mit Steuerung über GSM zu installieren. Die Gründe und die Notwendigkeit für diese Lösung gehen über den Rahmen des Artikels hinaus, aber ich möchte darüber schreiben, wie ich "auf meinem Knie" eine Schnittstelle zur Steuerung des Moduls über das Internet erstellt habe. Und sogar ein bisschen mit Blackjack, der Verwaltung der Basis von Autos von einem Mobiltelefon aus und Fotos von Momenten des Eintritts von einer Straßenkamera. Vielleicht möchte es jemand zu Hause vorstellen.
Ich warne Sie, dass der Artikel keine sofort einsatzbereite Lösung beschreibt, sondern einen Proof of Concept.
Teil 1. Warum so ein Controller
Vor der Installation des GSM-Moduls wurde eine Marktüberprüfung solcher Systeme durchgeführt. Ich wollte eine kostengünstige, zuverlässige und bewährte Lösung. Nun, damit die „Installateure“ die Installateure hatten, hatten sie einige Erfahrung damit usw.
Die Installateure zur Auswahl boten entweder ESIM 110/120 für ~ 12000r mit Internetzugang oder Doorhan GSM für ~ 6000r mit SMS-Steuerung oder Konfiguration über ein USB-Kabel an.
Die Option "Ihr Gerät aus einem Arduino + GSM-Modul für 3 US-Dollar herstellen" wurde nicht in Betracht gezogen, daher sollte die Lösung genau zuverlässig und getestet sein. Stellen Sie sich vor, jemand könnte nicht zu Hause anrufen? Dann werden Sie alle Probleme bekommen.
Ich wollte auch keine Lotterie mit dem Kauf eines Geräts
in China auf Ali , um Probleme mit der Zuverlässigkeit zu vermeiden. Obwohl die Preise bei 1500r beginnen.
Der Nachteil von ESIM120 war neben den Kosten für x2, dass GPRS-Internet für den Zugriff auf das Internet verwendet wurde. Für einige mag dies ein Plus sein, aber in unserem Fall verursacht es die Kosten für die Mobilkommunikation - Sie müssen einen Tarif mit dem Internet abschließen. Jetzt ist ein Tarif ohne monatliche Gebühr mit der SIM-Karte verbunden. Um zu verhindern, dass die Nummer gesperrt wird, plane ich, alle 2-3 Monate für 2-3 Rubel pro Tag für einen Tag eine Art kostenpflichtiges Abonnement vom persönlichen Konto des Betreibers zu verbinden. Zum Beispiel "Wetter", "Witze" oder was sonst noch für die Barriere nützlich ist)
Über Doorhan GSM wusste ich, dass es neben der Verwaltung per SMS (nicht sehr interessant) auch eine Verbindung über USB mit einem Computer herstellt und über die eigene Software die Verwaltung der Zahlenbasis ermöglicht.
Teil 2. Weiterleitungskontrolle
Da geplant war, die Barrieresteuereinheit 20 Meter von dem Raum entfernt zu installieren, in dem sich der Heim-IP-Videorecorder und das Kommunikationszentrum des lokalen Internetproviders befinden, wurde beschlossen, Doorhan zu nehmen und USB über einen Router wie TP-Link MR3020 im Wert von 1200 Rubel, OpenWRT und Programme aufzubauen aus dem
USBIP- Projekt
Mit dem Router stellte sich heraus, dass es noch etwas einfacher war - ich fand den alten ASUS WL500gP in den Behältern, der nach heutigen Maßstäben nicht sehr gut für das Internet geeignet ist, aber 2 USB-Anschlüsse hat. Er hat es benutzt.
Für usbip musste ich am 12. September die alte Version von OpenWRT installieren, da dieses Kernelmodul auf neuen nicht funktioniert. Ich werde die Verbindung des Routers mit dem Netzwerk nicht beschreiben. Wenn jemand es nicht im lokalen Netzwerk hat, gibt es Optionen mit Portweiterleitung, UPNP oder dem Einrichten eines VPN nach Ihrem Geschmack.
Installieren Sie kmod-usbip-server und überprüfen Sie, ob Sie von uns exportieren können
root@OpenWrt:~
Wir benötigen ein Busid-Gerät, 1-1.1, auf dem sich unser angeschlossener GSM-Controller befindet. Mit Blick auf die Zukunft stellte sich heraus, dass dies ein banaler COM-> USB-Konverter auf einem CH341-Chip ist
Wir führen aus:
root@OpenWrt:~
und in dmesg
usbip-host 1-1.1:1.0: usbip-host: register new device (bus 1 dev 57 ifn 0)
Installieren Sie auf einem Computer mit Windows USBIP-Treiber und führen Sie sie aus
usbip -a 10.16.19.19 1-1.1
wo 10.16.19.19 IP-Adresse unseres Routers mit OpenWRT. Natürlich müssen Sie zuerst den Zugriff entweder von Ihrer IP-Adresse auf den Router in der Firewall öffnen oder eine Verbindung über das lokale Netzwerk oder eine der 1000 anderen Optionen von VPN zu P2P herstellen.
Wenn alles gut gegangen ist, erklärt Windows glücklich, dass ein neues USB-zu-Seriell-Konverter-CH340-Gerät erkannt wurde. Wir geben ihm einen Treiber und ein COM-Anschluss wird im System angezeigt.
Jetzt können wir das Programm aus dem Kit mit dem Controller ausführen und die Nummern in der Datenbank verwalten, während wir zu Hause auf der Couch sitzen

Teil 3. Zugangskontrolle
Nachdem ich die Arbeit mit dem Controller auf meinem Heimcomputer eingerichtet und Benutzernummern aufgezeichnet hatte, entschied ich mich, etwas tiefer in die verfügbaren Funktionen des COM-Anschlusses einzusteigen.
Es stellt sich heraus, dass das GSM-Modul der Steuerung regelmäßig AT-Befehle mit dem Signalpegel an die Konsole sendet und auch die Telefonnummer schreibt, von der der Anruf beim Tätigen eines Anrufs empfangen wird. Die Verwaltung des AT-Moduls hat nicht funktioniert, anscheinend werden sie nicht vom Controller-Modul an das Modem-Modul gesendet.

Es ist sowieso ziemlich interessant. Während ich die Idee mit dem GSM-Controller ausarbeitete, hoffte ich, dass diese Anrufe im Detail des Betreibers aufgezeichnet werden. Da jedoch keine Verbindung hergestellt wird, enthält der Drilldown keine Datensätze. Jetzt können Sie direkt vom Controller aus die Protokolle desjenigen sammeln, der die Barriere geöffnet hat. Oder wer hat das versucht.
Installieren Sie dazu kmod-usb-serial-ch341 auf OpenWRT, deaktivieren Sie die USBIP-Übersetzung mit dem Befehl usbip unbind -b 1-1.1 und führen Sie insmod ch341 aus.
Danach können Sie direkt am Router eine Verbindung zu / dev / ttyUSB0 herstellen und beobachten, was mit Aufrufen im Controller geschieht.
Um die Daten zu verarbeiten, habe ich zunächst ein einfaches Skript geschrieben, das mithilfe von Curl Daten über einen eingehenden Anruf an einen externen Server mit PHP sendet, um sie zu verarbeiten und in der Datenbank zu speichern. Sie können mit demselben Erfolg in die lokale Datei schreiben, obwohl der Speicher auf dem Router nicht dick ist.
Auf dem Server habe ich eine Datenbank in MySQL und ein paar Platten erstellt: mit den Telefonnummern unserer Bewohner und mit dem Anrufprotokoll. Es wurde möglich zu vergleichen, wer die Barriere zu welchem Zeitpunkt geöffnet hat und ob sie versuchen, sie aus unbekannten Zahlen zu verwenden.
Die zweite Idee, die mir in den Sinn kam, war, eine Verbindung zwischen dem Ereignis des Öffnens der Barriere und einem Foto dieses Ereignisses herzustellen. Die Sache ist, wie ich oben erwähnte, rund um das Haus AHD-Kameras, die auf den Rekorder schreiben und über IP auf den Stream zugreifen. Darüber hinaus wurde eine der Kameras speziell auf die Barriere gedreht, in der Erwartung, dass sie diese brechen würde.
Ich konnte nicht herausfinden, wie ich JPEG von unserem chinesischen Registrar entfernen kann, obwohl es in vielen Kameras eine Vorschau-URL gibt. Deshalb ging ich frontal - zum Zeitpunkt des Anrufs bekomme ich RTSP und mache daraus 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
Mit dem gleichen Erfolg war es möglich, kleine Clips in mp4 zu schreiben, aber ich fand das überflüssig.
Fotos entschieden sich, Blobs in MySQL zu speichern. Die Leistungslösung ist mittelmäßig, aber das "Ziehen" des Projekts wird einfacher. Sie müssen nicht die Datenbank und die Dateien kopieren, sondern alles in der Datenbank. Und die Last auf ihn ist im Wesentlichen keine.
Infolgedessen sieht das Eintragsprotokoll ungefähr so aus:

Teil 4. Laden von Nummern aus der SQL-Datenbank auf der Site in den Controller
Wenn Sie sorgfältig gelesen haben, haben Sie wahrscheinlich bemerkt, dass der USB-Anschluss des Routers für die Registrierung von Einträgen im Serial-zu-USB-Konvertermodus funktioniert hat. Um mit der Zahlenbasis im Controller zu arbeiten, musste ich ihn über USBIP auf meinen Heimcomputer „pushen“ und dort über das Windows-Programm erstellen Änderungen. Dies ist nicht sehr praktisch. Sie mussten die USB-Konsole auf Ihrem Heimcomputer lösen / binden und sogar ausführen. Nun, Sie können dies nur von zu Hause aus tun (wieder RDP / VPN usw.) und insbesondere nicht von einem Mobiltelefon aus. Es wurde doppelt erhitzt, dass die Datenbank mit Zahlen sowohl im MDB-Format (das Programm für den Controller kann Daten in Access hochladen) als auch in der Webversion gepflegt werden musste.
Ein fließendes Googeln des Doorhan GSM-Protokolls funktionierte nicht. Ich schließe jedoch nicht aus, dass dies eine Art chinesisches Gerät unter der Marke Doorhan ist. Daher bewaffnete er sich mit einem Monitor (Sniffer) für den COM-Port und nahm mehrere Dumps, wenn er mit der ursprünglichen Anwendung arbeitete.

Habe so etwas wie:
Speicherlöschbefehl
aa 02 09 00 00 03 e8 01 00 00 00 00 ee
Die Antwort ist, dass alles gut
aa 20 00 ee
ist
aa 20 00 ee
Team, um eine Nummer aufzuzeichnen +79999999999
aa 03 10 00 01 2b 37 39 39 39 39 39 39 39 39 39 39 00 00 ee
Daraus folgerte er:
Beginn des Sendens von AA, Ende des Sendens von EE
Die Antwort ist, dass das Team 20 00 akzeptiert wird
Der Befehl zum Starten der Aufzeichnung der Nummer 03. Dann kommt die Anzahl der Nummern im Paket. Es kann zwischen 1 und 5 liegen, dh für ein Paket können Sie mehrere Nummern gleichzeitig senden, das Paket mit dem EE-Befehl beenden und eine Bestätigung pro Block erhalten.
Nach dem Befehl zum Starten der Aufzeichnung gibt es 2 Bytes (das zweite ist genau, das erste wird wahrscheinlich verwendet, wenn die Anzahl der Nummern mehr als 256 beträgt, aber nicht überprüft wurde), die die Seriennummer des Datensatzes in der Zelle angeben. Das heißt, wenn Sie in einen leeren Speicher schreiben, ist es zuerst 1, dann 2 und so weiter. Dann kommen 14 Bytes der Telefonnummer. Da unsere Zahlen in 12 Bytes (+79999999999) "enthalten" sind, werden die letzten 2 Bytes mit Nullen belegt. Wahrscheinlich für alle Arten von internationalen Formaten wie +10. Dies ist nicht korrekt, ich habe mich nicht eingehend damit befasst, da diese Daten ausreichten.
Das Senden per Byte EE endet.
Mit der Seriennummer der Zelle ist die Situation nicht ganz klar. Angenommen, 10 Zahlen werden in die Steuerung geschrieben, der Speicher wurde nicht gelöscht. Wenn Sie den Befehl "Schreiben Sie die Nummer in Zelle 5" senden, ändert sich die Nummer in dieser Zelle nach der Kontrollsubtraktion nicht, aber der Controller zeichnet 11 Nummern auf und die 11. ist leer. Und wenn Sie den Befehl "Schreiben Sie die Nummer in Zelle 11" geben, wird er darauf geschrieben. Dies ist wahrscheinlich auf die Befehle ADD und REPLACE (Hinzufügen und Ändern) zurückzuführen, die per SMS gesendet werden können. Da die ursprüngliche Anwendung jedoch nur das Löschen und das anschließende Umschreiben der Liste vollständig durchführt, kann die Hypothese nicht überprüft werden. Daher hat er seine Version auch erstellt, indem er einen Lösch- und sequentiellen Schreibbefehl an eine Nummer gesendet hat (der Einfachheit halber).
Wir haben also Befehle geschrieben, um die Liste der Teilnehmer an der Steuerung über die serielle Schnittstelle zu verwalten. Der Port befindet sich jedoch im Router und die Datenbank mit Benutzern auf einem externen Server. Natürlich können Sie es auf einen Router übertragen (Sie erhalten eine Komplettlösung "out of the box"), aber ich war zu faul. Ich bin in die andere Richtung gegangen - ich habe / dev / ttyUSB0 mit dem ser2net-Paket, das sich im openwrt-Paket befindet, auf tcp geworfen.
Die config /etc/ser2net.conf ist einfach für unanständig
3333:raw:0:/dev/ttyUSB0:9600,remctl
Nach dem Start von ser2net können Sie eine Verbindung zum Telnet-Router an Port 3333 herstellen und das Ergebnis überprüfen.
Ich möchte eine Reservierung vornehmen: Nach dem Neustart des Routers funktionierte cat / dev / ttyUSB0 nicht plötzlich. Das hat natürlich funktioniert, aber ich habe Müll auf die Konsole geschrieben. Ich erinnerte mich, dass ich während der Experimente mit dem Router Minicom ausgeführt habe, das wahrscheinlich die Portinitialisierung durchgeführt hat. Nur das Einstellen des Modus 9600 8n1 hat nicht funktioniert, daher habe ich mit stty nachgesehen, welche Porteinstellungen sich im Status "Arbeiten" befinden, und die Initialisierung in rc.local eingegeben
stty -F /dev/ttyUSB0 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
Sicherlich etwas Überflüssiges, Leser werden es möglicherweise korrigieren. Wenn Sie die Portparameter in ser2net.conf angeben, können Sie das stty-Paket nicht auf dem Router ablegen.
Infolge dieser Manipulationen auf dem Server mit der WEB-Schnittstelle wurde uns die Controller-Konsole zur Verfügung gestellt. Daher werden wir den Anrufbearbeitungscode leicht umschreiben. Ich habe in PHP geschrieben. Es ist eine Schande, den gesamten Code anzuzeigen (ich bin am Ende kein Programmierer, ich habe die Einfügungen aus dem Tutorial verwendet). Der Punkt ist also:
$re = '/CLIP: ".(7\d{10})"/m';
Ich denke, jeder implementiert den process_call nach Belieben, indem er Informationen in eine Protokolldatei schreibt, einen Foto- / Videoeintrag erstellt und über einen Telegramm-Bot an das Telefon seines Ehepartners sendet sowie ein Team für eine Kaffeemaschine oder zum Aufwärmen von Borschtsch.
Ich werde näher auf sync_phones eingehen, da es den sehr "nicht öffentlichen" Algorithmus des Doorhan GSM-Controllers implementiert. Und ja, kleines Gesicht, ich habe MySQL anstelle von PDO oder MySQL verwendet.
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');
Teil 5. Fazit
Als Ergebnis erhielt (schrieb) ich eine WEB-Schnittstelle für die Barriere, über die ich über einen mobilen Browser die Nummern unserer Hausbewohner dort hinzufügen / entfernen / ändern, Notizen zu Wohnung, Name, Telefonnummer und Autonummer machen kann. Es gibt Fotos von einem Auto, ein Protokoll der Einträge durch die Barriere mit einem Foto. In Zukunft werde ich laut Protokoll sehen, wer die Barriere am stärksten belastet - er wird für die Reparatur bezahlen :)
Nun, der Bonus war ein WIFI-Punkt auf dem Parkplatz in der Nähe des Hauses.
Der Ausgabepreis beträgt 0 Rubel und der freie Tag am Computer.