利用AT命令获取所在位置的小区号和基站号
来源: 转载 作者:秩名 时间:2009-09-27 09:22 点击: 次 文字:【大 中 小 】 我要投稿
核 心提示:利用小区号和基站号可以做简单的GSM定位,下面给出一个取得小区号和基站号的方法。 首先依然是打开AT指令端口。 HANDLE hCOM9 = CreateFile (LCOM9:,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if( hCO...
利用小区号和基站号可以做简单的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? < cr > < lf >
- +CREG: 2,n,"ABCD","ABCD" < cr > < lf >
- OK < cr > < lf >
其中第一个“ABCD”是小区号(LAC),第二个“ABCD”是基站号(CI)。
至于运营商,可以用AT+COPS?获取。返回值应该类似这样:
- AT+COPS? < cr > < lf >
- +COPS: 0,0,"China Mobile" < cr > < lf >
- OK < cr > < lf >
这样,就可以利用取得的基站号和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 );
注意,程序退出时要执行.