Skip to main content

Web Request

This sample makes a web request to http://google.com. It illustrates how to:

  • Enumerate attached network interfaces
  • Enumerate NetworkInterface information
  • Request an IP from a DHCP server and wait until one is obtained
  • Make an HttpWebRequest

Code

using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
using System;
using System.Threading;
using System.Net;
using System.IO;
using Microsoft.SPOT;
using Microsoft.SPOT.Net.NetworkInformation;

namespace Blinky
{
public class Program
{
public static void Main()
{

App app = new App ();
app.Run ();

OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);
while (app.IsRunning)
{
led.Write(true); // turn on the LED
Thread.Sleep(250); // sleep for 250ms
led.Write(false); // turn off the LED
Thread.Sleep(250); // sleep for 250ms
}

Debug.Print ("App finished.");
Debug.Print ("I've seen things you people wouldn't believe. Attack ships on fire off the shoulder of Orion. I watched C-beams glitter in the dark near the Tannhäuser Gate. All those moments will be lost in time, like tears in rain.");
Debug.Print ("Time to die.");
}
}

public class App
{
NetworkInterface[] _interfaces;


public bool IsRunning { get; set; }

public void Run()
{
this.IsRunning = true;
bool goodToGo = InitializeNetwork ();

if (goodToGo)
{
MakeWebRequest ("http://google.com");
}

this.IsRunning = false;
}


protected bool InitializeNetwork()
{
if (Microsoft.SPOT.Hardware.SystemInfo.SystemID.SKU == 3)
{
Debug.Print("Wireless tests run only on Device");
return false;
}

Debug.Print("Getting all the network interfaces.");
_interfaces = NetworkInterface.GetAllNetworkInterfaces();

// debug output
ListNetworkInterfaces ();

// loop through each network interface
foreach (var net in _interfaces)
{
// debug out
ListNetworkInfo (net);

switch (net.NetworkInterfaceType)
{
case (NetworkInterfaceType.Ethernet):
Debug.Print ("Found Ethernet Interface");
break;
case (NetworkInterfaceType.Wireless80211):
Debug.Print ("Found 802.11 WiFi Interface");
break;
case (NetworkInterfaceType.Unknown):
Debug.Print ("Found Unknown Interface");
break;
}

// check for an IP address, try to get one if it's empty
return CheckIPAddress (net);
}

// if we got here, should be false.
return false;
}

protected void MakeWebRequest(string url)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "GET";

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
Debug.Print("this is what we got from " + url + ": " + result);
}
}


protected bool CheckIPAddress (NetworkInterface net)
{
int timeout = 10000; // timeout, in milliseconds to wait for an IP. 10,000 = 10 seconds

// check to see if the IP address is empty (0.0.0.0). IPAddress.Any is 0.0.0.0.
if (net.IPAddress == IPAddress.Any.ToString())
{
Debug.Print ("No IP Address");

if (net.IsDhcpEnabled)
{
Debug.Print ("DHCP is enabled, attempting to get an IP Address");

// ask for an IP address from DHCP [note this is a static, not sure which network interface it would act on]
int sleepInterval = 10;
int maxIntervalCount = timeout / sleepInterval;
int count = 0;
while (IPAddress.GetDefaultLocalAddress () == IPAddress.Any && count < maxIntervalCount)
{
Debug.Print ("Sleep while obtaining an IP");
Thread.Sleep (10);
count++;
};

// if we got here, we either timed out or got an address, so let's find out.
if (net.IPAddress == IPAddress.Any.ToString())
{
Debug.Print ("Failed to get an IP Address in the allotted time.");
return false;
}

Debug.Print ("Got IP Address: " + net.IPAddress.ToString ());
return true;

//NOTE: this does not work, even though it's on the actual network device. [shrug]
// try to renew the DHCP lease and get a new IP Address
//net.RenewDhcpLease ();
//while (net.IPAddress == "0.0.0.0") {
// Thread.Sleep (10);
//}

}
else
{
Debug.Print ("DHCP is not enabled, and no IP address is configured, bailing out.");
return false;
}
}
else
{
Debug.Print ("Already had IP Address: " + net.IPAddress.ToString ());
return true;
}

}

protected void ListNetworkInterfaces()
{
foreach (var net in _interfaces)
{
switch (net.NetworkInterfaceType)
{
case (NetworkInterfaceType.Ethernet):
Debug.Print ("Found Ethernet Interface");
break;
case (NetworkInterfaceType.Wireless80211):
Debug.Print ("Found 802.11 WiFi Interface");
break;
case (NetworkInterfaceType.Unknown):
Debug.Print ("Found Unknown Interface");
break;
}
}
}

protected void ListNetworkInfo(NetworkInterface net)
{
Debug.Print("MAC Address: " + BytesToHexString(net.PhysicalAddress));
Debug.Print("DHCP enabled: " + net.IsDhcpEnabled.ToString());
Debug.Print("Dynamic DNS enabled: " + net.IsDynamicDnsEnabled.ToString());
Debug.Print("IP Address: " + net.IPAddress.ToString());
Debug.Print("Subnet Mask: " + net.SubnetMask.ToString());
Debug.Print("Gateway: " + net.GatewayAddress.ToString());

if (net is Wireless80211)
{
var wifi = net as Wireless80211;
Debug.Print ("SSID:" + wifi.Ssid.ToString ());
}

}

private static string BytesToHexString(byte[] bytes)
{
string hexString = string.Empty;

// Create a character array for hexadecimal conversion.
const string hexChars = "0123456789ABCDEF";

// Loop through the bytes.
for (byte b = 0; b < bytes.Length; b++)
{
if (b > 0)
hexString += "-";

// Grab the top 4 bits and append the hex equivalent to the return string.
hexString += hexChars[bytes[b] >> 4];

// Mask off the upper 4 bits to get the rest of it.
hexString += hexChars[bytes[b] & 0x0F];
}

return hexString;
}
}
}

Netduino Samples Github Repository

Full source code for all of the samples can be found in the Netduino Samples repository on Github.