iobroker对现实游戏中任务的追求


大家好,哈布雷(Habré)上已经有几篇关于诸如“现实中的任务”之类的游戏自动化的文章( ...),我也想分享参与这样一个项目的经验。 早在2015年,我的朋友们决定在我们的城市组织一个逃生室任务“抢劫银行”。 他们知道我很喜欢各种各样的自动化技术,包括基于开源解决方案的“智能家居”等系统,因此他们要求组织游戏方面的帮助。 这个想法对我来说似乎很有趣,我同意-我想将自己的经验和解决方案用于比使公寓里的灯泡闪烁更有趣的事情。

我试图参与该项目的整个周期-从更改脚本到下一个运行任务,确定并修复错误,以及后续的改进。 我参观了我们城市的几场比赛(2015年可以用一只手指望),不是为了球迷,而是为了获得经验和逆向工程解决方案,组织者的反应清楚地表明了这一点。 但是在参加了莫斯科的比赛之后,我了解了“灾难”的真实范围,并且我真的希望自己的工作不比技术方面更糟糕。 因此,在特维尔寻求“抢劫银行”,以了解如何在几年的时间里创建和发展银行的细节,我要求提供帮助。

技术解决方案说明


在我的同事们用手指向我解释了他们的需求以及一切应该如何工作之后,在我脑海中,几分钟之内就形成了架构:带有ioBroker平台的中央服务器,基于Arduino板和模块的本地控制器,与服务器和使用MQTT协议的控制器之间。 结果,该体系结构大致如下:


除了任务控制器与中央服务器的交互之外,还必须在不同任务任务的控制器之间建立交互。 在我看来,为此,在中央服务器上带有代理的MQTT协议是最合适的。 客户端-控制器将其状态发布到服务器,订阅来自服务器的命令以及其他控制器的状态。 为了实现此解决方案,使用了MQTT适配器-它也是一个MQTT代理,它允许您在ioBroker对象树中创建主题层次结构,以使用数据进行可视化和管理(“管理面板”旧版本下的屏幕截图)。


随后,我不后悔选择了这样的解决方案:

  1. MQTT是一种轻量级的协议,该库仅占用很小的空间,甚至对于带有ATmega328芯片的Arduino UNO来说也绰绰有余
  2. 首次重新启动或打开控制器时,他们收到了使用MQTT进行工作的初始条件-非常方便
  3. 事实证明,该解决方案是最可靠的解决方案,对于初学者而言,实施和学习非常简单

数据流仅获得一些选项,其中最简单的是-事件发生在1号任务控制器中(按下按钮),它以特​​定主题发布按钮状态,并通过更改操作员视觉形式上图形元素的颜色来显示其状态。


同样简单而相反的选择是,您需要通过1号任务控制器手动打开继电器,通过VIS适配器提供控制事件,该适配器会更改此控制器主题的状态,并且ask = false。 MQTT适配器接收到带有Ask = false的主题更改,因此该主题没有从控制器到达,该更改已发布到控制器,该控制器随后在响应中发布带有Ask = true的确认。


控制器间交换发生在控制器之一上的事件上。 例如,第一个控制器已完成其任务,必须打开第二个控制器上的中继-它在常规主题中发布其状态,代理将其显示在树中和可视化页面上,因为第二个控制器已订阅该主题,代理将其发布给第二个控制器,后者反过来发布确认答复。


该项目仍然必须添加与计算机交互的任务。 该界面是用php编写的,该页面在具有全屏浏览器模式下自动运行的Web服务器上旋转。 与主系统的集成是使用simple-api驱动程序进行的-ioBroker的某些php请求只是通过php来抽动。 系统单元本身隐藏在办公桌的肠子中,界面由鼠标控制,任务分配器配有无线键盘。

操作员的可视化是在VIS驱动程序中为一种分辨率(即操作员的监视器)开发的,但随后探员可以使用具有相同界面的移动平板电脑,事实证明重置该位置很方便,以准备进行新游戏和诊断系统。 界面原来是Spartan,没有时尚的仪表板和ryushek开关,但易于理解,简单且快速。 界面中不需要特殊的逻辑,层,图形或其他任何内容,仅需要用于显示设备状态的图标,用于控制的按钮以及几个用于显示控制器的操作模式和系统操作日志的文本字段。


在项目开发时,没有其他可视化设计选项。 后来,可视化适配器出现在移动设备(我使用material )和固定式平板电脑/计算机上: habpanellovelacetileboard等。
主要逻辑已在控制器的代码中规定,但是常规交互,启动参数的初始化,服务功能等是使用javascript适配器在主服务器上实现的。 该代码使用内置的ioBroker 函数以JS编写,然后进行“移动”以阻止运行 (此功能出现在项目开始工作之后)。


总共涉及几个脚本:

  1. 用于初始系统初始化的脚本(首次包含)
  2. 下一个游戏之前重置所有控制器的脚本
  3. 其中一个控制器没有立即“移动”到MQTT,因此一段时间以来,使用脚本通过HTTP与GET进行交换-GET请求
  4. 用于维护游戏日志的脚本

