Coder Social home page Coder Social logo

gps-tracking-nodejs's Introduction

NODE.JS GPS Tracker Server License

GPS TRACKING SERVER | Node.js

This package let you easily create listeners for your GPS tracking devices. You can add your custom implementations to handle more protocols.

Installation

With package manager npm:

npm install gps-tracking

Currently supported models

  • TK103
  • TK510
  • GT06
  • GT02A
  • You can add your own adapters easily as commented below

Usage

Once you have installed the package, you can use it like:

var gps = require("gps-tracking");

var options = {
    'debug'                 : true,
    'port'                  : 8090,
    'device_adapter'        : "TK103"
}

var server = gps.server(options,function(device,connection){

    device.on("login_request",function(device_id,msg_parts){

        // Some devices sends a login request before transmitting their position
        // Do some stuff before authenticate the device... 
        
        // Accept the login request. You can set false to reject the device.
        this.login_authorized(true); 

    });


    //PING -> When the gps sends their position  
    device.on("ping",function(data){

        //After the ping is received, but before the data is saved
        //console.log(data);
        return data;

    });

});

Step by step

  1. Install Node

  2. Create a folder for your project

  3. Copy the example code above in a .js file like server.js

  4. Install the package in the project folder

cd /path/to/my/project
npm install gps-tracking	
  1. Run your server
node server.js

Overview

With this package you are going to create a tcp server that listens on a open port of your server/computer for a specific gps device model. For example, you are going to listen on port 8090 for 'TK103 gps-trackers'.

If you want to listen for different kind of trackers, you have to create another tcp server. You can do this in a different node.js program in the same server, but you have to listen in a different port.

So, you can listen on port 8090 for TK103 devices and listen on 8091 for TK102 devices (or any gps-tracker you want)

Options

debug

Enables console.log messages.

    "debug":false, 

port

The port to listen to. Where the packages of the device will arrive.

    "port": 8080,

device_adapter

Which device adapter will be used to parse the incoming packets.

    "device_adapter": false, 
    // If false, the server will throw an error. 
    // At the moment, the modules comes with only one adater: TK103.
    "device_adapter": "TK103"
    // You can create your own adapter. 
    
    //FOR USING A CUSTOM DEVICE ADAPTER
     "device_adapter": require("./my_custom_adapter")

Events

Once you create a server, you can access to the connection and the device object connected. Both objects emits events you can listen on your app.

