<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
- <title>Location</title>
- <script src="http://www.openlayers.org/api/OpenLayers.js"></script>
- <script
- src="https://www.openstreetmap.org/openlayers/OpenStreetMap.js">
- </script>
- <script type="text/javascript">
- const urlParams = new URLSearchParams(window.location.search);
- const qimei = urlParams.get("imei");
- const wsproto = window.protocol === "https" ? "wss" : "ws";
- const wshost = window.hostname ? window.hostname : "localhost";
- const wsport = window.port ? window.port : 5049;
+<title>Location</title>
+<!-- This uses reeeally old 2.13.1 from 2013, also part of Debian distro -->
+<script src="http://www.openlayers.org/api/OpenLayers.js">
+</script>
+<script src="https://www.openstreetmap.org/openlayers/OpenStreetMap.js">
+</script>
+<script type="text/javascript">
+ const urlParams = new URLSearchParams(window.location.search);
+ const qimei = urlParams.get("imei");
- var sts;
- var ws;
- var map;
- var markers;
- var icon;
+ const wsproto = window.location.protocol === "https" ? "wss" : "ws";
+ const wshost = window.location.hostname ? window.location.hostname
+ : "localhost";
+ const wsport = window.location.port ? window.location.port : 5049;
+ const limei = window.location.pathname.substring(1)
- function init() {
- init_map();
- sts = document.getElementById("sts");
- sts.innerHTML = "uninitialized";
- imei = document.getElementById("imei");
- send = document.getElementById("send");
- if (qimei) {
- imei.value = qimei;
- }
- open_ws();
+ const imeis = new Set();
+ const locations = new Array();
+ const maxmarkers = 5;
+ const lineStyle = {
+ strokeColor: '#0000ff',
+ strokeOpacity: 0.5,
+ strokeWidth: 5
+ };
+
+ var sts;
+ var ws;
+ var imei;
+ var send;
+ var subslist;
+ var tstamp;
+ var map;
+ var line;
+ var markers;
+ var icon;
+
+ function init() {
+ init_map();
+ sts = document.getElementById("sts");
+ sts.innerHTML = "uninitialized";
+ imei = document.getElementById("imei");
+ send = document.getElementById("send");
+ clear = document.getElementById("clear");
+ subslist = document.getElementById("subslist");
+ devstatus = document.getElementById("devstatus");
+ tstamp = document.getElementById("tstamp");
+ if (qimei) {
+ imei.value = qimei;
+ } else if (limei) {
+ imei.value = limei;
}
+ open_ws();
+ }
- function init_map() {
- map = new OpenLayers.Map ("map", {
- controls:[
- new OpenLayers.Control.Navigation(),
- new OpenLayers.Control.PanZoomBar(),
- new OpenLayers.Control.LayerSwitcher(),
- new OpenLayers.Control.Attribution()],
- maxExtent: new OpenLayers.Bounds(
- -20037508.34,-20037508.34,
- 20037508.34,20037508.34),
- maxResolution: 156543.0399,
- numZoomLevels: 19,
- units: 'm',
- projection: new OpenLayers.Projection(
- "EPSG:900913"),
- displayProjection: new OpenLayers.Projection(
- "EPSG:4326")
- });
- layerMapnik =
- new OpenLayers.Layer.OSM.Mapnik("Mapnik");
- map.addLayer(layerMapnik)
- layerTransportMap =
- new OpenLayers.Layer.OSM.TransportMap("TransportMap");
- map.addLayer(layerTransportMap)
- layerCycleMap =
- new OpenLayers.Layer.OSM.CycleMap("CycleMap");
- map.addLayer(layerCycleMap);
- markers =
- new OpenLayers.Layer.Markers("Markers");
- map.addLayer(markers);
+ function init_map() {
+ map = new OpenLayers.Map ("map", {
+ controls:[
+ new OpenLayers.Control.Navigation(),
+ new OpenLayers.Control.PanZoomBar(),
+ new OpenLayers.Control.LayerSwitcher(),
+ new OpenLayers.Control.Attribution()],
+ maxExtent: new OpenLayers.Bounds(
+ -20037508.34,-20037508.34,
+ 20037508.34,20037508.34),
+ maxResolution: 156543.0399,
+ numZoomLevels: 19,
+ units: 'm',
+ projection: new OpenLayers.Projection(
+ "EPSG:900913"),
+ displayProjection: new OpenLayers.Projection(
+ "EPSG:4326")
+ });
+ layerMapnik =
+ new OpenLayers.Layer.OSM.Mapnik("Mapnik");
+ map.addLayer(layerMapnik)
+ layerTransportMap =
+ new OpenLayers.Layer.OSM.TransportMap("TransportMap");
+ map.addLayer(layerTransportMap)
+ layerCycleMap =
+ new OpenLayers.Layer.OSM.CycleMap("CycleMap");
+ map.addLayer(layerCycleMap);
+ line =
+ new OpenLayers.Layer.Vector("Line Layer");
+ map.addLayer(line);
+ map.addControl(new
+ OpenLayers.Control.DrawFeature(line,
+ OpenLayers.Handler.Path));
+ markers =
+ new OpenLayers.Layer.Markers("Markers");
+ map.addLayer(markers);
- var size = new OpenLayers.Size(21, 25);
- var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
- icon = new OpenLayers.Icon(
- 'https://www.openstreetmap.org/openlayers/img/marker.png',size,offset);
+ var size = new OpenLayers.Size(21, 25);
+ var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
+ icon = new OpenLayers.Icon(
+'https://www.openstreetmap.org/openlayers/img/marker.png',size,offset);
- var lonLat =
- new OpenLayers.LonLat(0, 0).transform(
- new OpenLayers.Projection("EPSG:4326"),
- map.getProjectionObject());
- map.setCenter(lonLat, 1);
+ var lonLat =
+ new OpenLayers.LonLat(0, 0).transform(
+ new OpenLayers.Projection("EPSG:4326"),
+ map.getProjectionObject());
+ map.setCenter(lonLat, 1);
+ }
+
+ function set_marker(msg) {
+ if (locations.push(msg) > maxmarkers) {
+ locations.shift();
}
+ console.log("new marker list " + JSON.stringify(locations));
+ tstamp.innerHTML = msg.timestamp;
+ // Draw a line between backlog locations
+ for (var i = 1; i < locations.length; i++) {
+ const p0 =
+ new OpenLayers.Geometry.Point(
+ locations[i-1].longitude,
+ locations[i-1].latitude)
+ .transform(new OpenLayers.Projection("EPSG:4326"),
+ map.getProjectionObject());
+ const p1 =
+ new OpenLayers.Geometry.Point(
+ locations[i].longitude,
+ locations[i].latitude)
+ .transform(new OpenLayers.Projection("EPSG:4326"),
+ map.getProjectionObject());
+ const leg =
+ new OpenLayers.Geometry.LineString([p0, p1]);
+ const lineFeature =
+ new OpenLayers.Feature.Vector(leg, null, lineStyle);
+ line.addFeatures([lineFeature]);
- function set_marker(lon, lat) {
- console.log("setting marker at " + lon + ", " + lat)
- var lonLat =
- new OpenLayers.LonLat(lon, lat).transform(
- new OpenLayers.Projection("EPSG:4326"),
- map.getProjectionObject());
- markers.addMarker(new OpenLayers.Marker(lonLat,icon));
- map.setCenter(lonLat, 16);
}
+ // Set marker at the reported (last) location
+ const lonLat = new OpenLayers.LonLat(+msg.longitude,
+ +msg.latitude).transform(
+ new OpenLayers.Projection("EPSG:4326"),
+ map.getProjectionObject());
+ markers.addMarker(new OpenLayers.Marker(lonLat, icon));
+ map.setCenter(lonLat, 14);
+ }
+ function display_status(msg) {
+ console.log("status " + JSON.stringify(msg));
+ devstatus.innerHTML = "BAT: " + msg.battery;
+ }
- function open_ws() {
- wsurl = new URL("ws://localhost/");
- wsurl.protocol = wsproto
- wsurl.hostname = wshost
- wsurl.port = wsport
- console.log("wsurl is " + wsurl)
- ws = new WebSocket(wsurl);
- ws.onopen = ws_onopen;
- ws.onmessage = ws_onmessage;
- ws.onerror = ws_onerror;
- ws.onclose = ws_onclose;
+ function open_ws() {
+ wsurl = new URL("ws://localhost/");
+ wsurl.protocol = wsproto
+ wsurl.hostname = wshost
+ wsurl.port = wsport
+ console.log("wsurl is " + wsurl)
+ ws = new WebSocket(wsurl);
+ ws.onopen = ws_onopen;
+ ws.onmessage = ws_onmessage;
+ ws.onerror = ws_onerror;
+ ws.onclose = ws_onclose;
+ }
+ function ws_onopen(event) {
+ console.log("ws opened " + event);
+ sts.innerHTML = "online";
+ imei.disabled = false;
+ send.disabled = false;
+ clear.disabled = false;
+ sendIMEI();
+ }
+ function ws_onmessage(event) {
+ console.log("message " + event.data);
+ msg = JSON.parse(event.data);
+ if (msg.type === "location") {
+ set_marker(msg);
+ } else if (msg.type === "status") {
+ display_status(msg);
}
- function ws_onopen(event) {
- console.log("ws opened " + event);
- sts.innerHTML = "open";
- imei.disabled = false;
- send.disabled = false;
+
+ }
+ function ws_onerror(event) {
+ console.log("error " + event);
+ sts.innerHTML = "error: " + event;
+ }
+ function ws_onclose(event) {
+ console.log("close " + event);
+ sts.innerHTML = "offline";
+ imei.disabled = true;
+ send.disabled = true;
+ clear.disabled = true;
+ setTimeout(open_ws, 5000);
+ }
+
+ function sendIMEI(do_clear) {
+ if (do_clear) {
+ imeis.clear();
+ } else {
if (imei.value) {
- sendIMEI();
+ imeis.add(imei.value);
}
}
- function ws_onmessage(event) {
- console.log("message " + event.data);
- msg = JSON.parse(event.data)
- set_marker(+msg.longitude, +msg.latitude);
- }
- function ws_onerror(event) {
- console.log("error " + event);
- sts.innerHTML = "error";
- }
- function ws_onclose(event) {
- console.log("close " + event);
- sts.innerHTML = "closed";
- imei.disabled = true;
- send.disabled = true;
- setTimeout(open_ws, 5000);
- }
+ const imstr = Array.from(imeis).join(",");
+ document.title = imstr;
+ subslist.innerHTML = imstr;
+ var msg = {
+ imei: Array.from(imeis),
+ type: "subscribe",
+ timestamp: Date.now(),
+ backlog: maxmarkers
+ };
+ console.log("sending" + JSON.stringify(msg));
+ ws.send(JSON.stringify(msg));
+ imei.value = "";
+ }
- function sendIMEI() {
- console.log("sending " + imei.value);
- var msg = {
- imei: imei.value,
- type: "subscribe",
- date: Date.now()
- };
- ws.send(JSON.stringify(msg));
- document.title = imei.value;
- imei.value = "";
- }
-
- function handleKey(evt) {
- if (evt.keyCode === 13 || evt.keyCode === 14) {
- if (!imei.disabled) {
- sendIMEI();
- }
+ function handleKey(evt) {
+ if (evt.keyCode === 13 || evt.keyCode === 14) {
+ if (!imei.disabled) {
+ sendIMEI(false);
}
}
- </script>
+ }
+</script>
</head>
<body onload="init();">
size="16" maxlength="16" placeholder="Enter IMEI"
autocomplete="off" onkeyup="handleKey(event)">
<input type="button" id="send" name="send" value="Send"
- onclick="sendIMEI()" disabled>
+ onclick="sendIMEI(false)" disabled>
+ <input type="button" id="clear" name="clear" value="Clear"
+ onclick="sendIMEI(true)" disabled>
+ <span id="subslist"></span>
+ <span style="float:right">
+ | <span id="devstatus"></span>
+ | <span id="tstamp"></span>
+ </span>
</div>
<div style="width:100%; height:97%" id="map"></div>
- <div style="width:100%; height:1%" id="sts"></div>
+ <div style="width:100%; height:1%">
+ <span id="sts"></span>
+ <span id="about" style="float:right">
+ <a href="http://www.average.org/gps303/">
+ http://www.average.org/gps303/</a>
+ </span>
+ </div>
</body>
</html>