透過 Google 提供的 geolocation 服務, 可以讓我們即便沒有 GPS device
也可以得到我們所在地的經緯度 既然沒有 GPS 裝置 當然也就不需要去實作 HAL
所有的一切都可以在 APP 層完成 只要我們將無線網路所得到的週邊 Access Point 的 mac address
或是將附近基地台的 cell id(ci) 包起來 送出 request 到 www.google.com/loc/json
順利的話 收到的 response 裡就包含了 latitude 及 longitude
只是單純為了嘗試實作 GPS HAL 的想法 所以我將上述的東西搬到底層的 HAL 函式庫
讓上層的 framework 真的以為有 GPS device 的存在 也真的可以得到定位座標
整個 GPS HAL 的架構 可以參考 include/hardware/gps.h 及 external/qemu/android/gps.c
簡單的建立四個 thread 第一個 thread 三不五時透過 wpa_supplicant 掃一下週邊的 AP mac address
第二個 thread 會去得到 main cell 的 ci 如果有成功註冊上基地台的話
第三個 thread 則是偶爾的把前兩個 thread 收集到的資料 透過 libcurl 送 http request 到 google
最後一個 thread 則是解析收到的 response 把得到的座標位置透過 callback func 作更新讓 framework 知道
這樣的作法可行 但是有些先天的限制 那就是一定要有網路 不管是現在普遍的 3G 上網或無線上網
而如果我們真的想要做到導航功能 利用周遭的 cell id 是目前的唯一作法而也是我現在遇到的瓶頸所在
3GPP 規範裡 我們可以得到的 ci 也就只有我們註冊上的 main cell 至於周遭的其他 towers 是各憑本事
有的是沒有提供相關的 at cmd 讓你查詢 有的則是功能上有所限制 也因此我們只能先從 main cell 下手
只是這樣的精準度會讓你想哭
至於在 Android 下除了 Phone 外的程式能不能和 rild 溝通又是另一個故事了
要注意的是 因為是 multi-thread 所以一些 function 的實作必須是 reentrant 的 同樣的去呼叫的 system call 也必須是 reentrant
例如 strtok_r() 是 strtok() 的 reentrant version
沒有留言:
張貼留言