Modifikasi modul penghalang GSM Doorhan untuk kontrol Internet



Baru-baru ini, diputuskan untuk memasang penghalang dengan kontrol melalui GSM di gedung apartemen. Alasan dan perlunya solusi ini berada di luar ruang lingkup artikel, tetapi saya ingin menulis tentang bagaimana, "pada lutut saya" Saya membuat antarmuka untuk mengendalikan modul melalui Internet. Dan bahkan sedikit dengan blackjack, mengelola basis mobil dari ponsel dan foto-foto momen masuk dari kamera jalanan. Mungkin seseorang ingin memperkenalkannya di rumah.

Saya akan memperingatkan Anda bahwa artikel tersebut tidak menggambarkan solusi yang sudah jadi di luar kotak, melainkan bukti konsep.

Bagian 1. Mengapa controller seperti itu


Sebelum memasang modul GSM, beberapa tinjauan pasar terhadap sistem tersebut telah dilakukan. Saya ingin mendapatkan solusi yang murah, andal, dan terbukti. Nah, sehingga "installer" memiliki installer, mereka memiliki beberapa pengalaman bekerja dengannya, dll.

Installer yang dapat dipilih menawarkan ESIM 110/120 untuk ~ 12000r dengan akses Internet, atau Doorhan GSM untuk ~ 6000r dengan kontrol atau konfigurasi SMS melalui kabel USB.

Pilihan untuk "membuat perangkat Anda dari modul arduino + gsm seharga $ 3" ​​tidak dipertimbangkan, jadi solusinya harus benar-benar andal dan teruji. Bayangkan seseorang tidak bisa menelepon ke rumah? Maka Anda akan mendapatkan semua masalah.

Saya juga tidak ingin lotre dengan pembelian perangkat di Cina pada Ali , lagi untuk menghindari masalah dengan keandalan. Meskipun harga mulai dari 1500r.

Kelemahan dari ESIM120, selain biaya x2, adalah bahwa GPRS Internet digunakan untuk mengakses Internet. Untuk beberapa orang, ini mungkin merupakan nilai tambah, tetapi dalam kasus kami ini membawa biaya komunikasi seluler - Anda harus mengambil tarif dengan Internet. Sekarang, tarif tanpa biaya bulanan terhubung ke kartu SIM, dan untuk mencegah nomor tersebut diblokir, saya berencana menghubungkan beberapa jenis langganan berbayar dari akun pribadi operator setiap 2-3 bulan untuk 2-3 rubel per hari, selama satu hari. Misalnya, "cuaca", "lelucon" atau apa lagi yang berguna untuk penghalang)

Tentang Doorhan GSM, saya tahu bahwa selain mengelola melalui SMS (tidak terlalu menarik), terhubung melalui USB ke komputer dan melalui perangkat lunaknya sendiri memungkinkan Anda untuk mengelola basis angka.

Bagian 2. Kontrol penerusan


Karena direncanakan untuk memasang unit kontrol penghalang 20 meter dari ruangan tempat perekam video IP rumah dan pusat komunikasi penyedia Internet lokal, diputuskan untuk mengambil Doorhan dan "membangun" USB melalui router seperti TP-Link MR3020 senilai 1200 rubel, OpenWRT dan program dari proyek USBIP

Ternyata menjadi sedikit lebih sederhana dengan router - Saya menemukan ASUS WL500gP lama di nampan, yang tidak sangat cocok untuk Internet dengan standar saat ini, tetapi memiliki 2 port USB. Dia menggunakannya.

Untuk usbip, saya harus menginstal versi lama OpenWRT, 12 September, karena modul kernel ini tidak berfungsi pada yang baru. Saya tidak akan menjelaskan koneksi router ke jaringan. Jika seseorang tidak memilikinya di jaringan lokal, ada opsi dengan penerusan porta, UPNP, atau pengaturan VPN sesuai selera Anda.

Instal kmod-usbip-server dan verifikasi bahwa Anda dapat mengekspor dari kami

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 

Kami membutuhkan perangkat busid, 1-1.1 di mana pengontrol GSM kami yang terhubung berada. Ke depan, ternyata ini adalah COM-> USB converter dangkal pada chip CH341

Kami melakukan:

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

dan dalam dmesg

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

Di komputer dengan Windows, instal driver USBIP dan jalankan

 usbip -a 10.16.19.19 1-1.1 

di mana 10.16.19.19 Alamat IP router kami dengan OpenWRT. Tentu saja, pertama Anda perlu membuka akses baik dari IP Anda ke router di firewall, atau terhubung dari jaringan lokal, atau salah satu dari 1000 opsi lain dari VPN ke P2P.

Jika semuanya berjalan dengan baik, maka Windows dengan senang hati menyatakan bahwa perangkat USB-to-Serial Converter CH340 baru telah terdeteksi, kami memberinya driver dan port COM muncul di sistem.

Sekarang kita dapat menjalankan program dari kit dengan controller dan mengatur angka-angka dalam database sambil duduk di rumah di sofa



Bagian 3. Kontrol Masuk


