GPS北斗双模技术应用开发研究—应用数据交互

简介:  GPS北斗双模技术应用开发研究—应用数据交互         Android开发原则就是谁对哪个数据感兴趣就可以通过listener去监听一下,那边定位数据肯定也是这样的,关于位置上报的话,笔者不准备在这累赘了,网上好多文章,下面就讲一下双模相关的北斗gps卫星星图搜星具体情况的数据上报以及私有协议的定制。

 

GPS北斗双模技术应用开发研究—应用数据交互

 

        Android开发原则就是谁对哪个数据感兴趣就可以通过listener去监听一下,那边定位数据肯定也是这样的,关于位置上报的话,笔者不准备在这累赘了,网上好多文章,下面就讲一下双模相关的北斗gps卫星星图搜星具体情况的数据上报以及私有协议的定制。

       在locationmanager里面有一个接口addGpsStatusListener,在应用里通过这个接口把listen传下去,这中间有很多过程,最终这个listener在location的provider里面存了起来,中间被service转了一手,但是service里面是直接用的provider的addGpsStatusListener。下面可以看看service里面的addGpsStatusListener接口情况,如下:

    public boolean addGpsStatusListener(IGpsStatusListener listener, String packageName) {
        if (mGpsStatusProvider == null) {
            return false;
        }
        int allowedResolutionLevel = getCallerAllowedResolutionLevel();
        checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel,
                LocationManager.GPS_PROVIDER);

        final int uid = Binder.getCallingUid();
        final long ident = Binder.clearCallingIdentity();
        try {
            if (!checkLocationAccess(uid, packageName, allowedResolutionLevel)) {
                return false;
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
        }

        try {
            mGpsStatusProvider.addGpsStatusListener(listener);
        } catch (RemoteException e) {
            Slog.e(TAG, "mGpsStatusProvider.addGpsStatusListener failed", e);
            return false;
        }
        return true;
    }

      这里就注册下去了。这样就相当于在provider里面就挂了个钩子了,一旦有新数据更新就可以直接传到应用里面了,当然这个listener中间转的那几手有兴趣的可以去看看代码,都不难看懂的。那看看卫星sv状态上报吧,直接触发了listener的onSvStatusChanged接口,如下:

    private void reportSvStatus() {

        int svCount = native_read_sv_status(mSvs, mSnrs, mSvElevations, mSvAzimuths, mSvMasks);

        synchronized (mListeners) {
            int size = mListeners.size();
            for (int i = 0; i < size; i++) {
                Listener listener = mListeners.get(i);
                try {
                    listener.mListener.onSvStatusChanged(svCount, mSvs, mSnrs,
                            mSvElevations, mSvAzimuths, mSvMasks[EPHEMERIS_MASK],
                            mSvMasks[ALMANAC_MASK], mSvMasks[USED_FOR_FIX_MASK],
                            mSvMasks[BD_SVS_NUM], mSvMasks[BD_EPHEMERIS_MASK],
                            mSvMasks[BD_ALMANAC_MASK],mSvMasks[BD_USED_FOR_FIX_MASK]);
                } catch (RemoteException e) {
                    Log.w(TAG, "RemoteException in reportSvInfo");
                    mListeners.remove(listener);
                    // adjust for size of list changing
                    size--;
                }
            }
        }

   这样就call到了GpsStatusListenerTransport里面的onSvStatusChanged了,在这里面要下点文章,它会发送一个GpsStatus.GPS_EVENT_SATELLITE_STATUS的消息,但是没有带参数,笔者就把两个参数利用起来了,一个存gps的数量,一个存北斗的数量。这个消息发送出去以后,会在他的handle里面处理转换一次。

        private final Handler mGpsHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == NMEA_RECEIVED) {
                    synchronized (mNmeaBuffer) {
                        int length = mNmeaBuffer.size();
                        for (int i = 0; i < length; i++) {
                            Nmea nmea = mNmeaBuffer.get(i);
                            mNmeaListener.onNmeaReceived(nmea.mTimestamp, nmea.mNmea);
                        }
                        mNmeaBuffer.clear();
                    }
                } else {
                    // synchronize on mGpsStatus to ensure the data is copied atomically.
                    synchronized(mGpsStatus) {
                    if(GpsStatus.GPS_EVENT_SATELLITE_STATUS == msg.what){
						int pri_event ;
						pri_event = 0x77 + (msg.arg1<<8) + (msg.arg2<<16);
						//Log.d(TAG, "LM: msg.arg1 "+msg.arg1 +" msg.arg2 "+msg.arg2+ " pri "+pri_event);
                        mListener.onGpsStatusChanged(pri_event);						

                    }
					
                        mListener.onGpsStatusChanged(msg.what);
                    }
                }
            }
     因此,在转发消息的时候做一下特殊处理,合成一个特殊的消息,带上我们的gps数量北斗数量,其他没有什么特别的了,第三方应用同样也可以收到sv的变化,只是不知道gps跟北斗具体的数量。其他没有差异。

   

 

 

目录
相关文章
|
Linux 开发工具 Windows
设备接入--海康摄像头SDK
springboot-对接海康摄像头,兼容window和Linux环境
4754 3
设备接入--海康摄像头SDK
|
物联网
通过微信小程序体验阿里云IoT物联网平台
通过微信小程序体验阿里云IoT物联网平台
9692 0
|
JavaScript Java 开发工具
最新!海康威视 java B/S SDK 强势登场
最新!海康威视 java B/S SDK 强势登场
650 0
最新!海康威视 java B/S SDK 强势登场
|
数据采集 移动开发 前端开发
springboot使用html模版导出pdf文档
springboot使用html模版导出pdf文档
|
Java Apache Maven
Java中使用poi+poi-tl实现根据模板导出word文档
这个过程不仅简化了文档生成的工作,而且保证了生成文档的一致性与准确性,特别适合于那些需要生成大量文档的自动化场景。通过以上步骤,Java开发人员可以实现高效、可靠的Word文档导出功能。
3017 0
|
fastjson 开发者
记一次fastjson空指针异常
案例:package com; import com.alibaba.fastjson.JSONObject; import lombok.Data; import java.nio.charset.StandardCharsets; @Data public class User {     private Long id;     private String name;     
1631 0
记一次fastjson空指针异常
|
算法 Java 程序员
springboot+thymeleaf实现公司文件的签字+盖章系统
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
460 0
springboot+thymeleaf实现公司文件的签字+盖章系统
|
监控 数据安全/隐私保护 网络架构
手把手教你实现摄像头快速接入阿里云
手把手教你实现摄像头快速接入阿里云,云端管理你的视频内容。
14856 4
手把手教你实现摄像头快速接入阿里云
|
10天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!