From 3990d779545c7dba72324182058ae20730311f97 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 18 Nov 2015 15:32:05 +1300 Subject: Implement location provider channel handler --- src/org/traccar/BasePipelineFactory.java | 9 ++++ src/org/traccar/Context.java | 13 ++++++ src/org/traccar/LocationProviderHandler.java | 68 ++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 src/org/traccar/LocationProviderHandler.java (limited to 'src/org') diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java index 6b877883d..4244da8c9 100644 --- a/src/org/traccar/BasePipelineFactory.java +++ b/src/org/traccar/BasePipelineFactory.java @@ -31,6 +31,7 @@ import org.jboss.netty.channel.SimpleChannelHandler; import org.jboss.netty.handler.logging.LoggingHandler; import org.jboss.netty.handler.timeout.IdleStateHandler; import org.traccar.helper.Log; +import org.traccar.location.LocationProvider; public abstract class BasePipelineFactory implements ChannelPipelineFactory { @@ -40,6 +41,7 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory { private FilterHandler filterHandler; private DistanceHandler distanceHandler; private ReverseGeocoderHandler reverseGeocoderHandler; + private LocationProviderHandler locationProviderHandler; private static final class OpenChannelHandler extends SimpleChannelHandler { @@ -103,6 +105,10 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory { Context.getReverseGeocoder(), Context.getConfig().getBoolean("geocode.processInvalidPositions")); } + if (Context.getLocationProvider() != null) { + locationProviderHandler = new LocationProviderHandler(Context.getLocationProvider()); + } + if (Context.getConfig().getBoolean("distance.enable")) { distanceHandler = new DistanceHandler(); } @@ -132,6 +138,9 @@ public abstract class BasePipelineFactory implements ChannelPipelineFactory { if (reverseGeocoderHandler != null) { pipeline.addLast("geocoder", reverseGeocoderHandler); } + if (locationProviderHandler != null) { + pipeline.addLast("location", locationProviderHandler); + } pipeline.addLast("remoteAddress", new RemoteAddressHandler()); addDynamicHandlers(pipeline); diff --git a/src/org/traccar/Context.java b/src/org/traccar/Context.java index 113ed02ec..aff72cd01 100644 --- a/src/org/traccar/Context.java +++ b/src/org/traccar/Context.java @@ -29,6 +29,8 @@ import org.traccar.geocode.NominatimReverseGeocoder; import org.traccar.geocode.OpenCageReverseGeocoder; import org.traccar.geocode.ReverseGeocoder; import org.traccar.helper.Log; +import org.traccar.location.LocationProvider; +import org.traccar.location.OpenCellIdLocationProvider; import org.traccar.web.WebServer; public final class Context { @@ -78,6 +80,12 @@ public final class Context { return reverseGeocoder; } + private static LocationProvider locationProvider; + + public static LocationProvider getLocationProvider() { + return locationProvider; + } + private static WebServer webServer; public static WebServer getWebServer() { @@ -144,6 +152,11 @@ public final class Context { } } + if (config.getBoolean("location.enable")) { + String key = config.getString("location.key"); + locationProvider = new OpenCellIdLocationProvider(key); + } + if (config.getBoolean("web.enable")) { if (config.getString("web.type", "new").equals("new") || config.getString("web.type", "new").equals("api")) { diff --git a/src/org/traccar/LocationProviderHandler.java b/src/org/traccar/LocationProviderHandler.java new file mode 100644 index 000000000..024d9fb95 --- /dev/null +++ b/src/org/traccar/LocationProviderHandler.java @@ -0,0 +1,68 @@ +/* + * Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar; + +import org.jboss.netty.channel.ChannelEvent; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.ChannelUpstreamHandler; +import org.jboss.netty.channel.Channels; +import org.jboss.netty.channel.MessageEvent; +import org.traccar.location.LocationProvider; +import org.traccar.model.Position; + +public class LocationProviderHandler implements ChannelUpstreamHandler { + + private final LocationProvider locationProvider; + + public LocationProviderHandler(LocationProvider locationProvider) { + this.locationProvider = locationProvider; + } + + @Override + public void handleUpstream(final ChannelHandlerContext ctx, ChannelEvent evt) throws Exception { + if (!(evt instanceof MessageEvent)) { + ctx.sendUpstream(evt); + return; + } + + final MessageEvent e = (MessageEvent) evt; + Object message = e.getMessage(); + if (message instanceof Position) { + final Position position = (Position) message; + if (locationProvider != null && position.getOutdated()) { + locationProvider.getLocation(position.getAttributes(), new LocationProvider.LocationProviderCallback() { + @Override + public void onSuccess(double latitude, double longitude) { + position.setFixTime(position.getDeviceTime()); + position.setLatitude(latitude); + position.setLongitude(longitude); + Channels.fireMessageReceived(ctx, position, e.getRemoteAddress()); + } + + @Override + public void onFailure() { + Channels.fireMessageReceived(ctx, position, e.getRemoteAddress()); + } + }); + } else { + Channels.fireMessageReceived(ctx, position, e.getRemoteAddress()); + } + } else { + Channels.fireMessageReceived(ctx, message, e.getRemoteAddress()); + } + } + +} -- cgit v1.2.3