前言:

在做手机定位应用软件,有两种方法可以实行定位:
1.利用基站定位,通过手机获取基站信息,再根据该信息获取经纬度;
2.利用GPS定位,直接获取经纬度信息。

利弊:

1.基站定位精确度低,误差范围估计500米以内(这种情况还是在大城市下的,如果是小城市,估计误差更大),但是基站定位可以实现处处定位,即不会因为建筑物等原因而无法获取基站信息。
2.GPS定位精确度高,误差范围估计10米以内,但是需要在空旷的地方,如果周围建筑物多,或者在室内,没法获取GPS信息。
通常用定位这两种方法都采用,也会增加第三种WIFI定位或者小区定位,这是后话。
在windows mobile下获得CELLID、LAC的途径有两条:利用串口发送AT指令或是利用RIL来获取。RIL(Radio Interface Layer)是微软自己开发的一个库,它的程序有固有的特点,在获取CELLID上,它其实是对第一种方法的封装,两者本质是一样的。但要注意是:串口一旦打开,就难以关闭,除非重启机器(可能涉及到底层的中断),另外并不是所有的设备都可以取到CELLID。
本文章是利用COM口来获取CELLID,并不保证所有的设备都支持。

测试平台:

VS2005 + WM 6.0

开发语言:

C++
定义基站信息结构体:
typedef struct
{  char CountryCode[12];  char AreaCode[4];  char NetworkCode[4];  char CellID[4];
} TCREG_DATA;

获取基站信息:

void Get_Cellid(void)
{  char m_sTemp[12] = {0};  strcat(m_sTemp,"COM");  for(int i = 9; i > 0; -- i)  {  char ch1;  _itoa(i,&ch1,10);  strcat(m_sTemp,&ch1);  strcat(m_sTemp,":");  TCREG_DATA* pData = (TCREG_DATA*)GetCREG(m_sTemp);  if(!pData)  continue;  char szNum1[8] = {0};  char szNum2[8] = {0};  strcpy(szNum1,pData->AreaCode);  strcpy(szNum2,pData->CellID);  int iLac = (int)strtol(szNum1,NULL,16);  int iId  = (int)strtol(szNum2,NULL,16);  if (iLac && iId)  {  sprintf(m_sCell.LAC,"%06d", iLac );  sprintf(m_sCell.ID,"%06d", iId  );  break;  }  }
}

获取串口:

char* GetCREG( char * comPort )
{  HANDLE hCom;  int bufpos;  DCB dcb;  COMMTIMEOUTS to;  DWORD nWritten;  DWORD event;  DWORD nRead;  static char outbuf[20], buf[256];  BYTE comdevcmd[2]= {0x84, 0x00};  WCHAR m_sCom[12] = {0};  mbstowcs(m_sCom,comPort,strlen(comPort));  hCom= CreateFile( m_sCom ,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);  if (hCom==NULL || hCom==INVALID_HANDLE_VALUE)  {  hCom= NULL;  return NULL;  }  if (!GetCommState(hCom, &dcb))  {  return "ERROR:GetCommState Failed";  }  dcb.BaudRate= CBR_115200;  dcb.ByteSize= 8;  dcb.fParity= false;  dcb.StopBits= ONESTOPBIT;  if (!SetCommState(hCom, &dcb))  {  return "ERROR:SetCommState Failed";  }  EscapeCommFunction(hCom, SETDTR);  EscapeCommFunction(hCom, SETRTS);  GetCommTimeouts(hCom, &to);  to.ReadIntervalTimeout= 0;  to.ReadTotalTimeoutConstant= 200;  to.ReadTotalTimeoutMultiplier= 0;  to.WriteTotalTimeoutConstant= 20000;  to.WriteTotalTimeoutMultiplier= 0;  SetCommTimeouts(hCom, &to);  if (!SetCommMask(hCom, EV_RXCHAR))  {  return "-8";  }  DWORD rildevresult=0,nReturned=0;  if (!DeviceIoControl (hCom,0xAAAA5679L, comdevcmd, sizeof(comdevcmd),0,0,0,0))  {  return "-9";  }  bufpos = 0;  strcpy(outbuf,"AT+creg=2\r");  if (!WriteFile(hCom, outbuf, 10, &nWritten, NULL))     {  return "-10";  }  if (nWritten != 10)  {  return "-11";  }  if (!WaitCommEvent(hCom, &event, NULL))  {  return "-12";  }  while(1)  {  if (!ReadFile(hCom, buf+bufpos, 256 - bufpos, &nRead, NULL))  {  return "-13";  }  if (nRead == 0)  break;  bufpos += nRead;  if (bufpos >= 256)  break;  }  strcpy(outbuf,"AT+creg?\r");  if (!WriteFile(hCom, outbuf, 9, &nWritten, NULL))     {  return "-14";  }  if (nWritten != 9)  {  return "-15";  }  if (!WaitCommEvent(hCom, &event, NULL))  {  return "-16";  }  while(1)  {  if (!ReadFile(hCom, buf+bufpos, 256 - bufpos, &nRead, NULL))  {  return "-17";  }  if (nRead == 0)  break;  bufpos += nRead;  if (bufpos >= 256)  break;  }  puts(buf);  rildevresult = 0;   if (!EscapeCommFunction(hCom, CLRDTR))  {  return "-4";  }  if (hCom!=NULL)  {  CloseHandle(hCom);  hCom= NULL;  }  char* cregResponse = strpbrk( buf, "CREG\0" );  return cregResponse;
}

