2014-04-25 82 views
0

我有一個定製的嵌入式硬件設備,運行由Python代碼控制的Linux。我想創建一個Android客戶端,它將自動在本地網絡上找到我的任何設備,配置設備並顯示它們中的數據。簡單設備發現和Web服務

我希望保持我的實現儘可能簡單,並儘可能多地利用開源軟件來實現快速實施(強烈偏好主動維護/支持代碼)。

我的研究,到目前爲止已導致我贊成的UPnP實現,採用SSDP找到我的設備,並讓UPnP的通信通過我的Android客戶端和Python控制Linux設備之間的SOAP

  1. UPnP是這個用例的一個不錯的選擇(我不是傳統的UPNP設備)嗎?或者我應該考慮其他基於標準的方法嗎?
  2. 假設UPnP是合理的:
    • (a)在Android和我的Python/Linux設備上使用什麼合理的庫?
    • (b)我應該實現一個自定義的UPNP「設備」嗎?還是應該試着將我的解決方案放到像媒體服務器一樣的位置?

目前,我試圖在Python端,無論是其中已經那麼簡單,因爲我本來希望使用Cling在Android端和Coherence實施,這使我懷疑我採取聰明的做法。

回答

1

使用UPnP沒有任何問題。這裏有兩個問題 - 相關但仍獨立:

  • 如何發現服務? SSDP是一種有效的技術,但zeroconf也是如此:我沒有意識到Android的實現,但我認爲它會存在。
  • 一旦發現uri,你如何暴露你的API?到目前爲止,UPnP已經有點老派了,但工作得很好,如果你使用了一個體面的圖書館,它很容易,但功能非常強大。根據您的需要,您可以使用類似普通REST web服務的東西,或者使用SOAP,而不用擔心使用UPnP。

這些問題是否真的不相關取決於你使用的庫 - 我不知道,例如, Cling允許您僅使用SSDP來處理非UPnP用例。

  1. 對於UPnP的問題:

    • (一)我不是很熟悉Android的一面,但對Linux的UPnP我建議GUPnP(我有偏見,雖然,因爲我m參與其發展):這是一個穩定和經過良好測試的圖書館。 Python綁定沒有像他們應該記錄的那麼好,但它們存在:from gi.repository import GUPnP。 GUPnP還讓你只需要SSDP:參見GSSDP庫。

    • (b)如果你找不到一個好的現有匹配,這絕對是自定義設備,這就是UPnP的設計目的。在GUPnP的情況下,您將編寫設備和服務描述(在xml中,請參閱源文件中的示例)並使用RootDevice加載它們。這需要處理設備/服務發現並託管描述文檔。然後,您只需要實施您在服務描述中的操作即可。

+0

謝謝。好信息。沒有考慮零配置。考慮過REST。 GUPnP很有趣,但我想限制Java和Python的語言數量。如果我可以在GUPnP中用XML完全實現並運行一個可執行文件,我會考慮這個問題,但看起來我仍然需要[編寫代碼](https://developer.gnome.org/gupnp/unstable/server- tutorial.html)。 – proximous

+0

只是爲了澄清:你可以用GUPnP在Python中實現一個UPnP服務(參考文檔只存在於C中)。只用XML實現一個服務實際上並不合理 - 你無法以這種方式實現任何非平凡的服務。 – jku

+0

感謝您的澄清。 UPnP和Cling都變得比我希望的更復雜,所以我目前正在使用REST和zeroconfig。如果這樣做,我會在幾天內接受你的答案,因爲它似乎是正確的建議。謝謝! – proximous