EthernetDNS

This sample program uses the DNS module to obtain an IP address from a host name. Here's what you need to do.

  • Plug a network cable into your board and connect to your network. For example, just plug your Ethernet board into your broadband router, which will act as a DHCP server.
  • Compile and then program the code into your device.
  • Start the Swordfish Serial Communicator plugin, and a connect to your MCUs USART at 115200 baud.
  • Reset the MCU.

If all goes well, something like the following should be displayed in the Serial Communicator window

 Waiting for DHCP...
 Host Name     : SWORDFISH      
 MAC Address   : $00 $04 $A3 $00 $00 $00 
 IP address    : 192.123.223.1
 Mask          : 255.255.255.0
 Gateway       : 192.123.223.254
 Primary DNS   : 192.123.223.254
 Secondary DNS : 158.123.223.58

Now enter the host name and press enter. If all goes well, the program should return the correct IP address.

 Resolving : www.microchip.com
 Resolved  : 88.221.127.45

Sample Code

// device and clock - code will work on an 18F452 as well...
Device = 18F4680
Clock = 20

// important configurations...
#option ENC28J60_CS = PORTD.6
#option NET_ICMP = true   // enable ping 
#option NET_DHCP = true   // enable Dynamic Host Configuration Protocol (DHCP)
#option NET_NBNS = true   // enable NETBIOS
#option NET_DNS = true    // enable Domain Name Service (DNS)
Include "NETApp.bas"      // always first!

// TCPIP stack specifics...
Include "NETTypes.bas"
Include "NETUtils.bas"
Include "Tick.bas"
Include "DNS.bas"

// program helpers...
Include "NETAppDisplay.bas"
Include "usart.bas"
Include "convert.bas"
Include "ISRRX.bas"

// state machine constants...
Const
   DNS_HOME = 0,
   DNS_RESOLVING = 1

// state machine variable...
Dim DNSState As Byte
{
****************************************************************************
* Name    : DNSInit                                                        *
* Purpose : Initialise the DNS state machine                               *
****************************************************************************
}
Sub DNSInit()
   DNSState = DNS_HOME
End Sub
{
****************************************************************************
* Name    : DNSResolve                                                     *
* Purpose : Start resolving hostname to IP address                         *
****************************************************************************
}
Sub DNSResolve(ByRef pHostName As String)
   If DNSBeginUsage() Then
      USART.Write("Resolving : ")
      USART.Write(pHostName,13,10)
      DNS.DNSResolve(@pHostName, DNS_TYPE_A)
      DNSState = DNS_RESOLVING
   EndIf   
End Sub
{
****************************************************************************
* Name    : DNSTask                                                        *
* Purpose : Handle DNS processing                                          *
****************************************************************************
}
Sub DNSTask()
   Dim DNSHostIP As IP_ADDR
   If DNSState = DNS_RESOLVING Then
      DNSHostIP.Val = 0
      If DNSIsResolved(DNSHostIP) Then
         DNSEndUsage
         DNSState = DNS_HOME
         If DNSHostIP.Val <> 0 Then
            Write("Resolved  : ")
            DisplayIPAddress(DNSHostIP)
         Else
            Write("Unable to resolve",13,10)
         EndIf
      EndIf
   EndIf 
End Sub   
{
****************************************************************************
* Name    : OnData                                                         *
* Purpose : The TCPIP stack is a co-operative state machine. Therefore, we *
*         : cannot wait around for USART data and use a buffered interrupt *
*         : instead. When a CR is received, set a ReadyToRead flag to true *
****************************************************************************
}
Dim ReadyToRead As Boolean
Event OnData()
   If ISRRX.DataChar = #13 Then
      ReadyToRead = true
   EndIf 
End Event

// program variables...
Dim StrHostname As String(60)

// program start...
SetBaudrate(br115200)
DNSInit()

#if NET_DHCP
Write("Waiting for DHCP...",13,10)
#else
DisplayConfig
#endif

// use interrupt buffered USART...
ReadyToRead = false
USART.ReadTerminator = 13
ISRRX.Initialize(OnData)

// loop forever...
While true

   // This task performs normal stack task including checking for incoming 
   // packet, type of packet and calling appropriate stack entity to process it.
   NETApp.Task

   // If the ready to read flag has been set, read a string from the interrupt
   // buffer and start resolving hostname to IP address...
   If ReadyToRead Then
      ReadyToRead = false
      ISRRX.ReadStr(StrHostname,13)
      DNSResolve(StrHostname)
   EndIf
   DNSTask()

   // If DHCP is enabled, display configuration when a DHCP event
   // has occurred...
   #if NET_DHCP
   If NETApp.DHCPEvent() Then
      DisplayConfig()
   EndIf
   #endif               
Wend