Sunday, March 17, 2013

Netduino, HTTP, REST Web Services, and Cosm

When I first got my Netduino, I was starting with a good understanding of programming, little experience with electronics, and only a slight grasp of HTTP requests/responses. Over the past months, I've been rabidly studying all the above and I've come to understand that all three areas combine with each other and reinforce one another. They form the pillars of knowledge that one needs to develop great embedded applications for the future.

HTTP Adds a New Dimension

While all three areas are important, one of these pillars is solely responsible for a new dimension in embedded electronics: HTTP. This standard for exchanging information across distances is the backbone of the Internet and its extension to microcontrollers is what defines a movement called "The Internet of Things".  Essentially, this phrase means that devices you build can now speak and hear HTTP and therefore communicate with the Internet at large.

The book I have been reading to get started with the Internet of things is, of course, Getting Started with the Internet of Things. It is a worthy introduction to Server/Client pattern and the implementation details. Yet, I must admit that it jumps into things a little too quickly. I feel like contributing some explanations about concepts that the book doesn't cover. In particular, the book jumps into using Pachube, a web service, without fully shining a light on what it does and what web services do, in general. (Additionally, when I started with this book, Pachube no longer existed under that name. To this day, it exists as Cosm. This change made all code examples out of date, though still applicable.)

Web Services

So first off, a definition is needed.

A web service is a resource on the Internet whose main purpose is to give you data that you ask for and/or record data that you send it. 

Think of it like a function that you can call in your browser. You send it parameters and you are returned a result. The parameters might be ones that determine the data you get or they might be the data you want the web service to save (or might be the data that creates another thing that is ultimately saved). The way the web service (function) works is specific and is explained in a manual or tutorial on its website (more about this in the next section on REST).

The data being transferred in or out is usually structured in an organized way. Some formats for organizing data are commonly used in web services: XML and JSON. These formats are basically very specific ways to label data so that you know what the data means. More importantly, they are formats that a computer programming language can look at and work with for further processing.

Web services give your microcontroller four super-powers.

  1. The power of information storage
  2. The power to process information
  3. The power to publish and share information
  4. The power of memory. 

What I mean to say by this last point is that Netduino has access to the memory of the Internet. Think of this as an analogy to how you use your brain to remember past events to determine your behavior. If one day you walk through an alley lined with rancid, smelly dumpsters, you might find yourself avoiding that alley on another day because your memory of the past event is unpleasant. This is the human scope of memory, but Netduino can use any past information that exists on the internet to determine its behavior. You have this resource at your fingertips even in your smallest project.

With web services, the microcontroller can focus on the following core operations:
  • Handling the event loop of your physical application
  • Changing hardware states
  • Processing local information

RE(presentational)S(tate)T(ransfer)

Though I'm no expert on REST, I understand it enough to be able to use web services that say they are REST-ful. As I understand it, REST is a way to structure URL for the benefit of data transfer with HTTP. In particular, each URL behaves in a particular way depending on the HTTP method that is used on the URL i.e. GET, POST, PUT, DELETE. These methods act on whatever data is specified by the URL and not all of these methods need to be supported by the web service. For example, one might not be able to DELETE all the records on a website.

When it comes to how this applies to microcontrollers, the aforementioned Cosm is a REST web service that one can send measurements to with HTTP. The website offers a nice interface to see the measurements over time on a graph (a time series).  It has an API which in other words is the manual for how to use the service to store and retrieve data.

A side note that is relevant to many web services is that once you create an account on the service, you are given a key which is a very cryptic collection of characters that works just like a key to your door. You send the key to the webservice with the HTTP request and it grants you access to the information/URLs you want.

What it all really means

Despite all the terminology, the main purpose of all these technologies is to take measurements of the physical world and store it on the internet  where you can access it anywhere you have a browser. The other main idea is to be able to react to past information and cause physical reactions in your embedded applications.

I hope this clarifies some basic concepts and that it encourages you to find better writers than me who have written about the subject and prepares you for further study.