irdaDotNetCliIrComm.vb raw source file Back to my Homepage A sample (IrDA) IrLPT client using C# .NET with the 32feet.NET library.


'
' Copyright (c) 2005-2006 Alan J. McFarlane
'
' irdaDotNetCliIrComm.vb
'
' A sample (IrDA) IrCOMM client using VB.NET with the 32feet.NET library.
'
' For greatest simplicity this sample is a command-line client designed to run 
' on desktop Windows, however both the 32feet.NET library and the way in which 
' it is used here are supported on both desktop Windows and Windows CE/
' PocketPC (CE/PPC), i.e. on full and Compact Frameworks.
'

' Created: 2006-Jan-01 -- Based on irdaDotNetCliIrLpt.cs
' 

' Example usage.
' 
' C:\>irdaDotNetCliIrComm_onV2.exe
' 1 Devices found
' 0: Nokia 6210, addr: BC300000, type: PnP, Modem, Fax, Extension, 
' Telephony, IrCOMM, Obex
' Selected #0
' Gonna connect to, BC300000 IrDA:IrCOMM
' Connected
' Sleeping for 5 seconds...
' Using encoding: Western European (IA5)
' Sending AT, response:
' AT
' OK
' 
' Sending ATI, response:
' ATI
' Nokia Mobile Phones
' 
' OK
' 
' Sending ATI1, response:
' ATI1
' 350146208454394
' 
' OK
' 
' Sending AT+GCAP, response:
' AT+GCAP
' +GCAP: +CGSM,+FCLASS,+DS
' 
' OK
' 
' Disconnecting...
' 
' C:\>
' 

'======================================================================

Option Strict
Option Explicit

Imports System
Imports System.Text 'e.g. Encoding
Imports Microsoft.VisualBasic   'e.g. ControlChars

Imports System.Net.Sockets  'e.g. SocketOptionLevel, NetworkStream

Imports InTheHand.Net           'e.g. IrDAEndPoint
Imports InTheHand.Net.Sockets   'e.g. IrDAClient
' Available from http://32feet.net/, version 1.5.51015 or later required.


