当前位置: 首页 > 科技观察

GPS模块分析ON功能

时间:2023-03-12 04:18:22 科技观察

更多内容请访问:51CTOOpenHarmony技术社区https://ost.51cto.com后台openharmony3.1版本3月30日发布,openharmony新增了很多服务功能组件。具体新增功能可通过社区获取。当然,新增的组件包括位置服务组件,用于定位、导航等与位置相关的服务功能。本文通过详细的代码具体分析其数据流向。注意:代码分析需要一定的c/c++代码阅读知识。当然,由于代码仅供个人理解,社区代码不完整,理解上会有偏差。location介绍仓库location的位置location仓库位于base目录下,其具体位置如图:location简介定位能力用于判断用户设备所在的位置。系统使用位置坐标来标记设备的位置,并结合多种定位技术提供服务,如GNSS定位、基站定位、WLAN/蓝牙定位(基站定位、WLAN/蓝牙定位统称为“网络定位”技术”)。通过这些定位技术,无论用户设备是在室内还是室外,都可以准确地确定设备所在的位置。坐标系参考1984年世界大地坐标系,使用经纬度数据来描述地球上的一个位置。GNSS定位是基于全球导航系统,包括:GPS、GLONASS、北斗、伽利略等,通过设备芯片提供的导航定位算法,确定设备的准确位置。定位过程中具体使用哪些定位系统取决于用户设备的硬件能力。基站定位是根据设备当前所在网络的基站和相邻基站的位置来估计设备的当前位置。这种定位方式的定位结果精度较低,需要设备能够接入蜂窝网络。WLAN和蓝牙定位根据设备可搜索到的周围WLAN和蓝牙设备的位置,估计设备当前位置。这种定位方式的定位结果精度取决于设备周围可见的固定WLAN和蓝牙设备的分布情况。当密度高时,精度高于基站定位方法。同时,设备也需要能够访问网络。框架介绍说明:代码验证使用的开发板为RK3568开发板。该代码是4月8日的主线代码。应用开发DevecostudioAPI我们是9版本,应用是ets语言开发的。应用程序开发使用deveco编写一个简单的应用程序。通过应用程序(即使用js)调用相应的位置服务来打开相应的界面。应用代码如下:tring=''privateisWlanEnable:boolean=false;privateislocationon:boolean=false;@State消息:string='HelloWorld'build(){Row(){Column(){Toggle({type:ToggleType.Switch,isOn:this.isWlanEnable}).width(50).height(40).onChange((isOn:boolean)=>{this.isWlanEnable=!this.isWlanEnable;if(this.isWlanEnable){this.islocationon=true;this.switchOn();}})Text("地址"+this.text).fontSize(50)}.width('100%')}.height('100%')}privateswitchOn(){//导航场景varrequestInfo={'scenario':0x301,'timeInterval':0,'distanceInterval':0,'maxAccuracy':0};//精度优先的//varrequestInfo={'priority':0x201,'timeInterval':0,'distanceInterval':10,'maxAccuracy':10};varlocationChange=(location)=>{console.log('locationChanger:data:'+JSON.stringify(位置));};//打开位置信息geolocation.on('locationChange',requestInfo,locationChange);//位置信息转换varreverseGeocodeRequest={"latitude":31.12,"longitude":121.11,"maxItems":1};geolocation.getAddressesFromLocation(reverseGeocodeRequest,(data)=>{console.log('getAddressesFromLocation地址:'+JSON.stringify(data));this.text=data;});}}应用截图:代码数据流开发板通过配置连接wifi,并打开位置信息(settings->privacy->location),运行编译安装的应用,通过hilog收集开发板中相应的log信息,我们可以逐渐了解数据的流动过程。注意:由于当前位置的使用没有具体的使用说明手册,因此通过修改CheckLocationPermission函数来完成位置授权处理(在应用中配置main_pages.json配置权限不起作用)。修改如下:通过hilog获取日志。我们可以收集一些位置对应的信息。使用02300标识符过滤与位置相关的日志信息。日志信息如图(代码中添加了当前图片日志信息,并非代码原日志):定位流程框架应用打开时,从APP到底层的流程如下:On(napi_envenv,napi_callback_infocbinfo)函数是拉起位置服务相关函数的入口函数。关于函数实现机制napi_valueOn(napi_envenv,napi_callback_infocbinfo)cbinfo信息就是传入js的information参数信息,具体实现过程可以分析相关代码。on函数中的实现类型如下:1.locationServiceState。2.gnssStatusChange。3.nmeaMessageChange。4.缓存的GnssLocationsReporting。5.fenceStat。6.位置改变。目前还不清楚其他类型将如何使用。需要后期研究。当前使用的类型是locationChange。通过locationChange(APP配置)进入SubscribeLocationChange。其中,SubscribeLocationChange中的JsObjToLocationRequest将相关的配置信息转换保存到对应的配置文件中。注意JsObjToLocationRequest有一个BUG,因为JsObjectToInt不判断返回值。不存在的参数会将前一个参数的值传递给下一个变量。参考issueg_locatorNapiPtr->StartLocating(requestConfig,locatorCallback);开始定位。StartLocatingintLocatorAbility::StartLocating(std::unique_ptr&requestConfig,sptr&callback,std::stringbundleName,pid_tpid,pid_tuid)对应的能力配置:ProxySendLocationRequestProxySendLocationRequest函数,对应使用三个Ability类型为GNSS_ABILITY、NETWORK_ABILITY、PASSIVE_ABILITY。根据日志分析,detectpassive/gps/networkabilityrequests(size:0)workrecord:[]这三个能力的size为0,目前还不清楚影响。行28932:04-1816:56:52.132368368I02300/RequestManager:RequestManager::HandleStartLocating行28934:04-1816:56:52.132368368D02300/定位器:RequestConfig::ToString行:04941816:56:52.132368368I02300/RequestManager:RestorRequest添加请求:[请求配置:场景:513,位置优先级:513,timeInterval:0,distanceInterval:0,maxAccuracy:0,fixNumber:0]来自pid:1891,uid:20010033,location.ILocator,回调地址:0x1d80390行28943:04-1816:56:52.132368368D02300/RequestManager:添加新接收者和新回调行28945:04-1816:56:52.1328D6836836802300/RequestManager:RequestManager::UpdateRequestRecord1行28948:04-1816:56:52.132368368E02300/RequestManager:无法根据请求配置获取代理名称行28950:04-1816:56:52.132368368E02300/RequestManager:RequestManager::HandleRequest行28952:04-1816:56:52.132368368D02300/RequestManager:RequestManagerProxySendLocationRequest行28955:04-1816:56:52.132368368D02300/RequestManager:检测gps能力requests(size:0)工作记录:[]行28957:04-1816:56:52.132368368D02300/RequestManager:RequestManagerGetRemoteObject行28960:04-1816:56:52.132368368I02300/GnssAbility:GnssAbilityStubOnRemoteRequestcmd=1,flags=0,pid=368,uid=0行28962:164:68:52.132368368I02300/GnssAbility:刷新要求行28965:04-1816:56:52.132368368D02300/GnssAbility:RemoteRequestTransactErrCode=0行28968:04-1816:526:86:52FusionController:fusedflag:0行28971:04-1816:56:52.132368368I02300/NetworkAbility:NetworkAbilityStubOnRemoteRequestcmd=4,flags=0,pid=368,uid=0行28973:04-1816:56:52.132368368E02300/NetworkAbility:SelfRequest0行28976:04-1816:56:52.132368368I02300/NetworkAbility:刷新要求行28978:04-1816:56:52.132368368D02300/RequestManager:RequestManagerProxySendLocationRequest行28980:04-1816:56:52.132368368D02300/RequestManager:检测网络能力请求(size:0)工作记录:[]行28982:04-1816:56:52.132368368D02300/RequestManager:RequestManagerGetRemoteObject行28985:04-1816:56:52.132368368I02300/NetworkAbility:NetworkAbilityStubOnRemoteRequestcmd=1,flags=36,,uid=0行28987:04-1816:56:52.132368368I02300/NetworkAbility:刷新要求行28989:04-1816:56:52.132368368D02300/NetworkAbility:RemoteRequestTransactErrCode2:09行04-1816:56:52.132368368D02300/RequestManager:RequestManagerProxySendLocationRequest行28994:04-1816:56:52.132368368D02300/RequestManager:检测被动能力请求(size:0)工作记录:[]行28996:04-1816:56:52.132368368D02300/RequestManager:RequestManagerGetRemoteObject行289IPassiveAbility:刷新要求行29004:04-1816:56:52.132368368D02300/PassiveAbility:RemoteRequestTransactErrCode=0行29010:04-1816:56:52.133368368D02300/TransactLocatorChange:OnTransLocatingChangelocation这是函数分析过程的结束。简单分析了locationChange类型的流程,其余的locationServiceState/gnssStatusChange/nmeaMessageChange/cachedGnssLocationsReporting/fenceStatusChange都有具体的使用方法。更多信息请访问:51CTOOpenHarmony技术社区https://ost.51cto.com