Windows Mobile手机GPS定位

转载自devdiv论坛,原作者为:yinzl0211

http://www.devdiv.net/viewthread.php?tid=12491&page=1&authorid=14949

带GPS功能的Windows Mobile手机定位可以通过GPS获取手机所在的详细地址,民用一般误差在5米到50米之间的范围内。通过使用GPSApi头文件中包含的一下四个函数,由GPS中层驱动程序(GPSID)提供,可以通过它使用GPS设备并实时更新手机所在位置的信息。注意包含GPSAPI.h头文件与GPAAPI.lib静态链接库。

#include <gpsapi.h>

#pragma comment(lib,"gpsapi.lib")


GPSOpenDevice
GPSGetPosition
GPSGetDeviceState
GPSCloseDevice

一、下面分别介绍各个函数的功能,参数以及具体怎样实现使用这些函数。

1.GPS_POSITION结构
在介绍各个函数之前,要先介绍GPS_POSITION数据结构,他用来存放GPS定位所需要的各种信息。
typedef struct _GPS_POSITION {
DWORD dwVersion; //GPSID的版本号,在调用GPSGetPosition之前赋值,暂时必须被赋值为GPS_VERSION_1
DWORD dwSize; //GPS_POSITION结构的大小,同样应先用sizeof给它赋值
DWORD dwValidFields;// 结构实例中的有效空间标记,标记结构中哪些值有效
DWORD dwFlags; //在调用GPSGetPosition函数时修改过的数据的状态
SYSTEMTIME stUTCTime; //根据GPS卫星提供的信息获得的宇宙时间
double dblLatitude; //纬度,单位”度”,正数表示北
double dblLongitude; //经度,单位”度”,正数表示东
float   flSpeed;    //移动速度,单位“KNOTS”(海里),估计是海里/小时
float   flHeading; //移动方向,单位“度”,数值为偏北往顺时针的度数
double dblMagneticVariation; //正北与地磁北极角度差,整数表示往东的度数
float   flAltitudeWRTSeaLevel; //距海平面高度
float   flAltitudeWRTEllipsoid;//距椭球面高度
GPS_FIX_QUALITY     FixQuality;
GPS_FIX_TYPE        FixType;
GPS_FIX_SELECTION SelectionType;
float flPositionDilutionOfPrecision;
float flHorizontalDilutionOfPrecision;
float flVerticalDilutionOfPrecision;

DWORD dwSatelliteCount; //获取以上信息使用到的卫星数量
DWORD rgdwSatellitesUsedPRNs[GPS_MAX_SATELLITES];

DWORD dwSatellitesInView; //GPS硬件设备可见范围内的卫星数量
   DWORD rgdwSatellitesInViewPRNs[GPS_MAX_SATELLITES];
DWORD rgdwSatellitesInViewElevation[GPS_MAX_SATELLITES];
DWORD rgdwSatellitesInViewAzimuth[GPS_MAX_SATELLITES];
DWORD rgdwSatellitesInViewSignalToNoiseRatio[GPS_MAX_SATELLITES];
} GPS_POSITION, *PGPS_POSITION;
通过以上可以知道,要获取GPS定位信息,必须定位一个GPS_POSITION变量保存其信息,且在使用GPSGetPosition函数前要将其前两个参数分别赋好值。

2.GpsOpenDevice
函数原型如下:
HANDLE GPSOpenDevice(
   HANDLE    hNewLocationData,
   HANDLE    hDeviceStateChange,
   const WCHAR *szDeviceName,
   DWORD        dwFlags
);
函数功能:建立程序同GPS中间驱动的连接,获得句柄。

前两个参数为HANDLE型,都通过CreateEvent的返回值给它们赋值。如:
HANDLE s_hNewLocationData = CreateEvent(NULL, FALSE, FALSE, NULL);       
HANDLE s_hDeviceStateChange = CreateEvent(NULL, FALSE, FALSE, NULL); 
第1个参数: HANDLE    hNewLocationData
CreateEvent生成的句柄或者为NULL。
当有新的GPS定位信息时,这个事件被GPS中间驱动设置为信号态。
第2个参数: HANDLE    hDeviceStateChange
CreateEvent生成的句柄或者为NULL。
当GPS设备位置发生改变时,驱动将其设置为信号态。
第3个参数:必须为NULL。
第4个参数:必须为0。

返回值:成功则返回GPS中间驱动句柄。失败则为NULL。

