Tag Archives: Real-time network

How to connect an Arduino to a real-time network in two steps

Arduino is a microcontroller and development environment that can be used, just like Raspberry Pi, to read information from its sensors and control other devices.

Programming on the Arduino is extremely simple, which has led to its widespread use in interactive environments. As with the Raspberry Pi, it’s a great (and low cost) starting point for experimenting with the world of embedded wearables and the Internet of Things.

This blog walks you through the steps to connect an Arduino to the PubNub Data Stream Network. This enables you to connect with a high volume of other devices at a global scale and start sending and receiving data between a wide variety of devices, including other Arduino and Raspberry Pi devices.

PubNub acts as your communication layer for signaling and data transfer between embedded devices. Some of the advantages of using the PubNub Data Stream Network over a custom, open source solution is reliability and speed. PubNub takes care of the backend infrastructure that you’d have to set up otherwise to create a signaling network between Arduino and other connected devices. You can find the Arduino PubNub extensions here. For additional resources, check out the PubNub Arduino documentation page. Arduino

Basics of Connecting the Arduino to The PubNub Data Stream Network

Really, all it takes is two steps to get your Arduino up and running. Follow these steps to get connected:

STEP 1: Connect the Arduino to a monitor, keyboard, mouse and ethernet cable. You’ll also have to sign up for a PubNub account to get your unique keys. PubNub is entirely free in the sandbox tier, which gives you more than enough bandwidth to test and play with your Arduino.

STEP 2: Open a new window and paste the following code.

#include 
#include 
#include "string.h"
#include "iotconnector.h"
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
 
char pubkey[] = "demo";char subkey[] = "demo";char channel[] = "iotchannel";char uuid[] = "Arduino";
 
iotbridge arduino;
 
void initialize(){
    Serial.begin(9600);
    Serial.println("Serial set up");
 
    while (!Ethernet.begin(mac)) {
        Serial.println("Ethernet setup error");
        delay(1000);
    }
    Serial.println("Ethernet set up");
}
 
void do_something(String value){
    Serial.println("in the callback");
    Serial.println(value);
   }
void setup()
{
    initialize();
    arduino.init( pubkey, subkey, uuid);
}
 
void loop()
{
    String returnmessage;
    Ethernet.maintain();

    //Publish
    arduino.send(channel,""Hey There"");
 
    //Subscribe
    returnmessage = arduino.connect(channel);

    //callback function of sorts, to work with the received message
    do_something(returnmessage);
    Serial.println();
}

The above code lets you set the following :

  • publish key using “pubkey”
  • subscribe key using “subkey”
  • UUID using “uuid”
  • channel you wish to subscribe and publish to using “channel”

For all of you who are familiar with Arduino, you will notice that this is in fact only a few additional lines of code in loop(). The remaining code sets up the Ethernet connection to the Arduino. The keys lines of code are just three lines:

  • arduino.init() that lets you initialize variables
  • arduino.send() that lets you send a message over the specified channel
  • arduino.connect() that lets you subscribe to a channel to receive messages

We create an instance of the iotbridge called “arduino” and we can use the SEND and CONNECT methods belonging to that class. SEND: This invokes the publish() API to send any message over a desired channel.

bool iotbridge::send(const char *channel, const char *message){
  EthernetClient *client;
  client = PubNub.publish(channel,message);
  return client;
}

CONNECT: This invokes the subscribe() API to listen for messages from other embedded devices connected to the same channel. NOTE: The call back function receive is invoked when subscribe runs. Connect() will block on subscribe, waiting for a message to be sent to the device. You can write your own simple task scheduler and bounce between tasks according to their timing requirements.

