异步访问Asterisk REST接口的库
项目描述
异步克隆自 https://github.com/asterisk/ari-py
使用swagger-py的异步版本
关于
此软件包包含Asterisk REST接口的Python客户端库。它基于Swagger.py库,提供改进的、针对Asterisk的特定API,该API由Swagger.py生成
使用
使用setup.py
脚本来从源代码安装。
$ sudo ./setup.py install
API
可以简单地通过 aioari.connect方法创建一个异步ARI客户端。这将根据从Asterisk下载的Swagger API创建一个客户端。
API被建模成仓储模式,就像你在领域驱动设计中找到的那样。每个Swagger资源(即API声明)都被映射到一个仓储对象,该对象作为客户端的一个字段提供(client.channels
、client.bridges
)。
来自Asterisk的响应被映射到一等对象,类似于仓储模式中的领域对象。这些对象既在RESTful API调用的响应中提供,也在通过WebSocket接收的事件的字段中提供。
制作REST调用
每个仓库对象都提供了调用相关Swagger资源(bridges.list(),channels.get())的非实例特定操作的方法。还提供了实例特定方法,这些方法需要传递身份参数(channels.get(channelId=id))。
在域对象上也提供了实例特定方法(some_channel.hangup())。
注册事件回调
Asterisk可能会通过WebSocket发送异步消息,以指示应用程序感兴趣的事件。
客户端对象有一个on_event方法,可以用来订阅来自Asterisk的特定事件。
一等对象也有“on_event”方法,可以订阅与该对象相关的Stasis事件。
对象生命周期
仓库对象存在的时间等于拥有它们的客户端的生命周期。
域对象是短暂的,不与Asterisk中底层对象的生命周期相关联。实际上,这意味着如果您多次调用channels.get('1234'),您可能会每次都得到不同的对象。
您可以保留一个域对象实例,但应将其视为过时的。对象中包含的数据可能已过时,但对象上的方法仍应正常工作。
如果您在不再存在于Asterisk中的过时域对象上调用方法,您将得到一个HTTPError异常(404未找到)。
注意事项
仓库和域对象暴露的动态方法实际上是远程过程调用。当前实现是同步的,这意味着如果响应变慢(网络慢、数据包丢失、系统负载等),则整个应用程序都可能受到影响。
示例
import asyncio
import aioari
client = await aioari.connect('http://localhost:8088/', 'hey', 'peekaboo')
def on_dtmf(channel, event):
digit = event['digit']
if digit == '#':
channel.play(media='sound:goodbye')
channel.continueInDialplan()
elif digit == '*':
channel.play(media='sound:asterisk-friend')
else:
channel.play(media='sound:digits/%s' % digit)
def on_start(channel, event):
channel.on_event('ChannelDtmfReceived', on_dtmf)
channel.answer()
channel.play(media='sound:hello-world')
client.on_channel_event('StasisStart', on_start)
loop = asyncio.get_event_loop()
loop.run_until_complete(client.run(apps="hello"))
开发
代码使用Sphinx进行文档编写,这允许IntelliJ IDEA更好地推断自动完成的类型。
为了保持独立,我还建议安装(并使用)virtualenv。
$ sudo pip install virtualenv $ mkdir -p ~/virtualenv $ virtualenv ~/virtualenv/ari $ . ~/virtualenv/ari/bin/activate
Setuptools用于构建。Nose用于单元测试,已安装coverage插件以生成代码覆盖率报告。通过传递--with-coverage生成代码覆盖率报告。报告的HTML版本位于cover/index.html。
$ ./setup.py develop # prep for development (install deps, launchers, etc.) $ ./setup.py nosetests # run unit tests $ ./setup.py bdist_egg # build distributable
待办事项
创建可以与Twisted、Tornado等一起使用的异步绑定。
添加对Python 3的支持
许可证
版权(c)2013-2014,Digium,Inc。版权(c)2016,Denis Fokin。版权(c)2018,Matthias Urlichs。
aioari使用BSD 3-Clause License授权。