最近為了想實現device 2 device的auto discovery/communication ,特別去研究了bonjour/mdns,今天跑去GTUG時,試著想利用mdns從我的mbp找我的手機時一直不成功,起初還以為我程式有問題,抓了封包,卻找不到mdns的封包,後來才發現到,原來我手機連上的wireless ap跟mbp連上的是不同一台,雖然同屬同一家咖啡廳,但卻是不同的subnet,當然就收不到multicast的封包
有了這樣一個經驗後,當下就開始思考(哈,台上講的我老早就沒認真聽了),利用multicast做這樣的應用到底實不實用,雖然說不管是mdns也好,還是upnp用的ssdp,都還蠻適合這類應用的,而且它們都是以udp multicast來實作,但對mobile device而言,特色是不會固定attach在同一個network,ip也隨時在變,利用multicast的方式大概只有在同一個wifi網路之下比較適用,要做真正 decentralized device 2 device discovery好像有點難度
因此後來我又轉往另一個想法,geographical peer to peer,剛剛想了幾個簡單的想法,先寫下來
Why peer 2 peer?
其實只是很單純的想讓在同一區域的mobile devices可以不用透過某一個central server來交換資料,或是通訊,甚至達到類似c2dm的功效,所以想是個可以處理peer 2 peer communication的service,支援的application只需要跟它註冊服務資訊,收到的request就以broadcast intent的方式交給相關服務處理。
大部分的P2P network像是BitTorrent, Napster, Gnutella, eDonkey, Tor都是為了分享而存在, 也有像是Skype是為了通訊, 由於我最初的想法是想達到zero configuration的通訊跟分享, 所以第一方面就往這方向的機制去想, 當然也不是為了做一個像BitTorrent這樣規模的東西
Why geographical?
最早的想法是local share, 也就是在同一個區域, 比如說同一個房間, 同一間會議室裡的mobile device之間的相互分享溝通, 所以最早想到的是Bonjour類型(基於mDNS), 不過如前述, 問題就存在於這些裝置未必在同一個sub net, 甚至是有些未必是用wifi, 也有可能是3G
想到的作法是: 借用BUMP的作法來建立一個虛擬的區域網路, 這"區域"是實際地理位置上的區域, 而非一般的LAN, 現在的mobile device, 大多都有定位系統, 取得地理位置資訊並不難, BUMP的作法是將地理相關的資訊例如IP, GPS座標等等資訊傳送到Server, 藉以判定是哪兩台做互碰的動作, 我想同一個原理應該可以用來協助建立一個地理上的local network, BUMP是用於兩台不同device之間, 但同一個原理也應該適用來建立一個這樣的network
How?
剛在回家路上把想法畫了一個簡單的架構圖
分為幾個步驟:
- Check in: Device用目前的位置資訊如IP, GPS座標等等向Registry註冊
- Seeding: Registry server利用device傳回來的位置資訊找出實際地理範圍內最近註冊的幾個裝置(時間也是必要元素), 並回傳給device
- Discover: Device根據回傳的seed名單, 一個個訪問所有的Seed, 並取得他們所支援的services, 以及他們的鄰居, 並持續這動作直到network到一定大小或是沒任何的新鄰居
- Connect and communicate: 建立服務連線並取用服務
這是一個大體上的架構, 應該還有很多細節, 比如說像是notification when join network等等
應用?
想到的應用像是file/data sharing, gaming network, data sync between different devices, chat room等等…
這只是一個簡單的想法而已, 還沒去想得很完整, 也還沒想到是不是有啥缺陷