一种现代高效的osc客户机/服务器实现
oscp的Python项目详细描述
紧密性
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文件。