解决完了Android,下面应该就到了iPhone了。这个问题网上搜索的时候基本都是一个代码版本。
参考 iphone-wireless。
当然,我们实际上有三种方法可以获取,目前我并未在真机上面测试,本文先做整理,后会放出iPhone上的测试版本代码。

iPhone上基站信息获取可以采用如下三种方法:

1 iphone-wireless方式获取。
2 串口发送AT指令获取。
3 模拟电话拨号 *3001#12345#* 获取。

第一种方法参考
获取CELLID,LAC等信息方法,感谢tiger723和shixuehuiab兄的代码。这里仅摘录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//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 calledn" ) ;
     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: %dn" , cellinfo. c1 , cellinfo. c2 ) ;

[pool release ] ;
        pool  = nil ;
     }

// 使用dlclose()来卸载打开的库
    dlclose (handle ) ;
}

第二种方法同样参考自上篇文章:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "at.h"

int fd = InitConn ( 115200 ) ;
AT (fd ) ;

char buf [ 100 ]  =  "" ;

/** 这里是发送的AT命令,如下面的命令,可以获取CELL的一些信息, 还有其他的一些信息,网上找找就有了,不过不是所有的命令都可以用哦,有些iphone没有留接口,有就用到一个命令AT+CCED=0,1,这个可以获取CELL的较详细的信息,但是IPHONE就没有留接口,没法用,悲剧*/
//下面是一些我找到的,可以用的命令
//获取小区信息
//SendStrCmd(fd, "AT+CREG=2;+CREG?rn");
//获取当前小区的信号强度
//SendStrCmd(fd, "AT+CSQrn");
//基带信息
//SendStrCmd(fd, "At+xgendatarn");
//获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
//SendStrCmd(fd, "AT+CCIDrn");
//获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件
//SendStrCmd(fd, "AT+CCIDrn");
//读取信息中心号码
//SendStrCmd(fd, "AT+CSCA?rn");
//单元广播信息标识。
//SendStrCmd(fd, "AT+CSCB?rn");

SendStrCmd (fd ,  "AT+XCELLINFO=1rn" ) ;
while  ( 1 )
{
read (fd , buf ,  100 ) ;
printf ( "%s" , buf ) ;
memset (buf ,  0 ,  100 ) ;
} ;

作者补充了代码:
at

另外,网上对以上方法做出了一些补充:

1. cellinfo的定义如下,估计就不会内存泄露了。
struct CellInfo
{
int mcc;
int mnc;
int location;
int cellid;
int station;
int freq;
int rxlevel;
int c1;
int c2;
int c3[6];
};
2.用AT命令取的话iphone4上试一下/dev/dlci.spi-baseband.extra_0。
3.也可能需要创造一个/tmp/ttydebugenable文件,然后 再/dev/tty.debug。

这个老帖子,现在还有人问,我也凑下热闹

代码没有问题,可以取到基站以及信号,但信号数字要减去-130或-110至于多少,需要你在查询相关资料

上面的代码只可以取到2G,信号,有些童鞋在实测发现,代码运行正常count一直是0,那是应该开着3G呢,至于3G怎么取我也在研究

AT指令确实可以取到比较丰富的信息,但在IPHONE4上应该是13楼所提到的文件dlci.spi-baseband.extra_0,但必须赋予+x权限,所以只能在开发试验使用,最终用户很难对权限进行更改

最后就是函数的问题,如果你是4.0以上的话,没有必要dlsym库里的函数,直接应用公开的库CoreTelephon.framwork即可,但需要声明下符号名称.

3 第三种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BOOL tryDial ( )  {
    NSString * rawNumber  =  [ [NSUserDefaults standardUserDefaults ] stringForKey : @ "phonenumber_preference" ] ;
     if (rawNumber  &&  ! [rawNumber isEqualToString :@ "" ] )  {
        NSString * telNumber  = @ "" ;
         for  ( int i = 0 ; i < [rawNumber length ] ; i ++ )  {
            NSString * chr  =  [rawNumber substringWithRange :NSMakeRange (i ,  1 ) ] ;
             if (doesStringContain (@ "*3001#12345#*" , chr ) )  {
                telNumber  =  [telNumber stringByAppendingFormat :@ "%@" , chr ] ;
             }
         }
        telNumber  =  [NSString stringWithFormat :@ "tel:%@" , telNumber ] ;
         [ [UIApplication sharedApplication ] openURL : [ [NSURL alloc ] initWithString :telNumber ] ] ;
         return TRUE ;
     }
     return FALSE ;
}

