我的编程空间,编程开发者的网络收藏夹
学习永远不晚

GPS模块分析之ON函数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

GPS模块分析之ON函数

​想了解更多内容,请访问:​

​51CTO OpenHarmony技术社区​

​https://ost.51cto.com​

背景

3月30日openharmony3.1版本发布,openharmony新增许多服务功能组件,具体新添加的功能可以通过社区获取,当然新增组件中包含位置服务组件,用于位置相关的服务功能如定位,导航等等。本文通过详细代码具体分析其数据流程。

注意:代码分析需要一定c/c++代码阅读知识,当然由于代码为个人理解和社区代码不完的原因,会存在理解上面的偏差。

location介绍

仓库位置

location仓库位于base目录下面,其具体位置如图:

location 简介说明

位置能力用于确定用户设备在哪里,系统使用位置坐标标示设备的位置,并用多种定位技术提供服务,如GNSS定位、基站定位、WLAN/蓝牙定位(基站定位、WLAN/蓝牙定位后续统称“网络定位技术”)。通过这些定位技术,无论用户设备在室内或是户外,都可以准确地确定设备位置。

坐标

系统以1984年世界大地坐标系统为参考,使用经度、纬度数据描述地球上的一个位置。

GNSS定位

基于全球导航系统,包含:GPS、GLONASS、北斗、Galileo等,通过导航,设备芯片提供的定位算法,来确定设备准确位置。定位过程具体使用哪些定位系统,取决于用户设备的硬件能力。

基站定位

根据设备当前驻网基站和相邻基站的位置,估算设备当前位置。此定位方式的定位结果精度相对较低,并且需要设备可以访问蜂窝网络。

WLAN、蓝牙定位

根据设备可搜索到的周围WLAN、蓝牙设备位置,估算设备当前位置。此定位方式的定位结果精度依赖设备周围可见的固定WLAN、蓝牙设备的分布,密度较高时,精度也相较与基站定位方式更高,同时也需要设备可以访问网络。

框架介绍

说明:代码验证使用开发板为RK3568开发板。代码为主线4月8日代码。应用开发deveco studio API we为9版本,应用采用ets语言开发。

应用开发

使用deveco 编写一个简单的应用。通应用(即使用js)调用对应位置服务打开对应的接口。

应用代码如下:

tring = ''
private isWlanEnable: boolean = false;
private islocationon: boolean = false;
@State message: string = 'Hello World'
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%')
}
private switchOn() {
//导航场景
var requestInfo = {'scenario': 0x301, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0};
//精度优先的
//var requestInfo = {'priority': 0x201, 'timeInterval': 0, 'distanceInterval': 10, 'maxAccuracy': 10};
var locationChange = (location) => {
console.log('locationChanger: data: ' + JSON.stringify(location));
};
// 打开位置信息
geolocation.on('locationChange', requestInfo, locationChange);
// 位置信息转换
var reverseGeocodeRequest = {"latitude": 31.12, "longitude": 121.11, "maxItems": 1};
geolocation.getAddressesFromLocation(reverseGeocodeRequest, (data) => {
console.log('getAddressesFromLocation address: ' + JSON.stringify(data));
this.text = data;
});
}
}

应用截图:

代码数据流程

开发板通过配置连接wifi,并打开位置信息(设置->隐私->位置),运行编译安装好的应用,通过hilog收集开发板中对应日志信息。我们可以逐步了解数据流转过程。注意:由于当前位置的使用没有具体的指导手册,位置授权处理是通过对CheckLocationPermission函数进行修改(应用中配置main_pages.json配置权限未见起作用)。

修改如下:

通过hilog 获取日志。我们可以收集部分location 对应的信息。通过02300标识筛选与位置相关的日志信息。日志信息如图(当前图片日志信息已经在代码中增添一部分,非代码原始日志):

位置流程框架

当开启应用时,从APP到底层的流程如下:

On(napi_env env, napi_callback_info cbinfo) 函数为拉起位置服务相关功能入口函数。

On函数实现机制

