基于_mq构建分布式认知应用的极简框架

Pabiana的Python项目详细描述


Build Status

帕比亚纳

智能家居由各种远程控制设备和传感器组成,所有这些设备和传感器都具有独特的接口。 这些设备可以通过应用程序手动控制,也可以通过基于传感器输入的自适应算法控制。 要从软件中进行控制,这些接口中的每一个都必须用代码表示。 这就要求一个特别的模块化软件设计是可维护的。 此外,大型智能家庭的物理距离需要一个分布式控制系统

处理和集成来自不同来源和类型的传感器输入,并根据结果控制多个设备,包括反馈回路,可以很快变得非常复杂。 A^ {EM1}层次数据处理模型EME>可以将复杂度限制在可管理的程度。 另一方面,分层系统控制模型可以实现对多个半自治系统的稳定监控。

pabiana是一个极简的python框架,它允许您构建符合这些原则的软件。 应用程序由许多并行运行的子模块组成,这些子模块分布在多个节点上。 然而,这些模块是紧密相连的。 恒定的消息流作为一种通信手段在它们之间传递。 网络上的消息传递由mq库处理。

除了家庭自动化系统,pabiana还可以用于开发智能助手、机器人控制系统或任何其他基于感官输入控制执行器的软件。

安装

pabiana目前使用python≥3.5进行测试。 它托管在pypi上。 要将pabiana集成到您的项目中,您可以使用以下命令安装它:

pip install --upgrade pabiana

建议对项目使用虚拟环境。

应用程序设计

开发pabiana应用程序的第一步是考虑应用程序将被拆分到的不同子模块。 在层次结构的底部,您通常会找到用于不同通信媒体的I/O模块。 一个模块可能负责http,另一个模块负责uhf无线信号,第三个模块负责音频信号。 这些模块强烈依赖于操作系统提供的驱动程序等资源。 但是,它们相当通用,可以在应用程序之间共享。 如果在通信介质中出现重要的反馈回路,在并行运行的两个模块之间分割输入和输出可能是有意义的。

上层模块接收下层模块的输入。 他们整合了来自不同传播媒介的信息,以及随着时间的推移。 这些模块负责表示现实并跟踪其状态。 对于家庭自动化系统,在这一层中,您可以为每个重要的现实设备创建单独的模块。

顶层模块监控底层模块的操作和状态,并在必要时进行干预。 它们实现复杂的逻辑来协调设备之间的交互。

用法

运行pabiana模块的进程称为areas。每个区域可以发布消息、订阅消息、触发其他区域的过程和接收触发器调用。要启动区域,必须使用以下命令:

python -m pabiana module_name:area_name

要使此命令工作,必须在工作目录中提供一个名为interfaces.json的json文件,指定应用程序所有区域的两个网络接口的地址。 此文件的结构如下:

{
    "area1-pub": {"ip": "127.0.0.1", "port": 10001},
    "area1-rcv": {"ip": "127.0.0.1", "port": 10002},
    "area2-pub": {"ip": "127.0.0.1", "port": 10003},
    "area2-rcv": {"ip": "127.0.0.1", "port": 10004, "host": "0.0.0.0"}
}

在当前的工作目录中,还必须有一个类似于模块的文件夹,其中包含一个名为__init__.py(python模块)的python文件。 在此文件中,您将定义该区域的功能。

from pabiana import Area, repo

area = Area(repo['area-name'], repo['interfaces'])
config = {
    'subscriptions': {'area2': ['ran', 'dom']}
}

@area.alteration(source='area2', slot='ran')
def input(recent, complete):
    print(recent)

@area.register
def procedure(parameter):
    area.publish({'foo': 'bar'}, slot='important')

这段代码创建一个区域,该区域将监听来自两个插槽上area2的消息。 如果它从area2接收消息,它将优先新台币。 需要注意的是,消息在一起处理之前会排队一段时间。 过程被定义为从其他区域调用。 忽略过程的返回值。 建议为消息处理程序和过程创建单独的文件。

如果模块需要第三方库,则可以在模块目录中的requirements.txt文件中指定它。 指定的库将在启动时通过pip安装。 包含此功能是为了支持在不同平台上自动部署应用程序。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何从java中链接到数组的数组中删除值。jar文件?   性能记录屏幕Java磁盘速度   java Elastic APM Tomcat zip文件或JAR清单丢失   java无法在eclipse控制台上打印结果   java如何在Android中解析json对象?   java如何更改边缘根类型   java根据一些规则替换EditText中的字母   java项目反应器:是否有类似Nosideeffect finally的方法(不是sideeffect方法doFinally)   java连接Cassandra节点和spark   开源Java作业调度器:远程处理、负载平衡、故障切换、依赖DAG?   使用矢量汇编程序(Java)在Spark中设置输入和输出时出现问题   swing如何在Java中为文本字段创建右键单击菜单?   java查找最近的邻居/纬度和经度   java计算完成的数独板的行和列