1.0.20 • Published 7 months ago
iot-server v1.0.20
iot-server
Description
This is a simple server for IoT devices. It stores data from devices and provides a simple API for getting data.
Installation
npm install iot-server
Usage
import startServer from "iot-server";
startServer(
{
serverPort: 8080,
databaseType: 'mysql',
database: {
host: 'localhost',
port: 3306,
name: 'iot_database',
user: 'root',
password: '',
table: 'iot_table'
},
rateLimit: 10000,
fields: [
{
name: 'temperature',
type: 'number',
},
{
name: 'status',
type: 'string',
},
{
name: 'active',
type: 'boolean',
}
],
secret: 'mysecretapikey123456789',
payloadType: 'json',
payloadLimit: 100,
}
);
Configuration
The server can be configured with the following options:
serverPort
- The port the server will listen on.databaseType
- The type of database to use. Currently onlymysql
is supported.database
- The database configuration. The following options are available:host
- The host of the database.port
- The port of the database.name
- The name of the database.user
- The user of the database.password
- The password of the database.table
- The name of the table to use.
rateLimit
- The rate limit for the API in milliseconds.fields
- The fields that are allowed to be stored. The following options are available:name
- The name of the field.type
- The type of the field. The following types are available:number
- A number.string
- A string.boolean
- A boolean.
queries
- Map of endpoints{endpoint}
- The name of the endpoint.query
- The query to execute.serializer
- The serializer to use. (Optional)validators
- The validators to use. (Optional){field name}
- The function to validate specific field value
secret
- The secret API key.payloadType
- The type of the payload. The following types are available:json
- A JSON payload.
API
The server provides the following API:
GET /
- Returns the current server status.GET /status?secret=[SECRET KEY]&beforeDate=[DATE]&afterDate=[DATE]&maxQuery=[NUMBER]
- Returns the payload.secret
- The secret API key. (Optional if no secret is set)beforeDate
- The maximum date of the payload. (Optional)afterDate
- The minimum date of the payload. (Optional)maxQuery
- The maximum number of payloads to return. (Optional, default: 100)
GET /data?secret=[SECRET KEY]&<field name>=<field value>
secret
- The secret API key. (Optional if no secret is set)<field name>
- The name of the field.<field value>
- The value of the field.
Response
The server will respond with the following status codes:
200
- The request was successful.400
- The request was invalid.401
- The request was unauthorized. (Invalid secret key)429
- The request was rate limited.
The server will respond with the following payload:
status
- The status of the request.data
- The data of the request. (ForGET /status
)message
- The message of the request. (Nullable)
The server will respond with the following status:
success
- The request was successful.fail
- The request failed.access-denied
- The request was unauthorized.rate-limited
- The request was rate limited.
Example response:
{
"status": "success",
"data": [
{
"temperature": 20,
"status": "working",
"active": true,
"date": "2020-01-01T00:00:00.000Z"
},
{
"temperature": 20,
"status": "working",
"active": true,
"date": "2020-01-01T00:00:00.000Z"
}
],
"message": "Successfully retrieved data."
}
Example
http://localhost:3000/
http://localhost:3000/status?beforeDate=2020-01-01T00:00:00.000Z&afterDate=2020-01-01T00:00:00.000Z&maxQuery=100
http://localhost:3000/data?temperature=20&status=working&active=true
Example Code
import startServer from "./iot-server.js";
startServer(
{
// Port yang digunakan untuk mengakses server
serverPort: 80,
// Konfigurasi database
database: {
type: 'mysql',
host: 'localhost',
port: 3306,
name: 'iot',
user: 'root',
password: '',
table: 'tb_cuaca',
date_field: 'ts',
},
// Membatasi jumlah request yang dapat dilakukan dalam satu waktu
// Jika melebihi batas, maka request akan ditolak
// (dalam milidetik)
rateLimit: 10000,
allowAlterTable: false,
// Berisi daftar fields yang ada pada tabel
fields: [
{
// Nama field
name: 'suhu',
// Tipe data field
type: 'float',
},
{
name: 'humid',
type: 'float',
},
{
name: 'lux',
type: 'float',
},
],
// Endpoint yang dapat diakses
queries: {
// Endpoint senddata (Contoh: http://localhost:8080/senddata?temp=20&humid=30&light=40)
senddata: {
query: 'INSERT INTO {table}(suhu, kelembapan, lux) VALUES ({temp}, {humid}, {light})',
serializer: results => {
return results.length;
},
validators: {
suhu: value => {
return value >= 0 && value <= 100;
}
}
},
// Endpoint getdata (Contoh: http://localhost:8080/getdata)
getalldata: 'SELECT * FROM {table}',
getlatestdata: 'SELECT * FROM {table} ORDER BY date DESC LIMIT 1',
gethottestdate: 'SELECT {date} FROM {table} WHERE suhu = (SELECT MAX(suhu) FROM {table}) GROUP BY {date}',
},
secret: ip => {
switch (ip) {
// Jika diakses dari localhost, maka tidak perlu secret
case '127.0.0.1':
return null;
default:
// Jika diakses dari luar, maka secret adalah string berikut
return 'abcdefghijklmnopqrstuvwxyz';
}
},
// Payload yang akan dikirimkan ke client
payloadType: 'text',
}
);
1.0.19
7 months ago
1.0.18
7 months ago
1.0.20
7 months ago
1.0.17
7 months ago
1.0.16
7 months ago
1.0.15
7 months ago
1.0.14
7 months ago
1.0.13
7 months ago
1.0.12
7 months ago
1.0.11
7 months ago
1.0.10
7 months ago
1.0.8
7 months ago
1.0.7
7 months ago
1.0.6
7 months ago
1.0.5
7 months ago
1.0.4
7 months ago
1.0.3
7 months ago
1.0.2
7 months ago
1.0.1
7 months ago
1.0.0
7 months ago
0.0.1
8 years ago