Sunday, November 4, 2012

Serving Websites on Local Network with IIS Express

Whenever I look through documentation, a tutorial, or blog post on any subject, I feel like Brigadier General Jack D. Ripper in Dr. Strangelove, except it's "Clarity of Essence" I'm after and not "Purity". I go to great lengths to find resources that speak to me, but sometimes when a problem needs troubleshooting it's impossible to find anything but poorly worded (and typeset) posts. But, rather than complain, I think I can contribute to some documentation on a problem whose tail I was chasing for too long.

The modern goal of embedded electronics is to create a world of "smart" devices that can upload information to and be controlled from the Cloud -- also known as the Internet to the meteorologically disinclined. Such a networked group of devices makes it possible to monitor and control our stuff from mobile devices to the benefit of our convenience and the reduction of our energy consumption. From an extreme perspective, this turns our world into a sort of video game where we can lazily monitor our current states, stats and change things with the press of a button or tilt of a joystick. I don't necessarily advocate achieving that sort of control. Certain applications of this level of control rattle my conscience (drone warfare). However, it goes without saying some applications need to be around for the good of the environment and humanity. 

Because I'm interested in building this type of networked devices, I consequently have been learning to be able to build embedded circuits and create website interfaces. My tools of choice, the two most elegant tools for doing this, are Netduino and ASP MVC. Netduino allows you to program circuits in C# and provides access to the elegant .NET Micro library. The ASP MVC framework is a great tool for quickly building websites that will offer a REST API, be backed by a database, and will benefit from templated webpages. It too relies on C#, so all logic on both sides is written in the same language.