Setelah saya mengatur pekerjaan dengan controller di komputer rumah saya dan mencatat nomor pengguna, saya memutuskan untuk menggali lebih dalam dengan apa yang tersedia pada port COM.

Ternyata GSM-module controller secara berkala mengirimkan perintah AT dengan level sinyal ke konsol, dan juga menulis nomor telepon dari mana panggilan diterima saat melakukan panggilan. Itu tidak berfungsi untuk mengelola modul AT, tampaknya mereka tidak disiarkan dari modul pengontrol ke modul modem.



Lagipula ini cukup menarik. Saat mengerjakan ide dengan pengontrol GSM, saya berharap bahwa panggilan ini akan direkam dalam detail operator. Tetapi karena tidak ada koneksi yang terjadi, tidak ada catatan dalam pencarian. Sekarang Anda dapat langsung dari controller untuk mengumpulkan log orang yang membuka penghalang. Atau siapa yang mencoba melakukan ini.

Untuk melakukan ini, instal kmod-usb-serial-ch341 pada OpenWRT, nonaktifkan terjemahan USBIP dengan perintah usbip unbind -b 1-1.1 dan lakukan insmod ch341.

Setelah itu, tepat di router, Anda dapat terhubung ke / dev / ttyUSB0 dan menonton apa yang terjadi dengan panggilan di controller.

Untuk memproses data, sebagai permulaan, saya menulis sebuah skrip sederhana yang menggunakan curl untuk mengirim data tentang panggilan masuk ke server eksternal dengan PHP untuk memproses dan menyimpan ke database. Anda dapat menulis ke file lokal dengan kesuksesan yang sama, meskipun memori pada router tidak tebal.

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

Di server, saya membuat database di mysql dan beberapa piring: dengan nomor telepon penduduk kami, dan dengan log panggilan. Menjadi mungkin untuk membandingkan siapa yang membuka penghalang pada jam berapa, dan apakah mereka mencoba menggunakannya dari angka yang tidak diketahui.

Gagasan kedua yang muncul di benak saya adalah membuat hubungan antara acara membuka penghalang dan foto acara ini. Masalahnya, seperti yang saya sebutkan di atas, di sekitar rumah ada kamera AHD yang menulis ke perekam dengan akses ke aliran melalui IP. Selain itu, salah satu kamera secara khusus diputar ke penghalang, untuk mengantisipasi bahwa mereka akan memecahkannya.

Saya tidak dapat menemukan cara menghapus jpeg dari registrar China kami, meskipun di banyak kamera ada URL Pratinjau. Oleh karena itu, saya berbicara langsung - pada saat panggilan saya mendapatkan RTSP dan menjadikannya 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 

Dengan kesuksesan yang sama, dimungkinkan untuk menulis klip kecil di mp4, tetapi saya menemukan ini berlebihan.
Foto memutuskan untuk menyimpan gumpalan di MySQL. Solusi kinerja begitu-begitu, tetapi "menyeret" proyek akan lebih mudah, Anda tidak perlu menyalin database dan file, semuanya ada di database. Dan beban pada dirinya pada dasarnya tidak ada.

Akibatnya, log entri terlihat seperti ini:



Bagian 4. Memuat angka dari database SQL di situs ke controller


Jika Anda membaca dengan seksama, Anda mungkin memperhatikan bahwa untuk mendaftarkan entri, port USB router berfungsi dalam mode Serial-to-USB converter, dan untuk bekerja dengan basis data nomor di dalam controller, saya harus "mendorong" melalui USBIP ke komputer di rumah saya dan menambahkannya melalui program Windows perubahan. Ini sangat tidak nyaman, Anda harus melakukan unbind / bind dan bahkan menjalankan konsol usbip di komputer di rumah Anda. Nah, Anda hanya bisa melakukan ini dari rumah (well, sekali lagi, RDP / VPN, dan sebagainya), dan terutama bukan dari ponsel. Dipanaskan dua kali lipat bahwa basis data angka harus dipertahankan baik dalam format mdb (program untuk pengontrol dapat mengunggah data dalam Access) dan dalam versi web.

Googling yang lancar dari protokol GSM Doorhan tidak bekerja. Saya tidak mengecualikan bahwa ini adalah semacam perangkat Cina di bawah merek Doorhan. Karena itu, ia mempersenjatai diri dengan monitor (sniffer) untuk port COM dan mengambil beberapa dump ketika bekerja dari aplikasi asli.



Punya sesuatu seperti:
Memory aa 02 09 00 00 03 e8 01 00 00 00 00 ee Command aa 02 09 00 00 03 e8 01 00 00 00 00 ee
Jawabannya adalah bahwa semuanya berjalan dengan baik aa 20 00 ee
Tim mencatat satu nomor +79999999999
aa 03 10 00 01 2b 37 39 39 39 39 39 39 39 39 39 39 00 00 ee