3.GPSGetPosition
DWORD GPSGetPosition(
   HANDLE        hGPSDevice,
   GPS_POSITION *pGPSPosition,
   DWORD       dwMaximumAge,
   DWORD       dwFlags
);
函数功能:返回本地位置信息。

第1个参数: HANDLE        hGPSDevice
GPS设备句柄。GPSOpenDevice函数打开的设备句柄。
这个参数可以为NULL,此时函数不会启动GPS设备。
但函数会返回其他程序调用GPS驱动后保留的数据。
这个数据满足dwMaximumAge设置的时间值。
第2个参数: GPS_POSITION *pGPSPosition
GPS_POSITION结构指针。函数将填充这个结构。
用户必须输入结构版本和大小参数值。
第3个参数: DWORD       dwMaximumAge
规定了本地GPS信息的最长有效期。在有效期内可以使用这个数据。
第4个参数: DWORD       dwFlags
保留值为0。
返回值:成功:ERROR_SUCCESS。   失败:错误信息。
GPSGetDeviceState
DWORD GPSGetDeviceState(
   GPS_DEVICE *pGPSDevice
);
函数功能:获取GPS硬件设备的当前状态信息。
参数:GPS_DEVICE *pGPSDevice :GPS_DEVICE结构体指针。
返回值:成功:ERROR_SUCCESS。   错误:错误编号。

4.GPSCloseDevice
DWORD GPSCloseDevice(
   HANDLE hGPSDevice
);
函数功能:关闭GPS设备句柄。
参数:HANDLE hGPSDevice:GPSOpenDevice打开的GPS设备句柄。
返回值:成功:ERROR_SUCCESS。   错误:错误信息。


二、GPS具体实现细节
1> 首先用CreateEvent生成3个接受消息的句柄,两个上述以说明,第三个用来接受置关闭GPS设备结束线程
HANDLE s_hExitThread = CreateEvent(NULL, FALSE, FALSE, NULL);
2> 打开GPS设备并声明线程函数
HANDLE s_hGPS_Device = GPSOpenDevice(s_hNewLocationData, s_hDeviceStateChange, NULL, NULL);
DWORD   GPSThreadProc(__opt LPVOID lpParameter);
3> 定义线程函数
DWORD   GPSThreadProc(__opt LPVOID lpParameter)

GPS_POSITION gps_Position = {0};              //不用说了,放数据的                                                          
DWORD dwRet = 0; //表状态的,具体状态干具体的事
GPS_DEVICE gps_Device = {0};          //存放GPS设备信息,在GPSGetDeviceState前要赋值,如下
HANDLE gpsHandles[GPS_CONTROLLER_EVENT_COUNT] = {s_hNewLocationData, s_hDeviceStateChange, s_hExitThread };
gps_Position.dwSize = sizeof(gps_Position); //POSITION结构的第一个参数
gps_Position.dwVersion = GPS_VERSION_1;    //POSITION结构的第二个参数
gps_Device.dwVersion = GPS_VERSION_1;       //DEVICE结构的第二个参数
gps_Device.dwSize = sizeof(gps_Device);    //DEVICE结构的第一个参数

while (1)                                  //循环获取

dwRet = WaitForMultipleObjects(GPS_CONTROLLER_EVENT_COUNT, gpsHandles, FALSE, 100);       
switch(dwRet)
{
case WAIT_OBJECT_0:                   //有数据,获取并输出
dwRet = GPSGetPosition(s_hGPS_Device, &gps_Position, MAX_AGE , 0);                   
break;
case WAIT_OBJECT_0 + 1:                 //设备状态变化,获取状态信息
dwRet = GPSGetDeviceState(&gps_Device); 
ZeroMemory(&gps_Device, sizeof(gps_Device)); 
gps_Device.dwVersion = GPS_VERSION_1; 
if (ERROR_SUCCESS == dwRet) 
{    //状态获取成功,则获取定位信息
dwRet = GPSGetPosition(s_hGPS_Device, &gps_Position, MAX_AGE , 0);                  } 
break;
case WAIT_OBJECT_0 + 2:                 //结束线程事件,关闭GPS设备
GPSCloseDevice(s_hGPS_Device);
return 1;
default: 
break;
}  
//获取间断时间
Sleep(MAX_WAIT);  
}
return 0;
}
4> _tmain函数
int _tmain(int argc, _TCHAR* argv[])
{
DWORD m_dwThreadID;                //创建线程
HANDLE m_hThread = CreateThread(NULL, NULL, GPSThreadProc, NULL, NULL, &m_dwThreadID); 
GPSThreadProc(NULL);                 //运行线程
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值