napi_value On(napi_env env, napi_callback_info cbinfo)

cbinfo 信息为js传入信息参数信息,具体实现过程可以分析相关代码。

on 函数中实现类型有以下几种:

1、locationServiceState。

2、gnssStatusChange。

3、nmeaMessageChange。

4、cachedGnssLocationsReporting。

5、fenceStat。

6、locationChange。

当前暂时不清楚其他几种类型的使用方法。需要后期研究。当前使用的为locationChange类型。

通过locationChange(APP配置)进入到SubscribeLocationChange。其中SubscribeLocationChange 中JsObjToLocationRequest将相关配置信息转换保存到对应的配置文件中。注意JsObjToLocationRequest由于JsObjectToInt没有对返回值进行判断,这里存在一个BUG。不存在的参数会将上一个参数的值传递到下一个变量。参考issue

g_locatorNapiPtr->StartLocating(requestConfig, locatorCallback); 拉起定位。

StartLocating

int LocatorAbility::StartLocating(std::unique_ptr<RequestConfig>& requestConfig, sptr<ILocatorCallback>& callback, std::string bundleName, pid_t pid, pid_t uid)

进行对应的ability配置:

ProxySendLocationRequest

ProxySendLocationRequest 函数中,对应的使用3种类型的能力GNSS_ABILITY、NETWORK_ABILITY、PASSIVE_ABILITY。

由日志分析detect passive/gps/network ability requests(size:0) work record:[]这3种ability 的size为0,暂不清楚这种影响。

 28932: 04-18 16:56:52.132   368   368 I 02300/RequestManager: RequestManager::HandleStartLocating
28934: 04-18 16:56:52.132 368 368 D 02300/Locator: RequestConfig::ToString
28941: 04-18 16:56:52.132 368 368 I 02300/RequestManager: RestorRequest add request:[request config: scenario : 513, location priority : 513, timeInterval : 0, distanceInterval : 0, maxAccuracy : 0, fixNumber : 0] from pid:1891, uid:20010033, location.ILocator, callback's address : 0x1d80390
28943: 04-18 16:56:52.132 368 368 D 02300/RequestManager: add new receiver with new callback
28945: 04-18 16:56:52.132 368 368 D 02300/RequestManager: RequestManager::UpdateRequestRecord1
28948: 04-18 16:56:52.132 368 368 E 02300/RequestManager: can not get proxy name according to request configuration
28950: 04-18 16:56:52.132 368 368 E 02300/RequestManager: RequestManager::HandleRequest
28952: 04-18 16:56:52.132 368 368 D 02300/RequestManager: RequestManager ProxySendLocationRequest
28955: 04-18 16:56:52.132 368 368 D 02300/RequestManager: detect gps ability requests(size:0) work record:[]
28957: 04-18 16:56:52.132 368 368 D 02300/RequestManager: RequestManager GetRemoteObject
28960: 04-18 16:56:52.132 368 368 I 02300/GnssAbility: GnssAbilityStub OnRemoteRequest cmd = 1, flags= 0, pid= 368, uid= 0
28962: 04-18 16:56:52.132 368 368 I 02300/GnssAbility: refrash requirements
28965: 04-18 16:56:52.132 368 368 D 02300/GnssAbility: RemoteRequest Transact ErrCode = 0
28968: 04-18 16:56:52.132 368 368 I 02300/FusionController: fused flag:0
28971: 04-18 16:56:52.132 368 368 I 02300/NetworkAbility: NetworkAbilityStub OnRemoteRequest cmd = 4, flags= 0, pid= 368, uid= 0
28973: 04-18 16:56:52.132 368 368 E 02300/NetworkAbility: SelfRequest 0
28976: 04-18 16:56:52.132 368 368 I 02300/NetworkAbility: refrash requirements
28978: 04-18 16:56:52.132 368 368 D 02300/RequestManager: RequestManager ProxySendLocationRequest
28980: 04-18 16:56:52.132 368 368 D 02300/RequestManager: detect network ability requests(size:0) work record:[]
28982: 04-18 16:56:52.132 368 368 D 02300/RequestManager: RequestManager GetRemoteObject
28985: 04-18 16:56:52.132 368 368 I 02300/NetworkAbility: NetworkAbilityStub OnRemoteRequest cmd = 1, flags= 0, pid= 368, uid= 0
28987: 04-18 16:56:52.132 368 368 I 02300/NetworkAbility: refrash requirements
28989: 04-18 16:56:52.132 368 368 D 02300/NetworkAbility: RemoteRequest Transact ErrCode = 0
28992: 04-18 16:56:52.132 368 368 D 02300/RequestManager: RequestManager ProxySendLocationRequest
28994: 04-18 16:56:52.132 368 368 D 02300/RequestManager: detect passive ability requests(size:0) work record:[]
28996: 04-18 16:56:52.132 368 368 D 02300/RequestManager: RequestManager GetRemoteObject
28999: 04-18 16:56:52.132 368 368 I 02300/PassiveAbility: PassiveAbilityStub OnRemoteRequest cmd = 1, flags= 0, pid= 368, uid= 0
29002: 04-18 16:56:52.132 368 368 I 02300/PassiveAbility: refrash requirements
29004: 04-18 16:56:52.132 368 368 D 02300/PassiveAbility: RemoteRequest Transact ErrCode = 0
29010: 04-18 16:56:52.133 368 368 D 02300/LocatorCallback: OnLocatingStatusChange Transact ErrCode

