通过数据层同步进行通信
Communication through Data Layer synchronization
我正在开发一个应用程序,该应用程序具有佩戴端和手持端。该应用程序旨在在没有手持端的情况下工作,并在两侧连接时同步获取的数据。现在我在手持端有一项服务正在监听 googleclientAPI,而在穿戴端我有一项服务可以获取 GPS 数据并将每个坐标都放在 googleclientAPI 上。当我 运行 磨损端(没有手持设备连接)时,应用程序会根据需要将所有数据添加到 googleclientAPI。
问题是,当我连接两侧(通过蓝牙)时,手持端仅接收添加到 googleClientAPI 的最后一个数据映射...
磨损面:
private void addLocationEntry(double latitude, double longitude, float accuracy, long gpsTime, float speed, double altitude, long time){
String PATH = "/TuneWear/GPSdata";
if(!googleClient.isConnected()){
return;
}
String path = PATH + "/" + time;
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(path);
putDataMapRequest.getDataMap().putLong(KEY_GPSTIME, gpsTime);
putDataMapRequest.getDataMap().putLong(KEY_TIME, time);
putDataMapRequest.getDataMap().putDouble(KEY_LATITUDE, latitude);
putDataMapRequest.getDataMap().putDouble(KEY_LONGITUDE, longitude);
putDataMapRequest.getDataMap().putFloat(KEY_SPEED, speed);
putDataMapRequest.getDataMap().putFloat(KEY_DISTANCE, distance);
putDataMapRequest.getDataMap().putFloat(KEY_ACCURACY, accuracy);
putDataMapRequest.getDataMap().putDouble(KEY_ALTITUDE, altitude);
PutDataRequest request = putDataMapRequest.asPutDataRequest();
Wearable.DataApi.putDataItem(googleClient, request);
mCalendar.setTimeInMillis(System.currentTimeMillis());
}
手持端:
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
for (DataEvent event : dataEventBuffer) {
if (event.getType() == DataEvent.TYPE_CHANGED) {
// DataItem changed
DataItem item = event.getDataItem();
//Log.d(TAG, "DataItem RECEIVED: " + item.getUri().getPath());
if (item.getUri().getPath().contains(PATH + "/")) {
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
Log.d(TAG, "DataItem " + item.getUri().getPath() + " changed: GPSTimestamp " + dataMap.getLong(KEY_GPSTIME) + " Time: " + dataMap.getLong(KEY_TIME) +
" LAT " + dataMap.getDouble(KEY_LATITUDE) + " LONG " + dataMap.getDouble(KEY_LONGITUDE) + " Speed: " + dataMap.getFloat(KEY_SPEED) +
" Distance: " + dataMap.getFloat(KEY_DISTANCE) + " Accuracy: " + dataMap.getFloat(KEY_ACCURACY) + " Altitude: " + dataMap.getDouble(KEY_ALTITUDE));
String headerString = "GPSTimestamp\tPhoneTimestamp\tLatitude\tLongitude\tSpeed\tDistance\tAccuracy\tAltitude\n";
String dataPath = Environment.getExternalStorageDirectory().toString() + "/TuneWear/";
String dataString = dataMap.getLong(KEY_GPSTIME) + "\t" + dataMap.getLong(KEY_TIME) + "\t" + dataMap.getDouble(KEY_LATITUDE) + "\t" +
dataMap.getDouble(KEY_LONGITUDE) + "\t" + dataMap.getFloat(KEY_SPEED) + "\t" + dataMap.getFloat(KEY_DISTANCE) + "\t" + dataMap.getFloat(KEY_ACCURACY) +
"\t" + dataMap.getDouble(KEY_ALTITUDE) + "\n";
File myDir = new File(dataPath + PATH);
myDir.mkdirs();
File file = new File(myDir, "data.txt");
Log.i("FILE", "FILE: " + file.getPath());
try {
FileOutputStream out = new FileOutputStream(file, true);
if(file.length() == 0){
out.write(headerString.getBytes());
}
out.write(dataString.getBytes());
out.close();
}
catch (IOException e) {
Log.e("Exception", "File write failed: " + e.toString());
}
Log.i("FILE", "FILE Changed!!! ");
}
} else if (event.getType() == DataEvent.TYPE_DELETED) {
// DataItem deleted
Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri());
}
//Wearable.DataApi.deleteDataItems(mGoogleApiClient, event.getDataItem().getUri(), DataApi.FILTER_PREFIX);
}
}
如何让所有数据同步?
如果您使用相同的 "time",这意味着您的数据项都具有相同的确切路径,那么每次添加都会更新旧数据,因此您最终只会得到一条记录(最后一条) .如果您希望所有内容都单独可用,请确保它们的路径是唯一的(例如,在您的路径中使用时间戳)。
我正在开发一个应用程序,该应用程序具有佩戴端和手持端。该应用程序旨在在没有手持端的情况下工作,并在两侧连接时同步获取的数据。现在我在手持端有一项服务正在监听 googleclientAPI,而在穿戴端我有一项服务可以获取 GPS 数据并将每个坐标都放在 googleclientAPI 上。当我 运行 磨损端(没有手持设备连接)时,应用程序会根据需要将所有数据添加到 googleclientAPI。
问题是,当我连接两侧(通过蓝牙)时,手持端仅接收添加到 googleClientAPI 的最后一个数据映射...
磨损面:
private void addLocationEntry(double latitude, double longitude, float accuracy, long gpsTime, float speed, double altitude, long time){
String PATH = "/TuneWear/GPSdata";
if(!googleClient.isConnected()){
return;
}
String path = PATH + "/" + time;
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(path);
putDataMapRequest.getDataMap().putLong(KEY_GPSTIME, gpsTime);
putDataMapRequest.getDataMap().putLong(KEY_TIME, time);
putDataMapRequest.getDataMap().putDouble(KEY_LATITUDE, latitude);
putDataMapRequest.getDataMap().putDouble(KEY_LONGITUDE, longitude);
putDataMapRequest.getDataMap().putFloat(KEY_SPEED, speed);
putDataMapRequest.getDataMap().putFloat(KEY_DISTANCE, distance);
putDataMapRequest.getDataMap().putFloat(KEY_ACCURACY, accuracy);
putDataMapRequest.getDataMap().putDouble(KEY_ALTITUDE, altitude);
PutDataRequest request = putDataMapRequest.asPutDataRequest();
Wearable.DataApi.putDataItem(googleClient, request);
mCalendar.setTimeInMillis(System.currentTimeMillis());
}
手持端:
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
for (DataEvent event : dataEventBuffer) {
if (event.getType() == DataEvent.TYPE_CHANGED) {
// DataItem changed
DataItem item = event.getDataItem();
//Log.d(TAG, "DataItem RECEIVED: " + item.getUri().getPath());
if (item.getUri().getPath().contains(PATH + "/")) {
DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
Log.d(TAG, "DataItem " + item.getUri().getPath() + " changed: GPSTimestamp " + dataMap.getLong(KEY_GPSTIME) + " Time: " + dataMap.getLong(KEY_TIME) +
" LAT " + dataMap.getDouble(KEY_LATITUDE) + " LONG " + dataMap.getDouble(KEY_LONGITUDE) + " Speed: " + dataMap.getFloat(KEY_SPEED) +
" Distance: " + dataMap.getFloat(KEY_DISTANCE) + " Accuracy: " + dataMap.getFloat(KEY_ACCURACY) + " Altitude: " + dataMap.getDouble(KEY_ALTITUDE));
String headerString = "GPSTimestamp\tPhoneTimestamp\tLatitude\tLongitude\tSpeed\tDistance\tAccuracy\tAltitude\n";
String dataPath = Environment.getExternalStorageDirectory().toString() + "/TuneWear/";
String dataString = dataMap.getLong(KEY_GPSTIME) + "\t" + dataMap.getLong(KEY_TIME) + "\t" + dataMap.getDouble(KEY_LATITUDE) + "\t" +
dataMap.getDouble(KEY_LONGITUDE) + "\t" + dataMap.getFloat(KEY_SPEED) + "\t" + dataMap.getFloat(KEY_DISTANCE) + "\t" + dataMap.getFloat(KEY_ACCURACY) +
"\t" + dataMap.getDouble(KEY_ALTITUDE) + "\n";
File myDir = new File(dataPath + PATH);
myDir.mkdirs();
File file = new File(myDir, "data.txt");
Log.i("FILE", "FILE: " + file.getPath());
try {
FileOutputStream out = new FileOutputStream(file, true);
if(file.length() == 0){
out.write(headerString.getBytes());
}
out.write(dataString.getBytes());
out.close();
}
catch (IOException e) {
Log.e("Exception", "File write failed: " + e.toString());
}
Log.i("FILE", "FILE Changed!!! ");
}
} else if (event.getType() == DataEvent.TYPE_DELETED) {
// DataItem deleted
Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri());
}
//Wearable.DataApi.deleteDataItems(mGoogleApiClient, event.getDataItem().getUri(), DataApi.FILTER_PREFIX);
}
}
如何让所有数据同步?
如果您使用相同的 "time",这意味着您的数据项都具有相同的确切路径,那么每次添加都会更新旧数据,因此您最终只会得到一条记录(最后一条) .如果您希望所有内容都单独可用,请确保它们的路径是唯一的(例如,在您的路径中使用时间戳)。