var server = gps.server(options,function(device,connection){
    //conection = net.createServer(...) object
    //device = Device object
}

connection events

Available events:

  • end
  • data
  • close
  • timeout
  • drain

You can check the documentation of node.js net object here.

//Example: 
var server = gps.server(opts,function(device,connection){
    connection.on("data",function(res){
		//When raw data comes from the device
	});
});

Device object events

Every time something connects to the server, a net connection and a new device object will be created. The Device object is your interface to send & receive packets/commands.

var server = gps.server(opts, function(device, connection){
    /*	Available device variables:
		----------------------------
		device.uid -> Set when the first packet is parsed
		device.name -> You can set a custon name for this device.
		device.ip -> IP of the device
		device.port --> Device port
	*/
	
    /******************************
	LOGIN
	******************************/
	device.on("login_request", function(device_id, msg_parts){
		//Do some stuff before authenticate the device...
		// This way you can prevent from anyone to send their position without your consent
		this.login_authorized(true); //Accept the login request.
	});
	
	device.on("login",function() {
		console.log("Hi! i'm " + device.uid);
	});
	
	device.on("login_rejected",function(){
	
	});
	
	
	/******************************
	PING - When the gps sends their position  
	******************************/
	device.on("ping",function(data){
		//After the ping is received
		//console.log(data);
		console.log("I'm here now: " + gps_data.latitude + ", " + gps_data.longitude);
		return data;
	});
	
	
	/******************************
	ALARM - When the gps sends and alarm  
	******************************/
	device.on("alarm", function(alarm_code, alarm_data, msg_data) {
		console.log("Help! Something happend: " + alarm_code + " (" + alarm_data.msg + ")");
		//call_me();
	});	
	
	
	/******************************
	MISC 
	******************************/
	device.on("handshake",function(){
		
	});
	
});

server.setDebug(true);

Adapters

If you want to create a new adapter, you have to create and exports an adapter function. You can base your new adapter on one of these nativaly supported adapters: https://github.com/freshworkstudio/gps-tracking-nodejs/tree/master/lib/adapters

youradapter.js

exports.protocol="GPS103";
exports.model_name="TK103";
exports.compatible_hardware=["TK103/supplier"];

var adapter = function(device){
    //Code that parses and respond to commands
}
exports.adapter = adapter;

Functions you have to implement

function parse_data(data)

You receive the data and you have to return an object with:

return {
    'device_id': 'string',
    // ID of the device. Mandatory
    
    'cmd': 'string',
    //'string' Represents what the device is trying to do. You can send some of the available commands or a custom string. Mandatory
    
    'data': 'string'
    //Aditional data in the packet. Mandatory
}

Available commands (What the device is trying to do?)

'cmd':'login_request' // The device is trying to login.
'cmd':'alarm'   //  (login_request, ping, alarm) 
'cmd':'ping'  //The device is sending gps_data

//Or send custom string
'cmd':'other_command' //You can catch this custom command in you app.

Example:

    var adapter = function(device){
        function parse_data(data){
            // Example implementation
            //
            // Packet from device: 
            // #ID_DEVICE_XXX#TIME#LOG_ME_IN_PLEASE#MORE_DATA(GPS,LBS,ETC)#
            
            //Do some stuff...
            return {
    			"device_id" : 'ID_DEVICE_XXX',//mandatory
    			"cmd" 		: 'login_request', //mandatory
    			"data" 		: 'MORE_DATA(GPS,LBS,ETC)' //Mandatory
    			
    			//optional parameters. Anything you want.
    			"optional_params": '',
    			"more_optional_parameters":'...',
            }
        }
    }

Full example (device_adapter implementation)

This is the implementation for TK103. Example data:

Login request from TK103

Packet: (012341234123BP05000012341234123140607A3330.4288S07036.8518W019.2230104172.3900000000L00019C2C)

So, Start String = "(" Device ID = "012341234123" Command = "BP05" --> "login_request" Custom Data = "000012341234123140607A3330.4288S07036.8518W019.2230104172.3900000000L00019C2C" Finish String = ")"

/* */

/* */
// some functions you could use like this 
// f = require('gps-tracking/functions'). There are optionals
f = require("../functions");

exports.protocol="GPS103";
exports.model_name="TK103";
exports.compatible_hardware=["TK103/supplier"];

var adapter = function(device){
	if(!(this instanceof adapter)) return new adapter(device);
	
	this.format = {"start":"(","end":")","separator":""}
	this.device = device;
	
	/*******************************************
	PARSE THE INCOMING STRING FROM THE DECIVE 
	You must return an object with a least: device_id, cmd and type.
	return device_id: The device_id
	return cmd: command from the device.
	return type: login_request, ping, etc. 
	*******************************************/
	this.parse_data = function(data){
		data = data.toString();
		var cmd_start = data.indexOf("B"); //al the incomming messages has a cmd starting with 'B'
		if(cmd_start > 13)throw "Device ID is longer than 12 chars!";
		var parts={
			"start" 		: data.substr(0,1), 
			"device_id" 	: data.substring(1,cmd_start),//mandatory
			"cmd" 			: data.substr(cmd_start,4), //mandatory
			"data" 			: data.substring(cmd_start+4,data.length-1),
			"finish" 		: data.substr(data.length-1,1)
		};
		switch(parts.cmd){
			case "BP05":
				parts.action="login_request";	
				break;
			case "BR00":
				parts.action="ping";
				break;
			case "BO01":
				parts.action="alarm";
				break;
			default:
				parts.action="other";
		}
		
		return parts;
	}
	this.authorize =function(){
		this.send_comand("AP05");
	}
	this.run_other = function(cmd,msg_parts){
		switch(cmd){
			case "BP00": //Handshake
				this.device.send(this.format_data(this.device.uid+"AP01HSO"));
				break;
		}
	}
	
	this.request_login_to_device = function(){
		//@TODO: Implement this.	
	}
	
	this.receive_alarm = function(msg_parts){
		//@TODO: implement this
		
		//gps_data = msg_parts.data.substr(1);
		alarm_code = msg_parts.data.substr(0,1);
		alarm = false;
		switch(alarm_code.toString()){
			case "0":
				alarm = {"code":"power_off","msg":"Vehicle Power Off"};
				break;
			case "1":
				alarm = {"code":"accident","msg":"The vehicle suffers an acciden"};
				break;
			case "2":
				alarm = {"code":"sos","msg":"Driver sends a S.O.S."};
				break;
			case "3":
				alarm = {"code":"alarming","msg":"The alarm of the vehicle is activated"};
				break;
			case "4":
				alarm = {"code":"low_speed","msg":"Vehicle is below the min speed setted"};
				break;
			case "5":
				alarm = {"code":"overspeed","msg":"Vehicle is over the max speed setted"};
				break;
			case "6":
				alarm = {"code":"gep_fence","msg":"Out of geo fence"};
				break;
		}
		this.send_comand("AS01",alarm_code.toString());
		return alarm
	}
	
	
	this.get_ping_data = function(msg_parts){
		var str = msg_parts.data;
		var data = {
			"date"			: str.substr(0,6),
			"availability"	: str.substr(6,1),
			"latitude"		: functions.minute_to_decimal(parseFloat(str.substr(7,9)),str.substr(16,1)),
			"longitude"	: functions.minute_to_decimal(parseFloat(str.substr(17,9)),str.substr(27,1)),
			"speed"			: parseFloat(str.substr(28,5)),
			"time"			: str.substr(33,6),
			"orientation"	: str.substr(39,6),
			"io_state"		: str.substr(45,8),
			"mile_post"	: str.substr(53,1),
			"mile_data"	: parseInt(str.substr(54,8),16)
		};
		var datetime = "20"+data.date.substr(0,2)+"/"+data.date.substr(2,2)+"/"+data.date.substr(4,2);
		datetime += " "+data.time.substr(0,2)+":"+data.time.substr(2,2)+":"+data.time.substr(4,2)
		data.datetime=new Date(datetime);
		res = {
			latitude		: data.latitude,
			longitude		: data.longitude,
			time			: new Date(data.date+" "+data.time),
			speed			: data.speed,
			orientation	: data.orientation,
			mileage			: data.mile_data
		}
		return res;	
	}
	
	/* SET REFRESH TIME */
	this.set_refresh_time = function(interval,duration){
		//XXXXYYZZ
		//XXXX Hex interval for each message in seconds
		//YYZZ Total time for feedback
		//YY Hex hours
		//ZZ Hex minutes
		var hours = parseInt(duration/3600);
		var minutes = parseInt((duration-hours*3600)/60);
		var time = f.str_pad(interval.toString(16),4,'0')+ f.str_pad(hours.toString(16),2,'0')+ f.str_pad(minutes.toString(16),2,'0')
		this.send_comand("AR00",time);
	}
	
	/* INTERNAL FUNCTIONS */
	
	this.send_comand = function(cmd,data){
		var msg = [this.device.uid,cmd,data];
		this.device.send(this.format_data(msg));
	}
	this.format_data = function(params){
		/* FORMAT THE DATA TO BE SENT */
		var str = this.format.start;
		if(typeof(params) == "string"){
			str+=params
		}else if(params instanceof Array){
			str += params.join(this.format.separator);
		}else{
			throw "The parameters to send to the device has to be a string or an array";
		}
		str+= this.format.end;
		return str;	
	}
}
exports.adapter = adapter;

Examples

DEMO SERVER APP

You can check a basic demo app here

GPS Emulator

We created a brand new gps emulator so you can start testing your app in a breeze. You can check the code of the emulator in this repo. https://github.com/freshworkstudio/gps-tracking-emulator

Stay tuned - Contributions

We are adding support for multiple devices and protocols. We highly appreciate your contributions to the project. Please, just throw me an email at [email protected] if you have questions/suggestions.

Why NodeJS?

NodeJS appears to be the perfect solution to receive the data for your multiple GPS devices thanks to the amazing performance an ease of use. Actually, it's extremely fast and it's easy to understand.

gps-tracking-nodejs's People

Contributors

gdespirito avatar menjaraz avatar reinhardholl avatar snyk-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gps-tracking-nodejs's Issues

Q50 device

Hi,

Have you seen a GSM tracker which sends a ping packet (?) looking like this

[3G*1452592884*0009*LK,0,0,97]
followed by
[3G*1452592884*00CD*UD2,130418,133752,A,32.180347,N,34.8551140,E,2.78,278.5,0.0,6,100,95,0,0,00000000,7,255,425,2,33576,11402,161,33576,12403,139,33576,11401,138,33552,11301,135,33576,16283,131,33576,13862,129,33576,11881,129]
The number 1452592884 is the device IEMI. Numbers A,32.180347,N,34.8551140 mean N32.180347,E34.8551140

Thanks

Socket IO

Is it possible for this to integrate with Socket IO?

Error: read ECONNRESET

Hello,

I recently implemented an adapter for a device, but eventually the node stops the error below:
`
events.js:160
throw er; // Unhandled 'error' event
^

Error: read ECONNRESET
at exports._errnoException (util.js:1020:11)
at TCP.onread (net.js:568:26)
`

Can you help me?

To Send Command to Device using Https

I am new to NodeJS, In the documentation an available option to send command is available,
'cmd':'other_command'

this.send_comand = function(cmd,data){ var msg = [this.device.uid,cmd,data]; this.device.send(this.format_data(msg)); }

But how to trigger this from http request to a specific connected device? Please do help. Thanks in advance.

Cannot find module '/usr/lib/node_modules/crc/lib/index.js'

=================================================
GPS LISTENER running at port 3000
EXPECTING DEVICE MODEL: GT06

#0359751090017463: I'm requesting to be loged.
#0359751090017463: Device 0359751090017463 has been authorized. Welcome!
internal/modules/cjs/loader.js:583
throw err;
^

Error: Cannot find module '/usr/lib/node_modules/crc/lib/index.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
at Function.Module._load (internal/modules/cjs/loader.js:507:25)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
at adapter.authorize (/var/www/html/nodejs_gps/node_modules/gps-tracking/lib/adapters/gt06.js:92:15)
at Device.login_authorized (/var/www/html/nodejs_gps/node_modules/gps-tracking/lib/device.js:93:20)
at Device. (/var/www/html/nodejs_gps/index.js:33:14)
at Device.emit (events.js:182:13)
at Device.login_request (/var/www/html/nodejs_gps/node_modules/gps-tracking/lib/device.js:86:11)
at Device.make_action (/var/www/html/nodejs_gps/node_modules/gps-tracking/lib/device.js:67:15)
ubuntu@ip-172-31-56-57:/var/www/html/nodejs_gps$

running instructions

it would be very great if you can add some server starting notes. At least for a people who just have landed to nodejs. Are we supposed to run this server.

use Gk-309

Hey
I want to use GK309 Device like your GT02a but its not login, i think checksum error
can you please help me to solve this

Protocol is atteched
GK-309 protocol.pdf

Device Session

Iam new with node js, howto save device position, so we can calculate distance, park time, by compare with next data when arrived....

Connect to tracker

Received this error my tracker is GT02_MT626/DV2.2

#:  is trying to 'noop' but it isn't loged. Action wasn't executed
78781f12120a1f120d1dc0029297a304f7ed2b00080002d40a101100c96a0009c22d0d0a
<Buffer 78 78 1f 12 12 0a 1f 12 0d 1d c0 02 92 97 a3 04 f7 ed 2b 00 08 00 02 d4 0a 10 11 00 c9 6a 00 09 c2 2d 0d 0a>
noop
{ start: '7878',
  length: 31,
  finish: '0d0a',
  protocal_id: '12',
  device_id: '',
  cmd: 'noop',
  action: 'noop' }
#:  is trying to 'noop' but it isn't loged. Action wasn't executed

Netstat Shows too many established connections

Socket not getting closed. Its getting increased as time passes. Around 200 devices are sending data to the server. But after restarting within 24-32 hours netstat -atn | wc -l shows around 60000 established connections. When connections go beyond 70K, then server getting crashed any time. Whether timeout scenario or anything helps in this scenario. Please guide.

Concox GT06N Device

How to identify the vehicle key is ON / OFF? I have seen ACC in protocol but its not stable its changing to 00 and 01 in every request. Although Key is ON / OFF. Whats the best way to check the Vehicle key is ON / OFF. Thank you.

Screen Shot 2019-04-20 at 3 23 21 PM

can not run

when try to run server I have this error

C:\Users\Administrator\Desktop\gs\node_modules\gps-tracking>node index.js
{ [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' }

js-bson: Failed to load c++ bson extension, using pure JS version
{ [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' }

js-bson: Failed to load c++ bson extension, using pure JS version
{ [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' }

js-bson: Failed to load c++ bson extension, using pure JS version
{ [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' }

js-bson: Failed to load c++ bson extension, using pure JS version

Device ID is longer than 12 chars!

I successfully save gps coordinate to database with TK110 (2 wire) using this project without any code modification. then when i bought TK110 4 wire cable (to cut off power). there are 2 version of TK110, 2 wire and 4 wire. the SMS command is different. and when i try to send data to server i got error :

/home/diaz/rent_car_tracker/gps_tracker_receiver/gps-tracking/lib/adapters/tk103.js:24 if(cmd_start > 13)throw "Device ID is longer than 12 chars!"; ^ Device ID is longer than 12 chars!
Do you have code for TK110 4 wire cable ? or how can i show the incoming message so i can substr() it by myself ?

thank you

FM1125

FM1125_Protocols_v0.0.7 how to received data to nodejs server

I want to use for TK06A

Hello folks,
I want to use this for "TK06A" protocol. Please help me, how i can achieve this?

Problem with SPDX.

[email protected] license should be a valid SPDX license expression returns when installing gps-tracking.

I changed "license": "GPLv3" to "license": "GPL-3.0" and now give npm WARN install Refusing to install gps-tracking as a dependency of itself

Any ideia how solve this?

gps server misses events and does not log them : is trying to 'ping' but it isn't loged. Action wasn't executed

Hi
I implemented a gps server using repo docs and during tested that i'm getting location for some time like :
device ping : {"latitude":29.158416666666668,"longitude":75.71923333333334,"time":null,"speed":0,"orientation":"129.83","mileage":204851,"inserted":"2015-06-18T09:43:49.762Z","from_cmd":"BR00"}

then in middle is get missed events like :
is trying to 'ping' but it isn't loged. Action wasn't executed.
is trying to 'alarm' but it isn't loged. Action wasn't executed.

Then again i get device ping in like 1/50 ping events. Why am i missing events ?

i have a question about the command transmission

now I had problems transmission commands to gps device
Can you help me ? Gps device does not return data

MEITRACK_GPRS_Protocol

Example

GPRS Sending @@O48,353358017784062,D00,0215080432_C2E03.jpg,0*DB\r\n
GPRS Reply The example cannot be displayed because of hexadecimal characters.

Do you have example code ?
I wrote a program by node JS
Please help.

encoding/decoding data BIG endian

Hello Sir, we have GPS device which send data in BIG- endian mode(big-endian)Network byte order to transfer words and double words. I kindly request for assistance on where (which file) I can make changes so that the transmitted data is encoded/decoded using BIG endian. Or to check the endianness first and decides. Currently this is what we get. It begins with a line saying undefined
then we get the following
T☺☺"G@c�♠d�☺☺0/0000XN-S4876363☺4
T☺
☺"G@c�♠d�☺☺0/0000XN-S4876363☺4
☺"@☺�Gdc�♠☺/☺0000N0SX4-7383646�☺B�XXXX
☺"@☺�Gdc�♠☺/☺0000N0SX4-7383646�☺B�XXXX

ignition on or off

hello, I'm working with the gt06, how do I extract the ACC from the location package, I was wondering if the equipment is with an ignition on or off

<Buffer 78 78 1f 12 15 04 12 0d 0e 02 c7 01 d9 65 6d 05 07 03 dc 00 18 00 02 d4 02 51 02 00 ad 9a 00 0b c1 c2 0d 0a>
{
date: '1504120d0e02',
set_count: 'c7',
latitude_raw: '01d9656d',
longitude_raw: '050703dc',
latitude: 17.235829444444445,
longitude: 46.85878888888889,
speed: 0,
orientation: '1800',
lbs: '02d402510200ad9a'
}
#0862874040419751: Position received ( 17.235829444444445,46.85878888888889 )
ping

How to know the device logout and actually stopped sending the packets

When a device sending packets to server A and its changed to server B. Whether server A is able to know the device is logged out completely?

In server.js,

connection.on('end', function(){
	_this.devices.splice(_this.devices.indexOf(connection), 1);
	connection.device.emit('disconnected');
});

In device.js,

this.on('disconnected', function(){
	_this.logout();
});

this.logout = function(){
	this.do_log('Device has been logged out.');
	this.loged = false;
	this.adapter.logout(); // No code in gt06n
	
	// code to send server as the device_id logout
};

But disconnected event is running very often. Is there a better solution to identify the device got disconnected completed?

TypeError: f.bufferToHexString is not a function

EXPECTING DEVICE MODEL: GT06
=================================================

I'm a new device connected
/home/meteor/gps-tracking-demo/node_modules/gps-tracking/lib/adapters/gt06.js:25
data = f.bufferToHexString(data);
^

TypeError: f.bufferToHexString is not a function
at adapter.parse_data (/home/meteor/gps-tracking-demo/node_modules/gps-tracking/lib/adapters/gt06.js:25:14)
at Device. (/home/meteor/gps-tracking-demo/node_modules/gps-tracking/lib/device.js:31:34)
at Device.emit (events.js:198:13)
at Socket. (/home/meteor/gps-tracking-demo/node_modules/gps-tracking/lib/server.js:133:27)
at Socket.emit (events.js:203:15)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)

Device driver for ST-901

Does it currently supports usage for ST-901 gps tracker ?
I believe it is using H02 protocol.

Bug overflow

Hi, great library. It eased my work by a lot.

https://github.com/freshworkstudio/gps-tracking-nodejs/blob/master/lib/main.js#L195

This line should really try to parse the data multiple times, as the clients can send messages too quickly and TCP can put them in a single packet. Thus, the adapter cannot return two objects with values.

Do you mind if I modify this and push a pull request?

Also, I've made an adapter "simplicity" that gets JSON messages from a custom android app and sends it to another tcp server. It is meant to be an alternative to the tracking system that the fire engines have in northern UK. Let me know if you want me to open source it and add some documentations. I can bother with it if you will link it up.

Regards,
Ioan.

undefined request

The only event what I got is the connected, and the first parameter is undefined.

device.on("connected",function(data){
        console.log("I'm a new device connected");
        console.log(data); // this will be undefined
});

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.