所有基于Arduino UNO板的控制器(后来必须将多个控制器转换为Arduino MEGA板-内存不足)都配备了基于W5100芯片的以太网扩展卡。 使用MQTT协议在控制器和服务器之间进行数据交换(如上所述)。 Arduino IDE中的算法开发是使用标准库进行的。 在铁方面,没有什么超自然的东西-最大限度地使用现成的模块和扩展卡,并且焊接最少,并且无需制造定制板,所有这些都在面包板上。 通过具有常规和固态继电器的模块,用于LED指示器的晶体管开关和低功率负载进行负载管理。 在机械部分,我尝试使用尽可能少的可移动元件:微动开关,按钮,E / M锁,并使用现成的LED光电二极管模块(开放式光电耦合器),固态继电器,常规磁锁,感应卡读取器和干簧传感器。 以下几张照片:





现场控制器通过自制的POE适配器供电-双绞线电缆使用空闲的核心来广播12V DC。 通过高达5V的现成DC-DC卡在控制器卡上进行转换-Arduino +以太网板本身以及具有5V逻辑的低功率负载被馈入:低电流LED,继电器等。更强大的12V负载:电磁锁,强大的继电器或接触器,各种照明设备-单独的电缆线与滚珠丝杠或PVA电线一起使用。 将两个220V交流输入引入主自动化机柜,并通过接触器上的接触器连接UPS,然后通过旁路将其连接,以简化维护。 为了给所有自动化和低压供电,机柜中安装了功能强大的2伏电源,其中2 x 12V,1 x 5V。 他们从自动化机柜中启动了220V电缆线,用于为计算机和任务的各种外围设备供电:从吹气到viu-viu))



其余解决方案是此类项目的相当标准。 有线IP摄像机上的视频监视系统,始终带有红外照明和内置麦克风。 视频流用于一项任务任务,并在任务管理器的PC上进行额外处理;使用开源软件(ZoneMinder)。 Arduino控制器的本地网络与其余网络分开,因此来自摄像头的流不会加载已经很弱的以太网板W5100芯片。

使用传统的苏联放大器和内置吸顶扬声器,游戏参与者可以免提。

最后,我想描述一个小的中央服务器。 ioBroker平台部署在BananaPi ARM单板上,其强大功能足以应付所有任务。 环境是Armbian操作系统,它是一些bash脚本,用于使用GPIO并在Yandex.Disk上创建到云的备份。 几个GPIO用于指示各个模块和适配器(LED)的操作状态,以及用于正确关闭系统的按钮。 在上面的19英寸机柜的照片中,可以看到该板位于标准的便宜有机玻璃外壳中;后来,它被安装在具有正常电源和其他外围设备的1U外壳中。

错误,陷阱,困难


我和我的同事提前很想好基本架构(我完成了项目),并且“在桌面上”组装并测试了许多节点,因此没有任何根本性的变化。 较小的“粗糙度”当场固定。 解决这些主要问题花费了很多时间:

  1. 缺少328芯片上的Arduino内存,转移到Arduino MEGA板上。 可以预料的要依靠芯片存储器中的某些控制器。 大部分时间都花在返修扩展卡上。
  2. ioBroker项目的作者很快解决了使用MQTT驱动程序的毛刺。
  3. 在VIS驱动程序中为正常可视化选择浏览器的过程漫长而艰巨。 事实证明,使用此适配器很困难。 结果,在Chrome浏览器中进行了编辑,并且运行时操作员通过Dragon浏览器启动了特定版本。 由于漏洞已得到修复,因此它们完全移至了最新的Chrome浏览器。
  4. 逐步创建防破坏解决方案-废弃的微动开关,机械按钮和按钮,薄膜键盘等。
  5. Sheriff电动机械锁的质量很低;必须在当地用普通的电磁锁更换。
  6. 当使用IP摄像机工作时,Arduino控制器的运行不稳定,结果,网络被分割了,一切都按预期进行了。

结论


从研究方案并就方案达成共识到启动第一个测试组,整个项目花费了大约六个月的时间-很多,但这是第一次体验,而且我几乎跟上了建筑/维修房屋的主要工作。 另外,还有很多工作要做–主要是在使用单独的Arduino模块时,因为它们不能完全按照我的预期工作。 在实施项目时,我们尽可能地遵循以下原则:

  1. 该项目涉及任何工程师的维护和小修,他们至少一次将烙铁拿在手中,知道Arduino是什么,并且能够“闪烁”焊接在板上的LED。
  2. 使用标准库在Arduino IDE中进行开发,以实现最大程度的简化。
  3. 在项目中最大限度地使用现成的通用模块,以便于维护和更换
  4. 使用标准协议和数据网络
  5. 减少机械零件的数量,以提高耐用性和防破坏能力。

结果,在最初的几周内,它消除了所有小的缺陷,现在该系统已经在几乎最初的环境中工作了近4年。

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


All Articles