Java,从GPS设备写入一个“.fit”格式的文件。不工作。蚂蚁+SDK
Java, write a ".fit" format file from GPS device. Not working. ANT+ SDK
我正在 Java 开发一个应用程序,用于读取和显示仪器生成的地理数据(它集成了 GPS)。我会开发此类数据的“.fit”格式的导出功能,以便在许多免费应用程序中使用它们。
我阅读了这个 "ANT +" 文档和 sdk 的东西,但是我在开发以下代码时遇到了问题。该文件以“.fit”格式正确生成,但该文件不兼容(没有网络或桌面应用程序可以读取该数据)。好像少了什么。进入SDK虽然在Java中有一些例子,但他们不清楚。
谢谢
代码是这样的:
FileEncoder encode;
try {
encode = new FileEncoder(new java.io.File(file.getAbsolutePath()+".fit"), Fit.ProtocolVersion.V2_0);
} catch (FitRuntimeException e) {
System.err.println("Error opening file " + file.getName()+".fit");
return;
}
//Generate FileIdMessage
FileIdMesg fileIdMesg = new FileIdMesg(); // Every FIT file MUST contain a 'File ID' message as the first message
fileIdMesg.setManufacturer(15);
fileIdMesg.setType(com.garmin.fit.File.ACTIVITY);
fileIdMesg.setProduct(4);
fileIdMesg.setSerialNumber(1701L);
fileIdMesg.setTimeCreated(new DateTime(systemStartTime.getTime()));
fileIdMesg.setNumber(0);
此代码是必需的,因为每个“.fit”文件都需要此代码。如文档中所述。
然后我找到了 java 的以下代码。
encode.write(fileIdMesg); // Encode the FileIDMesg
byte[] appId = new byte[] {
0x1, 0x1, 0x2, 0x3,
0x5, 0x8, 0xD, 0x15,
0x22, 0x37, 0x59, (byte)0x90,
(byte)0xE9, 0x79, 0x62, (byte)0xDB
};
DeveloperDataIdMesg developerIdMesg = new DeveloperDataIdMesg();
for(int i = 0; i < appId.length; i++)
{
developerIdMesg.setApplicationId(i, appId[i]);
}
developerIdMesg.setDeveloperDataIndex((short)0);
encode.write(developerIdMesg);
FieldDescriptionMesg fieldDescMesg = new FieldDescriptionMesg();
fieldDescMesg.setDeveloperDataIndex((short)0);
fieldDescMesg.setFieldDefinitionNumber((short)0);
fieldDescMesg.setFitBaseTypeId((short)Fit.MAX_FIELD_SIZE);
fieldDescMesg.setFieldName(0, "Bepop2");
fieldDescMesg.setUnits(0, "Bepop22");
encode.write(fieldDescMesg);
RecordMesg record = new RecordMesg();
DeveloperField doughnutsEarnedField = new DeveloperField(fieldDescMesg, developerIdMesg);
record.addDeveloperField(doughnutsEarnedField);
// This is my code added to try to record something.
Date d=new Date();
DateTime d2 =new DateTime(d.getTime());
for (int ii=0;ii<ndatitot-2;ii++){
record.timestampToDateTime((d.getTime()));
record.setTimestamp(d2);
record.setPositionLat(495280430+ii);
record.setPositionLong(-872696681+ii);
record.setHeartRate((short)140);
record.setCadence((short)88);
record.setDistance(2080f);
record.setSpeed(2800f);
doughnutsEarnedField.setValue(ii+1);
encode.write(record);
在这里重新发布我在 FIT 论坛上的回答 (https://www.thisisant.com/forum/viewthread/6501/)
像上面那样将文件编码为 Fit.ProtocolVersion.V2_0
是对 FIT 协议的重大更改,生成的文件将无法被旧的(即 FIT 协议版本 1.0)解码器正确解码。
FIT 2.0 于 5 月初才退出测试阶段,因此许多使用 FIT SDK 的应用程序可能尚未更新。
如果编码器是通过指定 Fit.ProtocolVersion.V1_0
创建的,则将创建 FIT 协议版本 1.0 兼容文件(假设未使用 2.0 功能)。
我正在 Java 开发一个应用程序,用于读取和显示仪器生成的地理数据(它集成了 GPS)。我会开发此类数据的“.fit”格式的导出功能,以便在许多免费应用程序中使用它们。 我阅读了这个 "ANT +" 文档和 sdk 的东西,但是我在开发以下代码时遇到了问题。该文件以“.fit”格式正确生成,但该文件不兼容(没有网络或桌面应用程序可以读取该数据)。好像少了什么。进入SDK虽然在Java中有一些例子,但他们不清楚。 谢谢 代码是这样的:
FileEncoder encode;
try {
encode = new FileEncoder(new java.io.File(file.getAbsolutePath()+".fit"), Fit.ProtocolVersion.V2_0);
} catch (FitRuntimeException e) {
System.err.println("Error opening file " + file.getName()+".fit");
return;
}
//Generate FileIdMessage
FileIdMesg fileIdMesg = new FileIdMesg(); // Every FIT file MUST contain a 'File ID' message as the first message
fileIdMesg.setManufacturer(15);
fileIdMesg.setType(com.garmin.fit.File.ACTIVITY);
fileIdMesg.setProduct(4);
fileIdMesg.setSerialNumber(1701L);
fileIdMesg.setTimeCreated(new DateTime(systemStartTime.getTime()));
fileIdMesg.setNumber(0);
此代码是必需的,因为每个“.fit”文件都需要此代码。如文档中所述。
然后我找到了 java 的以下代码。
encode.write(fileIdMesg); // Encode the FileIDMesg
byte[] appId = new byte[] {
0x1, 0x1, 0x2, 0x3,
0x5, 0x8, 0xD, 0x15,
0x22, 0x37, 0x59, (byte)0x90,
(byte)0xE9, 0x79, 0x62, (byte)0xDB
};
DeveloperDataIdMesg developerIdMesg = new DeveloperDataIdMesg();
for(int i = 0; i < appId.length; i++)
{
developerIdMesg.setApplicationId(i, appId[i]);
}
developerIdMesg.setDeveloperDataIndex((short)0);
encode.write(developerIdMesg);
FieldDescriptionMesg fieldDescMesg = new FieldDescriptionMesg();
fieldDescMesg.setDeveloperDataIndex((short)0);
fieldDescMesg.setFieldDefinitionNumber((short)0);
fieldDescMesg.setFitBaseTypeId((short)Fit.MAX_FIELD_SIZE);
fieldDescMesg.setFieldName(0, "Bepop2");
fieldDescMesg.setUnits(0, "Bepop22");
encode.write(fieldDescMesg);
RecordMesg record = new RecordMesg();
DeveloperField doughnutsEarnedField = new DeveloperField(fieldDescMesg, developerIdMesg);
record.addDeveloperField(doughnutsEarnedField);
// This is my code added to try to record something.
Date d=new Date();
DateTime d2 =new DateTime(d.getTime());
for (int ii=0;ii<ndatitot-2;ii++){
record.timestampToDateTime((d.getTime()));
record.setTimestamp(d2);
record.setPositionLat(495280430+ii);
record.setPositionLong(-872696681+ii);
record.setHeartRate((short)140);
record.setCadence((short)88);
record.setDistance(2080f);
record.setSpeed(2800f);
doughnutsEarnedField.setValue(ii+1);
encode.write(record);
在这里重新发布我在 FIT 论坛上的回答 (https://www.thisisant.com/forum/viewthread/6501/)
像上面那样将文件编码为 Fit.ProtocolVersion.V2_0
是对 FIT 协议的重大更改,生成的文件将无法被旧的(即 FIT 协议版本 1.0)解码器正确解码。
FIT 2.0 于 5 月初才退出测试阶段,因此许多使用 FIT SDK 的应用程序可能尚未更新。
如果编码器是通过指定 Fit.ProtocolVersion.V1_0
创建的,则将创建 FIT 协议版本 1.0 兼容文件(假设未使用 2.0 功能)。