总结:

通过获取基站信息,手机可以实现定位,这对于没有GPS设备的手机来说是一个不错的想法。

转载于:https://www.cnblogs.com/EricSu/archive/2010/11/13/1876424.html

Windows Mobile 获取基站信息(LAC,CellID)相关推荐

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

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

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

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

  3. Windows Mobile获取通话记录 C#

    Windows Mobile获取通话记录 C# 文章作者:alalmn文章作者:[E.S.T] alalmn 信息来源:邪恶八进制信息安全团队(www.eviloctal.com)飞龙 QQ31611 ...

  4. GPS实时定位、获取基站信息

    好久没有来更新我的博客了 , 最近刚做了一个GPS实时定位和获取基站信息的一个小的Demo ,这个辛酸泪啊- 来给大家们来分享一下 ! 做这个项目我用的是用的原始的手机GPS定位, 因为这个有可能需要 ...

  5. AT指令获取基站信息

    AT+CREG 网络注册和漫游      命令发送(command):       AT+CREG=<mode>       命令响应(Response):       +CREG :&l ...

  6. Windows Mobile 获取来电号码和屏蔽来电

    今天接到一个特殊任务...在 Windows Mobile 中获得来电号码,其实它本身就有个来电显示,可现在要求就是要自己写程序来完成这个来电显示... 没办法...虽然没搞过...但是这个东东好像比 ...

  7. 安卓手机获取基站信息

    拨号界面输入:*#*#4636#*#* 进入 "手机信息" 即可看到当前您所在的基站 LAC/CID 转载于:https://www.cnblogs.com/topwang-com ...

  8. gprs 获取基站信息,根据基站信息定位地理位置(基站免费查询接口)

    1,首先需要利用AT指令获取到基站编号.小区编号: 参考: +CREG: 2,1,"2495","12EA" 例如以上数据: 2495:小区号 12EA:基站号 ...

  9. Windows Mobile获取SIM卡上的所有电话号码

    从MS .NET CF版访问电话API(完整版) 以前查找了好些在.net CF框架上调用设备本地API函数读取手机SIM卡的资料,但各种资料都少了些描述,特别是少了一些引用的结构(struct),造 ...

最新文章

  1. bzoj2243 [SDOI2011]染色
  2. java和python哪个好就业2020-Python和java哪个就业前景好些?
  3. gRPC:Google开源的基于HTTP/2和ProtoBuf的通用RPC框架
  4. timespan怎么比较大小_装饰画怎么挂都不好看?那是你不懂技巧!整理了一篇攻略,请拿好...
  5. c语言switch计算利润,求助。。关于用switch编写简易计算器
  6. Apache Flink 零基础入门(十一)Flink transformation
  7. 数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些?
  8. safari 音频播放问题
  9. const指针和指向常量的指针
  10. 好用到哭!你需要立刻学会的20个Python代码段,你get到了吗?
  11. caffe学习笔记(1)
  12. Linux shell脚本启动 停止 重启jar包
  13. 虚拟linux第一次启动网卡配置过程
  14. 时间定位表达式-用于时间的加、减调整
  15. 关于DNF的多媒体包NPK文件的那些事儿(8) - DNF里的DDS图像
  16. 阅卷系统java语言_主观题阅卷系统
  17. 原生js实现音乐播放器功能,可以实时显示歌词并且高亮当前句
  18. 富士通Fujitsu LPK-888T 打印机驱动
  19. mysql事务的ACID原理
  20. ping-pong机制

热门文章

  1. ubuntu rar文件乱码
  2. 使用nginx部署项目的相关资料
  3. 关于Map迭代循环,key和value的顺序问题
  4. getBoundingClientRect()方法
  5. Python数据类型之变量
  6. git查看一个文件的历史记录
  7. AFNetworking和ASIHTTPRequest的比较
  8. iOS.访问通讯录.02.写入联系人
  9. SqlDataAdapter上调用存储过程
  10. c#与WMI使用技巧集