Python - 对程序设计的健全性检查

时间:2015-04-15 03:30:12

标签: python design-patterns publish-subscribe

我有一个像我这样的项目:

User
Interface
Interface Handler
Main
Network Handler
Networks
Elements Handler
Elements

接口是gui,主要是显而易见的,网络是元素的包装并定义它们的交互,元素是最小的组件。这是一个家庭安全/自动化程序,元素是像ZWave传感器,Android手机,灯光,电视等,网络包装在逻辑组,如ZWave或灯或站(Android手机,与IP网络摄像头一起使用,推动声音到他们通过Soundwire等)。

这就是问题 - 深入到项目中,它变得一团糟。我一直在使用这样的想法,即下面的层不能知道上面的层,但是上面可以知道下面的1层(除了对任何事物一无所知的接口)并且只能与它上面的层进行通信,并且通过只有抽象消息的pubsub进行通信可能是有趣的。下来,我只是使用对象方法调用,对象属性更改等。我正确地接近这个吗?一旦我开始实现复杂的交互,例如当传感器被触发并且远程警报处于活动状态时,会发生一系列事情:灯全部亮起,监视器切换到运动检测记录,发送带有拍照图片的电子邮件等。互动变得混乱,我已经下放到紧密结合的东西。当我试图松散地结合时,我最终基本上制作新语言,以便所有语言都用同一种语言。

一个核心问题是我有完全不同的元素。 ZWave通过OpenZWave说话,android站通过Zoneminder和/或soundwire说话,灯光通过http说话等等。我正确地接近这个吗?我应该建模一个更好的通用设计模式吗?感谢。

1 个答案:

答案 0 :(得分:0)

您可能希望选择所有元素都可以通过的消息传递协议,例如MQTT。这样,每个元素都可以订阅MQTT会话,并在发布与其有关的消息时采取适当的行动。

例如,每个设备在状态/#主题(status / living_room / window_1 - OK)上发生更改时都可以传达其状态。然后,系统的其他部分可以订阅状态主题,并在发生更改时做出相应的反应,例如status / living_room / window_1 - ALARM或类似内容。

您还可以使用设备主题向其他不会说同一种语言的设备发出命令。例如,一个命令/#主题,其中用户从网页输入以关闭灯光可能会发布命令/ living_room / light1 - OFF,而控制灯光的Zwave模块可以监听并对该消息进行操作。

查看MQTT消息的日志是查看系统中正在发生的事情的好方法,因为它是设备之间的对话,因为它们报告状态并相互交互。

MQTT在几乎所有平台上都得到了极好的支持。有Python,Arduino,PHP,JavaScript,Node.js,C / C ++,Java等客户端。