Namespace irdaDotNetCliIrComm

    Class Program

        '======================================================================

        '
        ' User selects the first peer!  Do this in your UI...
        '
        Const SelectPeerNum As Integer = 0

        '
        ' The Service Name to use.  We are using IrCOMM, which has the 
        ' Service Name "IrDA:IrCOMM" and it uses IrCOMM Cooked/9-wire mode 
        ' which we enable with setsockopt ( IRLMP_9WIRE_MODE ).
        '
        Const ServiceName As String = "IrDA:IrCOMM"


        '======================================================================

        Public Shared Sub Main()
            '--------------------------------------------
            ' Create client object
            '--------------------------------------------
            Dim cli As New IrDAClient

            '--------------------------------------------
            ' Set connection/socket options
            '--------------------------------------------
            ' Set IrCOMM Cooked/9-wire mode.
            cli.Client.SetSocketOption( _
                CType(IrDASocketOptionLevel.IrLmp, SocketOptionLevel), _
                CType(IrDASocketOptionName.NineWireMode, SocketOptionName), _
                1)      ' equivalent to 'true'

            '--------------------------------------------
            ' Enumerate peers and select one
            '--------------------------------------------
            '
            ' This should really filter (prefer) those peers with the 
            ' Modem Hint Bit set.
            ' ... = selectIrdaPeer( cli, 
            '         HintsFilter.Prefer | HintsFilter.OneOr, 
            '         IrDAHints.Modem );
            '
            Dim di As IrDADeviceInfo = selectIrdaPeer(cli)
            if ( di Is Nothing )
                Console.Out.Write("No peers discovered" & ControlChars.Lf)
                return
            End If
            Dim ep As IrDAEndPoint = new IrDAEndPoint(di.DeviceAddress, ServiceName)

            '--------------------------------------------
            ' Connect
            '--------------------------------------------
            Console.Write("Gonna connect to, {0} {1}" & ControlChars.Lf, ep.Address, ep.ServiceName)
            cli.Connect(ep)
            Console.Write("Connected" & ControlChars.Lf)

            '--------------------------------------------
            ' Get the maximum send size (limited by an IrLAP PDU).
            '--------------------------------------------
            '(We're not in IrLMP mode, so there's no limit; calling GSO with 
            'SendPduLength would be pointless).

            '--------------------------------------------
            ' Now use the connection...
            '--------------------------------------------
            Dim strm As NetworkStream = cli.GetStream()

            ' Sleep for 5 seconds to give the IrDA "connected" icon lots of 
            ' time to appear.
            Console.Write("Sleeping for 5 seconds..." & ControlChars.Lf)
            System.Threading.Thread.Sleep(5000)

            ' Now send some data to the peer. :-)
            ' Some commands from V.250 (previously V.25ter), see
            ' http://www.itu.int/rec/recommendation.asp?type=folders&lang=e&parent=T-REC-V.250
            v250SendRcv(strm, "AT")
            v250SendRcv(strm, "ATI")
            v250SendRcv(strm, "ATI1")
            v250SendRcv(strm, "AT+GCAP")

            '--------------------------------------------
            ' Close and Shutdown
            '--------------------------------------------
            Console.WriteLine("Disconnecting...")
            strm.Close()
            cli.Close()
        End Sub
        

        '======================================================================
        Shared Dim m_enc As Encoding
        
        Shared Sub v250SendRcv(strm As System.IO.Stream, cmd As String)
            Dim buf As byte()
            Dim response As String
            
            '--------------------------------------------
            ' Get the respective encoding for V.250
            '--------------------------------------------
            ' Not thread safe, but then neither is the rest of the function.
            If ( m_enc Is Nothing )
                ' V.25ter section 5.1 notes that alphabet IA5 is used.  However 
                ' that encoding is present only in Framework Version 2, so 
                ' allow fallback to ASCII, which is only slightly different...
                Try
                    m_enc = Encoding.GetEncoding("x-IA5")
                Catch ex As ArgumentException
                    'expecting "Invalid or unsupported code page type."
                    'Console.WriteLine("[ex=" & ex.ToString())
                    m_enc = Encoding.ASCII
                End Try
                System.Diagnostics.Debug.Assert(Not(m_enc Is Nothing))
                Console.WriteLine("Using encoding: " & m_enc.EncodingName)
            End If
            
            '--------------------------------------------
            ' Send and Receive
            '--------------------------------------------
            Console.WriteLine("Sending " & cmd & ", response:")
            'V.250 DTE uses Carriage return as line terminator
            buf = m_enc.GetBytes(cmd & ControlChars.Cr)
            strm.Write(buf, 0, buf.Length)
            strm.Flush()
            
            ' Receive; making the somewhat dodgy assumption that the response 
            ' will arrive all at once...
            buf = New Byte(256) {}
            Dim numRead As Integer = strm.Read(buf, 0, buf.Length)
            response = m_enc.GetString(buf, 0, numRead)
            Console.WriteLine(response)
        End Sub
        
        
        '======================================================================

        '
        ' As above, we should add filtering/preferring based on Hint Bits to 
        ' this function.  See the C example.
        '
        ' Return: the selected device, or null if no devices were discovered.
        '
        Shared Function selectIrdaPeer(cli As IrDAClient) As IrDADeviceInfo
            '--------------------------------------------
            ' Do the discovery
            '--------------------------------------------
            Dim aDi As IrDADeviceInfo() = cli.DiscoverDevices()
            if (aDi.Length = 0)
                return Nothing    'None found
            End If

            '--------------------------------------------.
            ' Display the discovered devices
            '--------------------------------------------
            Console.Write("{0} Devices found" & ControlChars.Lf, aDi.Length)
            Dim i As Integer = 0
            For Each curDi As IrDADeviceInfo In aDi
                Console.WriteLine("{0}: {1}, addr: {2}, type: {3}", _
                    i, curDi.DeviceName, curDi.DeviceAddress, curDi.Hints)
                i = i + 1
                'Console.WriteLine("  [curDi.CharacterSet: {0}]", curDi.CharacterSet)
            Next

            '--------------------------------------------
            ' Select which device
            '--------------------------------------------
            Dim selectNum As Integer = SelectPeerNum    'Do this in your UI...

            Console.Write("Selected #{0}" & ControlChars.Lf, selectNum)
            return aDi(selectNum)  'The selected device.
        End Function

    End Class
End Namespace

' EOF