正常没有硬件时钟的设备可以通过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;
}
6339

被折叠的 条评论
为什么被折叠?



