前一段时间,看到一个新闻,竟然光天化日,朗朗乾坤下,居然有人抢孩子,以前是拐卖,现在就开始明抢了!好可怕….
正好项目中遇到了手机基站的一些原理,那今天就在这里分享一下,现在穿戴设备这么发达,如果能有效地利用,说不定能对孩子及时的寻找,起到帮助,同时也是一大商机不是。
什么是基站:简单的说就是我们打电话能连接的信号塔,现在覆盖范围城市里基本达到了一个小区就有一个了。
那么也就是说,你跟踪的范围就是一个小区的范围之内了。
需要工具:能插手机卡的设备(小手机就可以),手机卡(能发信息)
我的实现方式:利用获得的基站信息,根据设定的合适时间发送消息给特定的人(不直接再设备上定位,因为可能没网络,当然有了你的基站位置,警察叔叔的系统很快的分析出你的位置,根据你的基站,分析出嫌疑人使用的基站,还能进行监听…)
那么先来看看效果:
电信手机展示效果
联通、移动展示效果
发送消息:
接受消息:
当然要还要知道各大运营商代码:
46000 中国移动 (GSM)
46001 中国联通 (GSM)
46002 中国移动 (TD-S)
46003 中国电信(CDMA)
46004 空(似乎是专门用来做测试的)
46005 中国电信 (CDMA)
46006 中国联通 (WCDMA)
46007 中国移动 (TD-S)
46008
46009
46010
46011 中国电信 (FDD-LTE)
到这里准备工作完成,开始代码:
一、首先获得运营商:
得到TelephonyManager
tm = (TelephonyManager) UIUtils.getContext().getSystemService(Context.TELEPHONY_SERVICE);
使用它的getNetworkOperatorName方法
tvOperator.setText(PhoneInfo.getTelephonyManager().getNetworkOperatorName());
二、获得网络:
package cn.hnshangyu.basestationdemo.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
/**
* 获取网络连接的工具类
*/
public class IntenetUtil {
//没有网络连接
public static final String NETWORN_NONE = "NONE";
//wifi连接
public static final String NETWORN_WIFI = "WIFI";
//手机网络数据连接类型
public static final String NETWORN_MOBILE = "MOBILE";
/**
* 获取当前网络连接类型
*
* @param context
* @return
*/
public static String getNetworkState(Context context) {
//获取系统的网络服务
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//如果当前没有网络
if (null == connManager)
return NETWORN_NONE;
//获取当前网络类型,如果为空,返回无网络
NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo();
if (activeNetInfo == null || !activeNetInfo.isAvailable()) {
return NETWORN_NONE;
}
// 判断是不是连接的是不是wifi
NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (null != wifiInfo) {
NetworkInfo.State state = wifiInfo.getState();
if (null != state)
if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
return NETWORN_WIFI;
}
}
// 如果不是wifi,则判断当前连接的是运营商的哪种网络2g、3g、4g等
NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (null != networkInfo) {
NetworkInfo.State state = networkInfo.getState();
String strSubTypeName = networkInfo.getSubtypeName();
if (null != state)
if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
switch (activeNetInfo.getSubtype()) {
//如果是2g类型
case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
return "GPRS";
case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
return "CDMA";
case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
return "EDGE";
case TelephonyManager.NETWORK_TYPE_1xRTT:
return "1xRTT";
case TelephonyManager.NETWORK_TYPE_IDEN:
return "IDEN";
//如果是3g类型
case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
return "EVDO_A";
case TelephonyManager.NETWORK_TYPE_UMTS:
return "UMTS";
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return "EVDO_0";
case TelephonyManager.NETWORK_TYPE_HSDPA:
return "HSDPA";
case TelephonyManager.NETWORK_TYPE_HSUPA:
return "HSUPA";
case TelephonyManager.NETWORK_TYPE_HSPA:
return "HSPA";
case TelephonyManager.NETWORK_TYPE_EVDO_B:
return "EVDO_B";
case TelephonyManager.NETWORK_TYPE_EHRPD:
return "EHRPD";
case TelephonyManager.NETWORK_TYPE_HSPAP:
return "IDEN";
//如果是4g类型
case TelephonyManager.NETWORK_TYPE_LTE:
return "LTE";
default:
//中国移动 联通 电信 三种3G制式
if (strSubTypeName.equalsIgnoreCase("TD-SCDMA")) {
return "TD-SCDMA";
} else if (strSubTypeName.equalsIgnoreCase("WCDMA")) {
return "WCDMA";
} else if (strSubTypeName.equalsIgnoreCase("CDMA2000")) {
return "CDMA2000";
} else {
return NETWORN_MOBILE;
}
}
}
}
return NETWORN_NONE;
}
}
tvNetwork.setText(IntenetUtil.getNetworkState(this));
三、获取460代码:
tm = (TelephonyManager) UIUtils.getContext().getSystemService(Context.TELEPHONY_SERVICE);
networkOperator = PhoneInfo.getTelephonyManager().getNetworkOperator();
if (networkOperator.startsWith("46000") || networkOperator.startsWith("46002")) {
//"中国移动";
showDatasMoeAndLink();
type = 1;
} else if (networkOperator.startsWith("46001")) {
//"中国联通";
showDatasMoeAndLink();
type = 1;
} else if (networkOperator.startsWith("46003") || networkOperator.startsWith("46011")) {//46003电信3G ,46011电信4G
//"中国电信";
showDatasTelecom();
type = 2;
}
四、获得中国移动和联通的基站信息
/**
* 如果是中国移动和联通
*/
private void showDatasMoeAndLink() {
llLacd.setVisibility(View.VISIBLE);
llLach.setVisibility(View.VISIBLE);
llSidd.setVisibility(View.GONE);
llSidh.setVisibility(View.GONE);
gcl = (GsmCellLocation) PhoneInfo.getTelephonyManager().getCellLocation();
lac = gcl.getLac();
cid = gcl.getCid();
tvLacd.setText(String.valueOf(lac));
tvLach.setText(Integer.toHexString(lac));
tvCid.setText(String.valueOf(cid));
tvCih.setText(Integer.toHexString(cid));
// mhandler.sendEmptyMessageDelayed(88, 10 * 1000);
}
五、获得中国电信的基站信息
/**
* 如果是中国电信
*/
private void showDatasTelecom() {
llLacd.setVisibility(View.GONE);
llLach.setVisibility(View.GONE);
llSidd.setVisibility(View.VISIBLE);
llSidh.setVisibility(View.VISIBLE);
ccl = (CdmaCellLocation) PhoneInfo.getTelephonyManager().getCellLocation();
sid = ccl.getSystemId();
nid = ccl.getNetworkId();
bid = ccl.getBaseStationId();
tvSidd.setText(String.valueOf(sid));
tvSidh.setText(Integer.toHexString(sid));
tvBidd.setText(String.valueOf(bid));
tvBidh.setText(Integer.toHexString(bid));
tvNidd.setText(String.valueOf(nid));
tvNidh.setText(Integer.toHexString(nid));
// mhandler.sendEmptyMessageDelayed(88, 10 * 1000);
}
六、发信息:
private void sendSms() {
smsManager = SmsManager.getDefault();
if (type == 1) {//是中国移动和联通
smsManager.sendTextMessage("187****8566", null, "mcc=" + mcc + ",mnc=" + mnc + ",lac=" + lac +
",cid=" + cid, null, null);
} else if (type == 2) {//是中国电信
smsManager.sendTextMessage("187****8566", null, "mcc=" + mcc + ",mnc=" + mnc + ",sid=" + sid +
",nid=" + nid + ",bid=" + bid, null, null);
Log.e("LogUtils","sendTextMessage,sendTextMessage,sendTextMessage");
}
}
七、权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
好了基本核心功能就是这了,当然如果需要直接定位的的可以用Google的接口,不过一般使用基站定位都用的是自己后台接口(用谷歌还不如直接用地图了,还方便….)
有什么不足望大家指出,谢谢….
demo下载地址:http://download.csdn.net/download/huangxiaoguo1/9715542