芯片在手机中的耗电量如何在不耗电不充电情况下进行GPS定位

在手机上怎样安装GPS定位芯片_百度知道
在手机上怎样安装GPS定位芯片
请问是定位自己位置还是对方位置?
我有更好的答案
您好,亲爱的管家用户目前手机的GPS模块是内置的,无法外置连接,如果您的手机无GPS模块,则只能用基站进行定位。感谢您对腾讯手机管家的支持!
有实力 无所惧
主营:手机安全与管理软件
只能弄个外至式的
请具体说说,什么是外至式
就是放在外面的,要用数据线连接手机的,就像充电宝一样链接手机
手机外置式导航模块一般可以通过蓝牙连接手机起到导航定位功能
为您推荐:
其他类似问题
您可能关注的内容
gps定位的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。扫描二维码使用触屏版
上市代码000062&&原华强安防网
华强安防产品库由 174106 位商家共同打造而成,共计 4847345 条产品,当前有 306 位采购商正在找产品
官方微信 精彩呈现
3小时前,来自美国的采购商联系了
产品供应商4小时前,来自湖北省武汉市的采购商提交了
询价单6小时前,来自江苏省南通市的采购商联系了
产品供应商6小时前,来自广东省深圳市的采购商联系了
产品供应商
儿童GPS定位器,微型个人定位器
&无线呼叫器
品牌锐峰汇智
产品型号rf-V16
供应地区广东 深圳
售后服务由深圳锐峰汇智科技有限公司提供 
2935 人感兴趣
锐峰汇智RF-V16GPS个人应急定位通器是一款老人、小孩及特殊人群的应及求救及定位器,具有SOS求救功能、一键拨号、双向语音通话、GPS全球定位、电子围栏、轨迹回放等功能,利用GPS定位和LBS基站双模式定位,为广大用户提供全方位的精确定位及远程监护服务,采用最顶尖的GPS芯片,定位更快,精度更高,耗电更低。用户可以通过扫描二维码下载智能手机客户端软件,用智能手机管理更方便,而且定位信息在地图上看起来比短信更直观、更精确。如果遇到危险,按下SOS按钮即向监护人发出求救电话,快速得到救缓和脱险。锐峰汇智个人应急定位通器,让距离不再是关爱的障碍,无论您与监护器相隔多远,关爱与呵护均可即刻送达,“锐峰汇智”GPS个人应急定位通讯器贴身守护您的家人安全,让关爱一路随行。
产品功能描述:
【一键拨号】:在突发事件上,只需轻轻一按,就可以与亲人通电话,让关爱与呵护均可即刻送达。
【sos求救】:在紧急情况时,孩子或老人按下SOS键,即对监护人发出求救信息,通讯器会自动将当前位置信息发给事先设置的5个求救号码,并持续拨打求救号码,直到有人接听为止,真正能够保证孩子的生命安全。
【按键接听】当RF-V16来电铃声响时,孩子只需要按其中一个按键就可以和爸爸妈妈通电话,如果不想听,按挂机键就可以拒听。
【免提自动接听】在遇到紧急的情况下,无需接下键就可以自动进入免提自动接听状态,RF-V16个人应急通讯器将自动启动接听来电电话,爸爸妈妈不用担心孩子因叛逆而不接电话,或者遇到危险时无法接听电话了,从而减少意外的发生。保障家人安全,阻止危险发生!
【静音关怀】当你拨打孩子电话无人接听时,或者在特殊事件中孩子无法接听,或者您不想打扰孩子却又关心孩子的情况时,您可以开启远程“静音关怀”功能,就可以听到孩子周围的环境声音,从而了解孩子的情况,应对突发事情。
【双向通话】如果只是单向远程监听,遇到紧急求救时,家人并不知道你们已经收到他的求救信息,只能光着急。有了双向通话,若遇到紧急情况你可以直接和亲人沟通,了解当前情况,能有效的舒缓双方紧张的情绪。
【全球定位】内置GPS芯片,GPS卫星和基站双重监控定位实现全天候实时定位追踪。提供多种方式查询定位,精准定位并获取位置信息,全球通用,无地区限制,父母、老人、孩子的位置了如指指掌,所有担忧一扫而光,安心做自己的事情。
【电子围栏】担心孩子在网吧玩游戏耽误学心,家长可以给孩子设定一定的区域范围,一旦孩子超出此范围,监护人都会收到短信提示。(你可以在定位平台网站上的地图页面设置电子围栏,以设备为中心在地图划定一个区域,当设备超出围栏时会向已绑定的手机号码发出提醒信息。)
【低电量报警和换卡提示】当电量低于10%时,定位通讯器主动向主控号码发送低电量提示信息,提醒用户及时充电。当定位通讯器更其它SIM号码时,定位通讯器主动向主控号码发送SIM卡提示信息。
【防骚扰模式】开通防骚扰模式,后台系统会自动过滤陌生人的电话和短信息,在按键接听的情况下只能SOS号码才能呼入。
【轨迹回放】监护人可以通过绑定的手机、微信、定位平台等查询被监护人的行驶轨迹。
【平台查询位置】“锐峰汇智”RF-V16提供多种平台查询方式,定位平台www.gps123.org,支持多种定位查询:微信,APP,手机短信,互联网平台等
手机APP查询
网站www.gps123.org&进行查询
产品细节:
全新的产品定位,颠覆传统的产品外观设计、结构设计与制造材料,打造精益求精的硬件产品,累计多年“锐峰汇智”与GPS定位产品的开发实力,专注所以专业,独特经典时尚的设计风格,军工级的实力造新品质,锐峰汇智-是您身边的关爱呵护服务的产品专家
内部细节:
采用高性能芯片、原装进口主板、最新软件程序,声音更清晰,定位更准确,待机时间更长,所有精华浓缩于小巧的机身里,隐蔽性好,携带方便。严格的生产线把关,不同于市场上一些山寨产品,一分钱一分货。好产品,你值得拥有!
平台的基本功能有:
1.手机查询演示(短信、微信及APP客户端)
2.即时定位-轻松用鼠标点击,即可对目标进行即时定位,还可同时定位多个目标。
3.轨迹回放,轻松查看去过的路线。
4.监控平台有最具权威的Google全球地图和百度地图。
5.多地图查看位置,电子地图、卫星影像图等,任意切换,摆脱电子地图更新慢的约束。
产品优势:
体积最小、待机超长(300小时)、功能全面、使用简单、符合人体工程学、无毒无害、可按需定制(OEM)等。
本公司(厂家)优势:
1、历史悠久,有长期的技术沉淀积累;
2、掌握GPS、LBS核心技术;
3、保证产品用料和各性能指标领先同行水平;
4、产品达到国际标准,出口远销全球各地;
5、厂家直供的第一价格;
6、最直接的技术支持和售后服务等
欢迎来电咨询或到公司洽谈。
邮箱:service@rf-gsm.com
官网1:http://www.rf-gsm.com/
官网2:http://www.rfgsm.net/
地址:深圳市宝安龙华民治民宝路南源商业大厦503室
(联系我时,请务必告知是在华强智慧网上看到的,谢谢!)
资质认证:
电子邮箱:
地址:深圳市宝安龙华民治民宝路南贤商业大厦503...
相关技术知识
可能您感兴趣的
关于儿童GPS定位器,微型个人定位器的详细介绍、联系电话、批发报价、产品图片、规格参数、品牌型号等信息,是由深圳锐峰汇智科技有限公司在华强安防网发布提供的,如果您对儿童GPS定位器,微型个人定位器的产品信息感兴趣可以联系他们或者留言询价让供应商主动联系您,您也可以进入店铺查看更多相关产品!
内容声明:华强安防网为第三方信息服务平台,华强安防网所展示的商品/服务的标题、价格、详情等信息内容系由店铺经营者发布,其真实性、准确性和合法性均由店铺经营者负责,华强安防网提醒您购买商品/服务前注意谨慎核实。
|||||产品检索:
华强安防网 版权所有
经营许可证: 软件企业认证:
提示:供应商将在24小时内给您回复。
儿童GPS定位器,微型个人定位器
获取手机验证码
为共建真实可信的信息服务平台,支付1.00元认证您的询价信息
支付宝支付¥1.00
支付提示信息
请在新打开的支付页面上完成付款,付款完成前请不要关闭此窗口。如您在支付过程中遇到问题,请联系客服。
您的询价已发送
供应商将在24小时内给您回复,请保持手机畅通!【图片】[定位教程]正确且合理的GPS定位,你的7i做到了吗【华为荣耀7i吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:5,576贴子:
[定位教程]正确且合理的GPS定位,你的7i做到了吗
GPS相信我们每个人都用过,特别是有车一族,遇到不认识的地方,GPS给我们带来了大大的好处。还有现在的地图软件,去一个地方不知道如何坐车,一搜马上就能出来,给我们的出行带来了很大的方便。那么在使用GPS的时候经常会遇到一些问题,例如定位慢,不准确,等等这些问题,现在就来教大家如何解决。打开设置,定位服务,定位模式,里面有三种模式,分别是准确度高,耗电量低,仅限设备。准确度高:GPS芯片,网络,全方面定位,更加准确,追求准确度高的选该项。耗电量低:仅使用网络,准确度可能会有误,毕竟依靠基站,一般预览地图可以,不建议导航用。仅限设备:仅使用手机内置的GPS芯片,没有网络也可以定位,定位较慢。以上三种,根据情况来选择,准确度高肯定是最好的,但会增加功耗,毕竟芯片加网络。下面是楼主手机GPS测试,楼主使用的是仅限GPS,在空旷,未移动的情况下定位还是挺快的。图文转载自花粉论坛我不生产水 我只是大自然的搬运工
我想问下怎么关闭无线网络定位。。用位置伪装大师··
贴吧热议榜
使用签名档&&
保存至快速回贴GPS全球定位芯片。有没有GPS芯片装在项链里戴在脖子上的_百度知道
GPS全球定位芯片。有没有GPS芯片装在项链里戴在脖子上的
我想买一个GPS全球定位芯片 微型的,装在一个项链里,送给女朋友。这样我就可以随时知道我女朋友的处境,方便找到她,我看到非常小特务2
里面他家儿子失踪了以后,没有任何方法能找到,最后想起了它爷爷以前送他的吊坠,里面带有GPS芯片,最后找到了,
我有更好的答案
1、手机相互定位应该是可以的,可以咨询运营商;2、目前市场上还有就是手表定位,带一个特殊的手表,内嵌GPS定位和GRPS功能,能够实时了解佩戴人的位置信息。
采纳率:31%
现在没有这么小的吊坠,火柴盒一般大小的就有,而且需要定时充电。
你可以在她的手机里装一个位信,然后打开,这样你在网站的后台就可以看见她的定位信息了。
你说的是否是腾讯的微信?
不是,是位智天下的一个smartlbs位信。
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
gps全球定位的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。【Android架构GPS篇】之定位数据如何从GPS芯片到应用层
Android:V4.2.2
Source Insight
在漫长的Android源码编译等待过程中,想起之前写过一部分的Android定位实现的探究小品,于是继续探究。
注:代码都是片段化的代码,用来提纲挈领的说明问题。
定位的基础知识:
1、定位芯片和CPU之间通过串口进行通信
2、串口和CPU之间传输的是ASCII格式的NMEA(National Marine Electronics Association)信息,如:
$GPGGA,,,S,,E,1,04,24.4,19.7,M,,,,0000*1F
$GPGLL,,S,,E,,A*2D
$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
$GPRMC,,A,,S,,E,0.00,89.68,211200,,*25
基于以上两点,要探知定位数据从GPS芯片到应用层的流程,最好的途径就是从应用层输出NEMA信息的地方开始。
NMEA资料参见:
一、GPS定位的应用层实现
Luckily,在应用层我们可以通过onNmeaReceived()方法获取到NMEA信息,如下Code Fragment:
public class GpsTestActivity extends ActionBarActivity {
/* Other Codes */
/** 获取系统的定位服务,记得在AndroidManifest中赋予定位方面的权限:
* &uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&
* &uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/&
* &uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/&
LocationManager mLocationService = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mLocationService.addNmeaListener(mNmeaListener);
private GpsStatus.NmeaListener mNmeaListener = new NmeaListener() {
public void onNmeaReceived(long timestamp, String nmea) {
System.out.println(nmea + "\n");
二、GPS定位的Framework层实现
GpsStatus.NmeaListener是一个接口类,来自GpsStatus.java文件:
frameworks\base\location\java\android\location\GpsStatus.java
* Used for receiving NMEA sentences from the GPS.
* NMEA 0183 is a standard for communicating with marine electronic devices
* and is a common method for receiving data from a GPS, typically over a serial port.
* See &a href="http://en.wikipedia.org/wiki/NMEA_0183"&NMEA 0183&/a& for more details.
* You can implement this interface and call {@link LocationManager#addNmeaListener}
* to receive NMEA data from the GPS engine.
public interface NmeaListener {
void onNmeaReceived(long timestamp, String nmea);
}在上述App中,我们的应用程序实现了该方法,一旦NMEA数据到来,onNmeaReceived()方法就被调用一次,我们在Console上可以看到原始的NEMA信息。
那么接下来,就要寻找nmea数据的来源了。
mNmeaListener通过LocationManager类的addNmeaListener()方法进行注册(register):
frameworks\base\location\java\android\location\LocationManager.java
* Adds an NMEA listener.
* @param listener a {@link GpsStatus.NmeaListener} object to register
* @return true if the listener was successfully added
* @throws SecurityException if the ACCESS_FINE_LOCATION permission is not present
public boolean addNmeaListener(GpsStatus.NmeaListener listener) {
/* mNmeaListeners是LocationManager类的成员变量:
* private final HashMap&GpsStatus.NmeaListener, GpsStatusListenerTransport& mNmeaListeners =
new HashMap&GpsStatus.NmeaListener, GpsStatusListenerTransport&();
if (mNmeaListeners.get(listener) != null) {
// listener is already registered
GpsStatusListenerTransport transport = new GpsStatusListenerTransport(listener);
result = mService.addGpsStatusListener(transport);
if (result) {
mNmeaListeners.put(listener, transport);
} catch (RemoteException e) {
Log.e(TAG, "RemoteException in registerGpsStatusListener: ", e);
}这里,先检测定义的NmeaListener有没有被注册过,若果没有,注册之。
注册到哪里去了呢?
由mNmeaListeners成员的定义可知,和GpsStatus.NmeaListener进行关联的是GpsStatusListenerTransport,而它是LocationManager类的一个内部类。
只看相关的部分:
// This class is used to send GPS status events to the client's main thread.
private class GpsStatusListenerTransport extends IGpsStatusListener.Stub {
private final GpsStatus.NmeaListener mNmeaL
// This must not equal any of the GpsStatus event IDs
private static final int NMEA_RECEIVED = 1000;
private class Nmea {
Nmea(long timestamp, String nmea) {
mTimestamp =
private ArrayList&Nmea& mNmeaB
//G psStatusListenerTransport(GpsStatus.Listener listener){}
GpsStatusListenerTransport(GpsStatus.NmeaListener listener) {
mNmeaListener =
mListener =
mNmeaBuffer = new ArrayList&Nmea&();
public void onNmeaReceived(long timestamp, String nmea) {
if (mNmeaListener != null) {
synchronized (mNmeaBuffer) {
mNmeaBuffer.add(new Nmea(timestamp, nmea));
Message msg = Message.obtain();
msg.what = NMEA_RECEIVED;
// remove any NMEA_RECEIVED messages already in the queue
mGpsHandler.removeMessages(NMEA_RECEIVED);
mGpsHandler.sendMessage(msg);
private final Handler mGpsHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == NMEA_RECEIVED) {
synchronized (mNmeaBuffer) {
int length = mNmeaBuffer.size();
for (int i = 0; i & i++) {
Nmea nmea = mNmeaBuffer.get(i);
mNmeaListener.onNmeaReceived(nmea.mTimestamp, nmea.mNmea);
mNmeaBuffer.clear();
// synchronize on mGpsStatus to ensure the data is copied atomically.
}在GpsStatusListenerTransport类中:
定义一个Nmea类型的链表mNmeaBuffer,一旦onNmeaReceived()接收到NMEA数据,新数据被加载到链表mNmeaBuffer中(mNmeaBuffer.add(new Nmea(timestamp, nmea))),然手置消息标志为NMEA_RECEIVED(msg.what = NMEA_RECEIVED)。
mGpsHandler对上述NMEA_RECEIVED消息进行处理,最终把传过来的NMEA数据发往应用层GpsTestActivity中的onNmeaReceived()。
那么,GpsStatusListenerTransport类中onNmeaReceived(long timestamp, String nmea)方法的nmea数据有谁提供呢?
GpsStatusListenerTransport类继承自IGpsStatusListener,由类前的字符"I"我们得知,它是一个扩展名为.aidl的文件。
AIDL:AIDL机制用来完成在进程之间进行通信(在Android中不允许进程间共享数据),它的详细知识另外Google之。
这里,我们再次见到了onNmeaReceived():rameworks\base\location\java\android\location\IGpsStatusListener.aidl
oneway interface IGpsStatusListener
void onGpsStarted();
void onGpsStopped();
void onFirstFix(int ttff);
void onSvStatusChanged(int svCount, in int[] prns, in float[] snrs, in float[] elevations, in float[] azimuths, int ephemerisMask, int almanacMask, int usedInFixMask);
void onNmeaReceived(long timestamp, String nmea);
oneway关键字是用来修饰远程调用行为。使用该关键词时,远程调用不是阻塞的,它只是发送事物数据并立即返回。接口的最终实现是把普通的远程调用按照Binder线程池的调用规则来接收,如果oneway是使用在本地调用上,那么不会有任何影响,并且调用依然是异步的。
下面,探究必须进入第三层。
三、GPS定位的Lib层实现
和IGpsStatusListener接头的是GpsLocationProvider类:
frameworks\base\services\java\com\android\server\location\GpsLocationProvider.java
public class GpsLocationProvider implements LocationProviderInterface {
// 此处省略1000+N行
private ArrayList&Listener& mListeners = new ArrayList&Listener&();
private final class Listener implements IBinder.DeathRecipient {
final IGpsStatusListener mL
Listener(IGpsStatusListener listener) {
mListener =
public void binderDied() {
if (DEBUG) Log.d(TAG, "GPS status listener died");
synchronized (mListeners) {
mListeners.remove(this);
if (mListener != null) {
mListener.asBinder().unlinkToDeath(this, 0);
* called from native code to report NMEA data received
private void reportNmea(long timestamp) {
synchronized (mListeners) {
int size = mListeners.size();
if (size & 0) {
// don't bother creating the String if we have no listeners
int length = native_read_nmea(mNmeaBuffer, mNmeaBuffer.length);
String nmea = new String(mNmeaBuffer, 0, length);
for (int i = 0; i & i++) {
Listener listener = mListeners.get(i);
listener.mListener.onNmeaReceived(timestamp, nmea);
} catch (RemoteException e) {
Log.w(TAG, "RemoteException in reportNmea");
mListeners.remove(listener);
// adjust for size of list changing
}GPS定位功能最终需要调用硬件实现,操作硬件就必须通过C/C++完成,GpsLocationProvider中包含许多native方法,采用JNI机制为上层提供服务。
在上面的Code Frame中,通过调用本地方法native_read_nmea()获取到NMEA数据,然后传数据到IGpsStatusListener接口类的onNmeaReceived()方法。
reportNmea()是被JNI方法回调的方法,在 JNI 的实现中,通过这些方法的回调来传递JNI层的执行结果。
源码编译出错,解决问题去。。。
native_read_nmea()在GpsLocationProvider类中定义:
private native int native_read_nmea(byte[] buffer, int bufferSize);native指明它是本地方法,和它对应的C/C++文件的实现是:static jint android_location_GpsLocationProvider_read_nmea(JNIEnv* env, jobject obj, jbyteArray nmeaArray, jint buffer_size);How?Next...
frameworks\base\services\jni\com_android_server_location_GpsLocationProvider.cpp
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
/* other members... */
{"native_read_nmea", "([BI)I", (void*)android_location_GpsLocationProvider_read_nmea},
/* other members... */
};JNINativeMethod是Android中采用的Java和C/C++函数的映射方式,并在其中描述了函数的参数和返回值:
typedef struct {
const char*
// Java文件中的本地方法
const char* // 述了函数的参数和返回值
// 指针,指向具体的C/C++函数
} JNINativeM详细内容这里还是不展开了。
来看android_location_GpsLocationProvider_read_nmea()的实现:static jint android_location_GpsLocationProvider_read_nmea(JNIEnv* env, jobject obj,
jbyteArray nmeaArray, jint buffer_size)
// this should only be called from within a call to reportNmea
jbyte* nmea = (jbyte *)env-&GetPrimitiveArrayCritical(nmeaArray, 0);
int length = sNmeaStringL
if (length & buffer_size)
length = buffer_
memcpy(nmea, sNmeaString, length);
env-&ReleasePrimitiveArrayCritical(nmeaArray, nmea, JNI_ABORT);
}虽然不清楚JNI深入含义,但这个函数意思还是挺明显的,我们推断:
第5行:用来动态分配内存,nmea指向获取到的内存区域,同时把nmea和nmeaArray进行关联;
第6行:sNmeaStringLength指示一次从串口读取到的字节长度
第7、8行:在Java中调用native_read_nmea()方法时指明了我们需要取的数据长度,所以,如果从串口实际读取的数据长度大于我们需要的,我们对串口数据进行截取:即,只取指定长度的数据;
第9行:从串口读出的数据存在sNmeaString中,这里Copy到nmea指向的内存区域;
第10行:nmea指向的内存区域中的数据交给nmeaArray,然后释放nmea指向的内存空间。这里也可以看到,函数调用是通过nmeaArray传递NMEA数据的
下面应该看sNmeaStringLength、sNmeaString的设置过程:
static void nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)
JNIEnv* env = AndroidRuntime::getJNIEnv();
// The Java code will call back to read these values
// We do this to avoid creating unnecessary String objects
sNmeaString =
sNmeaStringLength =
env-&CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
}method_reportNmea、、、有没有熟悉的感觉?
对,在GpsLocationProvider类中见过reportNmea(long timestamp)函数。下面的代码片段表明,method_reportNmea()和reportNmea()是绑定在一起的,调用C/C++函数method_reportNmea,也就间接调用Java的reportNmea()方法。这中间的机制,就是JNI!
static void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {
/* other definitions... */
method_reportNmea = env-&GetMethodID(clazz, "reportNmea", "(J)V");
/* other definitions... */
}而method_reportNmea是在nmea_callback()函数中被调用的,哪里又调用nmea_callback()函数呢?
Let's go to neXt Layer...
四、GPS定位HAL层的实现
所谓Android的HAL层,也就是是Linux的应用程序。至于串口具体配置,比如寄存器配置、数据收发等芯片级实现,是在在Linux内核里的。
com_android_server_location_GpsLocationProvider.cpp文件中另外出现nmea_callback的地方是:
GpsCallbacks sGpsCallbacks = {
sizeof(GpsCallbacks),
location_callback,
status_callback,
sv_status_callback,
nmea_callback,
set_capabilities_callback,
acquire_wakelock_callback,
release_wakelock_callback,
create_thread_callback,
request_utc_time_callback,
};GpsCallbacks结构体封装了所有需要回调的函数(确切的说是函数指针),sGpsCallbacks调用关系:static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)
// this must be set before calling into the HAL library
if (!mCallbacksObj)
mCallbacksObj = env-&NewGlobalRef(obj);
// fail if the main interface fails to initialize
if (!sGpsInterface || sGpsInterface-&init(&sGpsCallbacks) != 0)
/* other codes */
}而android_location_GpsLocationProvider_init()在GpsLocationProvider类中调用native_init()时被调用:static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"native_init", "()Z", (void*)android_location_GpsLocationProvider_init}
}这里,我们找到了和上层的关系,和下层如何打交道呢?
下面需要贴一大段代码:/** Represents the standard GPS interface. */
typedef struct {
/** set to sizeof(GpsInterface) */
* Opens the interface and provides the callback routines
* to the implemenation of this interface.
(*init)( GpsCallbacks* callbacks );
/** Starts navigating. */
(*start)( void );
/** Stops navigating. */
(*stop)( void );
/** Closes the interface. */
(*cleanup)( void );
/** Injects the current time. */
(*inject_time)(GpsUtcTime time, int64_t timeReference,
int uncertainty);
/** Injects current location from another location provider
(typically cell ID).
latitude and longitude are measured in degrees
expected accuracy is measured in meters
(*inject_location)(double latitude, double longitude, float accuracy);
* Specifies that the next call to start will not use the
* information defined in the flags. GPS_DELETE_ALL is passed for
* a cold start.
(*delete_aiding_data)(GpsAidingData flags);
* min_interval represents the time between fixes in milliseconds.
* preferred_accuracy represents the requested fix accuracy in meters.
* preferred_time represents the requested time to first fix in milliseconds.
(*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,
uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);
/** Get a pointer to extension information. */
const void* (*get_extension)(const char* name);
} GpsIGpsInterface结构体封装了GPS实现的标准接口——接口,注意!接口不就时用来连接两端的吗?一端是com_android_server_location_GpsLocationProvider.cpp文件里的实现,那另一端就是。。。都探到这个地步了,另一端应该是串口方式直接和GPS芯片打交道的Linux驱动了吧?
确是,但是还需要一个媒介:struct gps_device_t {
struct hw_device_
* Set the provided lights to the provided values.
* Returns: 0 on succes, error code on failure.
const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev);
};然后,static void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {
hw_module_t*
/* other codes..*/
err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
if (err == 0) {
hw_device_t*
err = module-&methods-&open(module, GPS_HARDWARE_MODULE_ID, &device);
if (err == 0) {
gps_device_t* gps_device = (gps_device_t *)
sGpsInterface = gps_device-&get_gps_interface(gps_device);
/* other codes..*/
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native},
}GpsLocationProvider.java通过class_init_native的调用实现对C/C++文件中android_location_GpsLocationProvider_class_init_native的调用;
com_android_server_location_GpsLocationProvider.cpp通过gps_device_t获取操作GPS芯片的接口。How????
重点来了:GPS_HARDWARE_MODULE_ID
对,就是GPS_HARDWARE_MODULE_ID!
往下看:ardware\qcom\gps\loc_api\libloc_api\gps.c
struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.version_major = 1,
.version_minor = 0,
.id = GPS_HARDWARE_MODULE_ID,
.name = "loc_api GPS Module",
.author = "Qualcomm USA, Inc.",
.methods = &gps_module_methods,
};有木有?GPS_HARDWARE_MODULE_ID!hardware\qcom\gps\loc_api\libloc_api\gps.c
extern const GpsInterface* gps_get_hardware_interface();
const GpsInterface* gps__get_gps_interface(struct gps_device_t* dev)
return gps_get_hardware_interface();
static int open_gps(const struct hw_module_t* module, char const* name,
struct hw_device_t** device)
struct gps_device_t *dev = malloc(sizeof(struct gps_device_t));
memset(dev, 0, sizeof(*dev));
dev-&common.tag = HARDWARE_DEVICE_TAG;
dev-&common.version = 0;
dev-&common.module = (struct hw_module_t*)
dev-&get_gps_interface = gps__get_gps_
*device = (struct hw_device_t*)
static struct hw_module_methods_t gps_module_methods = {
.open = open_gps
};流程很清楚了:
gps_get_hardware_interface()函数在驱动程序中实现
——在gps__get_gps_interface()中被调用
——在open_gps()被调用
——在gps_module_methods中例化
——HAL_MODULE_INFO_SYM
const GpsInterface* gps_get_hardware_interface()函数在其他C文件实现,该C文件是和Linux驱动打交道的应用程序。基本功能:
1、open处理器CPU和GPS芯片连接的串口;
2、read串口NEMA数据,并解析;
3、根据上层传进来的回调函数,打包数据,调用相应Callback,进而发送到Android应用层。
static const GpsInterface
mGpsInterface = {
.size =sizeof(GpsInterface),
.init = gps_init,
|--1、接收从上层传下来的GpsCallbacks变量,用它初始化GpsState-&callbacks成员
|--2、GpsState结构体的其他成员初始化
|--3、GpsState-&init状态设置为:STATE_INIT
|--4、最重要:启动GPS线程,进行数据的读取、处理:
state-&thread = state-&callbacks.create_thread_cb("gps", gps_state_thread, state);
--gps_create_thread create_thread_
--typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);
.start = gps_start,
--设置GPS的状态为开始:GPS_STATUS_SESSION_BEGIN
.stop = gps_stop,
--设置GPS的状态为结束:GPS_STATUS_SESSION_END
.cleanup = gps_cleanup,
--退出需要进行的一些清理工作,如GpsState-&init = STATE_QUIT,GpsCallbacks指针归null,信号量回收
.inject_time = gps_inject_time,
--可为空函数
.inject_location = gps_inject_location,
--可为空函数
.delete_aiding_data = gps_delete_aiding_data,
--可为空函数
.set_position_mode = gps_set_position_mode,
--设置GPS工作模式:单GPS、单BD、GPS/BD双系统
.get_extension = gps_get_extension,
--定位之外的扩展功能实现
state-&thread = state-&callbacks.create_thread_cb("gps", gps_state_thread, state);
--static void gps_state_thread(void*
1、state通过arg参数传入函数
2、创建了Time和Nmea数据处理两个线程
state-&nmea_thread = state-&callbacks.create_thread_cb("nmea_thread", gps_nmea_thread, state);
--static void gps_nmea_thread(void*
--gps_opentty(state);
nmea_reader_init(reader);
--nmea_reader_parse(NmeaReader*
if (gps_state-&callbacks.nmea_cb) {
gettimeofday(&tv,NULL);
mytimems = tv.tv_sec * 1000 + tv.tv_usec / 1000;
gps_state-&callbacks.nmea_cb(mytimems, r-&in, r-&pos);
D("reader_parse. %.*s ", r-&pos, r-&in );
我们是从APP层NMEA信息输出自定向下分析的,APP层信息输出的最终起始是:gps_state-&callbacks.nmea_cb(mytimems, r-&in, r-&pos);
到这里还有个问题:GPS芯片和CPU连接,使用的是哪个串口?这个串口号怎么确定的呢?
打算贴个完整HAL层的实例,考虑到代码很多,下篇在说吧。。。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 锂电池充电管理芯片 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信