2006/11/14

數位家庭產品初探 -- djmount

djmount 寫法跟 ushare 差異非常大,感覺它想通吃 c/c++ 的用心,不過造成我覺得兩份源碼不太相容(或說風格大不同)。另外,看半天有點累,因此明天或許先驗證 upnp 怎麼說的,再來看 libupnp. 我相信這兩個都要花不少時間。

content_dir 跟 ushare 的 cds 看來很像,不過分成 public(本檔) 與 private/protected 部份
UpnpSetMaxContentLength (MAX_CONTENT_LENGTH);

didl_object 怪了,跟 ushare 來比,似乎簡單不少,不過感覺 ushare 寫的比較易讀

djfs file system implementation for djmount

<mount> -+- devices
|
|- <devname> -+- .status -> ../.debug/<devname>/status
| |
| +- xxx -+- xxx
| | |- xxx
| | `- _search/
| |
| +- .metadata/ -+- xxx
| | `- xxx
| |
| `- _search/ -+- search_capabilities
| |- -+- ...
| `- ...
|
|- <devname>
|
`- .debug/

/*
* Warning : the libupnp API (UpnpOpenHttpGetEx,
* UpnpReadHttpGet ...) has strange prototypes for length
* and ranges : "int" is not sufficient for large files !
*/

UpnpOpenHttpGetEx(), UpnpReadHttpGet(), UpnpCloseHttpGet()


djmount 比較有「物件」的概念,這會是較優的寫法呢,還是讓源碼不易閱讀呢?
比較有關的檔除了上面的 device_list 之外,還有 service, upnp_util,共三個


device_list 這個檔跟 upnp 相關性還比較大些

UpnpSearchAsync(), UpnpDownloadUrlItem(), UpnpGetErrorMessage(), UpnpInit(), UpnpFinish(), UpnpGetServerIpAddress(), UpnpGetServerPort(), UpnpUnRegisterClient(), UpnpRegisterClient() <-- 這是 Control Point 在 EventHandlerCallback () 會看到底下的 event type UPNP_DISCOVERY_ADVERTISEMENT_ALIVE, UPNP_DISCOVERY_SEARCH_RESULT, UPNP_DISCOVERY_SEARCH_TIMEOUT, UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE, UPNP_CONTROL_ACTION_COMPLETE, UPNP_CONTROL_GET_VAR_COMPLETE. UPNP_EVENT_RECEIVED, UPNP_EVENT_SUBSCRIBE_COMPLETE, UPNP_EVENT_UNSUBSCRIBE_COMPLETE, UPNP_EVENT_RENEWAL_COMPLETE, UPNP_EVENT_AUTORENEWAL_FAILED, UPNP_EVENT_SUBSCRIPTION_EXPIRED, UPNP_EVENT_SUBSCRIPTION_REQUEST, UPNP_CONTROL_GET_VAR_REQUEST, UPNP_CONTROL_ACTION_REQUEST 後面三個會被忽略 upnp_util 裡則看到更多些

UPNP_DISCOVERY_ADVERTISEMENT_ALIVE,
UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE,
UPNP_DISCOVERY_SEARCH_RESULT,
UPNP_DISCOVERY_SEARCH_TIMEOUT,
/*
* SOAP Stuff
*/
UPNP_CONTROL_ACTION_REQUEST,
UPNP_CONTROL_ACTION_COMPLETE,
UPNP_CONTROL_GET_VAR_REQUEST,
UPNP_CONTROL_GET_VAR_COMPLETE,
/*
* GENA Stuff
*/
UPNP_EVENT_SUBSCRIPTION_REQUEST,
UPNP_EVENT_RECEIVED,
UPNP_EVENT_RENEWAL_COMPLETE,
UPNP_EVENT_SUBSCRIBE_COMPLETE,
UPNP_EVENT_UNSUBSCRIBE_COMPLETE,
UPNP_EVENT_AUTORENEWAL_FAILED,
UPNP_EVENT_SUBSCRIPTION_EXPIRED,

2 意見:

菠蘿麵包 提到...

今天在用另一台電腦來執行 djmount,發現一直跑不起來,後來問 Jason 才又記起以前搞過同樣的事情,記性真的很差。這邊特別寫下來供參考:

一、要執行 modprobe fuse
二、要有工具 fusermount
三、要 route add -net 239.0.0.0 netmask 255.0.0.0 dev eth0
四、檢查一下命令中的 mount point 是否存在
五、要以 root 執行命令

菠蘿麵包 提到...

在我的工作電腦裡,我有兩張網卡,一張是公司網路,一張是內部網路,若想把兩張網路切割開來,得自己修改 routing table 才行,請參考 route 命令。我的 route table 目前是:

# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 * 255.255.255.0 U 0 0 0 eth0
192.168.6.0 * 255.255.255.0 U 0 0 0 eth0
192.168.123.0 * 255.255.255.0 U 0 0 0 eth1
10.1.0.0 * 255.255.0.0 U 0 0 0 eth0
239.0.0.0 * 255.0.0.0 U 0 0 0 eth0
default 192.168.123.254 0.0.0.0 UG 0 0 0 eth1

對外走 eth1(default), 對內走 eth0, 搭配 route 239.0.0.0 可以抓到內部 upnp devices.