iPhone中取得LAC和cellid等信息

2024-06-01 15:48
文章标签 信息 iphone 取得 lac cellid

本文主要是介绍iPhone中取得LAC和cellid等信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考链接:
http://www.devdiv.com/iOS_iPhone ... read-30564-1-1.html


//CoreTelephony.h
#import <Foundation/Foundation.h>

struct CTServerConnection
{
    int a;
    int b;
    CFMachPortRef myport;
    int c;
    int d;
    int e;
    int f;
    int g;
    int h;
    int i;
};
struct CellInfo
{
    int servingmnc;
    int network;
    int location;
    int cellid;
    int station;
    int freq;
    int rxlevel;
    // int freq;
    int c1;
    int c2;
};

@interface CoreTelephony : NSObject

- (void) getCellInfo;

int callback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo);

@end



//CoreTelephony.m
#import "CoreTelephony.h"
#include <dlfcn.h>
#import <UIKit/UIKit.h>
#include <stdio.h>
#include <stdlib.h>

CFMachPortRef port;
struct CTServerConnection *sc=NULL;
//struct CTServerConnection scc;
struct CellInfo cellinfo;
int b;
int t1;

@implementation CoreTelephony

int callback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
    printf("Callback called\n");
    return 0;
}

- (void) getCellInfo
{
    int cellcount;
    char* sdk_path = "/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony";
    
    // void * dlopen( const char * pathname, int mode ); 
    // 功能:以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。 打开错误返回NULL,成功,返回库引用
    // RTLD_LAZY 暂缓决定,等有需要时再解出符号。这个参数使得未解析的symbol将在使用时去解析
    int* handle =dlopen(sdk_path, RTLD_LAZY);
    if (handle == NULL) {
        return;
    }
    
    // void* dlsym(void* handle,const char* symbol) 该函数在<dlfcn.h>文件中。将库中的一个函数绑定到预定义的函数地址(即获取到函数的指针)。handle是由dlopen打开动态链接库后返回的指针,symbol就是要求获取的函数的名称,函数返回值是void*,指向函数的地址,供调用使用。
    struct CTServerConnection * (*CTServerConnectionCreate)() = dlsym(handle, "_CTServerConnectionCreate");
    sc=CTServerConnectionCreate(kCFAllocatorDefault, callback, &t1);
    
//    int (*CTServerConnectionGetPort)() = dlsym(handle, "_CTServerConnectionGetPort");
//    port=CFMachPortCreateWithPort(kCFAllocatorDefault, _CTServerConnectionGetPort(sc), NULL, NULL, NULL);
    
    void (*CTServerConnectionCellMonitorStart)() = dlsym(handle, "_CTServerConnectionCellMonitorStart");
    CTServerConnectionCellMonitorStart(&t1,sc);
    
    int* (*CTServerConnectionCellMonitorGetCellCount)() = dlsym(handle, "_CTServerConnectionCellMonitorGetCellCount");
    CTServerConnectionCellMonitorGetCellCount(&t1,sc,&cellcount);
    NSLog(@"cellcount:%d",cellcount);
    
    void (*CTServerConnectionCellMonitorGetCellInfo)() = dlsym(handle, "_CTServerConnectionCellMonitorGetCellInfo");
    
    for(int b=0;b<cellcount;b++)
    { 
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
        
        memset(&cellinfo, 0, sizeof(struct CellInfo));
        int ts = 0;
        
        /** 这个方法的问题出现在这里,3.0以前的版本是4个参数,运行后会崩溃,后来发现新版本中是5个参数,不过获取的结果不理想,只获取了5个结果:MNC,MCC,LAC,CELLID,PXLEVEL,其他4项四项返回-1*/
        CTServerConnectionCellMonitorGetCellInfo(&t1, sc, b, &ts, &cellinfo);
        
        printf("Cell Site: %d, MNC: %d, ",b,cellinfo.servingmnc);
        printf("LAC: %d, Cell ID: %d, Station: %d, ",cellinfo.location, cellinfo.cellid, cellinfo.station);
        printf("Freq: %d, RxLevel: %d, ", cellinfo.freq, cellinfo.rxlevel);
        printf("C1: %d, C2: %d\n", cellinfo.c1, cellinfo.c2);
        
        [pool release];
        pool = nil;
    }
    
    // 使用dlclose()来卸载打开的库
    dlclose(handle);
}

