Android TelephonyManager getAllCellInfo()刷新率RSSI

时间:2016-05-25 15:38:08

标签: android gsm telephonymanager rssi

我目前正在为我的大学研究项目开发一个Android应用程序。该应用程序应该能够读取附近GSM基站的RSSI级别。我编写了以下函数,该函数成功读取了附近单元格的RSSI级别。我每200毫秒调用一次这个函数,但RSSI值几乎不随时间变化。我怀疑基带处理器每xs只更新这些值,但我找不到任何有关刷新率的信息。有人知道 getAllCellInfo()中的信息刷新有多快吗?我想知道这个的原因是因为时间对于我的设置来说非常重要。在实验室中,我们以特定频率(大于1 Hz)启用和禁用干扰。启用干扰时,RSSI值将下降。所以我想知道如果干扰器启用和禁用,例如10赫兹,可以刷新RSSI以检测此信号丢失的速度。

public HashMap<Integer,Integer> RSSI_values() {

    HashMap<Integer,Integer> result = new HashMap<Integer,Integer>();

    TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
    telephonyManager.getNetworkType();
    List<CellInfo> CellInfo_list = telephonyManager.getAllCellInfo();
    if(telephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_EDGE) {
        for (int i = 0; i < CellInfo_list.size(); i++) {
            CellInfoGsm cellinfogsm = (CellInfoGsm) CellInfo_list.get(i);

            int cid = cellinfogsm.getCellIdentity().getCid();

            CellSignalStrengthGsm cellSignalStrengthGsm = cellinfogsm.getCellSignalStrength();
            int rssi = cellSignalStrengthGsm.getDbm();

            result.put(cid,rssi);
        }
    } 
    return result;
}

如果此刷新率是特定于设备的,我将使用nexus 5 android 6.0.1

1 个答案:

答案 0 :(得分:2)

我认为你可以在这个实现上使用更好的方法。

您可以注册一个监听器,而不是使用定义的时间间隔来查询“单元信息”,只要单元信息发生更改,就会调用该监听器。

这样,您就不必担心理想的价值,而且,您也不会浪费资源检查可能尚未更改的信息。

您可以使用PhoneStateListener。您创建它并注册它以接收单元格信息更改。如果不再需要(后台活动或被破坏),您必须取消注册。

以下是一个例子。我没有测试。但它可能会帮助你理解这个想法。

// standard includes
#include <iostream>
#include <string>
#include <fstream>
#include <cassert>
// includes for defining the Voronoi diagram adaptor
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Voronoi_diagram_2.h>
#include <CGAL/Segment_Delaunay_graph_2.h>
#include <CGAL/Segment_Delaunay_graph_adaptation_traits_2.h>
#include <CGAL/Segment_Delaunay_graph_adaptation_policies_2.h>
#include <CGAL/Segment_2.h>
#include <CGAL/Segment_Delaunay_graph_traits_2.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Segment_Delaunay_graph_traits_2<K> Gt;
typedef CGAL::Segment_Delaunay_graph_2<Gt> DT;
typedef CGAL::Segment_Delaunay_graph_adaptation_traits_2<DT> AT;
typedef CGAL::Segment_Delaunay_graph_degeneracy_removal_policy_2<DT> AP;
typedef CGAL::Voronoi_diagram_2<DT, AT, AP> VD;
typedef AT::Site_2                    Site_2;
typedef VD::Face_handle               Face_handle;

int main()
{
    std::ifstream ifs("data.cin");
    assert( ifs );
    VD vd;
    Site_2 t;
    while ( ifs >> t ) { vd.insert(t); }
    ifs.close();
    assert( vd.is_valid() );
    std::cout << vd.number_of_faces() << std::endl;
    VD::Face_iterator it = vd.faces_begin(),       
    beyond = vd.faces_end();
    for (int f=0; it != beyond; ++f, ++it) {
        std::cout << "Face" << f << ": \n";
        VD::Ccb_halfedge_circulator hec = it->ccb();
        do {
            VD::Halfedge_handle heh = static_cast<VD::Halfedge_handle>(hec);
                if (heh->has_target())
                    std::cout << heh->target()->point() << "\n";
                else
                    std::cout << "point at infinity\n";

        } while (++hec != it->ccb());
        std::cout << std::endl;
    }  
    return 0;
}

希望我能帮助你。