修改用于互联网控制的Doorhan GSM屏障模块



最近,决定在公寓大楼中安装通过GSM控制的屏障。 该解决方案的原因和必要性不在本文讨论范围之内,但是我想写一下如何“在我的膝盖上”创建一个用于通过Internet控制模块的界面。 甚至还有一点点二十一点,都可以通过手机管理汽车底座,并通过路边摄像头管理进入时刻的照片。 也许有人想在家里介绍它。

我会警告您,本文并非开箱即用地描述现成的解决方案,而只是概念上的证明。

第1部分。为什么这样的控制器


在安装GSM模块之前,对该系统进行了一些市场评估。 我想获得一种便宜,可靠且经过验证的解决方案。 好吧,这样“安装程序”就有了安装程序,他们有一些使用它的经验,等等。

安装人员可以选择通过ESIM 110/120(约12000r)访问互联网,或通过Doorhan GSM(约6000r)通过SMS控制或通过USB线进行配置。

没有考虑“以3美元的价格从arduino + gsm模块制造您的设备”的选项,因此该解决方案应完全可靠并经过测试。 想象有人不能打电话回家? 然后,您会遇到所有麻烦。

为了避免可靠性问题,我也不想在中国通过Ali购买彩票。 虽然价格从1500r开始。

ESIM120的缺点是,除x2成本外,还使用GPRS Internet来访问Internet。 对于某些人来说,这可能是一个优点,但是在我们的情况下,这带来了移动通信的成本-您将不得不对Internet收费。 现在,没有月费的资费已连接到SIM卡,并且为了防止号码被阻止,我计划每2-3个月从运营商的个人区域连接某种付费订阅,每天收费2-3卢布。 例如,“天气”,“笑话”或其他对障碍有用的信息)

关于Doorhan GSM,我知道除了通过SMS进行管理(不是很有趣)之外,它还通过USB连接到计算机,并通过自己的软件可以管理数字基础。

第2部分。转发控制


由于计划将屏障控制单元安装在距离家庭IP录像机和本地Internet提供商的通信中心所在房间20米的位置,因此决定采用Doorhan并通过路由器(例如价值1200卢布的TP-Link MR3020,OpenWRT和程序“建立” USB)从USBIP项目

事实证明,使用路由器甚至更简单-我在垃圾箱中发现了旧的ASUS WL500gP,按照今天的标准,它不太适合用于Internet,但它具有2个USB端口。 他用了。

对于usbip,我必须在9月12日安装旧版本的OpenWRT,因为此内核模块不适用于新模块。 我将不描述路由器与网络的连接。 如果某人在本地网络上没有它,则可以选择端口转发,UPNP或根据您的喜好设置VPN。

安装kmod-usbip-server并确认您可以从我们这里导出

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 

我们需要一个已连接GSM控制器的1-1.1总线设备。 展望未来,事实证明这是CH341芯片上的普通COM-> USB转换器

我们执行:

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

和在dmesg

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

在装有Windows的计算机上,安装USBIP驱动程序并运行

 usbip -a 10.16.19.19 1-1.1 

其中,带有OpenWRT的路由器的10.16.19.19 IP地址。 当然,首先,您需要打开从IP到防火墙中路由器的访问权限,或者从本地网络连接,或者从VPN到P2P的1000个其他选项中的任何一个。

如果一切顺利,则Windows会高兴地声明已检测到新的USB串行转换器CH340设备,我们为其提供了驱动程序,并且系统中出现了COM端口。

现在,我们可以坐在家里的沙发上,使用控制器从套件中运行程序并管理数据库中的数字



第3部分。进入控制


在家用计算机上设置控制器的工作并记录用户编号之后,我决定对COM端口上的可用内容进行更深入的研究。

事实证明,控制器的GSM模块会定期将具有信号电平的AT命令发送到控制台,并且还会在拨打电话时写出接收到电话的电话号码。 管理AT模块没有任何作用,显然它们没有从控制器模块广播到调制解调器模块。



无论如何,这很有趣。 我希望在与GSM控制器一起解决这个问题时,希望将这些呼叫记录在运营商的详细信息中。 但是由于未发生任何连接,因此在向下钻取中没有任何记录。 现在,您可以直接从控制器中收集打开屏障的那个人的日志。 或尝试这样做的人。

为此,请在OpenWRT上安装kmod-usb-serial-ch341,使用usbip unbind -b 1-1.1命令关闭USBIP转换并执行insmod ch341。

之后,就在路由器上,您可以连接到/ dev / ttyUSB0并观察控制器中的调用会发生什么。

为了处理数据,对于初学者来说,我编写了一个简单的脚本,该脚本使用curl将有关传入呼叫的​​数据发送到具有PHP的外部服务器,以进行处理并将其保存到数据库。 尽管路由器上的内存并不厚,但是您可以成功写入本地文件。

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

在服务器上,我在mysql中创建了一个数据库,并创建了两块板:使用居民的电话号码和呼叫日志。 可以比较谁在什么时候打开了壁垒,以及他们是否试图从未知数字中使用它。

我想到的第二个想法是在打开障碍的事件与事件的照片之间建立联系。 正如我上面提到的,房子周围是AHD摄像机,它们可以通过IP访问流向刻录机写入数据。 此外,其中一台摄像机专门转入了障碍物,因为它们会打破障碍物。

我找不到从我们的中文注册商中删除jpeg的方法,尽管在许多相机中都有一个预览URL。 因此,我进行了正面讨论-在通话时,我得到了RTSP并从中将其制成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 