After building a simple website with ASP MVC, I wanted to be able to send requests to it on my local network from Netduino.  To see if this was possible, I needed to first try to connect to the website from my Android phone. When I ran my website from Visual Studio, it only served the website to "localhost" on a particular port (http://localhost:<5 digit port>/). I couldn't type this URL into my phone and access the site.

I found out that Visual Studio runs the project and serves it by using IIS Express, a scaled down version of the commercial IIS server developed by Microsoft. In the project properties, there is a field to specify which URL you want to address the site. By default it is what I already mentioned, localhost. However, there is a way to make IIS Express serve the website when it receives a request for a different URL. Once this is achieved, changing what's called a URL reservation and security settings allow it to serve to computers, or phones, on the local network.

Here are the steps to follow:
  1. Find Documents/IISExpress/config/applicationhost.xml. This has a section <sites> and in it there is a section <bindings>. These list all the URLs that will represent the site. Copy the existing localhost binding and replace localhost with your IP address. Find your IP address with ipconfig in the command line and look at the top of the output for the IPv4 label.
  2. Add a URL reservation. This will grant the right for others on the network to request a URL from IIS Express and is done at the command line by typing:
    • netsh http add urlacl url=http://<your IP>:<5 digit port>/ user=everyone (Italics represents parameters to be passed.)
  3. Add a firewall rule to allow inbound requests on the port. Go to Control Panel > Windows Firewall > Advanced Settings > Inbound Rules > Add Rule. Name the rule after your site (since it will be the only one running on the chosen port). Change the scope Remote IP Address to "Local subnet". Make sure Profiles is limited to Private. Protocols and Ports should be set to TCP and the port you found in Visual Studio. 
I found that I didn't need to change the URL specified in the properties of the project in Visual Studio so long as it was localhost. In fact, it even worked when I changed it to the IP address URL. 

The problem with all other walk through posts is that they recommended the use of machine name. This never worked for me. The way I described does not require the application to be run with administrator privileges or other nonsense. 

In conclusion, I haven't created any applications that connect the Netduino and my ASP MVC project yet, but at the very least, I know I can access my service on my local network since my phone can browse the site. More to come.

Saturday, November 3, 2012

A Micropost on Microcontrollers

Microcontrollers allow you to control circuits by using a programming language. Real, physical circuit components can become variables in your virtual programming world and you can act on them as you would on virtual objects in your program. Since programs can access networks, one can collect data produced by a circuit, process it into information, and send it to a remote database via the internet, in effect automating scientific data recording. The reverse process allows information to be sent to the microcontroller via the internet (from the result of a website interaction) and the behavior of the circuit can be changed based on those remote inputs.

The programs that control your circuit would live on the microcontroller and they are able to read voltages and produce voltages in the circuit. When voltages are read, they represent different states of the circuit e.g. whether a button is on or off or a sensor measurement. When voltage is produced, the program can alter the behavior of the circuit. When reading and writing are combined, one can utilize feedback and alter the behavior of the circuit based on the states it is in. The produced voltages can provide enough power for smaller circuits, but if more power is needed, smaller circuits can be activated with this lower voltage to drive higher power applications.

Microcontrollers are a tool that allow for, oftentimes, a simpler, more efficient, and faster implementation of various circuit behaviors. This is not to say that they are more energy efficient than a well designed, single-purpose circuit. For example, if we need to build a circuit with an LED that blinks every second, this can be implemented without a microcontroller, however by using a microcontroller, we have the ability to easily code this behavior using object-oriented methods. If we want to tailor the light's behavior later to change its blink rate, for example, this can be done with lines of code instead of wires and capacitors. The power and simplicity of a programming language allows us to manipulate the electrical inputs and outputs without knowing about different circuits and circuit components that would create the behavior we want. This allows a single circuit connected to a microcontroller to have an incredible number of behaviors.

The microcontroller is connected to a program virtually, however to be useful it must be physically connected to the world with sensor circuits and actuator circuits. Sensors take the world and convert it to electricity. Actuators take electricity and change the world. The microcontroller is the bridge between ideas and physical form.

Networks

I was able to finally connect my Netduino to the local network at my house. This allowed me to run sample code that makes it possible to turn the on-board LED on and off from my browser anywhere in my house via WiFi.

I want to summarize the most salient things that I needed to know to get this to work. These ideas made the whole project easier to understand.

First off, the idea of networks is simple. Devices need to send data i.e. electric pulses and signals to one another by some medium (e.g. copper wires, fiber optics, etc.). These pulses can represent things from emails to pictures to numbers because of the plasticity of binary. (For a good read on the origins of binary aka digital representation, read Turing's Cathedral.) The vocabulary used to describe networks is not simple, however. The people who created network theory really loved to call things by esoteric names like "protocol" and give everything initialisms.

Networks, by their very nature, require addresses. When we want to send data to another device, it should conjure up the metaphor of sending a letter. We can only do this if we know friend's address and our own. Even the stamp has a role in the metaphor, but I will describe that later. There are two schemes for addressing electronic devices.
  1. Every device that can be networked is uniquely identified by a MAC address. Unique means that out of all electronics made that can be networked, your device is the only device that has that number. This is a way to identify your device on a network e.g. laptop or Netduino. 
  2. The internet has its own address system called IP (Internet Protocol) addressing. This makes it possible to group networks together logically. This means you can look at the digits that form the IP address and deduce that two networks are related if certain digits are the same. This logical structure wouldn't be possible with the MAC address alone. Think of a ZIP code: there is a relationship between location and the numbering. Any ZIP starting with "98" is in a certain region of the USA. You can achieve the same type of awareness by looking at an IP. Anything starting with "192.168" belongs to the local network, for example. Now, if you were given a house number (i.e. a MAC address) you wouldn't be able to tell me much about where it is located in the country.
Both of these addresses give a sense of identity to your device, but the IP address can change according to its relationship to the network. The "arp" command gives you a table of all the devices connected on your network and shows you the MAC and its assigned IP. ARP stands for Address Resolution Protocol.

Your router that connects you to the Internet serves its own control interface that can be accessed at 192.168.1.1. It lets you configure local IP addressing, security, and passwords. The most important configuration that occurs in the router is something called DHCP (Dynamic Host Configuration Protocol). As the name suggests, it configures the hosts on the network dynamically (isn't that so simple to understand?) In easier terms, it assigns IP addresses to all the hosts i.e. devices on the network depending on which IP addresses are not in use or are restricted. This means devices won't necessarily receive static (unchanging) addresses which is good for security reasons. However, DHCP reservations can be made so that certain IP addresses will always associate with a particular device (MAC address).

The final thing that helped me work on this project is demystifying the Internet in my mind by viewing it simply as a network. I feel as though the Internet is referred to as though it were God -- the first letters are even capitalized as such -- and people feel like the answers and resources it can produce are magical. In reality, it is a group of devices that hold a lot of data and information. It is huge and it stores a lot of knowledge, but it's not god. Think of your home network as a small "internet". If the information you share is important, it might be a really important internet. However, the main difference between the Internet and a local network (LAN) is that the Internet fulfills the idea of a "concatenated network" where many separate networks are linked. Your LAN is not concatenated because it represents one network. Connect your LAN with your neighbor's and it becomes closer to becoming a full-fledged Internet.

As for my earlier postage stamp analogy, we all pay a price to connect to the infrastructure that makes wide communication possible. Our electrons become the messengers and they roll down fiber optic roads like mail trucks to do our bidding.

I hope to write another post that will summarize the idea of Network Interfaces and how to make connections in C#.