结束

location on 函数分析流程到此结束其中只是简单的分析了locationChange 类型的流程,其余locationServiceState/gnssStatusChange/nmeaMessageChange/cachedGnssLocationsReporting/fenceStatusChange有具体使用方法时在一一进行分析。

​想了解更多内容,请访问:​

​51CTO OpenHarmony技术社区​

​https://ost.51cto.com​

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

GPS模块分析之ON函数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GPS模块分析之ON函数

代码分析需要一定c/c++代码阅读知识,当然由于代码为个人理解和社区代码不完的原因,会存在理解上面的偏差。

数据分析之pandas模块

一、Series  类似于一位数组的对象,第一个参数为数据,第二个参数为索引(索引可以不指定,就默认用隐式索引)Series(data=np.random.randint(1,50,(10,)))Series(data=[1,2,3],in
2023-01-30

Python基础之函数和模块

函数的基本使用函数的定义:把具有独立功能的代码块组织成一个小模块,在需要的时候调用。或者说,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数的使用:1.定义函数;2.调用函数。函数的作用:能提高应用的模块性,和代码的重
2023-01-31

Nodejs v14源码分析之Event模块

events模块是Node.js中比较简单但是却非常核心的模块,Node.js中,很多模块都继承于events模块,events模块是发布、订阅模式的实现。我们首先看一下如何使用events模块。
Nodejs模块2024-12-03

Python中functools模块函数解析

Python自带的 functools 模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数。换言之,就是能使用该模块对可调用对象进行处理。 functools模块函数概览functools.cmp_to_key(func)fun
2022-06-04

Python基础之模块的示例分析

这篇文章给大家分享的是有关Python基础之模块的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是模块容器 -> 数据的封装函数 -> 语句的封装类 -> 方法和属性的封装模块 -> 模块就是程序
2023-06-15

Python argparse参数模块之命令行参数实例分析

这篇文章主要介绍“Python argparse参数模块之命令行参数实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python argparse参数模块之命令行参数实例分析”文章能帮助大家解
2023-07-02

Openharmony软总线之连接模块分析

openharmony 软总线需要将不同设备整合到一起,由于不同的设备通信存在差异,如wifi与蓝牙之间通信存在差异,软总线(bus)需要具备有处理不同类型设备之间通信功能。

Spring之WEB模块配置的示例分析

小编给大家分享一下Spring之WEB模块配置的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring的WEB模块用于整合Web框架,例如Struts
2023-05-30

Python中functools模块的常用函数解析

1.partial 首先是partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象:>>> int('10') # 实际上等同于int('10', base=10)和int('10', 10) 10
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录