import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Main
{
private static InetAddress gatewayAddress;
private static int gatewayPort;
public static void main(String[] args) throws Exception
{
Thread datagramReceiverThread = new Thread(new ListenerThread());
datagramReceiverThread.start();
InetAddress multicastGroup = InetAddress.getByName("224.0.23.12");
MulticastSocket mcastSocket = new MulticastSocket(3671);
mcastSocket.joinGroup(multicastGroup);
int hibyte1 = 0xC0;
int hibyte2 = 0xA8;
byte[] clientDiscoveryPayload = new byte[]
{
0x06, 0x10, 0x02, 0x01, 0x00, 0x0E, 0x08, 0x01, (byte)hibyte1, (byte)hibyte2, 0x01, 0x34, 0x09, 0x29
};
DatagramPacket clientDiscovery = new DatagramPacket(
clientDiscoveryPayload,
clientDiscoveryPayload.length,
multicastGroup,
3671
);
mcastSocket.send(clientDiscovery);
}
private static void createConnection()
{
try
{
DatagramSocket socket = new DatagramSocket(18001);
socket.connect(gatewayAddress, gatewayPort);
int clientIPClassA = 192; int clientIPClassB = 168;
int clientIPClassC = 1;
int clientIPClassD = 53;
int clientUDPPortHiByte = 0x46; int clientUDPPortLoByte = 0x51;
byte[] serverIPAddress = gatewayAddress.getAddress();
byte serverPortHiByte = (byte)((gatewayPort & 0x0000FF00) >> 8);
byte serverPortLoByte = (byte)(gatewayPort & 0xFF);
byte[] buffer = new byte[26];
buffer[0] = 0x06; buffer[1] = 0x10; buffer[2] = 0x02; buffer[3] = 0x05; buffer[4] = 0x00; buffer[5] = 0x1A;
buffer[6] = 0x08; buffer[7] = 0x01; buffer[8] = (byte)clientIPClassA; buffer[9] = (byte)clientIPClassB; buffer[10] = (byte)clientIPClassC; buffer[11] = (byte)clientIPClassD; buffer[12] = (byte)clientUDPPortHiByte; buffer[13] = (byte)clientUDPPortLoByte;
buffer[14] = 0x08; buffer[15] = 0x01; buffer[16] = serverIPAddress[0]; buffer[17] = serverIPAddress[1]; buffer[18] = serverIPAddress[2]; buffer[19] = serverIPAddress[3]; buffer[20] = serverPortHiByte; buffer[21] = serverPortLoByte;
buffer[22] = 0x04; buffer[23] = 0x04; buffer[24] = 0x02; buffer[25] = 0x00;
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.send(packet);
byte[] receivebuffer = new byte[8192];
DatagramPacket receivePacket = new DatagramPacket(receivebuffer, receivebuffer.length);
socket.receive(receivePacket);
System.out.println("Channel ID : " + receivebuffer[6]);
System.out.println("Status : " + receivebuffer[7]);
final byte channelID = receivebuffer[6];
int serverIPClassA = receivebuffer[10] & 0xFF;
int serverIPClassB = receivebuffer[11] & 0xFF;
int serverIPClassC = receivebuffer[12] & 0xFF;
int serverIPClassD = receivebuffer[13] & 0xFF;
int _serverPortHiByte = (receivebuffer[14] & 0xFF) << 8;
int _serverPortLoByte = receivebuffer[15] & 0xFF;
int port = _serverPortHiByte + _serverPortLoByte;
System.out.println(
"Gateway IP & Port: " +
serverIPClassA + "." + serverIPClassB + "." + serverIPClassC + "." + serverIPClassD +
":" + port
);
System.out.println("");
byte[] writebuffer = new byte[21];
writebuffer[0] = 0x06; writebuffer[1] = 0x10; writebuffer[2] = 0x04; writebuffer[3] = 0x20; writebuffer[4] = 0x00; writebuffer[5] = 0x15;
writebuffer[6] = 0x04; writebuffer[7] = channelID;
writebuffer[8] = 0x00; writebuffer[9] = 0x00;
int controlField1 = 0x8C;
int controlField2 = 0xE0;
int switchON = 0x81;
writebuffer[10] = 0x11; writebuffer[11] = 0x00; writebuffer[12] = (byte)controlField1;
writebuffer[13] = (byte)controlField2;
writebuffer[14] = 0x00; writebuffer[15] = 0x00; writebuffer[16] = 0x00; writebuffer[17] = 0x04; writebuffer[18] = 0x01; writebuffer[19] = 0x00; writebuffer[20] = (byte)switchON;
DatagramPacket writepacket = new DatagramPacket(writebuffer, writebuffer.length);
socket.send(writepacket);
byte[] tunnelingACK = new byte[8192];
DatagramPacket tunnelAckPacket = new DatagramPacket(tunnelingACK, tunnelingACK.length);
socket.receive(tunnelAckPacket);
byte[] data = tunnelAckPacket.getData();
}
catch (Throwable t)
{
....
}
}
static class ListenerThread implements Runnable
{
public void run()
{
try
{
final DatagramSocket responseListener = new DatagramSocket(2345);
byte[] buffer = new byte[8092];
DatagramPacket responsePacket = new DatagramPacket(buffer, buffer.length);
responseListener.receive(responsePacket);
gatewayAddress = responsePacket.getAddress();
gatewayPort = responsePacket.getPort();
byte[] responseData = responsePacket.getData();
int searchResponse = responseData[2] << 8;
searchResponse += responseData[3];
int size1 = responseData[4];
int size2 = responseData[5];
int bodySize = size1+size2;
System.out.println("EIBnet/IP bodysize: " + bodySize);
System.out.println("Description size: " + (bodySize - 0x06 - 0x08));
System.out.println("HPAI len: " + responseData[6] + "(0x08)");
System.out.println("protocol type: " + responseData[7] + "(0x01 == IPv4 UDP)");
int ipClassA = (int) responseData[8] & 0xFF;
int ipClassB = (int) responseData[9] & 0xFF;
int ipClassC = (int) responseData[10] & 0xFF;
int ipClassD = (int) responseData[11] & 0xFF;
int HPAIport = responseData[12] << 8;
HPAIport += responseData[13];
System.out.println("IP Address: " + ipClassA + "." +
ipClassB + "." +
ipClassC + "." +
ipClassD + ":" + HPAIport);
System.out.println("");
System.out.println("DIB: Device Hardware");
System.out.println("====================");
System.out.println("Structure length: " + responseData[14]);
System.out.println("Description Type Code: " + responseData[15]);
System.out.println("KNX Medium: " + responseData[16]);
System.out.println("Device Status: " + responseData[17]);
int physicalAddress = (int) responseData[18] & 0xFF << 8;
physicalAddress += (int) responseData[19] & 0xFF;
System.out.println("Physical Address: " + physicalAddress);
int projectInstallationID = (int) responseData[20] & 0xFF << 8;
projectInstallationID += (int) responseData[21] & 0xFF;
System.out.println("Project Installation ID: " + projectInstallationID);
int serialPart1 = ((int) responseData[22] & 0xFF) << 16;
serialPart1 += ((int) responseData[23] & 0xFF) << 8;
serialPart1 += (int) responseData[24] & 0xFF;
int serialPart2 = ((int) responseData[25] & 0xFF) << 16;
serialPart1 += ((int) responseData[26] & 0xFF) << 8;
serialPart1 += (int) responseData[27] & 0xFF;
System.out.println("Device Serial Number: " + serialPart1 + "" + serialPart2);
int routingMulticastAddressClassA = (int) responseData[28];
int routingMulticastAddressClassB = (int) responseData[29];
int routingMulticastAddressClassC = (int) responseData[30];
int routingMulticastAddressClassD = (int) responseData[31];
System.out.println("Routing Multicast Address: " +
routingMulticastAddressClassA + "." +
routingMulticastAddressClassB + "." +
routingMulticastAddressClassC + "." +
routingMulticastAddressClassD
);
int macPart1 = ((int) responseData[32] & 0xFF) << 16;
macPart1 += ((int) responseData[33] & 0xFF) << 8;
macPart1 += (int) responseData[34] & 0xFF;
int macPart2 = ((int) responseData[35] & 0xFF) << 16;
macPart2 += ((int) responseData[36] & 0xFF) << 8;
macPart2 += (int) responseData[37] & 0xFF;
System.out.println("MAC: " + Integer.toHexString(macPart1) + "" + Integer.toHexString(macPart2));
byte name[] = new byte[30];
for (int i = 38; i < 68; ++i)
{
name[i - 38] = responseData[i];
}
System.out.println("DEVICE NAME: " + new String(name).trim());
System.out.println("");
System.out.println("DIB: Supported Service Families");
System.out.println("===============================");
System.out.println("Structure length: " + responseData[68]);
System.out.println("Description Type Code: " + responseData[69]);
System.out.println("Service Family ID: " + responseData[70]);
System.out.println("Service Family Version: " + responseData[71]);
System.out.println("Service Family ID: " + responseData[72]);
System.out.println("Service Family Version: " + responseData[73]);
System.out.println("Service Family ID: " + responseData[74]);
System.out.println("Service Family Version: " + responseData[75]);
}
catch (Throwable t)
{
throw new Error(t);
}
}
}
}