Chinaunix首页 | 论坛 | 博客
  • 博客访问: 392246
  • 博文数量: 48
  • 博客积分: 1628
  • 博客等级: 上尉
  • 技术积分: 482
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 14:20
文章分类

全部博文(48)

文章存档

2013年(6)

2012年(14)

2011年(6)

2010年(5)

2009年(17)

我的朋友

分类:

2012-06-15 00:04:56

利用小区号和基站号可以做简单的GSM定位,下面给出一个取得小区号和基站号的方法。

首先依然是打开AT指令端口。

HANDLE hCOM9 = CreateFile( L"COM9:" , GENERIC_READ|GENERIC_WRITE , FILE_SHARE_READ|FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );

if ( hCOM9 == INVALID_HANDLE_VALUE ) MzMessageBoxEx( NULL , L"Error opening COM9" , NULL );

要取得小区号和基站号,需要首先让手机输出这两个号码,方法是利用设置命令"AT+CREG=2"。然后再发送AT+CREG?查询即可取得基站号和ID号。

DWORD dwBytes;

char p = 0x0D;        //cr

char q = 0x0A;        //lf

WriteFile( hCOM9 , “AT+CREG=2;+CREG?” , 9 , &dwBytes , NULL );

WriteFile( hCOM9 , &p , 1 , &dwBytes , NULL );

WriteFile( hCOM9 , &q , 1 , &dwBytes , NULL );

返回值应该是这样的:

AT+CREG=2;+CREG?

+CREG: 2,n,"ABCD","ABCD"

OK

其中第一个“ABCD”是小区号(LAC),第二个“ABCD”是基站号(CI)。

至于运营商,可以用AT+COPS?获取。返回值应该类似这样:

AT+COPS?

+COPS: 0,0,"China Mobile"

OK

这样,就可以利用取得的基站号和ID号做基站定位了。当然,这样的方法,需要用户不断的发送命令并读取,比较麻烦。因此还有一个Infineon自己的命令,可以自动返回基站信息,就是AT+XCELLINFO。首先发送AT+XCELLINFO=1,然后GSM模块就会持续发回小区信息,具体格式因为没有文档不是很清楚,但应该是这样的:

+XCELLINFO: a,b,c,LAC,CI,d

a/b/c/d的意义不是很清楚,只知道b应该是运营商代码(我收到的都是460,还有65535,d可能是信号强度,其他就不知道了。在不需要获取时,发送AT+XCELLINFO=0可以关闭小区信息发送。

注意,程序退出时要执行

CloseHandle( hCOM9 );

获得基站信息后,可以通过手机基站数据转经纬度网站,查询当前位置信息,网址是:

阅读(8483) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~