npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

gps-tracker-server

v0.0.4

Published

This library allows to connect devices GPS with connections TCP and UDP using events, a lot of devices GPS have different protocols with this module you can create your own adapter and decode the GPS that you need.

Downloads

2

Readme

gps-tracker-server

This library allows to connect devices GPS with connections TCP and UDP using events, a lot of devices GPS have different protocols with this module you can create your own adapter and decode the GPS that you need.

Features

  • Connections TPC and UDP at the same time.
  • Alarms ON LINE - OFF LINE
  • Timer alarm ONLINE
  • Custom Adapters (decoder)

Installation

With package manager npm:

npm install gps-tracker-server

Adapter

Once you have installed you can create your own adapter, the adapter has the next structure:

  • connections: This parameter indicates that connections are allow, those parameters can be a string with those values TCP || UDP or both in a array ['TCP','UDP'].

  • connection_name: This parameter should be a string, this is the name of the adapter it can be a protocol name for example.

  • port: When the server is running you can choose what port you want to get all request from the devices, this parameter should be a number for example: 5000.

  • parseData: This method is called when a new request is sending for the devices, give one parameter data you'll need to parse the message and it will return a JSON object with this structure:

{
  start: decode[6], // status
  device_id: decode[0].substring(5),// mandatory
  cmd: decode[1], // mandatory
  data: [
    decode[2], // local time
    decode[5], // time UTC
    decode[7], // latitude
    decode[8],
    decode[9], // longitude
    decode[10],
    decode[11] // speed
  ],
  action: ''// ping || alarm || other
}
  • getAlarm This method is called if a request is an alarm, give one parameter cmd this parameter should contain the original code from the device GPS, it should return a JSON object with this structure:
{
  code: 'MOTION_SENSOR',
  msg: 'Shock alarm',
  type: 'ALARM'
}
  • getPingData This method returns all information about the last request, this method give one parameter that contain a message parsed from parseData() it should return a JSON with this structure:
{
  latitude: number,
  longitude: number,
  speed: number,
  orientation: number | null,
  mileage: number | null,
  accuracy: null,
  imei: null,
  inserted: new Date(),
  cmd: '' //code from gps
}

Using

Adapter example for GPS103 protocol.

export default class Gps103Adapter {
  connections = ['TCP', 'UDP'];
  connection_name = 'GPS103';
  port = 5000;
  debug = false;

  parseData(data) {
    data = data.toString();
    let decode = data.split(',');

    if (decode.length < 5) {
      throw new Error('fail');
    }

    let pdata = {
      start: decode[6], // status
      device_id: decode[0].substring(5),// mandatory
      cmd: decode[1], // mandatory
      data: [
        decode[2], // local time
        decode[5], // time UTC
        decode[7], // latitude
        decode[8],
        decode[9], // longitude
        decode[10],
        decode[11] // speed
      ],
      action: ''
    };
    switch (pdata.cmd) {
      case "tracker":
      pdata.action = "ping";
      break;
      case "sensor alarm":
      case "move":
      case "acc alarm":
      case "help me":
      case "acc on":
      case "acc off":
      pdata.action = "alarm";
      break;
      default:
      pdata.action = "other";
    }

    return pdata;
  }

  getAlarm(cmd) {
    switch (cmd) {
      case 'sensor alarm':
        return { code: 'MOTION_SENSOR', msg: 'Shock alarm', type: 'ALARM' };
      case 'help me':
        return { code: 'SOS', msg: 'SOS alarm', type: 'ALARM' };
      case 'low battery':
        return { code: 'LOW_BATTERY', msg: 'low battery alarm', type: 'ALARM' };
      case 'move':
        return { code: 'MOVE', msg: 'move alarm', type: 'MOVE' };
      case 'speed':
        return { code: 'SPEED', msg: 'Over seed alarm', type: 'SPEED' };
      case 'acc alarm':
        return { code: 'ACC_ALARM', msg: 'Acc alarm', type: 'ALARM' };
      case 'acc on':
        return { code: 'ACC_ON', msg: 'Acc on alarm', type: 'ALARM' };
      case 'acc off':
        return { code: 'ACC_OFF', msg: 'Acc off alarm', type: 'ALARM' };
      case 'off_line':
        return { code: 'OFF_LINE', msg: 'Device is offline', type: 'ALARM' };
      case 'on_line':
        return { code: 'ON_LINE', msg: 'Device is online', type: 'ALARM' };
      default:
        return null;
    }
  }

  getPingData(msg) {
    let str = msg.data;
    return {
      latitude: minuteToDecimal(str[2], str[3]),,
      longitude: minuteToDecimal(str[4], str[5]),,
      speed: parseInt(str[6]),
      orientation: 0,
      mileage: 0,
      accuracy: null,
      imei: null,
      inserted: new Date(),
      cmd: null
    }
  }
}

Implementation


import Gps103Adapter from './adapter';
import { Server } from 'gps-tracker-server';

async function start() {

  try {
    let adapter = new Gps103Adapter();
    let server = new Server(adapter);

    server.on('connections', device => {
      //set alarm offline
      device.maxInterval = 120 * 1000 //ten minutes
      device.alarmOffline = true;
      device.startTimerStatusOnline();

      console.log('device start', device.UID);
    })

    server.on('tracker', (msg, device) => {
      console.log(msg, device.UID);
    })

    server.on('alarms', (info, device) => {
      console.log(info, device.UID);
    });

    server.on('disconnections', device => {
      console.log(device.UID);
    });

    await server.run();
    console.log("server start");
  }
  catch (err) {
    console.log(err);
    process.exit(1);
  }

}

start();

TODO

  • [X] Upload to github
  • [X] Create npm module
  • [X] Update README.md
  • [X] Documentation
  • [ ] Complete unit tests
  • [ ] Server Manager
  • [ ] Typescript support