String iotbridge::connect(const char *channel){
  PubSubClient *pclient = PubNub.subscribe(channel);

You can customize the channels you publish/subscribe to, the UUID you assume and also the messages you send by just changing the above fields. And that’s it! You can now talk Arduino to any other device or application subscribing/publishing to the same channel.

5 challenges of IoT connectivity

At last month’s MIT Technology Review Digital Summit, PubNub CEO Todd Greene discussed the importance of connecting Internet of Things embedded devices on a reliable and secure realtime network. CPU, battery, and bandwidth consumption, as well as security are all paramount considerations that need to be taken into account when connecting low-powered embedded devices.

You’ll find that when developing and networking Internet of Things devices in the lab, connectivity is fairly seamless. You may have a few embedded devices connected to a backend server, so latency isn’t an issue.

Internet of Things

However, deploying that IoT app on a global scale, to thousands or even millions of users simultaneously, is a whole other ball game. Unfortunately, the Internet isn’t just one big network, but rather is composed of an infinite amount of heterogeneous networks, including proxy servers, firewalls, cell towers, and WiFi networks, all slower and faster than one another.

As a result, there are 5 major challenges when it comes to Internet of Things connectivity. Keep scrolling down to see them, or watch the video below:

At PubNub, we think a lot about IoT connectivity and how we can make it as reliable, secure, and fast as possible. So to make PubNub the best network for connecting and signaling between Internet of Things devices, we first had to understand the challenges of doing so. Presenting the 5 challenges of IoT connectivity:

1. Signaling

When connecting IoT embedded devices, you need to start with bidirectional signaling to collect and route data between devices. Whether it’s embedded devices talking to a server to collect data, or devices signaling one another, you need to stream IoT signals and data quickly and reliably. You need to be 100% sure that that stream of data or signal is going to arrive at its destination every time.

2. Security

Security is a huge umbrella, but it’s paramount in Internet of Things connectivity and should be forethought, not an afterthought. For example, what good is a smart home if anyone can open your garage door? Here are three considerations for IoT security:

  • Authorization: When publishing or subscribing to stream of data or IoT signal, it’s essential to make sure that the IoT device or server has proper authorization to send or receive that stream of data.
  • Encryption: You need end-to-end encryption between devices and servers.
  • Open ports: An IoT device is dangerously vulnerable when it’s sitting and listening to an open port out to the Internet. You need birectional communication, but you don’t want to have open ports out to the Internet.

3. Presence Detection

Who’s there, (or in terms of IoT, what device is there)? It’s important to immediately know when an IoT device drops off the network and goes offline. And when that device comes back online, you need to know that as well.

Presence detection of IoT devices gives an exact, up to the second state of all devices on a network. This gives you the ability to monitor your IoT devices and fix any problems that may arise with your network.

4. Power consumption

IoT embedded devices are small and expensive, so CPU and power consumption need to be considered. When you have hundreds or even thousands of devices sending data and signaling one another, it takes a toll on power and CPU consumption. You need to maximize efficiency while minimizing power and CPU drain.

5. Bandwidth

In addition to power and CPU, bandwidth consumption is another challenge for IoT connectivity. Bandwidth on a cellular network is expensive, especially with hundreds of thousands of IoT devices on a network sending request/response signals to your server.

That’s a huge server issue and a requires a large scale server farm handling all this data. You need a lightweight network that can seamlessly transfer data between devices and servers.

Connecting IoT Devices with PubNub

Connecting devices in the lab is one thing, but once they’re out in the wild, it’s a whole new ballgame. So where do you start? Having a scalable IoT network to connect embedded devices and servers is especially critical for IoT applications with a large user base.

These are the types of Internet of Things challenges we’ve solved at PubNub. With over two hundred million connected devices connected to our global realtime network in fourteen data centers, we average 50 to 60 thousand transactions per second, peaking at over 3 million. PubNub is used to stream data and signal for hundreds of different IoT uses cases including:

  • Automotive: Connected cars need a realtime communication layer to stream data and signal between their fleet, dispatch, and the consumer on the app. Examples: Sidecar, Lyft, Easy Taxi, Gett, Zoomy
  • Home Automation: A realtime network can be used to signal and trigger actions for smart devices and home automation solutions. Examples: Insteon, Revolv, Vivint
  • Wearables: IoT wearables require a low latent, lightweight network to stream data between the device and a server. Battery, CPU, and bandwidth consumption are all important considerations that must be taken into account. Examples: 3rd Eye

By 2020, it’s estimated that there will be between 20 and 30 billion connected devices on the Earth. As a result, how we connect those devices should take precedence as the IoT field grows exponentially.