要注意以下两点:
1.dlsym()方法只是获取到了所需函数的指针,需要执行相应函数才能取得所需的值;
2.方法的执行顺序应该为:打开动态库、创建服务、执行服务(先取得信息数再循环取得信息)、关闭动态库。

这篇关于iPhone中取得LAC和cellid等信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021436

相关文章

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

设置android返回键,保存和取得最高分

1.在.h中声明一些方法 virtual void keyBackClicked();           //Android返回键 bool isHaveSaveFile(); void getHighestHistoryScore(); 在.cpp中实现这个几个方法 void WelcomeLayer::keyBackClicked(

ORACLE 、达梦 数据库查询指定库指定表的索引信息

在Oracle数据库中,索引是一种关键的性能优化工具,通过它可以加快数据检索速度。在本文中,我们将深入探讨如何详细查询指定表的索引信息,以及如何利用系统视图和SQL查询来获取这些信息。 索引在数据库中的重要性 索引是一种数据结构,用于加快数据库表中数据的检索速度。它类似于书籍的目录,可以帮助数据库引擎快速定位数据行,特别是在大型数据集合下,其作用尤为显著。 查询指定表的索引信息 在Orac

基于协方差信息的Massive MIMO信道估计算法性能研究

1. 引言 随着移动互联网不断发展,人们对通信的速率和可靠性的要求越来越高[1]。目前第四代移动通信系统已经逐渐商用,研究人员开始着手研究下一代移动通信系统相关技术[2][3]。在下一代移动通信系统中要求下行速率达到10Gbps,这就要求我们使用更先进的技术和更宽的系统带宽。MIMO技术由于可以在不增加系统带宽和功率的前提下,成倍的提升系统容量和可靠性,已经广泛应用于各种无线通信系统中,但仅采用

nodejs基础教程-简单blog(8)--展示用户注册信息列表

本节课展示用户注册信息列表;当点击导航栏的“用户管理”浏览器跳转路由/admin/user 显示用户列表。 先上效果图; 开始 1,在layout.html模板中导航标签中设置路径; 2,新建文件 views/admin/user_index.html,在admin.js中设置user_index的路由为/admin/user;并查询数据库所有用户的信息 返回给前台users;

WinCE使用Webservice或者WCF与后台数据库SQL进行数据信息交互

之前使用过Webservice作为后台服务,WinCE上通过调用webservice来与后台数据库进行数据交互。 速度,稳定性都非常好。而且编程模块化,封装成为Webservice的两个函数即可解决数据库的增,删,查,改四个SQL语句的执行,因此编程非常高效。 有了这样的封装,程序员在编写程序时,主要精力放在逻辑上,分析业务知识上。从而降低程序员的技术门槛,提高编程效率,节省人力成本。

利用AT命令获取所在位置的小区号LAC和基站号ID,基站ID转换成经纬度

最近在做一个基站ID转换成经纬度的功能。     1.先发AT指令:AT+CREG=2     2.再发AT指令:AT+CREG?     获得返回值:     +CREG:     2,1,"A530","0161F10F",6 A530为LAC,0161F10F为基站ID 然后将获取的LAC,和基站ID,通

玩转Web之easyui(三)-----easy ui dataGird 重新指定url以获取不同数据源信息

如果已经写了一个dataGird并且已经通过url绑定数据源,能不能在其他地方改变url使其从不同数据源获取信息,从而实现查询等操作?答案当然是肯定的,而且仅需要几行代码 $('#btnq').bind('click', function(){ $('#dg').datagrid({ url: '../servlet/Student_search' });//重新指定url$('#dg'

IP地址解析省份区域信息

背景 最近工作需要根据IP地址,解析通话所在省份。因此,在网上找了相关方案,作为存档记录下来。 在线接口 不做阐述。因为,一是网上可以很轻松的找到,没有必要多说。二是开发在内网中,多数不会让连接外网。三是多数花钱的方案,公司审批麻烦。 离线方案 调研了开源的ip2region,但是其不支持IPV6,因此使用mica-ip2region版。mica-ip2region,已内置了IP数据源,