Class NetAdapter

  • All Implemented Interfaces:
    NetAdapterConstants

    public class NetAdapter
    extends DSPortAdapter
    implements NetAdapterConstants

    NetAdapter is a network-based DSPortAdapter. It allows for the use of an actual DSPortAdapter which isn't on the local machine, but rather is connected to another device which is reachable via a TCP/IP network connection.

    The syntax for the selectPort(String) command is the hostname of the computer which hosts the actual DSPortAdapter and the TCP/IP port that the host is listening on. If the port number is not specified, a default value of 6161 is used. Here are a few examples to illustrate the syntax:

    • my.host.com:6060
    • 180.0.2.46:6262
    • my.host.com
    • 180.0.2.46

    In the onewire.properties file, you can add a host to your list of valid hosts by making a NetAdapter.host with an integer to distinguish the hosts. There is no limit on the number of hosts which can appear in this list, but the first one must be numbered '0'. These hosts will then be returned in the list of valid 'ports' from the selectPortNames() method. Note that there do not have to be any servers returned from selectPortNames() for the NetAdapter to be able to connect to them (so it isn't necessary to add these entries for it to function), but applications which allow a user to automatically select an appropriate adapter and a port from a given list will not function properly without it. For example:

    • NetAdapter.host0=my.host.com:6060
    • NetAdapter.host1=180.0.2.46:6262
    • NetAdapter.host2=my.host.com
    • NetAdapter.host3=180.0.2.46

    The multicast socket technique allows you to automatically discover hosts on your subnet which are listening for multicast packets. By default, the multicast discovery of NetAdapter hosts is disabled. When enabled, the NetAdapter creates a multicast socket and looks for servers every time you call selectPortNames(). This will add a 1 second delay (due to the socket timeout) on calling the method. If you'd like to enable this feature, add the following line to your onewire.properties file:

    • NetAdapter.MulticastEnabled=true
    The port used and the multicast group used for multicast sockets can also be changed. The group however, must fall within a valid range. For more information about multicast sockets in Java, see the Java tutorial on networking at http://java.sun.com/docs/books/tutorial/. Change the defaults in the onewire.properties file with the following entries:
    • NetAdapter.MulticastGroup=228.5.6.7
    • NetAdapter.MulticastPort=6163

    Once the NetAdapter is connected with a host, a version check is performed followed by a simple authentication step. The authentication is dependent upon a secret shared between the NetAdapter and the host. Both will use a default value, that each will agree with if you don't provide a secret of your own. To set the secret, add the following line to your onewire.properties file:

    • NetAdapter.secret="This is my custom secret"
    Optionally, the secret can be specified on a per-host basis by simply adding the secret after the port number followed by a colon. If no port number is specified, a double-colon is required. Here are examples:
    • my.host.com:6060:my custom secret
    • 180.0.2.46:6262:another custom secret
    • my.host.com::the custom secret without port number
    • 180.0.2.46::another example of a custom secret

    All of the above mentioned properties can be set on the command-line as well as being set in the onewire.properties file. To set the properties on the command-line, use the -D option: java -DNetAdapter.Secret="custom secret" myApplication

    The following is a list of all parameters that can be set for the NetAdapter, followed by default values where applicable.

    • NetAdapter.secret=Adapter Secret Default
    • NetAdapter.secret[0-MaxInt]=[no default]
    • NetAdapter.host[0-MaxInt]=[no default]
    • NetAdapter.MulticastEnabled=false
    • NetAdapter.MulticastGroup=228.5.6.7
    • NetAdapter.MulticastPort=6163

    If you wanted added security on the communication channel, an SSL socket (or similar custom socket implementation) can be used by circumventing the standard DSPortAdapter's selectPort(String) and using the NetAdapter-specific selectPort(Socket). For example:

     NetAdapter na = new NetAdapter();
    
     Socket secureSocket = // insert fancy secure socket implementation here
    
     na.selectPort(secureSocket);
     
     
     

    For information on setting up the host component, see the JavaDocs for the NetAdapterHost

    See Also:
    NetAdapterHost
    • Field Detail

      • UNSPECIFIED_ERROR

        protected static final java.lang.String UNSPECIFIED_ERROR
        Error message when neither RET_SUCCESS or RET_FAILURE are returned
        See Also:
        Constant Field Values
      • COMM_FAILED

        protected static final java.lang.String COMM_FAILED
        Error message when I/O failure occurs
        See Also:
        Constant Field Values
      • NOT_OWNED

        protected static final java.lang.Integer NOT_OWNED
        constant for no exclusive lock
      • currentThreadHash

        protected java.lang.Integer currentThreadHash
        Keeps hash of current thread for exclusive lock
      • portNameForReconnect

        protected java.lang.String portNameForReconnect
        portName For Reconnecting to Host
      • netAdapterSecret

        protected byte[] netAdapterSecret
        secret for authentication with the server
      • useCustomSecret

        protected boolean useCustomSecret
        if true, the user used a custom secret
      • multicastEnabled

        protected java.lang.Boolean multicastEnabled
        indicates whether or not mulicast is enabled
      • multicastGroup

        protected java.lang.String multicastGroup
        The multicast group to use for NetAdapter Datagram packets
      • datagramPort

        protected int datagramPort
        The port to use for NetAdapter Datagram packets
    • Constructor Detail

      • NetAdapter

        public NetAdapter()
        Creates an instance of NetAdapter that isn't connected. Must call selectPort(String); or selectPort(Socket);
    • Method Detail

      • setSecret

        public void setSecret​(java.lang.String secret)
        Sets the shared secret for authenticating this NetAdapter with a NetAdapterHost.
        Parameters:
        secret - the new secret for authenticating this client.
      • resetSecret

        public void resetSecret()
        Resets the secret to be the default stored in the onewire.properties file (if there is one), or the default as defined by NetAdapterConstants.
      • pingHost

        public void pingHost()
                      throws OneWireException,
                             OneWireIOException
        Sends a ping to the host, just to keep the connection alive. Although it currently is not implemented on the standard NetAdapterHost, this command is used as a signal to the NetAdapterSim to simulate some amount of time that has run.
        Throws:
        OneWireException
        OneWireIOException
      • getAdapterName

        public java.lang.String getAdapterName()
        Retrieves the name of the port adapter as a string. The 'Adapter' is a device that connects to a 'port' that allows one to communicate with an iButton or other 1-Wire device. As example of this is 'DS9097U'.
        Specified by:
        getAdapterName in class DSPortAdapter
        Returns:
        String representation of the port adapter.
      • getPortTypeDescription

        public java.lang.String getPortTypeDescription()
        Retrieves a description of the port required by this port adapter. An example of a 'Port' would 'serial communication port'.
        Specified by:
        getPortTypeDescription in class DSPortAdapter
        Returns:
        String description of the port type required.
      • getClassVersion

        public java.lang.String getClassVersion()
        Retrieves a version string for this class.
        Specified by:
        getClassVersion in class DSPortAdapter
        Returns:
        version string
      • getPortNames

        public java.util.Enumeration<java.lang.String> getPortNames()
        Retrieves a list of the platform appropriate port names for this adapter. A port must be selected with the method 'selectPort' before any other communication methods can be used. Using a communication method before 'selectPort' will result in a OneWireException exception.
        Specified by:
        getPortNames in class DSPortAdapter
        Returns:
        Enumeration of type String that contains the port names
      • selectPort

        public boolean selectPort​(java.lang.String portName)
                           throws OneWireIOException,
                                  OneWireException
        Specifies a platform appropriate port name for this adapter. Note that even though the port has been selected, it's ownership may be relinquished if it is not currently held in a 'exclusive' block. This class will then try to re-acquire the port when needed. If the port cannot be re-acquired when the exception PortInUseException will be thrown.
        Specified by:
        selectPort in class DSPortAdapter
        Parameters:
        portName - Address to connect this NetAdapter to, in the form of "hostname:port". For example, "shughes.dalsemi.com:6161", where 6161 is the port number to connect to. The use of NetAdapter.DEFAULT_PORT is recommended.
        Returns:
        true if the port was acquired, false if the port is not available.
        Throws:
        OneWireIOException - If port does not exist, or unable to communicate with port.
        OneWireException - If port does not exist
      • selectPort

        public boolean selectPort​(java.net.Socket sock)
                           throws OneWireIOException,
                                  OneWireException
        New method, unique to NetAdapter. Sets the "port", i.e. the connection to the server via an already established socket connection.
        Parameters:
        sock - Socket connection to NetAdapterHost
        Returns:
        true if connection to host was successful
        Throws:
        OneWireIOException - If port does not exist, or unable to communicate with port.
        OneWireException - If port does not exist
      • freePort

        public void freePort()
                      throws OneWireException
        Frees ownership of the selected port, if it is currently owned, back to the system. This should only be called if the recently selected port does not have an adapter, or at the end of your application's use of the port.
        Specified by:
        freePort in class DSPortAdapter
        Throws:
        OneWireException - If port does not exist
      • canDeliverSmartPower

        public boolean canDeliverSmartPower()
                                     throws OneWireIOException,
                                            OneWireException
        Returns whether the adapter can physically support "smart" strong 5 volt power mode. "smart" power delivery is the ability to deliver power until it is no longer needed. The current drop it detected and power delivery is stopped.
        Overrides:
        canDeliverSmartPower in class DSPortAdapter
        Returns:
        true if this port adapter can do "smart" strong 5 volt mode, false otherwise.
        Throws:
        OneWireIOException - on a 1-Wire communication error with the adapter
        OneWireException - on a setup error with the 1-Wire adapter
      • findNextDevice

        public boolean findNextDevice()
                               throws OneWireIOException,
                                      OneWireException
        Returns true if the next iButton or 1-Wire device is found. The previous 1-Wire device found is used as a starting point in the search. If no more devices are found then false will be returned.
        Specified by:
        findNextDevice in class DSPortAdapter
        Returns:
        true if an iButton or 1-Wire device is found.
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter
      • getAddress

        public void getAddress​(byte[] address)
        Copies the 'current' 1-Wire device address being used by the adapter into the array. This address is the last iButton or 1-Wire device found in a search (findNextDevice()...). This method copies into a user generated array to allow the reuse of the buffer. When searching many iButtons on the one wire network, this will reduce the memory burn rate.
        Specified by:
        getAddress in class DSPortAdapter
        Parameters:
        address - An array to be filled with the current iButton address.
        See Also:
        Address
      • setSearchOnlyAlarmingDevices

        public void setSearchOnlyAlarmingDevices()
        Sets the 1-Wire Network search to find only iButtons and 1-Wire devices that are in an 'Alarm' state that signals a need for attention. Not all iButton types have this feature. Some that do: DS1994, DS1920, DS2407. This selective searching can be canceled with the 'setSearchAllDevices()' method.
        Specified by:
        setSearchOnlyAlarmingDevices in class DSPortAdapter
        See Also:
        setNoResetSearch()
      • setNoResetSearch

        public void setNoResetSearch()
        Sets the 1-Wire Network search to not perform a 1-Wire reset before a search. This feature is chiefly used with the DS2409 1-Wire coupler. The normal reset before each search can be restored with the 'setSearchAllDevices()' method.
        Specified by:
        setNoResetSearch in class DSPortAdapter
      • setSearchAllDevices

        public void setSearchAllDevices()
        Sets the 1-Wire Network search to find all iButtons and 1-Wire devices whether they are in an 'Alarm' state or not and restores the default setting of providing a 1-Wire reset command before each search. (see setNoResetSearch() method).
        Specified by:
        setSearchAllDevices in class DSPortAdapter
        See Also:
        setNoResetSearch()
      • targetFamily

        public void targetFamily​(int family)
        Takes an integer to selectively search for this desired family type. If this method is used, then no devices of other families will be found by any of the search methods.
        Overrides:
        targetFamily in class DSPortAdapter
        Parameters:
        family - the code of the family type to target for searches
        See Also:
        Address, targetAllFamilies()
      • targetFamily

        public void targetFamily​(byte[] family)
        Takes an array of bytes to use for selectively searching for acceptable family codes. If used, only devices with family codes in this array will be found by any of the search methods.
        Overrides:
        targetFamily in class DSPortAdapter
        Parameters:
        family - array of the family types to target for searches
        See Also:
        Address, targetAllFamilies()
      • excludeFamily

        public void excludeFamily​(int family)
        Takes an integer family code to avoid when searching for iButtons. or 1-Wire devices. If this method is used, then no devices of this family will be found by any of the search methods.
        Overrides:
        excludeFamily in class DSPortAdapter
        Parameters:
        family - the code of the family type NOT to target in searches
        See Also:
        Address, targetAllFamilies()
      • excludeFamily

        public void excludeFamily​(byte[] family)
        Takes an array of bytes containing family codes to avoid when finding iButtons or 1-Wire devices. If used, then no devices with family codes in this array will be found by any of the search methods.
        Overrides:
        excludeFamily in class DSPortAdapter
        Parameters:
        family - array of family cods NOT to target for searches
        See Also:
        Address, targetAllFamilies()
      • beginExclusive

        public boolean beginExclusive​(boolean blocking)
                               throws OneWireException
        Gets exclusive use of the 1-Wire to communicate with an iButton or 1-Wire Device. This method should be used for critical sections of code where a sequence of commands must not be interrupted by communication of threads with other iButtons, and it is permissible to sustain a delay in the special case that another thread has already been granted exclusive access and this access has not yet been relinquished.

        It can be called through the OneWireContainer class by the end application if they want to ensure exclusive use. If it is not called around several methods then it will be called inside each method.

        Specified by:
        beginExclusive in class DSPortAdapter
        Parameters:
        blocking - true if want to block waiting for exclusive access to the adapter
        Returns:
        true if blocking was false and a exclusive session with the adapter was acquired
        Throws:
        OneWireException - on a setup error with the 1-Wire adapter
      • endExclusive

        public void endExclusive()
        Relinquishes exclusive control of the 1-Wire Network. This command dynamically marks the end of a critical section and should be used when exclusive control is no longer needed.
        Specified by:
        endExclusive in class DSPortAdapter
      • reset

        public int reset()
                  throws OneWireIOException,
                         OneWireException
        Sends a Reset to the 1-Wire Network.
        Specified by:
        reset in class DSPortAdapter
        Returns:
        the result of the reset. Potential results are:
        • 0 (RESET_NOPRESENCE) no devices present on the 1-Wire Network.
        • 1 (RESET_PRESENCE) normal presence pulse detected on the 1-Wire Network indicating there is a device present.
        • 2 (RESET_ALARM) alarming presence pulse detected on the 1-Wire Network indicating there is a device present and it is in the alarm condition. This is only provided by the DS1994/DS2404 devices.
        • 3 (RESET_SHORT) inticates 1-Wire appears shorted. This can be transient conditions in a 1-Wire Network. Not all adapter types can detect this condition.
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter
      • getBlock

        public void getBlock​(byte[] arr,
                             int len)
                      throws OneWireIOException,
                             OneWireException
        Gets a block of data from the 1-Wire Network and write it into the provided array.
        Specified by:
        getBlock in class DSPortAdapter
        Parameters:
        arr - array in which to write the received bytes
        len - length of data bytes to receive
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter
      • getBlock

        public void getBlock​(byte[] arr,
                             int off,
                             int len)
                      throws OneWireIOException,
                             OneWireException
        Gets a block of data from the 1-Wire Network and write it into the provided array.
        Specified by:
        getBlock in class DSPortAdapter
        Parameters:
        arr - array in which to write the received bytes
        off - offset into the array to start
        len - length of data bytes to receive
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter
      • dataBlock

        public void dataBlock​(byte[] dataBlock,
                              int off,
                              int len)
                       throws OneWireIOException,
                              OneWireException
        Sends a block of data and returns the data received in the same array. This method is used when sending a block that contains reads and writes. The 'read' portions of the data block need to be pre-loaded with 0xFF's. It starts sending data from the index at offset 'off' for length 'len'.
        Specified by:
        dataBlock in class DSPortAdapter
        Parameters:
        dataBlock - array of data to transfer to and from the 1-Wire Network.
        off - offset into the array of data to start
        len - length of data to send / receive starting at 'off'
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter
      • setPowerDuration

        public void setPowerDuration​(int timeFactor)
                              throws OneWireIOException,
                                     OneWireException
        Sets the duration to supply power to the 1-Wire Network. This method takes a time parameter that indicates the program pulse length when the method startPowerDelivery().

        Note: to avoid getting an exception, use the canDeliverPower() and canDeliverSmartPower() method to check it's availability.

        Overrides:
        setPowerDuration in class DSPortAdapter
        Parameters:
        timeFactor -
        • 0 (DELIVERY_HALF_SECOND) provide power for 1/2 second.
        • 1 (DELIVERY_ONE_SECOND) provide power for 1 second.
        • 2 (DELIVERY_TWO_SECONDS) provide power for 2 seconds.
        • 3 (DELIVERY_FOUR_SECONDS) provide power for 4 seconds.
        • 4 (DELIVERY_SMART_DONE) provide power until the the device is no longer drawing significant power.
        • 5 (DELIVERY_INFINITE) provide power until the setPowerNormal() method is called.
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter
      • startPowerDelivery

        public boolean startPowerDelivery​(int changeCondition)
                                   throws OneWireIOException,
                                          OneWireException
        Sets the 1-Wire Network voltage to supply power to a 1-Wire device. This method takes a time parameter that indicates whether the power delivery should be done immediately, or after certain conditions have been met.

        Note: to avoid getting an exception, use the canDeliverPower() and canDeliverSmartPower() method to check it's availability.

        Overrides:
        startPowerDelivery in class DSPortAdapter
        Parameters:
        changeCondition -
        • 0 (CONDITION_NOW) operation should occur immediately.
        • 1 (CONDITION_AFTER_BIT) operation should be pending execution immediately after the next bit is sent.
        • 2 (CONDITION_AFTER_BYTE) operation should be pending execution immediately after next byte is sent.
        Returns:
        true if the voltage change was successful, false otherwise.
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter
      • setProgramPulseDuration

        public void setProgramPulseDuration​(int timeFactor)
                                     throws OneWireIOException,
                                            OneWireException
        Sets the duration for providing a program pulse on the 1-Wire Network. This method takes a time parameter that indicates the program pulse length when the method startProgramPulse().

        Note: to avoid getting an exception, use the canDeliverPower() method to check it's availability.

        Overrides:
        setProgramPulseDuration in class DSPortAdapter
        Parameters:
        timeFactor -
        • 7 (DELIVERY_EPROM) provide program pulse for 480 microseconds
        • 5 (DELIVERY_INFINITE) provide power until the setPowerNormal() method is called.
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter
      • startProgramPulse

        public boolean startProgramPulse​(int changeCondition)
                                  throws OneWireIOException,
                                         OneWireException
        Sets the 1-Wire Network voltage to eprom programming level. This method takes a time parameter that indicates whether the power delivery should be done immediately, or after certain conditions have been met.

        Note: to avoid getting an exception, use the canProgram() method to check it's availability.

        Overrides:
        startProgramPulse in class DSPortAdapter
        Parameters:
        changeCondition -
        • 0 (CONDITION_NOW) operation should occur immediately.
        • 1 (CONDITION_AFTER_BIT) operation should be pending execution immediately after the next bit is sent.
        • 2 (CONDITION_AFTER_BYTE) operation should be pending execution immediately after next byte is sent.
        Returns:
        true if the voltage change was successful, false otherwise.
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter or the adapter does not support this operation
      • setPowerNormal

        public void setPowerNormal()
                            throws OneWireIOException,
                                   OneWireException
        Sets the 1-Wire Network voltage to normal level. This method is used to disable 1-Wire conditions created by startPowerDelivery and startProgramPulse. This method will automatically be called if a communication method is called while an outstanding power command is taking place.
        Overrides:
        setPowerNormal in class DSPortAdapter
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter or the adapter does not support this operation
      • setSpeed

        public void setSpeed​(int speed)
                      throws OneWireIOException,
                             OneWireException
        Sets the new speed of data transfer on the 1-Wire Network.

        Overrides:
        setSpeed in class DSPortAdapter
        Parameters:
        speed -
        • 0 (SPEED_REGULAR) set to normal communication speed
        • 1 (SPEED_FLEX) set to flexible communication speed used for long lines
        • 2 (SPEED_OVERDRIVE) set to normal communication speed to overdrive
        • 3 (SPEED_HYPERDRIVE) set to normal communication speed to hyperdrive
        • >3 future speeds
        Throws:
        OneWireIOException - on a 1-Wire communication error
        OneWireException - on a setup error with the 1-Wire adapter or the adapter does not support this operation
      • getSpeed

        public int getSpeed()
        Returns the current data transfer speed on the 1-Wire Network.

        Overrides:
        getSpeed in class DSPortAdapter
        Returns:
        int representing the current 1-Wire speed
        • 0 (SPEED_REGULAR) set to normal communication speed
        • 1 (SPEED_FLEX) set to flexible communication speed used for long lines
        • 2 (SPEED_OVERDRIVE) set to normal communication speed to overdrive
        • 3 (SPEED_HYPERDRIVE) set to normal communication speed to hyperdrive
        • >3 future speeds