前一段时间,看到一个新闻,竟然光天化日,朗朗乾坤下,居然有人抢孩子,以前是拐卖,现在就开始明抢了!好可怕….

正好项目中遇到了手机基站的一些原理,那今天就在这里分享一下,现在穿戴设备这么发达,如果能有效地利用,说不定能对孩子及时的寻找,起到帮助,同时也是一大商机不是。

什么是基站:简单的说就是我们打电话能连接的信号塔,现在覆盖范围城市里基本达到了一个小区就有一个了。

那么也就是说,你跟踪的范围就是一个小区的范围之内了。

需要工具:能插手机卡的设备(小手机就可以),手机卡(能发信息)

我的实现方式:利用获得的基站信息,根据设定的合适时间发送消息给特定的人(不直接再设备上定位,因为可能没网络,当然有了你的基站位置,警察叔叔的系统很快的分析出你的位置,根据你的基站,分析出嫌疑人使用的基站,还能进行监听…)

那么先来看看效果:

电信手机展示效果

通过wifi 基站定位 Java 根据基站查找手机位置_中国移动

联通、移动展示效果

通过wifi 基站定位 Java 根据基站查找手机位置_手机_02

发送消息:

通过wifi 基站定位 Java 根据基站查找手机位置_中国移动_03

接受消息:

通过wifi 基站定位 Java 根据基站查找手机位置_通过wifi 基站定位 Java_04

当然要还要知道各大运营商代码:

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的接口,不过一般使用基站定位都用的是自己后台接口(用谷歌还不如直接用地图了,还方便….)

有什么不足望大家指出,谢谢….