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 alotted 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.
These docs are open source. If you find an issue, please file a bug, or send us a pull request. And if you want to contribute, we'd love that too!