aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/org/traccar/location/LocationProvider.java4
-rw-r--r--src/org/traccar/location/OpenCellIdLocationProvider.java44
-rw-r--r--test/org/traccar/location/LocationProviderTest.java15
3 files changed, 55 insertions, 8 deletions
diff --git a/src/org/traccar/location/LocationProvider.java b/src/org/traccar/location/LocationProvider.java
index cbc9663f8..2bff1a7ca 100644
--- a/src/org/traccar/location/LocationProvider.java
+++ b/src/org/traccar/location/LocationProvider.java
@@ -21,7 +21,9 @@ public interface LocationProvider {
interface LocationProviderCallback {
- void onResult(double latitude, double longitude);
+ void onSuccess(double latitude, double longitude);
+
+ void onFailure();
}
diff --git a/src/org/traccar/location/OpenCellIdLocationProvider.java b/src/org/traccar/location/OpenCellIdLocationProvider.java
index 22456c482..2339585ad 100644
--- a/src/org/traccar/location/OpenCellIdLocationProvider.java
+++ b/src/org/traccar/location/OpenCellIdLocationProvider.java
@@ -15,10 +15,50 @@
*/
package org.traccar.location;
+import com.ning.http.client.AsyncCompletionHandler;
+import com.ning.http.client.Response;
+import org.traccar.Context;
+
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+
public class OpenCellIdLocationProvider extends BaseLocationProvider {
- protected void getLocation(int mcc, int mnc, long lac, long cid, LocationProviderCallback callback) {
- // TODO
+ private String url;
+
+ public OpenCellIdLocationProvider(String key) {
+ this("http://opencellid.org/cell/get", key);
+ }
+
+ public OpenCellIdLocationProvider(String url, String key) {
+ this.url = url + "?format=json&mcc=%d&mnc=%d&lac=%d&cellid=%d&key=" + key;
+ }
+
+ protected void getLocation(int mcc, int mnc, long lac, long cid, final LocationProviderCallback callback) {
+ String x = String.format(url, mcc, mnc, lac, cid);
+ Context.getAsyncHttpClient().prepareGet(String.format(url, mcc, mnc, lac, cid))
+ .execute(new AsyncCompletionHandler() {
+ @Override
+ public Object onCompleted(Response response) throws Exception {
+ try (JsonReader reader = Json.createReader(response.getResponseBodyAsStream())) {
+ JsonObject json = reader.readObject();
+ if (json.containsKey("lat") && json.containsKey("lon")) {
+ callback.onSuccess(
+ json.getJsonNumber("lat").doubleValue(),
+ json.getJsonNumber("lon").doubleValue());
+ } else {
+ callback.onFailure();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void onThrowable(Throwable t) {
+ callback.onFailure();
+ }
+ });
}
}
diff --git a/test/org/traccar/location/LocationProviderTest.java b/test/org/traccar/location/LocationProviderTest.java
index c4aedbb09..b7280cfea 100644
--- a/test/org/traccar/location/LocationProviderTest.java
+++ b/test/org/traccar/location/LocationProviderTest.java
@@ -24,20 +24,25 @@ public class LocationProviderTest {
}
public void testOpenCellId() {
- OpenCellIdLocationProvider locationProvider = new OpenCellIdLocationProvider();
+ OpenCellIdLocationProvider locationProvider = new OpenCellIdLocationProvider("fake");
Map<String, Object> attributes = new HashMap<>();
- attributes.put(Event.KEY_MCC, 250);
+ attributes.put(Event.KEY_MCC, 260);
attributes.put(Event.KEY_MNC, 2);
- attributes.put(Event.KEY_LAC, 4711);
- attributes.put(Event.KEY_CID, 7989334);
+ attributes.put(Event.KEY_LAC, 10250);
+ attributes.put(Event.KEY_CID, 26511);
locationProvider.getLocation(attributes, new LocationProvider.LocationProviderCallback() {
@Override
- public void onResult(double latitude, double longitude) {
+ public void onSuccess(double latitude, double longitude) {
Assert.assertEquals(60.07254, latitude, 0.00001);
Assert.assertEquals(30.30996, longitude, 0.00001);
}
+
+ @Override
+ public void onFailure() {
+ Assert.fail();
+ }
});
}