参考文章:
1 http://apt.weiphone.com/index.php?action=packageRead&id=9429
2 http://www.cocoachina.com/bbs/read.php?tid=70132
3 http://stackoverflow.com/questions/8846174/app-crash-at-ctserverconnectioncellmonitorgetcellinfo
4 http://www.devdiv.com/iOS_iPhone-iPhone%E4%B8%AD%E5%8F%96%E5%BE%97%E5%9F%BA%E7%AB%99%E7%9A%84cellid-thread-30564-1-1.html
5 http://www.cocoachina.com/downloads/video/2010/0713/1854.html
6 http://code.google.com/p/iphone-wireless/source/browse/trunk/CellStumbler/main.c

-End-

iPhone/iOS获得基站信息相关推荐

  1. 苹果手机如何用短信信息服务器,Iphone双卡双待如何发信息? 苹果双卡手机发短信的方法...

    苹果x系列的手机可以有主副卡的,支持双卡双待,用户放好卡根据自己的需要设置主副卡进行使用,那么Iphone双卡双待如何发信息呢?下面我们就来详细介绍一下. 1.在苹果xr手机的桌面找到并且点击[拨号] ...

  2. 最新的iPhone 各种机型尺寸信息列表(含iPhone 7/8、iPhoneX、iPhone XR、iPhone XS Max)

    1. iPhone 各种机型尺寸信息列表入下表: 机型 尺寸 逻辑缩放因子 (UIKit Scale factor) 实际缩放因子 (Native Scale factor) 屏幕宽高 屏幕分辨率 3 ...

  3. android 获取手机GSM/CDMA信号信息,并获得基站信息

    本文转自:http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表,那如 ...

  4. Windows Mobile 获取基站信息(LAC,CellID)

    前言: 在做手机定位应用软件,有两种方法可以实行定位: 1.利用基站定位,通过手机获取基站信息,再根据该信息获取经纬度: 2.利用GPS定位,直接获取经纬度信息. 利弊: 1.基站定位精确度低,误差范 ...

  5. 【转】iphone - ios app maximum memory budget

    [转]iphone - ios app maximum memory budget https://stackoverflow.com/questions/5887248/ios-app-maximu ...

  6. android获取到电信的手机号码,Android基站信息获取以及Sim卡相关信息获取

    概述: 本篇主要介绍Android获取基站信息的方式,除此之外,还有SIM卡相关字段获取,先介绍一些缩写的概念,后续更新代码的写法. 前言:之前有碰到一个需求,需要获取SIM卡的相关属性:IMSI号. ...

  7. Android基站定位——通过手机信号获取基站信息

    基站定位原理:通过手机信号获取基站信息,然后调用第三方公开的根据基站信息查找基站的经纬度值,想要具体地址信息的再根据经纬度值获取具体的地址信息. 一.通过手机信号获取基站信息 通过TelephonyM ...

  8. ios获取磁力计信息

    ios获取磁力计信息 #ios -(NSDictionary*) getMagnetometer{CMMotionManager *motionMagnet = [[CMMotionManager a ...

  9. Android基站定位——通过手机信号获取基站信息(一)

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8672442 基站定位原理:通过手机信号获取基站信息,然后调用第三方公开的根据基站信息 ...

最新文章

  1. 海量数据库解决方案2011032301
  2. 网页3D效果库Three.js学习[二]-了解照相机
  3. ORACLE客户端jdbc连接测试,Oracle 客户端JDBC连接测试工具
  4. java jdbc url编码_java中jdbc/sql出现编码问题
  5. 数据结构(单链表的相关操作)
  6. Qt 图形特效(Graphics Effect)介绍
  7. Flask开发成语接龙游戏,闲来无事手机玩玩自己写的游戏吧!
  8. c++如何获取文件时间_3分钟短文 | PHP 如何优雅地获取文件扩展名?别再explode了
  9. 【clickhouse】clickhouse时区
  10. 性能优化是数据库应用的核心问题
  11. cgroup学习(七)——cpu子系统
  12. 数字IC手撕代码-格雷码的编码与解码
  13. 新浪、腾讯微博开放平台非标准oauth解析
  14. w3school在线学习教程 http://www.w3school.com.cn/
  15. 超级计算机中心建设方案,我校举办大连理工大学超算中心建设方案论证会
  16. LeetCode1153 字符串转化
  17. c语言综合合计实验报告,C语言设计实验报告(第一次)
  18. info testing mysql_sqlmap新手注入
  19. 蔚然的风,你一阵吹过
  20. Android Accessibility(辅助功能) 学习

热门文章

  1. 9.数电复刻 之 CMOS反相器+其他类型CMOS门电路
  2. CSS属性【文本属性】or【列表属性】
  3. 青龙面板搭建和手机京东Cookie获取最新方法
  4. 当代GSM手机的硬件系统分析
  5. 斩波电路原理及基本斩波电路
  6. 【数据分析】方法论(in)
  7. 深入理解JVM—垃圾回收机制
  8. 关于clock gating的 set_clock_gating_check
  9. Python正则\w匹配中文的问题
  10. Hi35XXX海思媒体处理平台架构介绍.