SlideShare a Scribd company logo
Programming IoT Gateways
in JavaScript with macchina.io
Günter Obiltschnig
Applied Informatics Software Engineering GmbH
guenter@appinf.com
@obiltschnig, @macchina_io
About Me
hard-core C++ developer (20+ years), who also likes JavaScript
“full stack++”, embedded, hardware to web frontend + cloud
POCO C++ Libraries (2004)
Applied Informatics GmbH (2006)
my-devices.net (2010)
AIS Radar for iOS (2011)
macchina.io (2013)
m .ioacchina
A modular open source toolkit for building embedded IoT
applications that connect sensors, devices and cloud services.
IoT Gateway
devices.netCloud Services
AirVantage, Bluemix,
Tinamous, Xively, etc.
HTTP(S)
MQTT
Remote Access
my-devices.net
device apps
local“business logic”
web services
web visualization
database
discoverability
Mobile/Web
Clients
Devices/Sensor Networks
CoAP, IEEE 802.15.4,
Modbus, USB,
Bluetooth,
RS-232
Programming IoT Gateways in JavaScript with macchina.io
> open source (Apache 2.0 License)
> built in C++ for best performance and efficiency 

(JavaScript for parts of web interface)
> modular and extensible
> mature, proven codebase: 

POCO C++ Libraries, Google V8, Eclipse Paho, SQLite

AngularJS, jQuery, OpenLayers, Ace (text editor),

+ Applied Informatics OSP and Remoting frameworks
> C++-to-JavaScript bridge
> Raspberry Pi, Beaglebone, Edison, RED, MangOH, etc.
> prototype on Linux or OS X host, easily deploy to device
> web interface with JavaScript editor
Sensors & Devices Protocols Cloud Services
Temperature, Ambient Light, 

Humidity, Air Pressure, etc.
HTTP AirVantage
I/O, Trigger, Rotary Encoder MQTT Bluemix
Accelerometer CoAP* Twitter
GNSS/GPS WebEvent Twilio (SMS)
Barcode Reader, RFID* WebTunnel my-devices.net
XBee (ZigBee, IEEE 802.15.4) XBee API any with HTTP/REST APIs
Serial Port Modbus*, CANopen*
* planned
Pro Users and Device Manufacturers
> add device specific APIs
> make devices programmable in JavaScript for partners or end users
> device specific app store (sell additional software features)
> additional frameworks (UPnP, Remoting SOAP and JSON-RPC)
> customizable web user interface
> improved user authentication and authorization
> signed bundles
> pro support
Demo
Inside macchina.io
Programming IoT Gateways in JavaScript with macchina.io
POCO C++ Libraries
> Started 2004
> ~300.000 LOC
> 1000+ classes
> on GitHub since 2012 

1000+ stars

400+ forks

30-50 clones/day
> ~100 contributors
> Boost License
> http://pocoproject.org
POSIX, WIN32, other (RT)OS API
Foundation
C++ and C Standard LibrariesApplication
Zip
Net
Crypto
Data
SQLite
ODBC
MySQL
NetSSL
Util
Tools, Utilities and
additional Libraries
XML JSON
V8
> Google’s JavaScript Engine
> Used by Chrome/Chromium and node.js
> C++ library, (reasonably) easy to integrate and to extend
> Compiles JavaScript to native code (x86, ARM, MIPS)
> Great performance
> BSD License
Remoting
> Similar to .NET Remoting or Java RMI, but for C++
> Code generator parses annotated C++ header files and generates code

(serialization/deserialization, method dispatching, helpers)
> Supports different transports (binary TCP, SOAP, JSON-RPC)
> Used for automatic C++-to-JavaScript bridging
> Will also be used to implement sandbox mechanism
Open Service Platform (OSP)
> Inspired by OSGi, but for C++ (also JavaScript, Python, etc.)
> Dynamic module system based on bundles

(Zip files with metadata, 

shared libs, other files)
> Dependency and 

lifecycle management
> Services and service registry
> Web Server
POCO Core Libraries
(Foundation,XML,Util,Net)
Operating
System
API
Std.C/C++
Libraries
Service
Registry
Portable Runtime
Environment
Life
C
ycle
M
anagem
ent
Bundle
M
anagem
ent
Standard
Services
Bundles
install,resolve,start,stop
and uninstall bundles
provide services to other
bundles and find services
provided by other bundles
manage bundle versions
and dependencies
web server,
web- and console-
based management,
user authentication
and authorization,
preferences,etc.
application-specific
functionality and services
Combining POCO C++ Libraries and V8
> JavaScript is single-threaded and garbage-collected
> POCO is multithreaded (specifically web server)
> Make C++ object available to JavaScript

