001/** 002 * Copyright (c) 2014 Digi International Inc., 003 * All rights not expressly granted are reserved. 004 * 005 * This Source Code Form is subject to the terms of the Mozilla Public 006 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 007 * You can obtain one at http://mozilla.org/MPL/2.0/. 008 * 009 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343 010 * ======================================================================= 011 */ 012package com.digi.xbee.api; 013 014import java.io.IOException; 015 016import com.digi.xbee.api.exceptions.InterfaceNotOpenException; 017import com.digi.xbee.api.exceptions.TimeoutException; 018import com.digi.xbee.api.exceptions.XBeeException; 019import com.digi.xbee.api.models.ATCommand; 020import com.digi.xbee.api.models.ATCommandResponse; 021import com.digi.xbee.api.models.XBee16BitAddress; 022import com.digi.xbee.api.models.XBee64BitAddress; 023import com.digi.xbee.api.models.XBeeProtocol; 024 025/** 026 * This class represents a remote XBee device. 027 * 028 * @see RemoteDigiMeshDevice 029 * @see RemoteDigiPointDevice 030 * @see RemoteRaw802Device 031 * @see RemoteZigBeeDevice 032 */ 033public class RemoteXBeeDevice extends AbstractXBeeDevice { 034 035 /** 036 * Class constructor. Instantiates a new {@code RemoteXBeeDevice} object 037 * with the given local {@code XBeeDevice} which contains the connection 038 * interface to be used. 039 * 040 * @param localXBeeDevice The local XBee device that will behave as 041 * connection interface to communicate with this 042 * remote XBee device. 043 * @param addr64 The 64-bit address to identify this remote XBee device. 044 * 045 * @throws IllegalArgumentException if {@code localXBeeDevice.isRemote() == true}. 046 * @throws NullPointerException if {@code localXBeeDevice == null} or 047 * if {@code addr64 == null}. 048 * 049 * @see com.digi.xbee.api.models.XBee64BitAddress 050 */ 051 public RemoteXBeeDevice(XBeeDevice localXBeeDevice, XBee64BitAddress addr64) { 052 super(localXBeeDevice, addr64); 053 } 054 055 /** 056 * Class constructor. Instantiates a new {@code RemoteXBeeDevice} object 057 * with the given local {@code XBeeDevice} which contains the connection 058 * interface to be used. 059 * 060 * @param localXBeeDevice The local XBee device that will behave as 061 * connection interface to communicate with this 062 * remote XBee device. 063 * @param addr64 The 64-bit address to identify this remote XBee device. 064 * @param addr16 The 16-bit address to identify this remote XBee device. It 065 * might be {@code null}. 066 * @param ni The node identifier of this remote XBee device. It might be 067 * {@code null}. 068 * 069 * @throws IllegalArgumentException if {@code localXBeeDevice.isRemote() == true}. 070 * @throws NullPointerException if {@code localXBeeDevice == null} or 071 * if {@code addr64 == null}. 072 * 073 * @see com.digi.xbee.api.models.XBee16BitAddress 074 * @see com.digi.xbee.api.models.XBee64BitAddress 075 */ 076 public RemoteXBeeDevice(XBeeDevice localXBeeDevice, XBee64BitAddress addr64, 077 XBee16BitAddress addr16, String ni) { 078 super(localXBeeDevice, addr64, addr16, ni); 079 } 080 081 /** 082 * Always returns {@code true}, since it is a remote device. 083 * 084 * @return {@code true} always. 085 */ 086 @Override 087 public boolean isRemote() { 088 return true; 089 } 090 091 /* 092 * (non-Javadoc) 093 * @see com.digi.xbee.api.AbstractXBeeDevice#reset() 094 */ 095 @Override 096 public void reset() throws TimeoutException, XBeeException { 097 // Check connection. 098 if (!connectionInterface.isOpen()) 099 throw new InterfaceNotOpenException(); 100 101 logger.info(toString() + "Resetting the remote module ({})...", get64BitAddress()); 102 103 ATCommandResponse response = null; 104 try { 105 response = sendATCommand(new ATCommand("FR")); 106 } catch (IOException e) { 107 throw new XBeeException("Error writing in the communication interface.", e); 108 } catch (TimeoutException e) { 109 // Remote 802.15.4 devices do not respond to the AT command. 110 if (localXBeeDevice.getXBeeProtocol() == XBeeProtocol.RAW_802_15_4) 111 return; 112 else 113 throw e; 114 } 115 116 // Check if AT Command response is valid. 117 checkATCommandResponseIsValid(response); 118 } 119 120 /* 121 * (non-Javadoc) 122 * @see com.digi.xbee.api.AbstractXBeeDevice#toString() 123 */ 124 @Override 125 public String toString() { 126 String id = getNodeID(); 127 if (id == null) 128 id = ""; 129 return String.format("%s - %s", get64BitAddress(), getNodeID()); 130 } 131}