取得了同样的成功,可以在mp4中编写小片段,但是我发现这是多余的。
照片决定将Blob存储在MySQL中。 性能解决方案是一般的,但是“拖动”项目会更容易,您不需要复制数据库和文件,所有内容都在数据库中。 他身上的负担基本上是零。

结果,条目日志如下所示:



第4部分。将数字从站点上的SQL数据库加载到控制器


如果您仔细阅读,可能会注意到,要注册条目,路由器的USB端口以“串行到USB”转换器模式工作,并与控制器内部的数字数据库一起工作,我必须通过USBIP将其“推送”到我的家用计算机,然后通过Windows程序添加变化。 这不是很方便,您必须取消绑定/绑定,甚至在家用计算机上运行usbip控制台。 好吧,您只能在家中进行此操作(同样,RDP / VPN等),尤其是不能通过手机进行。 令人倍受争议的是,数字数据库必须以mdb格式(控制器程序可以在Access中上载数据)和网络版本进行维护。

流利地搜索Doorhan GSM协议是行不通的。 但是,我不排除这是Doorhan品牌下的某种中文设备。 因此,他为COM端口配备了一个监视器(嗅探器),并在从原始应用程序工作时进行了几次转储。



有类似的东西:
内存aa 02 09 00 00 03 e8 01 00 00 00 00 ee命令aa 02 09 00 00 03 e8 01 00 00 00 00 ee
答案是一切都顺利进行aa 20 00 ee
团队记录一个号码+79999999999
aa 03 10 00 01 2b 37 39 39 39 39 39 39 39 39 39 39 00 00 ee

他从中得出以下结论:
发送AA开始,发送EE结束
答案是该团队被接受20 00
开始记录数字03的命令。然后是包装中的数字。 它可以是1到5,即对于一个包裹,您可以连续一次发送多个号码,使用EE命令完成包裹,然后每块获得一个确认。

在开始记录的命令后,有2个字节(确切地说是第二个字节,当数字的数目大于256但未检查时,可能会使用第一个字节)来指示单元中记录的序列号。 也就是说,如果您写入空内存,则首先是1,然后是2,依此类推。 然后是电话号码的14个字节。 由于我们的数字“包含”在12个字节中(+79999999999),因此最后2个字节为零。 可能适用于各种国际格式,例如+10。 这是不准确的,我没有深入研究,因为此数据已足够。

字节EE发送结束。

对于单元的序列号,情况还不完全清楚。 假设有10个数字被写入控制器,但内存未被清除。 如果发送命令“在单元格5中写入数字”,则控制减法后此单元格中的数字将不会更改,但控制器将记录11个数字,而第11个数字将为空。 如果您输入命令“在单元格11中写入数字”,则将其写入其中。 这可能是由于可以通过SMS发送的ADD和REPLACE(添加和更改)命令。 但是,由于原始应用程序仅完成擦除操作并随后重写了列表,因此无法验证该假设。 因此,他还通过向一个数字发送擦除和顺序写入命令来简化版本(为简单起见)。

因此,我们来编写命令来通过串行端口管理控制器的订户列表。 但是端口在路由器中,而数据库和用户在外部服务器上。 当然,您可以将其传输到路由器(“开箱即用”即可获得完整的解决方案),但是我太懒了。 我走了另一条路-我使用openwrt软件包中的ser2net软件包在tcp上扔了/ dev / ttyUSB0。

配置/etc/ser2net.conf对于不雅很简单

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

启动ser2net之后,您可以在端口3333上连接到telnet路由器并检查结果。

我想预约:重启路由器后,cat / dev / ttyUSB0突然无法工作。 那是当然的,但是我在控制台上写了垃圾。 我记得在路由器上进行实验时,我运行了minicom,它可能进行了端口初始化。 仅仅设置9600 8n1模式是行不通的,所以我花了点时间看一下哪个端口设置处于“工作”状态,并在rc.local中输入了初始化信息。

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

当然有些多余的内容,读者可能会予以纠正。 好吧,如果您在ser2net.conf中指定端口参数,则无法将stty数据包放在路由器上。

由于使用WEB界面在服务器上进行了这些操作,因此我们可以使用控制器控制台。 因此,我们将略微重写呼叫处理代码。 我用PHP编写。 显示所有代码很可惜(最后我不是程序员,我使用了教程中的插入内容),所以重点是:

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

我认为每个人都可以按照自己的喜好执行process_call,从将信息写入日志文件,创建照片/视频条目,然后通过Telegram机器人将其发送到他/她的配偶的手机,再通过团队将其发送到咖啡机或预热罗宋汤。

我将更详细地介绍sync_phones,因为它实现了Doorhan GSM控制器的“非公开”算法。 是的,小脸,我使用mysql而不是pdo或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'"); } ?> 

第5部分。结论


结果,我收到(编写)障碍物的WEB界面,在这里我可以通过移动浏览器浏览,添加/删除/更改那里的房屋居民的号码,做笔记,并参考公寓,姓名,电话号码,汽车号码。 有汽车的照片,通过障碍物的进入日志和照片。 将来,根据日志,我将看到谁在障碍物上造成了最大的负担-他将支付维修费用:)

好吧,奖金是房子附近停车场的WIFI点。

发行价为0卢布,请假一天。

Source: https://habr.com/ru/post/zh-CN415805/


All Articles