Dari mana ia membuat kesimpulan sebagai berikut:
mulai dari pengiriman AA, akhir pengiriman EE
Jawabannya adalah bahwa tim diterima 20 00
Perintah untuk mulai merekam angka 03. Kemudian muncul jumlah angka dalam paket. Bisa dari 1 hingga 5, yaitu, untuk satu paket, Anda dapat mengirim beberapa nomor sekaligus dalam satu baris, menyelesaikan paket dengan perintah EE, dan mendapatkan satu konfirmasi per blok.

Setelah perintah untuk mulai merekam, ada 2 byte (yang kedua tepat, yang pertama mungkin akan digunakan ketika jumlah angka lebih dari 256 tetapi tidak memeriksa) yang menunjukkan nomor seri catatan dalam sel. Artinya, jika Anda menulis ke memori kosong, maka pertama adalah 1, lalu 2, dan seterusnya. Kemudian muncul 14 byte nomor telepon. Karena angka kami “dimasukkan” dalam 12 byte (+79999999999), 2 byte terakhir ditempati oleh nol. Mungkin untuk semua jenis format internasional seperti +10. Ini tidak akurat, saya tidak menggali lebih dalam, karena data ini cukup.

Pengiriman dengan byte EE berakhir.

Dengan nomor seri sel, situasinya tidak sepenuhnya jelas. Katakanlah 10 angka ditulis ke controller, memori tidak dihapus. Jika Anda mengirim perintah "tulis angka di sel 5", maka angka di sel ini setelah pengurangan kontrol tidak akan berubah, tetapi controller akan mencatat 11 angka, dan tanggal 11 akan kosong. Dan jika Anda memberi perintah "tulis nomor di sel 11", maka itu akan ditulis untuk itu. Ini mungkin karena perintah ADD dan REPLACE (tambah dan ubah), yang dapat dikirim melalui SMS. Tetapi karena aplikasi asli hanya menyelesaikan penghapusan dan penulisan ulang daftar, hipotesis tidak dapat diverifikasi. Oleh karena itu, ia juga membuat versinya dengan mengirimkan perintah write erase dan sequential ke satu nomor (untuk kesederhanaan).

Jadi, kami datang untuk menulis perintah untuk mengelola daftar pelanggan ke controller melalui port serial. Tapi port ada di router, dan database dengan pengguna di server eksternal. Tentu saja, Anda dapat mentransfernya ke router (Anda mendapatkan solusi lengkap "di luar kotak"), tapi saya terlalu malas. Saya pergi ke arah lain - saya melempar / dev / ttyUSB0 pada tcp menggunakan paket ser2net, yang ada dalam paket openwrt.

Config /etc/ser2net.conf sederhana untuk tidak senonoh

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

Setelah memulai ser2net, Anda dapat terhubung ke router telnet pada port 3333 dan memeriksa hasilnya.

Saya ingin membuat reservasi: setelah memulai kembali router, cat / dev / ttyUSB0 tidak bekerja secara tiba-tiba. Tentu saja itu berhasil, tetapi saya menulis sampah ke konsol. Saya ingat bahwa selama percobaan di router saya menjalankan minicom, yang mungkin melakukan inisialisasi port. Hanya pengaturan mode 9600 8n1 tidak bekerja, jadi saya melihat dengan stty pengaturan port mana yang dalam keadaan "berfungsi" dan memasukkan inisialisasi dalam rc.local

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

Tentunya sesuatu yang berlebihan, pembaca akan memperbaikinya. Nah, jika Anda menentukan parameter port di ser2net.conf, maka Anda tidak bisa meletakkan paket stty di router.

Sebagai hasil dari manipulasi ini di server dengan antarmuka WEB, konsol pengendali menjadi tersedia bagi kami. Karenanya, kami akan sedikit menulis ulang kode pemrosesan panggilan. Saya menulis dalam PHP. Sayang sekali menunjukkan semua kode (pada akhirnya saya bukan seorang programmer, saya menggunakan sisipan dari tutorial), jadi intinya adalah:

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

Saya pikir semua orang mengimplementasikan process_call sesukanya, dari menulis informasi ke file log, hingga membuat entri foto / video dan mengirimkannya melalui bot Telegram ke ponsel pasangannya, serta tim ke pembuat kopi atau untuk menghangatkan borsch.

Saya akan membahas sync_phones secara lebih terperinci, karena mengimplementasikan algoritma yang sangat “non-publik” dari pengontrol-pintu Doorhan GSM. Dan ya, wajah kecil, saya menggunakan mysql bukan pdo atau 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'"); } ?> 

Bagian 5. Kesimpulan


Sebagai hasilnya, saya menerima (menulis) antarmuka WEB untuk penghalang, di mana saya dapat pergi melalui browser seluler, menambah / menghapus / mengubah jumlah penghuni rumah kami di sana, membuat catatan, dengan mengacu pada apartemen, nama, nomor telepon, nomor mobil. Ada foto-foto mobil, log entri melalui penghalang dengan foto. Di masa depan, menurut log, saya akan melihat siapa yang menciptakan beban terbesar pada penghalang - dia akan membayar untuk perbaikan :)

Nah, bonusnya adalah titik WIFI di tempat parkir dekat rumah.

Harga masalah adalah 0 rubel dan hari libur di komputer.

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


All Articles