easy for static objects, just provide Wrapper
> Allow JavaScript code to create C++ objects

easy if you don’t care about memory/resource leaks
> Register a callback function called by GC when object is deleted

allows you to properly delete underlying c++ object
> However, V8 does not do callbacks when script ends

wrapped C++ objects won’t be deleted, leaks resulting
> Need to track every C++ object a script creates and clean up afterwards :-(
Automatic JavaScript
Wrappers for C++ Objects
// Sensor.h
//@ remote
class Sensor: public Device
{
public:
Poco::BasicEvent<const double> valueChanged;
virtual double value() const = 0;
virtual bool ready() const = 0;
};
Sensor.h
RemoteGen
lots of generated source files
RemoteGen.xml
Service
<<generatedFrom>>
IService
ServiceProxy
Service
RemoteObject
The interface class has
all @remote methods
from the service class.
Service
Skeleton
<<invokes>>
<<generated>>
<<generated>><<generated>>
<<generated>>
Service
ServerHelper
<<generated>>
Registers
Skeleton, RemoteObject
and EventDispatcher (if
needed) with the Object
Request Broker.
Service
ProxyFactory
<<creates>>
<<generated>>
Service
ClientHelper
<<generated>>
Registers ProxyFactory
with the Object Request
Broker.
<<registers>><<registers>>
<<registers>>
Service
EventSubscriber
<<generated>>
Service
EventDispatcher
<<generated>>
<<registers>>
var tempSensor = ...;
tempSensor.on(‘valueChanged', function(ev) {
var temp = ev.data;
// ...
});
if (tempSensor.ready())
{
var temp = tempSensor.value();
// ...
}
JavaScript Samples
// sensors.js (search sensors by physical quantity)
var sensors = {};
var illuminanceRefs = serviceRegistry.find(
'io.macchina.physicalQuantity == "illuminance"');
if (illuminanceRefs.length > 0)
{
sensors.illuminance = illuminanceRefs[0].instance();
}
var temperatureRefs = serviceRegistry.find(
'io.macchina.physicalQuantity == "temperature"');
if (temperatureRefs.length > 0)
{
sensors.temperature = temperatureRefs[0].instance();
}
var humidityRefs = serviceRegistry.find(
'io.macchina.physicalQuantity == "humidity"');
if (humidityRefs.length > 0)
{
sensors.humidity = humidityRefs[0].instance();
}
module.exports = sensors;
// sensors.js (search sensors by ID)
var sensors = {};
var illuminanceRef = serviceRegistry.findByName(
'io.macchina.xbee.sensor.illuminance#0013A20040A4D7F7');
if (illuminanceRef)
{
sensors.illuminance = illuminanceRef.instance();
}
var temperatureRef = serviceRegistry.findByName(
'io.macchina.xbee.sensor.temperature#0013A20040A4D7F7');
if (temperatureRef)
{
sensors.temperature = temperatureRef.instance();
}
var humidityRef = serviceRegistry.findByName(
'io.macchina.xbee.sensor.humidity#0013A20040A4D7F7');
if (humidityRef)
{
sensors.humidity = humidityRef.instance();
}
module.exports = sensors;
// database.js
var database = {};
database.path = bundle.persistentDirectory + "logger.db";
database.session = new DBSession('SQLite', database.path);
database.logIntervalSeconds = application.config.getInt(
"datalogger.intervalSeconds", 30);
database.keepDataSeconds = application.config.getInt(
"datalogger.keepDataSeconds", 3600);
module.exports = database;
// logger.js
var sensors = require('sensors.js');
var db = require('database.js');
db.session.execute('PRAGMA journal_mode=WAL');
db.session.execute('CREATE TABLE IF NOT EXISTS datalog ( 
timestamp INTEGER, 
illuminance FLOAT, 
temperature FLOAT, 
humidity FLOAT 
)');
setInterval(
function()
{
db.session.execute('INSERT INTO datalog VALUES (?, ?, ?, ?)',
DateTime().epoch,
sensors.illuminance.value(),
sensors.temperature.value(),
sensors.humidity.value());
},
db.logIntervalSeconds*1000);
// logger.js (continued)
setInterval(
function()
{
var cutoffTime = DateTime().epoch - db.keepDataSeconds;
db.session.execute('DELETE FROM datalog WHERE timestamp < ?',
cutoffTime);
},
db.keepDataSeconds*1000);
// history.jss
var db = require(‘../database.js');
var validItems = ['temperature', 'humidity', 'illuminance'];
var data = [];
db.session.pageSize = form.maxItems ? parseInt(form.maxItems) : 20;
var item = form.item;
if (validItems.indexOf(item) > -1)
{
var recordSet = db.session.execute(
'SELECT timestamp, ' + item + ' FROM datalog ORDER BY timestamp DESC');
// history.jss (continued)
for (var row = 0; row < recordSet.rowCount; row++)
{
var time = recordSet.getValue('timestamp');
var value = recordSet.getValue(item);
var date = LocalDateTime('1970-01-01');
date.addSeconds(time);
data[recordSet.rowCount - row - 1] =
{
timestamp: date.format('%H:%M:%S'),
value: value
};
recordSet.moveNext();
}
recordSet.close();
}
response.contentType = 'application/json';
response.write(JSON.stringify(data));
response.send();
// MQTT to AirVantage
var sensors = require('sensors.js');
var mqttClientRefs = serviceRegistry.find(
'io.macchina.mqtt.serverURI == "tcp://na.airvantage.net:1883"');
if (mqttClientRefs.length > 0)
{
logger.information("MQTT Client found!");
var mqttClient = mqttClientRefs[0].instance();
setInterval(function() {
var epoch = "" + 1000*DateTime().epoch; // seconds to milliseconds
var payload = {};
payload[epoch] = {
"sensors.temperature": sensors.temperature.value(),
"sensors.humidity": sensors.humidity.value()
"sensors.illuminance": sensors.illuminance.value()
};
mqttClient.publish('JA347400060803/messages/json', 

JSON.stringify(payload), 0);
}, 10000);
}
// Send SMS via Twilio
function sendSMS(to, message)
{
var accountSID = application.config.getString("twilio.accountSID");
var authToken = application.config.getString("twilio.authToken");
var from = application.config.getString(“twilio.from");
var twilioHttpRequest = new HTTPRequest(
"POST",
"https://api.twilio.com/2010-04-01/Accounts/"
+ accountSID
+ "/SMS/Messages"
);
twilioHttpRequest.authenticate(accountSID, authToken);
twilioHttpRequest.contentType = "application/x-www-form-urlencoded";
twilioHttpRequest.content =
"From=" + encodeURIComponent(from) +
"&To=" + encodeURIComponent(to) +
"&Body=" + encodeURIComponent(message);
twilioHttpRequest.send(function(result) {
logger.information("Twilio SMS Response: ",
result.response.status,
result.response.content);
});
}
var sensors = require('sensors.js');
var enableSMS = true;
sensors.illuminance.on('valueChanged', function(ev) {
logger.notice("valueChanged: " + ev.data);
if (ev.data < 10)
{
logger.warning("Lights out!");
if (enableSMS)
{
sendSMS("+436765166737", "Lights out!");
enableSMS = false;
}
}
else if (ev.data > 50)
{
enableSMS = true;
}
});
Q&A
guenter@appinf.com | @obiltschnig | obiltschnig.com
macchina.io | my-devices.net | pocoproject.org | www.appinf.com

More Related Content

What's hot (18)

PDF
Arduino、Web 到 IoT
Justin Lin
 
PDF
Do you know what your drupal is doing? Observe it!
Luca Lusso
 
PPTX
C#을 이용한 task 병렬화와 비동기 패턴
명신 김
 
PPTX
Jafka guide
Ady Liu
 
PDF
Ice mini guide
Ady Liu
 
PDF
NoSQL and JavaScript: a love story
Alexandre Morgaut
 
PDF
Security and performance designs for client-server communications
WO Community
 
PDF
FwDays 2021: Metarhia Technology Stack for Node.js
Timur Shemsedinov
 
PDF
Http4s, Doobie and Circe: The Functional Web Stack
GaryCoady
 
PPTX
Python database interfaces
Mohammad Javad Beheshtian
 
PPTX
Taking advantage of the Amazon Web Services (AWS) Family
Ben Hall
 
ODP
Networking and Data Access with Eqela
jobandesther
 
KEY
What is the ServiceStack?
Demis Bellot
 
PPTX
The zen of async: Best practices for best performance
Microsoft Developer Network (MSDN) - Belgium and Luxembourg
 
PDF
Source Code for Dpilot
Nidhi Chauhan
 
PDF
Dpilot Source Code With ScreenShots
DeepAnshu Sharma
 
PDF
Node.js in production
Felix Geisendörfer
 
PPTX
Java Persistence Frameworks for MongoDB
Tobias Trelle
 
Arduino、Web 到 IoT
Justin Lin
 
Do you know what your drupal is doing? Observe it!
Luca Lusso
 
C#을 이용한 task 병렬화와 비동기 패턴
명신 김
 
Jafka guide
Ady Liu
 
Ice mini guide
Ady Liu
 
NoSQL and JavaScript: a love story
Alexandre Morgaut
 
Security and performance designs for client-server communications
WO Community
 
FwDays 2021: Metarhia Technology Stack for Node.js
Timur Shemsedinov
 
Http4s, Doobie and Circe: The Functional Web Stack
GaryCoady
 
Python database interfaces
Mohammad Javad Beheshtian
 
Taking advantage of the Amazon Web Services (AWS) Family
Ben Hall
 
Networking and Data Access with Eqela
jobandesther
 
What is the ServiceStack?
Demis Bellot
 
The zen of async: Best practices for best performance
Microsoft Developer Network (MSDN) - Belgium and Luxembourg
 
Source Code for Dpilot
Nidhi Chauhan
 
Dpilot Source Code With ScreenShots
DeepAnshu Sharma
 
Node.js in production
Felix Geisendörfer
 
Java Persistence Frameworks for MongoDB
Tobias Trelle
 

Viewers also liked (20)

PDF
Welcome
AGILE IoT
 
PDF
ApacheCon NA11 - Apache Celix, Universal OSGi?
abroekhuis
 
PDF
The tools & technologies behind Resin.io
GreeceJS
 
PDF
IoTcloud-cybersecurity-securityofthings
Ed Pimentel
 
PDF
Lab IoT 2016
Roman Hasko
 
PDF
Introduction to AllJoyn
Alex Gonzalez
 
PDF
Building Open Source IoT Cloud
dejanb
 
PPTX
Internet of Things (IoT) reference architecture using Azure -MIC - Lahore
Information Technology University
 
PDF
Real World IoT Architectures and Projects with Eclipse IoT
Eurotech
 
PPTX
Introduction to Internet of Things Hardware
Daniel Eichhorn
 
PPT
Building IoT with Arduino Day One
Anthony Faustine
 
PDF
Native OSGi, Modular Software Development in a Native World - Alexander Broek...
mfrancis
 
PDF
Hands on with lightweight m2m and Eclipse Leshan
Julien Vermillard
 
PDF
IoT Architecture - Are Traditional Architectures Good Enough or do we Need Ne...
Guido Schmutz
 
PDF
IoT Solutions for Smart Energy Smart Grid and Smart Utility Applications
Eurotech
 
PPT
MySQL
Gouthaman V
 
PPT
MySQL Atchitecture and Concepts
Tuyen Vuong
 
PDF
Open IoT Cloud Architecture, Web of Things, Shenzhen, China.
Jollen Chen
 
PPT
MySql slides (ppt)
webhostingguy
 
PDF
IoT Open Source Integration Comparison (Kura, Node-RED, Flogo, Apache Nifi, S...
Kai Wähner
 
Welcome
AGILE IoT
 
ApacheCon NA11 - Apache Celix, Universal OSGi?
abroekhuis
 
The tools & technologies behind Resin.io
GreeceJS
 
IoTcloud-cybersecurity-securityofthings
Ed Pimentel
 
Lab IoT 2016
Roman Hasko
 
Introduction to AllJoyn
Alex Gonzalez
 
Building Open Source IoT Cloud
dejanb
 
Internet of Things (IoT) reference architecture using Azure -MIC - Lahore
Information Technology University
 
Real World IoT Architectures and Projects with Eclipse IoT
Eurotech
 
Introduction to Internet of Things Hardware
Daniel Eichhorn
 
Building IoT with Arduino Day One
Anthony Faustine
 
Native OSGi, Modular Software Development in a Native World - Alexander Broek...
mfrancis
 
Hands on with lightweight m2m and Eclipse Leshan
Julien Vermillard
 
IoT Architecture - Are Traditional Architectures Good Enough or do we Need Ne...
Guido Schmutz
 
IoT Solutions for Smart Energy Smart Grid and Smart Utility Applications
Eurotech
 
MySQL Atchitecture and Concepts
Tuyen Vuong
 
Open IoT Cloud Architecture, Web of Things, Shenzhen, China.
Jollen Chen
 
MySql slides (ppt)
webhostingguy
 
IoT Open Source Integration Comparison (Kura, Node-RED, Flogo, Apache Nifi, S...
Kai Wähner
 
Ad

Similar to Programming IoT Gateways in JavaScript with macchina.io (20)

PPTX
Why we need internet of things on Node.js
Indeema Software Inc.
 
PDF
Using Java Script and COMPOSE to build cool IoT applications, SenZations 2015
SenZations Summer School
 
PDF
Node.js as an IOT Bridge
Eduardo Pelegri-Llopart
 
PPTX
Going native with less coupling: Dependency Injection in C++
Daniele Pallastrelli
 
PDF
IoT is Something to Figure Out
Peter Hoddie
 
PDF
What is IoT and how Modulus and Pacific can Help - Featuring Node.js and Roll...
Eduardo Pelegri-Llopart
 
PDF
IoT-javascript-2019-fosdem
Phil www.rzr.online.fr
 
PPTX
[University] Capstone Design Project 2 (SAIOT)
창엽 양
 
PDF
JavaScript all the things! - FullStack 2017
Jan Jongboom
 
PDF
Modern Web Applications Utilizing HTML5 APIs
Ido Green
 
PDF
Javascript all the things
Felix Wahner
 
KEY
Mongo and node mongo dc 2011
async_io
 
PPTX
Bare metal Javascript & GPIO programming in Linux
Alexander Vanwynsberghe
 
PPTX
Using an Open Source RESTful Backend for IoT Applications
Jan Liband
 
PDF
Nodejs - A quick tour (v6)
Felix Geisendörfer
 
PDF
Modern Web Applications Utilizing HTML5 (Dev Con TLV 06-2013)
Ido Green
 
PPTX
Building the Internet of Things with Thingsquare and Contiki - day 1, part 3
Adam Dunkels
 
KEY
Practical Use of MongoDB for Node.js
async_io
 
PDF
Easy IoT with JavaScript
Samsung Open Source Group
 
PPTX
Webdevcon Keynote hh-2012-09-18
Pierre Joye
 
Why we need internet of things on Node.js
Indeema Software Inc.
 
Using Java Script and COMPOSE to build cool IoT applications, SenZations 2015
SenZations Summer School
 
Node.js as an IOT Bridge
Eduardo Pelegri-Llopart
 
Going native with less coupling: Dependency Injection in C++
Daniele Pallastrelli
 
IoT is Something to Figure Out
Peter Hoddie
 
What is IoT and how Modulus and Pacific can Help - Featuring Node.js and Roll...
Eduardo Pelegri-Llopart
 
IoT-javascript-2019-fosdem
Phil www.rzr.online.fr
 
[University] Capstone Design Project 2 (SAIOT)
창엽 양
 
JavaScript all the things! - FullStack 2017
Jan Jongboom
 
Modern Web Applications Utilizing HTML5 APIs
Ido Green
 
Javascript all the things
Felix Wahner
 
Mongo and node mongo dc 2011
async_io
 
Bare metal Javascript & GPIO programming in Linux
Alexander Vanwynsberghe
 
Using an Open Source RESTful Backend for IoT Applications
Jan Liband
 
Nodejs - A quick tour (v6)
Felix Geisendörfer
 
Modern Web Applications Utilizing HTML5 (Dev Con TLV 06-2013)
Ido Green
 
Building the Internet of Things with Thingsquare and Contiki - day 1, part 3
Adam Dunkels
 
Practical Use of MongoDB for Node.js
async_io
 
Easy IoT with JavaScript
Samsung Open Source Group
 
Webdevcon Keynote hh-2012-09-18
Pierre Joye
 
Ad

Recently uploaded (20)

PDF
𝐁𝐔𝐊𝐓𝐈 𝐊𝐄𝐌𝐄𝐍𝐀𝐍𝐆𝐀𝐍 𝐊𝐈𝐏𝐄𝐑𝟒𝐃 𝐇𝐀𝐑𝐈 𝐈𝐍𝐈 𝟐𝟎𝟐𝟓
hokimamad0
 
PPTX
internet básico presentacion es una red global
70965857
 
PPTX
L1A Season 1 Guide made by A hegy Eng Grammar fixed
toszolder91
 
PPTX
sajflsajfljsdfljslfjslfsdfas;fdsfksadfjlsdflkjslgfs;lfjlsajfl;sajfasfd.pptx
theknightme
 
PDF
The Internet - By the numbers, presented at npNOG 11
APNIC
 
PPT
introductio to computers by arthur janry
RamananMuthukrishnan
 
PPTX
L1A Season 1 ENGLISH made by A hegy fixed
toszolder91
 
PPTX
Orchestrating things in Angular application
Peter Abraham
 
PDF
BRKACI-1003 ACI Brownfield Migration - Real World Experiences and Best Practi...
fcesargonca
 
PPTX
PE introd.pptxfrgfgfdgfdgfgrtretrt44t444
nepmithibai2024
 
PDF
The-Hidden-Dangers-of-Skipping-Penetration-Testing.pdf.pdf
naksh4thra
 
PDF
Paper: Quantum Financial System - DeFi patent wars
Steven McGee
 
PDF
Azure_DevOps introduction for CI/CD and Agile
henrymails
 
PPTX
一比一原版(SUNY-Albany毕业证)纽约州立大学奥尔巴尼分校毕业证如何办理
Taqyea
 
PDF
Cleaning up your RPKI invalids, presented at PacNOG 35
APNIC
 
PPTX
Softuni - Psychology of entrepreneurship
Kalin Karakehayov
 
PPTX
原版西班牙莱昂大学毕业证(León毕业证书)如何办理
Taqyea
 
PPT
introduction to networking with basics coverage
RamananMuthukrishnan
 
PDF
Apple_Environmental_Progress_Report_2025.pdf
yiukwong
 
PPT
Agilent Optoelectronic Solutions for Mobile Application
andreashenniger2
 
𝐁𝐔𝐊𝐓𝐈 𝐊𝐄𝐌𝐄𝐍𝐀𝐍𝐆𝐀𝐍 𝐊𝐈𝐏𝐄𝐑𝟒𝐃 𝐇𝐀𝐑𝐈 𝐈𝐍𝐈 𝟐𝟎𝟐𝟓
hokimamad0
 
internet básico presentacion es una red global
70965857
 
L1A Season 1 Guide made by A hegy Eng Grammar fixed
toszolder91
 
sajflsajfljsdfljslfjslfsdfas;fdsfksadfjlsdflkjslgfs;lfjlsajfl;sajfasfd.pptx
theknightme
 
The Internet - By the numbers, presented at npNOG 11
APNIC
 
introductio to computers by arthur janry
RamananMuthukrishnan
 
L1A Season 1 ENGLISH made by A hegy fixed
toszolder91
 
Orchestrating things in Angular application
Peter Abraham
 
BRKACI-1003 ACI Brownfield Migration - Real World Experiences and Best Practi...
fcesargonca
 
PE introd.pptxfrgfgfdgfdgfgrtretrt44t444
nepmithibai2024
 
The-Hidden-Dangers-of-Skipping-Penetration-Testing.pdf.pdf
naksh4thra
 
Paper: Quantum Financial System - DeFi patent wars
Steven McGee
 
Azure_DevOps introduction for CI/CD and Agile
henrymails
 
一比一原版(SUNY-Albany毕业证)纽约州立大学奥尔巴尼分校毕业证如何办理
Taqyea
 
Cleaning up your RPKI invalids, presented at PacNOG 35
APNIC
 
Softuni - Psychology of entrepreneurship
Kalin Karakehayov
 
原版西班牙莱昂大学毕业证(León毕业证书)如何办理
Taqyea
 
introduction to networking with basics coverage
RamananMuthukrishnan
 
Apple_Environmental_Progress_Report_2025.pdf
yiukwong
 
Agilent Optoelectronic Solutions for Mobile Application
andreashenniger2
 

Programming IoT Gateways in JavaScript with macchina.io

  • 1. Programming IoT Gateways in JavaScript with macchina.io Günter Obiltschnig Applied Informatics Software Engineering GmbH [email protected] @obiltschnig, @macchina_io
  • 2. About Me hard-core C++ developer (20+ years), who also likes JavaScript “full stack++”, embedded, hardware to web frontend + cloud POCO C++ Libraries (2004) Applied Informatics GmbH (2006) my-devices.net (2010) AIS Radar for iOS (2011) macchina.io (2013)
  • 3. m .ioacchina A modular open source toolkit for building embedded IoT applications that connect sensors, devices and cloud services.
  • 4. IoT Gateway devices.netCloud Services AirVantage, Bluemix, Tinamous, Xively, etc. HTTP(S) MQTT Remote Access my-devices.net device apps local“business logic” web services web visualization database discoverability Mobile/Web Clients Devices/Sensor Networks CoAP, IEEE 802.15.4, Modbus, USB, Bluetooth, RS-232
  • 6. > open source (Apache 2.0 License) > built in C++ for best performance and efficiency 
 (JavaScript for parts of web interface) > modular and extensible > mature, proven codebase: 
 POCO C++ Libraries, Google V8, Eclipse Paho, SQLite
 AngularJS, jQuery, OpenLayers, Ace (text editor),
 + Applied Informatics OSP and Remoting frameworks > C++-to-JavaScript bridge > Raspberry Pi, Beaglebone, Edison, RED, MangOH, etc. > prototype on Linux or OS X host, easily deploy to device > web interface with JavaScript editor
  • 7. Sensors & Devices Protocols Cloud Services Temperature, Ambient Light, 
 Humidity, Air Pressure, etc. HTTP AirVantage I/O, Trigger, Rotary Encoder MQTT Bluemix Accelerometer CoAP* Twitter GNSS/GPS WebEvent Twilio (SMS) Barcode Reader, RFID* WebTunnel my-devices.net XBee (ZigBee, IEEE 802.15.4) XBee API any with HTTP/REST APIs Serial Port Modbus*, CANopen* * planned
  • 8. Pro Users and Device Manufacturers > add device specific APIs > make devices programmable in JavaScript for partners or end users > device specific app store (sell additional software features) > additional frameworks (UPnP, Remoting SOAP and JSON-RPC) > customizable web user interface > improved user authentication and authorization > signed bundles > pro support
  • 12. POCO C++ Libraries > Started 2004 > ~300.000 LOC > 1000+ classes > on GitHub since 2012 
 1000+ stars
 400+ forks
 30-50 clones/day > ~100 contributors > Boost License > http://pocoproject.org POSIX, WIN32, other (RT)OS API Foundation C++ and C Standard LibrariesApplication Zip Net Crypto Data SQLite ODBC MySQL NetSSL Util Tools, Utilities and additional Libraries XML JSON
  • 13. V8 > Google’s JavaScript Engine > Used by Chrome/Chromium and node.js > C++ library, (reasonably) easy to integrate and to extend > Compiles JavaScript to native code (x86, ARM, MIPS) > Great performance > BSD License
  • 14. Remoting > Similar to .NET Remoting or Java RMI, but for C++ > Code generator parses annotated C++ header files and generates code
 (serialization/deserialization, method dispatching, helpers) > Supports different transports (binary TCP, SOAP, JSON-RPC) > Used for automatic C++-to-JavaScript bridging > Will also be used to implement sandbox mechanism
  • 15. Open Service Platform (OSP) > Inspired by OSGi, but for C++ (also JavaScript, Python, etc.) > Dynamic module system based on bundles
 (Zip files with metadata, 
 shared libs, other files) > Dependency and 
 lifecycle management > Services and service registry > Web Server POCO Core Libraries (Foundation,XML,Util,Net) Operating System API Std.C/C++ Libraries Service Registry Portable Runtime Environment Life C ycle M anagem ent Bundle M anagem ent Standard Services Bundles install,resolve,start,stop and uninstall bundles provide services to other bundles and find services provided by other bundles manage bundle versions and dependencies web server, web- and console- based management, user authentication and authorization, preferences,etc. application-specific functionality and services
  • 16. Combining POCO C++ Libraries and V8 > JavaScript is single-threaded and garbage-collected > POCO is multithreaded (specifically web server) > Make C++ object available to JavaScript
 easy for static objects, just provide Wrapper > Allow JavaScript code to create C++ objects
 easy if you don’t care about memory/resource leaks > Register a callback function called by GC when object is deleted
 allows you to properly delete underlying c++ object > However, V8 does not do callbacks when script ends
 wrapped C++ objects won’t be deleted, leaks resulting > Need to track every C++ object a script creates and clean up afterwards :-(
  • 18. // Sensor.h //@ remote class Sensor: public Device { public: Poco::BasicEvent<const double> valueChanged; virtual double value() const = 0; virtual bool ready() const = 0; };
  • 19. Sensor.h RemoteGen lots of generated source files RemoteGen.xml
  • 20. Service <<generatedFrom>> IService ServiceProxy Service RemoteObject The interface class has all @remote methods from the service class. Service Skeleton <<invokes>> <<generated>> <<generated>><<generated>> <<generated>> Service ServerHelper <<generated>> Registers Skeleton, RemoteObject and EventDispatcher (if needed) with the Object Request Broker. Service ProxyFactory <<creates>> <<generated>> Service ClientHelper <<generated>> Registers ProxyFactory with the Object Request Broker. <<registers>><<registers>> <<registers>> Service EventSubscriber <<generated>> Service EventDispatcher <<generated>> <<registers>>
  • 21. var tempSensor = ...; tempSensor.on(‘valueChanged', function(ev) { var temp = ev.data; // ... }); if (tempSensor.ready()) { var temp = tempSensor.value(); // ... }
  • 23. // sensors.js (search sensors by physical quantity) var sensors = {}; var illuminanceRefs = serviceRegistry.find( 'io.macchina.physicalQuantity == "illuminance"'); if (illuminanceRefs.length > 0) { sensors.illuminance = illuminanceRefs[0].instance(); } var temperatureRefs = serviceRegistry.find( 'io.macchina.physicalQuantity == "temperature"'); if (temperatureRefs.length > 0) { sensors.temperature = temperatureRefs[0].instance(); } var humidityRefs = serviceRegistry.find( 'io.macchina.physicalQuantity == "humidity"'); if (humidityRefs.length > 0) { sensors.humidity = humidityRefs[0].instance(); } module.exports = sensors;
  • 24. // sensors.js (search sensors by ID) var sensors = {}; var illuminanceRef = serviceRegistry.findByName( 'io.macchina.xbee.sensor.illuminance#0013A20040A4D7F7'); if (illuminanceRef) { sensors.illuminance = illuminanceRef.instance(); } var temperatureRef = serviceRegistry.findByName( 'io.macchina.xbee.sensor.temperature#0013A20040A4D7F7'); if (temperatureRef) { sensors.temperature = temperatureRef.instance(); } var humidityRef = serviceRegistry.findByName( 'io.macchina.xbee.sensor.humidity#0013A20040A4D7F7'); if (humidityRef) { sensors.humidity = humidityRef.instance(); } module.exports = sensors;
  • 25. // database.js var database = {}; database.path = bundle.persistentDirectory + "logger.db"; database.session = new DBSession('SQLite', database.path); database.logIntervalSeconds = application.config.getInt( "datalogger.intervalSeconds", 30); database.keepDataSeconds = application.config.getInt( "datalogger.keepDataSeconds", 3600); module.exports = database;
  • 26. // logger.js var sensors = require('sensors.js'); var db = require('database.js'); db.session.execute('PRAGMA journal_mode=WAL'); db.session.execute('CREATE TABLE IF NOT EXISTS datalog ( timestamp INTEGER, illuminance FLOAT, temperature FLOAT, humidity FLOAT )'); setInterval( function() { db.session.execute('INSERT INTO datalog VALUES (?, ?, ?, ?)', DateTime().epoch, sensors.illuminance.value(), sensors.temperature.value(), sensors.humidity.value()); }, db.logIntervalSeconds*1000);
  • 27. // logger.js (continued) setInterval( function() { var cutoffTime = DateTime().epoch - db.keepDataSeconds; db.session.execute('DELETE FROM datalog WHERE timestamp < ?', cutoffTime); }, db.keepDataSeconds*1000);
  • 28. // history.jss var db = require(‘../database.js'); var validItems = ['temperature', 'humidity', 'illuminance']; var data = []; db.session.pageSize = form.maxItems ? parseInt(form.maxItems) : 20; var item = form.item; if (validItems.indexOf(item) > -1) { var recordSet = db.session.execute( 'SELECT timestamp, ' + item + ' FROM datalog ORDER BY timestamp DESC');
  • 29. // history.jss (continued) for (var row = 0; row < recordSet.rowCount; row++) { var time = recordSet.getValue('timestamp'); var value = recordSet.getValue(item); var date = LocalDateTime('1970-01-01'); date.addSeconds(time); data[recordSet.rowCount - row - 1] = { timestamp: date.format('%H:%M:%S'), value: value }; recordSet.moveNext(); } recordSet.close(); } response.contentType = 'application/json'; response.write(JSON.stringify(data)); response.send();
  • 30. // MQTT to AirVantage var sensors = require('sensors.js'); var mqttClientRefs = serviceRegistry.find( 'io.macchina.mqtt.serverURI == "tcp://na.airvantage.net:1883"'); if (mqttClientRefs.length > 0) { logger.information("MQTT Client found!"); var mqttClient = mqttClientRefs[0].instance(); setInterval(function() { var epoch = "" + 1000*DateTime().epoch; // seconds to milliseconds var payload = {}; payload[epoch] = { "sensors.temperature": sensors.temperature.value(), "sensors.humidity": sensors.humidity.value() "sensors.illuminance": sensors.illuminance.value() }; mqttClient.publish('JA347400060803/messages/json', 
 JSON.stringify(payload), 0); }, 10000); }
  • 31. // Send SMS via Twilio function sendSMS(to, message) { var accountSID = application.config.getString("twilio.accountSID"); var authToken = application.config.getString("twilio.authToken"); var from = application.config.getString(“twilio.from"); var twilioHttpRequest = new HTTPRequest( "POST", "https://api.twilio.com/2010-04-01/Accounts/" + accountSID + "/SMS/Messages" ); twilioHttpRequest.authenticate(accountSID, authToken); twilioHttpRequest.contentType = "application/x-www-form-urlencoded"; twilioHttpRequest.content = "From=" + encodeURIComponent(from) + "&To=" + encodeURIComponent(to) + "&Body=" + encodeURIComponent(message); twilioHttpRequest.send(function(result) { logger.information("Twilio SMS Response: ", result.response.status, result.response.content); }); }
  • 32. var sensors = require('sensors.js'); var enableSMS = true; sensors.illuminance.on('valueChanged', function(ev) { logger.notice("valueChanged: " + ev.data); if (ev.data < 10) { logger.warning("Lights out!"); if (enableSMS) { sendSMS("+436765166737", "Lights out!"); enableSMS = false; } } else if (ev.data > 50) { enableSMS = true; } });
  • 33. Q&A
  • 34. [email protected] | @obiltschnig | obiltschnig.com macchina.io | my-devices.net | pocoproject.org | www.appinf.com