Google Maps基站定位
(轉載至http://www.cnblogs.com/psunny/archive/2009/10/22/1587779.html)
若是你在你的手機裝過Google Mobile Maps,你就能夠發現只要你的手機能鏈接GPRS,即便沒有GPS功能,也能定位到你手機所在的位置, 只是精度不夠準確。在探討這個原理以前,咱們須要瞭解一些移動知識,瞭解什麼是MNC/LAC/Cell ID。php
Mobile Network Code(MNC)
移動網號碼,中國聯通CDMA系統的MNC爲03,中國移動的爲00。
css
Mobile Country Code(MCC)
移動用戶所屬國家代號:460
html
Location Area Code(LAC)
地區區域碼,用來劃分區域,通常一個小地方就一個LAC,大地方就
java
Cell Tower ID(Cell ID)
CellID表明一個移動基站,若是你有基站數據,查CellID你就能夠知道這個基站在哪裏,移動公司或者警察經過這個知道你是在哪一個基站範圍打的移動電話。git
這些信息有什麼用呢? 經過這些信息能夠知道你的手機是從哪一個國家,區域和哪一個基站接入移動網絡的。因此有些防盜手機丟失後,會發一些相似"MCC:460;MNC:01;LAC:7198:CELLID:24989"內容的短信到你指定號碼就是這個用途,經過這些信息能夠從移動查到你的被盜手機在哪裏出現過。不過知道了也沒用,中國人口這麼密集,就是在你身邊你也不知道誰是小偷:) es6
這些信息從哪裏來呢,通常的手機系統都提供相應的API來獲取這些信息(Tower Info),好比Window SmartPhone 或Mobile就是經過RIL.dll裏的API來取得,每一個手機操做系統不同,相關的信息能夠查相關資料。web
獲得了這些信息,若是沒有基站信息表,獲得了這些信息也不知道在哪,由於只有移動運營商有相關的信息,除非你是運營商或者警察才能獲得這些信息。是否是咱們就查不到相應的數據呢,固然不是,強大的Google就有,這裏就要提到Google Mobile Maps API,裏面囊括了比較全的基站信息,中國的也有,就是偏遠地區的有沒有就不知道了。Google Mobile Maps自己就是使用的這些信息,感興趣能夠試一試,沒有GPS模塊也能定位到你手機位置,但精度不大,取決於基站的位置離你多遠。
算法
一樣咱們本身也能夠開發相應的手機應用來定位,只要調用Google現成的API(Secret API)"http://www.google.com/glm/mmap「.spring
首先讀取你本身手機的CellID和LAC。windows
經過Http鏈接發送Post請求到http://www.google.com/glm/mmap。
傳入CellID和LAC參數,從API返回基站的經緯度(Latitude/Longitude)。
另外有個能夠參考的例子(windows mobile)http://www.codeproject.com/KB/mobile/DeepCast.aspx
下面是經過j2me獲取手機imei號碼和cellid(基站號)的例子
package jizhan;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class GetIMEIAndCellId extends MIDlet implements CommandListener {
private Command exitCommand = new Command("exit", Command.EXIT, 1);
Form form = new Form("imei and cellid");
Display display = null;
public GetIMEIAndCellId() {
display = Display.getDisplay(this);
}
protected void destroyApp(boolean arg0) {
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
//獲取系統信息
String info = System.getProperty("microedition.platform");
//獲取到imei號碼
String imei = "";
//cellid
String cellid = "";
//lac
String lac = "";
// #if polish.vendor==Sony-Ericsson
imei = System.getProperty("com.sonyericsson.imei");
//參考 http://forums.sun.com/thread.jspa?threadID=5278668
//https://developer.sonyericsson.com/message/110949
cellid = System.getProperty("com.sonyericsson.net.cellid");
//獲取索愛機子的
lac = System.getProperty("com.sonyericsson.net.lac");
// #else if polish.vendor==Nokia
imei = System.getProperty("phone.imei");
if (imei == null || "".equals(imei)) {
imei = System.getProperty("com.nokia.IMEI");
}
if (imei == null || "".equals(imei)) {
imei = System.getProperty("com.nokia.mid.imei");
}
//獲取到cellid
//參考http://wiki.forum.nokia.com/index.php/CS000947_-_Getting_Cell_ID_in_Java_ME
// #if polish.group==Series60
cellid = System.getProperty("com.nokia.mid.cellid");
// #else if polish.group==Series40
cellid = System.getProperty("Cell-ID");
// #endif
// #else if polish.vendor==Siemens
imei = System.getProperty("com.siemens.imei");
// #else if polish.vendor==Motorola
imei = System.getProperty("com.motorola.IMEI");
//cellid 參考 http://web.mit.edu/21w.780/www/spring2007/guide/
cellid = System.getProperty("CellID");
// #else if polish.vendor==Samsung
imei = System.getProperty("com.samsung.imei");
// #endif
if (imei == null || "".equals(imei)) {
imei = System.getProperty("IMEI");
}
//展現出來
form.append("platforminfo:" + info);
form.append("imei:" + imei);
form.append("cellid:" + cellid);
form.setCommandListener(this);
form.addCommand(exitCommand);
display.setCurrent(form);
}
public void commandAction(Command cmd, Displayable item) {
if (cmd == exitCommand) {
destroyApp(false);
notifyDestroyed();
}
}
}
須要注意的是,必須是受信任的Midlet才能夠取到這些數據。也就是說Midlet必須通過簽名上述代碼才能夠工做,不然獲取到的是NULL。。
下面是從別的地方看來的,沒作過測試,供參考。
a) Nokia = System.getProperty("com.nokia.mid.imei");
System.getProperty("com.nokia.IMEI");
System.getProperty("phone.imei");
b) Samsung
System.getProperty("com.samsung.imei");
c) Sony-Ericsson
System.getProperty("com.sonyericsson.imei");
IMSI: IMSI全稱是International Mobile Subscriber Identification Number,移動用戶身份碼。當手機開機後,在接入網絡的過程當中有一個註冊登記的過程,系統經過控制信道將經加密算法後的參數組傳送給客戶,手機中的 SIM卡收到參數後,與SIM卡存儲的客戶鑑權參數經一樣算法後對比,結果相同就容許接入,不然爲非法客戶,網絡拒絕爲此客戶服務。IMSI惟一的標誌了一個SIM卡。
IMEI: IMEI即International Mobile Equipment Identity(國際移動設備身份)的簡稱,也被稱爲串號,它惟一標誌了一臺移動設備,好比手機。 IMEI碼通常由15位數字組成,絕大多數的GSM手機只要按下「*#06#」,IMEI碼就會顯示出來。其格式以下: TAC即Type Approval Code,爲設備型號覈准號碼。FAC即Final Assembly Code,爲最後裝配號碼。 SNR即Serial Number,爲出廠序號。 SP即Spare Number,爲備用號碼。
有時候,咱們在應用中須要獲取IMSI或者IMEI號用於將應用程序和手機或SIM卡綁在一塊兒。獲取的方式在各不一樣廠商的各款手機上不盡相同,在motorola RAZR E6 上採用System.getProperty()獲取。相應程序代碼是:
String imei= System.getProperty("IMEI"); //for E6
if ( null == imei )
imei = System.getProperty("phone.IMEI");
String imsi = System.getProperty("IMSI"); //for E6
if ( null == imsi )
imei = System.getProperty("phone.IMSI");
g.drawString("IMEI: "+imei, 10, 50, Graphics.LEFT | Graphics.TOP);
g.drawString("IMSI: "+imsi, 10, 70, Graphics.LEFT | Graphics.TOP);