分类: 嵌入式
2014-09-13 11:41:14
利用小区号和基站号可以做简单的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 );
获得基站信息后,可以通过手机基站数据转经纬度网站,查询当前位置信息。