Java,写一个" .fit"来自GPS设备的格式文件。不工作。 ANT + SDK

时间:2016-05-29 14:49:35

标签: java gps garmin

我正在开发一个Java应用程序,用于读取和显示由仪器生成的地理数据(它集成了GPS)。我会在" .fit"中开发出口功能。这些数据的格式可以在很多免费应用程序中使用它们。 我阅读了这个"ANT +"文档和sdk的东西,但是我在开发以下代码时遇到了问题。该文件在" .fit"中正确生成格式,但此文件不兼容(没有Web或桌面应用程序可以读取此数据)。似乎有些东西丢失了。尽管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);

1 个答案:

答案 0 :(得分:2)

将答案从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功能)。