一种现代高效的osc客户机/服务器实现

oscp的Python项目详细描述


紧密性

Coverage StatusBuild Status

python2/3中osc的现代实现。

什么是OSC。

opensoundcontrol是一个基于udp的网络协议,它是为快速 顾名思义,它是设计用来发送时间敏感信息的 作为MIDI的替代品,但也适用于其他情况。协议是 简单易用,osc地址看起来像httpurl,并接受各种基本的 类型,如string、float、int等,基本上可以认为它是 http post,开销更小。

您可以在OpenSoundControl.org上了解有关OSC的更多信息

目标

  • python2.7/3.6+兼容性(可以在python3侧放松更多 如果需要,但不支持2.7之前的内容)
  • 易于使用
  • 健壮(在消息格式错误的情况下返回有意义的错误, 总是在正确的信息上做正确的事情)
  • 关注点分离(消息解析与通信)
  • 同步和异步兼容性(线程、异步、三元组…)
  • 清晰易读的代码

功能
  • 序列化和分析OSC数据类型/消息/捆绑包
  • 一个基于线程的udp服务器,用于打开套接字并在其上的osc地址上绑定回调
  • 一个简单的客户

安装

pip install oscpy

用法

服务器(线程)

fromoscpy.serverimportOSCThreadServerfromtimeimportsleepdefcallback(values):print("got values: {}".format(values))osc=OSCThreadServer()sock=osc.listen(address='0.0.0.0',port=8000,default=True)osc.bind(b'/address',callback)sleep(1000)osc.stop()

或者可以使用decorator api。

服务器(线程)

fromoscpy.serverimportOSCThreadServerfromtimeimportsleeposc=OSCThreadServer()sock=osc.listen(address='0.0.0.0',port=8000,default=True)@osc.address(b'/address')defcallback(values):print("got values: {}".format(values))sleep(1000)osc.stop()

服务器也是客户机,从某种意义上说,它们可以发送消息并响应 来自其他服务器的消息

fromoscpy.serverimportOSCThreadServerfromtimeimportsleeposc_1=OSCThreadServer()osc_1.listen(default=True)@osc_1.address(b'/ping')defping(*values):print("ping called")ifTrueinvalues:cont.append(True)else:osc_1.answer(b'/pong')osc_2=OSCThreadServer()osc_2.listen(default=True)@osc_2.address(b'/pong')defpong(*values):print("pong called")osc_2.answer(b'/ping',[True])osc_2.send_message(b'/ping',[],*osc_1.getaddress())timeout=time()+1whilenotcont:iftime()>timeout:raiseOSError('timeout while waiting for success message.')

服务器(异步)(TOdo!)

fromoscpy.serverimportOSCThreadServerwithOSCAsyncServer(port=8000)asOSC:foraddress,valuesinOSC.listen():ifaddress==b'/example':print("got {} on /example".format(values))else:print("unknown address {}".format(address))

客户

fromoscpy.clientimportOSCClientosc=OSCClient(address,port)foriinrange(10):osc.send_message(b'/ping',[i])

Unicode编码

默认情况下,服务器和客户端采用字节(编码字符串),而不是Unicode 字符串,用于OSC地址以及OSC字符串。但是,您可以通过 encoding使字符串自动编码和解码的参数 它们,所以回调将得到unicode字符串(python2中的unicode,str in Python3)。

osc=OSCThreadServer(encoding='utf8')osc.listen(default=True)values=[]@osc.address(u'/encoded')defencoded(*val):forvinval:assertnotisinstance(v,bytes)values.append(val)send_message(u'/encoded',[u'hello world',u'ééééé ààààà'],*osc.getaddress(),encoding='utf8')

u为清楚起见,此处添加文字)。

cli

oscpy提供了一个“oscli”实用程序,以帮助调试:

  • oscli dump收听并转储消息
  • oscli send向服务器发送消息或捆绑包

有关详细信息,请参见oscli -h

待办事项

  • 对timetag的真正支持(目前只支持可选的 丢弃延迟的捆绑包,而不是在将来延迟那些带有时间标签的捆绑包)
  • 支持其他参数类型
  • 面向异步的服务器实现
  • 示例和文档

贡献

查看我们的contribution guide并随时改进OSCPY。

许可证

OSCPY是根据麻省理工学院的许可条款发布的。 请参阅LICENSE.txt文件。

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

推荐PyPI第三方库


热门话题
JavaGWT:何时使用Lazydemelement?   Java中跟踪消失线程的多线程处理   java Springboot未能配置数据源:“url”,但我没有使用数据库   java为按钮生成随机位置   math Java:包含二项式系数计算的表达式   java通过AsyncTask传递参数   从路径错误创建java文件   高流量网站的性能播放框架、Java、Apache、PostgreSQL、JPA和Hibernate   java将4D矢量转换为长矢量   arraylist Java循环在没有任何错误的情况下终止   java正在制作一个计算器应用程序,希望在第二个片段中更新历史,但无法完成   java将信息从IntentService发送到Activity   java如何在游戏中插入大量实体!工作   javascript如何在ScriptEngineforJava中从数学中获得准确的结果?