http://mr.xjr.blog.163.com/blog/static/907010820081129113836771/
Developing Location Based Applications with BREW
介绍
本文目的是给那些BREW开发者们一个关于BREW SDK/API中有效特征的大概的了解,他们用这些来创建BREW定位应用程序。
gpsOne
gpsOne是一种混合定位系统。包括AGPS(the PDE-Position Determination Entity assisted handset-based GPS gechnology)(定位实体辅助手持GPS技术),和AFLT(the network-dependent position by triangulation technology基于网络的三角测量技术)。这两个主要的组件构成了gpsOne定位解决方案。
gpsOne混合系统吸取了AGPS中的精确定位的优点并且扩展使用这些特征,当在某些条件下不能达到GPS的准确程度时,将启用基于AFLT网络的深层穿透能力来扩展系统,使其覆盖所有的地带(森林,农田,室内,室外)。
一个移动设备可以初始化三种gpsOne模式:
1、 辅助定位(MS-Assisted)
2、 基本定位(MS-Based)
3、 独立或者自主模式
辅助定位模式利用初始化定位实体(服务器)来计算移动位置,他只能是混合模式。
基本定位模式利用定位实体的有限和周期的信号来计算移动设备的位置。
独立或者自主的模式是指手持设备的计算位置能力而不用定位实体的干预。
BREW 对 gpsOne的支持
BREW 1.* ( ISHELL_GetPosition() )系列API支持一个有限的辅助定位gpsOne 定位数据(大量的经纬度)。BREW 1.*不支持基本定位模式。
BREW 2.0 ( IPOSDET Interface )完全支持辅助定位模式并且提供了一系列的位置数据,这些数据要比1.*所支持的数据更丰富。BREW 2.0不支持基本定位模式。
本版本不支持自主模式。
需要MIF文件
使用 IPOSDET API 需要定位权限( PL_POS_LOCATION)。
BREW 2.0位置测定API
BREW gpsOne API 通过IPOSDET接口生效。
调用一个定位需要两个步骤。
1, 应用程序设置gpsOne引擎;
2, gpsOne引擎取得定位信息。
注意:如果接受默认的设置,那么可以不用初始化gpsOne引擎就获取定位信息。
AEEGPSConfig :是一个初始化GPS引擎的数据结构。
AEEGPSInfo:从(向)API函数输入和提取信息的一个数据结构。
第一步:设置GPS引擎
在调用的时候完成设置GPS引擎的工作。
int IPOSDET_SetGPSConfig(IPosDet *pIPosDet, AEEGPSConfig *pConfig );
IPosDet_SetGPSConfig()函数返回的可能返回值如下:
SUCCESS |
函数成功 |
EPRIVLEVEL |
您的BREW程序在MIF中不包括PL_POS_LOCATION权限。请更正MIF文件后重试一次。 |
EBADPARM |
您设置的pConfig参数是无效的(NULL)。 |
EUNSUPPORTED |
gpsOne引擎不支持您设置的模式。 |
在AEEGPSConfig中的参数有:mode,optim,server,nFixes,nInterval和qos。
mode
模式可以设置四种操作模式之一。
AEEGPS_Mode_One_Shot:
这是默认的模式。这种模式允许您请求一个定位而不需要担心gpsOne引擎使用的是下面哪一种模式(辅助或者基本定位)。这种模式与您为optim选择的那些参数是相关联的。
假如optim被设置为AEEGPS_OPT_SPEED,这种模式会提供给您一个最短时间的数据。在设备当前状态下,他会选择一个最好的途径来在最短的时间内获取定位数据。
如果设备执行基本定位比辅助定位快,就会使用基本定位。如果设备有必要的辅助数据(历书和历表)来执行一个基本定位,那么就会用这种方式。如果辅助数据无效或者不再有效,这种模式将试图下载或者刷新辅助数据。并且会给您一个辅助定位数据。
假如optim被设置成AEEGPS_OPT_ACCURACY,这种模式会提供给您一个最高精度的数据。目前,这是一个辅助定位数据,用来适应PDE的计算能力。然而,这种初始化模式可能会在将来改变。
假如您没有设置optim参数,默认的模式(AEEGPS_OPT_DEFAULT)将是AEEGPS_OPT_SPEED(速度优先)。
注意,对于 AEEGPS_OPT_SPEED和AEEGPS_OPT_ACCUACY设备的状态是从属执行的,假如不知道使用上面哪一种模式获取定位数据,您也不必关心它。
AEEGPS_Mode_One_Shot 是使用的最简单的模式,因为下面的BREW API将指出使用哪一种模式将依赖于您的设备:速度还是精确数据。还要注意的是,为了使AEEGPS_OPT_SPEED达到最优化,这种模式将自动自我改变来适应变化中的情况(例如:无论当前的设备有足够的辅助数据条件下)。然后,正如您看到的那样,您永远不能确定gpsOne引擎会使用哪一种模式(MS-Assisted VS MS-Based)(甚至于AEEGPS-OPT-ACCURACY)。
如果您需要控制gpsOne模式,请使用下面列出的AEEGPS_Mode_Track_Network或者AEEGPS_Mode_Track_Network模式。
AEEGPS_Mode_Track_Network:
假如您希望强制gpsOne引擎为MS-Assisted模式,则使用这个参数。
AEEGPS_Mode_Track_Local:
假如您希望强制gpsOne引擎为MS-Based模式,请使用这个参数。
在导航应用上。使用导航,作为名字的一部分,可能被混淆并且不能从中推断出使用了哪些上述模式。这种模式将在单点上准确的提供给您一份定位数据,并且不会和PDE初始化任何现有的导航期间。为了在MS-Assisted模式上执行导航(除非移动设备不支持MS-Based模式,否则对于导航来说,它不是一个最好的选择),您的应用程序必须定期调用IPOSDET_GetGPSInof() 函数。
AEEGPS_Mode_DLoad_First
这种模式使用在与MS-Based模式的连接中。为了响应一个位置请求,它将从PDE下载GPS辅助数据(历书和历表),因此,移动设备可以利用部分数据,在本地执行位置计算。
注意,假如信息无效或者已经被废弃,使用AEEGPS_Mode_Track_Local模式会下载GPS辅助信息。当您希望下载或者更新历书资料和天文历表数据时,这种模式正好提供给您控制权。
进一步来说,使用这种模式来缩短获取第一次MS-Based模式的数据时间:一个应用程序正当他显示应用程序的欢迎界面时,他可能还想同时开始下载GPS辅助信息,并且通过第一个初始化的屏幕提供给用户。
Optim
该参数将用于连接上述所讲的AEEGPS_Mode_One_Shot模式。在定位进程中有一点需要协调,即使用更多的时间来获取高精度的定位数据,还是使用较少的时间获取低精度的数据。这个属性表示对于最快速度或者最高精度是否达到优化。他可以是下面值:
AEEGPS_OPT_SPEED:
速度优先。在AEEGPS_Mode_One_Shot模式上使用,他将提供给您尽最快速度得到的数据。基于设备的当前状态和能力,设备将在一个最少时间内选择一个最快的路途来获取定位数据。如果设备可以执行MS-Based模式比MS-Assisted快,那么就会使用MS-Basde模式。这种情况会在设备存在必须的辅助数据(历书和历表)时发生。如果辅助数据不可用或者失效,这种模式将不会去下载或者刷新辅助数据,相反,他会提供给您一份MS-Assisted定位数据。
AEEGPS_OPT_ACCURACY:
精度优先。在AEEGPS_Mode_One_Shot模式上使用,这种模式将提供给您尽可能精确的定位数据。当然,为了配合PDE的高级计算能力,他是MS-Assisted模式。然而,这种状况或许会在将来改变。
AEEGPS_OPT_DEFAULT:
默认模式,将被设置成为速度优先。
qos
“服务质量”参数特别对应于像gpsOne引擎这样的应用会花多长(以秒为单位)时间来搜寻卫星。注意,为了获得真AFTL定位数据,您只能设置这个参数为零。
该参数取值范围为0 ~ 255,但是上面的初始化可能会舍去最大值,并使它小于255。更高的qos数值代表返回更高精度的定位数据和更长的定位时间(像MS-Assisted模式)。更低的qos数值返回更低精度的定位数据和更少的定位时间(像MS-Based模式)。注意,长时间的搜索卫星可能使获取定位数据时间加长。目前大多数设备的最大值是30左右。
应该在MS_Assisted模式使用qos参数来干预获取定位时间。对于MS-Based模式,不需要使用qos参数,因为gpsOne引擎已经自动把定位时间最小化了。在MS-Assisted模式中,如果gpsOne引擎不能得到满足特定的qos需求环境,IPOSDET_GetGPSInof()函数的返回值会在状态域里面报告一个AEEGPS_ERR_INFO_UNAVAIL值(请参阅状态0的描述)。
您可以使用下面范围的数值,来体会您希望的定位时间和精度之间的关系。请注意,当前的定位时间和精度高度依赖个体操作者的网络设计,并且不应该是逐字的方式,因为他们正试图传输一个由qos造成的错误的联系信号。
0 - 返回一个只有AFLT(Advanced Forward Link Trilateration高级先向链路三角测量法)的定位数据。它将仅仅使用基站供的数据,他将不会执行相对于GPS卫星的伪测距测量。定位数据的精度受下列条件影响:PDE的基战历时精度,设备的校准情况和设备导航频道连接的基战数目。在设备校准和基战历时较好的情况下,它的精度可以达到80-200米。
1 - 255 - 返回一个gpsOne 定位数据。 qos的值为16应该返回一个6-8秒的定位数据,但是当在室内时会使用更长的时间。在室外精度应该在20-40米。室内读取精度可能会下降,原因是从卫星的GPS信号多路传输影响。
对于速度,qos的典型值是16,对于精度是30。我们建议您使用AEEGPS_Mode_One_Shot模式,除非您的目标是强制在速度或者精度上,或者您不希望使用pos参数。
server
该参数描述了传输层,设备可以通过它来连接PDE。我们推荐使用默认的设置AEEGPS_SERVER_DEFAULT,这样的话设备可以使用优化的PDE。
它可能的参数如下:
AEEGPS_SERVER_DEFAULT |
使用提供给设备的PDE的IP地址,端口号和其他的PDE设置参数。 |
AEEGPS_SERVER_DBURST |
使用PDE的数据脉冲通讯。BREW不支持。 |
AEEGPS_SERVER_IP |
使用PDE的数据连接方式(TCP/IP)。应用设备必须有单独的IP地址和端口号码。 |
nFixes
该参数代表了应用设备将要获取的定位数据的期望值。0值代表一个关于定位请求未知的数字。
nInterval
改参数代表了请求间隔(单位:秒),在这个间隔内应用设备执行定位请求。
当使用nInterval时,nFixes和nInterval会使得下述的gpsOne引擎在现有电池电量和定位时间条件下产生更好的性能。
可以调用下面函数来获取现存的参数int IPOSDET_GetGPSConfig( IPosDet *pIPosDet,AEEGPSConfig *pConfig )
第二步:请求定位数据
一旦设置了gpsOne模式,就应该调用Int IPOSDET_GetGPSInfo(IPosDet *pIPosDet, AEEGPSReq req, AEEGPSAccuracy accuracy, AEEGPSInfo *pGPSInfo, AEECallback *pcb)
函数来获得定位数据。
IPOSDET_GetGPSInfo()是一个异步函数,他使用AEECallback和AEEGPSInfo结构。这意味着必须关注并确定返回值,和在返回值返回前传递给这个方法的信息结构一直在其范围之内。
在定位决定完成的时候调用回调函数。位置需求会在AEEGPSInfo结构中显示。(AEEGPSInfo结构中包含了返回的位置信息)。
注意,如果您希望实施一个周期性质的位置导航应用请求,您必须等待返回值返回,那时才能创建一个新的IPOSDET_GetGpsInfo( )调用。
IPOSDET_GetGPSInfo( )接受下列输入参数:
req |
in |
请求类型: AEEGPS_GETINFO_LOCATION, AEEGPS_GETINFO_VELOCITY, AEEGPS_GETINFO_ALTITUDE. 这些标准可以组合使用以获取更多类型的信息。 |
accuracy |
in |
本次请求的允许精度 它规定在MS-Based模式中所需数据的精度。如果您使用AEEGPS_Mode_Track_local模型(例如:真MS-Based模型)使用这个参数来设置您的期望定位精度。如果gpsOne引擎不能获得相应的精度,IPOSDET-GetGPSInfo()函数会在返回包含在状态域里面的 AEEGPS_ERR_ACCURACY_UNAVAIL参数。
它允许的值从 AEEGPS_ACCURACY_LEVEL1(最低精度)到AEEGPS_ACCURACY_LEVEL6(最高精度)。这个值被从属初始化,默认值是AEEGPS_ACCURACY_LEVEL1。 |
pGPSInfo |
out |
在输出上,他必须是一个指向AEEGPSInfo结构的有效指针。在返回值中,这个结构的成员包括了GPS信息。调用者必须确定这个结构有效,直到由pcb规定的回调函数得到调用。 |
pcb |
in |
回调函数,他在定位结束之后得到调用。 |
IPosDet-GetGPSInfo()函数有如下返回值:
SUCCESS |
调用函数成功。 |
EPRIVLEVEL |
您的BREW程序在MIF中没有设置PL_POS_LOCATION特权。更换MIF文件,再试一次。 |
EBADPARM |
您定义的pGPSInfo或者指向回调函数的指针是无效的(空的)。 |
EUNSUPPORTED |
gpsOne引擎不支持您设定的模式。 |
EFAILED |
启动定位殷勤失败。回调函数将不会被BREW调用。 |
在AEEGPSInfo结构中的值包括:
dwTimeStamp
开始测量的时间(从1968年1月6日开始计算,以秒为单位)。
status
返回一个非零的,包括定位错误的值。它可能如下所示:
AEEGPS_ERR_NO_ERR |
手持gpsOne引擎返回定位数据成功。 |
AEEGPS_ERR_GENERAL_FAILURE |
普通系统错误。应用程序会忽略对话并向用户显示一个错误信息。 |
AEEGPS_ERR_TIMEOUT |
在手持设备初使的时间范围内不能获取定位数据。时间是设备关联的,并且可能与其他设备上的时间不同。超时可能由几个原因造成的,包括PDE不反馈请求,数据连接失败等等。在这种错误发生时,应用程序会重新发送定位请求。 |
AEEGPS_ERR_ACCURACY_UNAVAIL |
在输入精度变量时,手持gpsOne引擎中设置的允许精度范围内不能获得定位数据。应用程序可以试图重试。 注意:在BREW API中不直接返回这个错误。 |
AEEGPS_ERR_INFO_UNAVAIL |
部分或者全部请求信息无效。应用程序会执行fValid标志查看是否有局部信息无效(例如高程信息无效,但是经度/纬度信息有效)。 假如在fValid中所以信息都是无效的,那么意味着设备不能获取定位数据,它的原因如下: 1、 如果使用 AEEGPS_MODE_TRACK_NETWORK参数,设备不能为定位从CDMA导航或者GPS卫星获取足够数据。应用程序会在重复几次失败后提示用户。 2、 如果使用 AEEGPS_MODE_TRACK_LOCAL参数,设备不能获取足够的卫星数量来计算定位数据。在建筑物内或者地道内可能会发生这种情况。如果应用程序在这种模式下重复失败,它会尽量采用AEEGPS_MODE_TRACK_NETWORK模式来获取一个定位数据。 |
dwLat
纬度,以WGS-84参考椭球体中的180/
dwLon
精度,以WGS-84参考椭球体中的360/
对于BREW 2.0
下面的代码演示了如何将WGS84经纬度值转换成度数。
double val;
pMe -> m_WGSFactor = FASSIGN_STR(“186413.5111”);
if ( !pMe_ -> GPSInfo.status )
{
Val = FASSIGN_INT(pMe -> GPSInfo.dwLat );
pMe -> m_Lat = FDIV( val, pMe -> m_WGSFactor );
vla = FASSIGN_INT( pMe -> mGPSInfo.dwLon );
pMe -> m_Long = FDIV( val, pMe -> m_WGSFactor );
}
这里赋给 pMe -> m_GPSInfo.dwLat 和 pMe -> GPSInfo.dwLon 的值是返回的WGS84经纬度值。186413.5111是WGS系数。
wAltitude
纬度,单位是米。这个值表示传输高度加
wHeading
标题,单位是360/
wVelocityHor
水平速率,单位是
bVelocityVer
垂直速率,单文是
accuracy
数据精度。
fValid
数据结构中的指示无效域的标志。假如用于指出哪一个通过IPOSDET_GetGPSInof()函数从AEEGPS_ERR_INFO_UNAVAIL的返回值是无效的
返回值包括:
AEEGPS_VALID_LAT |
无效纬度。 |
AEEGPS_VALID_LON |
无效经度。 |
AEEGPS_VALID_ALT |
无效高程。 |
AEEGPS_VALID_HEAD |
无效头。 |
AEEGPS_VALID_HVEL |
无效水平速率。 |
AEEGPS_VALID_VVEL |
无效垂直速率。 |
AEEGPS_VALID_HUNC |
无效的水平误差。 |
AEEGPS_VALID_AUNC |
无效的水平误差(度)。 |
AEEGPS_VALID_PUNC |
无效的水平误差(正交)。 |
为了判断接受的特殊字段的有效性,您可以使用&来连接字段。例如:
gpsInfo.fValid & AEEGPS_VALID_LAT,是用来检测纬度信息的有效性。
bHorUnc
沿着bHorUncAngle轴向的标准偏差。
bVerUnc
位置不确定的垂直标准偏差。
bHorUncAngle
位置不确定的轴向与真北的夹角。单位是 5.625度。
bHorUncPerp
垂直轴与bHorUncAngle的标准偏差。
在Emulator上运行一个基于定位的应用程序
当您希望在emulator上运行一个基于定位的应用程序(使用IPosdet API)时,在tools菜单中,选择“GPS Emulation”并且选择GPS数据源。
a.(输入文件)File Input方式:如果您希望使用这种方式,您需要一个有效的BGP文件。您的bgp文件中,需要GPRMC和GPGGA两种数据格式的数据。并且,bgp文件中的第一种数据应该是GPRMC数据。如果IPOSDET_GetGPSInof()函数的返回值没能得到调用,您应该检查您的bgp文件是否是正确的格式。如果您希望得到BGP文件的更多信息,请参阅Brew工具向导中的“使用NMES记录(Using the NMEA Logger)”一章。
b.端口输入(Serial Port Input)方式:您需要有GPS接收器,并且它已经连接到您的pc机的com端口。
基于区段的位置定位
在Brew1.*版本中,调用int IPOSDET_GetSectorInfo( IPosDet *pif, AEESectorInfo *pSecInfo )函数
它返回基于区段定位的信息,例如系统ID,网络ID,基战ID,基战类,和最佳导航信息。这些信息是载体的属性。
基于区段定位的使用方法( IPOSDET_GetScetorInfo() )需要区段信息权限( PL_SECTORINFO)。