use of com.zsmartsystems.zigbee.dongle.xbee.internal.XBeeFrameHandler in project com.zsmartsystems.zigbee by zsmartsystems.
the class ZigBeeDongleXBeeTest method sendCommand.
@Test
public void sendCommand() {
XBeeFrameHandler frameHandler = Mockito.mock(XBeeFrameHandler.class);
ArgumentCaptor<XBeeCommand> commandCapture = ArgumentCaptor.forClass(XBeeCommand.class);
Mockito.when(frameHandler.sendRequestAsync(commandCapture.capture())).thenReturn(null);
ZigBeeDongleXBee dongle = new ZigBeeDongleXBee(null);
Field field;
try {
field = dongle.getClass().getDeclaredField("frameHandler");
field.setAccessible(true);
field.set(dongle, frameHandler);
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
MatchDescriptorResponse command = new MatchDescriptorResponse();
command.setDestinationAddress(new ZigBeeEndpointAddress(46946));
command.setNwkAddrOfInterest(46946);
command.setStatus(ZdoStatus.SUCCESS);
command.setTransactionId(0x2A);
List<Integer> matchList = new ArrayList<>();
matchList.add(1);
command.setMatchList(matchList);
ZigBeeApsFrame apsFrame = new ZigBeeApsFrame();
apsFrame.setDestinationAddress(46946);
apsFrame.setDestinationEndpoint(0);
apsFrame.setDestinationIeeeAddress(new IeeeAddress("000D6F00057CF7C6"));
apsFrame.setCluster(32774);
apsFrame.setAddressMode(ZigBeeNwkAddressMode.DEVICE);
apsFrame.setRadius(31);
apsFrame.setSequence(42);
apsFrame.setPayload(new int[] { 0x00, 0x00, 0x2E, 0x5B, 0x01, 0x01 });
System.out.println(command);
System.out.println(apsFrame);
dongle.sendCommand(apsFrame);
assertEquals(1, commandCapture.getAllValues().size());
XBeeTransmitRequestExplicitCommand sentCommand = (XBeeTransmitRequestExplicitCommand) commandCapture.getValue();
sentCommand.setFrameId(32);
System.out.println(sentCommand);
int[] payload = new int[] { 0, 26, 17, 32, 0, 13, 111, 0, 5, 124, 247, 198, 183, 98, 0, 0, 128, 6, 0, 0, 0, 32, 0, 0, 46, 91, 1, 1, 202 };
int[] output = sentCommand.serialize();
assertTrue(Arrays.equals(payload, output));
}
use of com.zsmartsystems.zigbee.dongle.xbee.internal.XBeeFrameHandler in project com.zsmartsystems.zigbee by zsmartsystems.
the class ZigBeeDongleXBee method initialize.
@Override
public ZigBeeInitializeResponse initialize() {
logger.debug("XBee dongle initialize.");
zigbeeTransportReceive.setNetworkState(ZigBeeTransportState.UNINITIALISED);
if (!serialPort.open()) {
logger.error("Unable to open XBee serial port");
return ZigBeeInitializeResponse.FAILED;
}
// Create and start the frame handler
frameHandler = new XBeeFrameHandler();
frameHandler.start(serialPort);
frameHandler.addEventListener(this);
// Reset to a known state
// Device sends WATCHDOG_TIMER_RESET event
// A retry mechanism is used as sometimes the reset response is not received.
// This appears to happen if there are other events queued in the stick.
int resetCount = 0;
do {
if (resetCount >= MAX_RESET_RETRIES) {
logger.info("XBee dongle reset failed after {} tries.", ++resetCount);
return ZigBeeInitializeResponse.FAILED;
}
logger.debug("XBee dongle reset {}.", ++resetCount);
XBeeSetSoftwareResetCommand resetCommand = new XBeeSetSoftwareResetCommand();
frameHandler.sendRequest(resetCommand);
} while (frameHandler.eventWait(XBeeModemStatusEvent.class) == null);
// Enable the API with escaping
XBeeSetApiEnableCommand apiEnableCommand = new XBeeSetApiEnableCommand();
apiEnableCommand.setMode(2);
frameHandler.sendRequest(apiEnableCommand);
// Set the API mode so we receive detailed data including ZDO
XBeeSetApiModeCommand apiModeCommand = new XBeeSetApiModeCommand();
apiModeCommand.setMode(3);
frameHandler.sendRequest(apiModeCommand);
// Get the product information
XBeeGetHardwareVersionCommand hwVersionCommand = new XBeeGetHardwareVersionCommand();
frameHandler.sendRequest(hwVersionCommand);
XBeeGetFirmwareVersionCommand fwVersionCommand = new XBeeGetFirmwareVersionCommand();
frameHandler.sendRequest(fwVersionCommand);
XBeeGetDetailedVersionCommand versionCommand = new XBeeGetDetailedVersionCommand();
frameHandler.sendRequest(versionCommand);
// Get Ieee Address
XBeeGetIeeeAddressHighCommand ieeeHighCommand = new XBeeGetIeeeAddressHighCommand();
XBeeIeeeAddressHighResponse ieeeHighResponse = (XBeeIeeeAddressHighResponse) frameHandler.sendRequest(ieeeHighCommand);
XBeeGetIeeeAddressLowCommand ieeeLowCommand = new XBeeGetIeeeAddressLowCommand();
XBeeIeeeAddressLowResponse ieeeLowResponse = (XBeeIeeeAddressLowResponse) frameHandler.sendRequest(ieeeLowCommand);
if (ieeeHighResponse == null || ieeeLowCommand == null) {
logger.error("Unable to get XBee IEEE address");
return ZigBeeInitializeResponse.FAILED;
}
int[] tmpAddress = new int[8];
tmpAddress[0] = ieeeLowResponse.getIeeeAddress()[3];
tmpAddress[1] = ieeeLowResponse.getIeeeAddress()[2];
tmpAddress[2] = ieeeLowResponse.getIeeeAddress()[1];
tmpAddress[3] = ieeeLowResponse.getIeeeAddress()[0];
tmpAddress[4] = ieeeHighResponse.getIeeeAddress()[3];
tmpAddress[5] = ieeeHighResponse.getIeeeAddress()[2];
tmpAddress[6] = ieeeHighResponse.getIeeeAddress()[1];
tmpAddress[7] = ieeeHighResponse.getIeeeAddress()[0];
ieeeAddress = new IeeeAddress(tmpAddress);
logger.debug("XBee IeeeAddress={}", ieeeAddress);
// Set the ZigBee stack profile
XBeeSetZigbeeStackProfileCommand stackProfile = new XBeeSetZigbeeStackProfileCommand();
stackProfile.setStackProfile(2);
frameHandler.sendRequest(stackProfile);
// Enable Security
XBeeSetEncryptionEnableCommand enableEncryption = new XBeeSetEncryptionEnableCommand();
enableEncryption.setEnableEncryption(true);
frameHandler.sendRequest(enableEncryption);
XBeeSetEncryptionOptionsCommand encryptionOptions = new XBeeSetEncryptionOptionsCommand();
encryptionOptions.addEncryptionOptions(EncryptionOptions.ENABLE_TRUST_CENTRE);
frameHandler.sendRequest(encryptionOptions);
// Enable coordinator mode
XBeeSetCoordinatorEnableCommand coordinatorEnable = new XBeeSetCoordinatorEnableCommand();
coordinatorEnable.setEnable(true);
frameHandler.sendRequest(coordinatorEnable);
// Set the network key
XBeeSetNetworkKeyCommand networkKey = new XBeeSetNetworkKeyCommand();
networkKey.setNetworkKey(new ZigBeeKey());
frameHandler.sendRequest(networkKey);
// Set the link key
XBeeSetLinkKeyCommand setLinkKey = new XBeeSetLinkKeyCommand();
setLinkKey.setLinkKey(linkKey);
frameHandler.sendRequest(setLinkKey);
// Save the configuration in the XBee
XBeeSetSaveDataCommand saveData = new XBeeSetSaveDataCommand();
frameHandler.sendRequest(saveData);
// Get network information
XBeeGetPanIdCommand getPanId = new XBeeGetPanIdCommand();
XBeePanIdResponse panIdResponse = (XBeePanIdResponse) frameHandler.sendRequest(getPanId);
panId = panIdResponse.getPanId();
XBeeGetExtendedPanIdCommand getEPanId = new XBeeGetExtendedPanIdCommand();
XBeeExtendedPanIdResponse epanIdResponse = (XBeeExtendedPanIdResponse) frameHandler.sendRequest(getEPanId);
extendedPanId = epanIdResponse.getExtendedPanId();
zigbeeTransportReceive.setNetworkState(ZigBeeTransportState.INITIALISING);
return ZigBeeInitializeResponse.JOINED;
}
Aggregations