Android开发板通过外设GPS获取当前时间

正常没有硬件时钟的设备可以通过NTP服务器获取时间。比如

adb shell settings put global ntp_server ntp1.aliyun.com

但是这需要联网服务,或者可以通过局域网和一台带硬件时钟的设备交互获取。

由于没有这些条件,最后想的通过gps协议解析时间,Android正常API获取也很简单,如下

        LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
      
        // 注册NMEA监听器
        GpsStatus.NmeaListener  nmeaListener = new GpsStatus.NmeaListener() {
            @Override
            public void onNmeaReceived(long timestamp, String nmea) {
                parseNmeaData(nmea);
            }
        };
        
        locationManager.addNmeaListener(nmeaListener);

但是这开发板也没有集成gps。。。。。

最后通过在RS485串口外接了一个gps模块,解析协议获取。确认好串口号和波特率,打开串口硬件会一直往串口写数据

 serialPort = new SerialPort(new File(pathname), 9600, 0);

另外,还需要注意gps协议中大部分只有时间没有日期,比如GGA,GSA,GSV,还好RMC两者都包含

$GPRMC、<1>、<2>、<3>、<4>、<5>、< 6>、<7>、<8>、<9>、<10>、<11>、*hh<CR> <LF>
<0>$GPRMC,语句ID,表明该语句为RecommendedMinimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
<1>定位时UTC时间hhmmss.sss格式
<2>状态A=定位V=导航
<3>纬度ddmm.mmm 格式(前导位数不足则补0)
<4>纬度方向N(北纬)或S(南纬)
<5>经度dddmm.mmmm (前导位数不足则补0)
<6>经度方向E(东经)或W(西经)
<7>速率,节,Knots
<8>方位角(二维方向指向,相当于二维罗盘)
<9>当前UTC日期ddmmyy 格式
<10>磁偏角,(000- 180)度(前导位数不足则补0)
<11>磁偏角方向,E=东经 W=西经

这是数据解析方法

    private static String parseGNRMCTime(String data, StringBuilder buffer) {
        int startIndex = data.indexOf("$GNRMC");
        if (startIndex == -1) {
            // 如果没有找到GNRMC开头,清空无效数据但保留最后部分(可能包含不完整的句子)
            if (buffer.length() > 100) {
                buffer.delete(0, buffer.length() - 50); // 保留最后50个字符
            }
            return null;
        }

        int endIndex = data.indexOf("\r\n", startIndex);
        if (endIndex != -1) {
            String gprmcSentence = data.substring(startIndex, endIndex);
            String[] fields = gprmcSentence.split(",");

            if (fields.length > 9 && !fields[1].isEmpty() && !fields[9].isEmpty()) {
                String time = formatRmcTimeDateLegacy(fields[1], fields[9]);
                // 移除已处理的数据
                buffer.delete(0, endIndex + 2);
                return time;
            }
            // 移除已处理的句子(即使解析失败)
            buffer.delete(0, endIndex + 2);
        } else {
            // 保留不完整的数据供下次读取
            if (startIndex > 0) {
                buffer.delete(0, startIndex);
            }
            // 防止缓冲区过大
            if (buffer.length() > 2048) {
                buffer.setLength(0);
                Log.w(TAG, "Buffer overflow, cleared buffer");
            }
        }
        return null;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值