简单的设备发现与网络服务
我有一个自定义的嵌入式硬件设备,它运行着Linux系统,并且是通过Python代码来控制的。我想创建一个Android客户端,这个客户端能够自动在本地网络上找到我的设备,配置这些设备,并显示它们的数据。
我希望我的实现尽可能简单,并且尽量利用开源软件来快速实现(我更倾向于使用那些有积极维护和支持的代码)。
到目前为止,我的研究让我倾向于使用UPnP,通过SSDP来找到我的设备,并让UPnP通过SOAP在我的Android客户端和Python控制的Linux设备之间进行通信。
- UPnP适合我的这个用例吗(我并不是一个传统的UPnP设备)?或者还有其他基于标准的方法我应该考虑吗?
- 假设UPnP是合理的:
- (a) 在Android和我的Python/Linux设备上,有哪些合适的库可以使用?
- (b) 我应该实现一个自定义的UPnP“设备”,还是应该尝试把我的解决方案硬塞进看起来像一个媒体服务器?
目前,我正在尝试在Android端使用Cling,在Python端使用Coherence,但这两个库的使用都没有我想象中那么简单,这让我开始怀疑我是否在采取一个聪明的做法。
1 个回答
1
使用UPnP来做这个没有问题。这里有两个问题,虽然相关但还是独立的:
- 你怎么发现服务?SSDP是一种有效的技术,zeroconf也是:我不知道Android上有没有实现,但我想应该会有。
- 一旦找到URI,你怎么暴露你的API?UPnP现在有点过时了,但仍然很好用,如果你用一个不错的库,操作起来简单又强大。根据你的需求,你也可以选择像普通的REST网络服务,或者使用SOAP,而不必麻烦UPnP。
这两个问题是否真的无关,取决于你使用的库——我不知道比如Cling是否允许你只用SSDP来处理非UPnP的情况。
关于UPnP的问题:
(a) 我对Android方面不太熟悉,但对于Linux的UPnP,我建议使用GUPnP(我有点偏见,因为我参与了它的开发):这是一个稳定且经过良好测试的库。Python的绑定文档没有那么完善,但是存在的:
from gi.repository import GUPnP
。如果你想,GUPnP也可以只用SSDP:可以看看GSSDP库。(b) 如果找不到合适的现成设备,肯定要自定义设备,这正是UPnP设计的初衷。在GUPnP的情况下,你需要编写设备和服务的描述(用xml格式,可以在源代码中找到示例),然后用RootDevice加载它们。这会处理设备/服务的发现和描述文档的托管。然后你只需要实现你在服务描述中定义的操作。