Skip to content

Instantly share code, notes, and snippets.

@marcgeld
Last active August 4, 2017 11:21
Show Gist options
  • Save marcgeld/2f082584a311a87928cf37b7c21baad1 to your computer and use it in GitHub Desktop.
Save marcgeld/2f082584a311a87928cf37b7c21baad1 to your computer and use it in GitHub Desktop.
Connect to IKEA Trådfri Gateway Device via CoAP and DTLS
#!/usr/bin/env groovy
// Keywords are:
// CoAP - Constrained Application Protocol (Internet Application Protocol for constrained devices.)
// DTLS - Datagram Transport Layer Security (Encryption for Datagram (UDP))
// IKEA Trådfri - (http://www.ikea.com/us/en/catalog/products/90353361/)
@Grapes([
@GrabConfig(systemClassLoader = true),
@Grab(group='net.straylightlabs', module='hola', version='0.2.2'),
@Grab(group='org.slf4j', module='slf4j-api', version='1.7.25'),
@Grab(group='org.eclipse.californium', module='californium-core', version='1.0.4'),
@Grab(group='org.eclipse.californium', module='scandium', version='1.0.5'),
])
import org.slf4j.LoggerFactory
import ch.qos.logback.classic.Logger;
import net.straylightlabs.hola.sd.Service
import net.straylightlabs.hola.sd.Query
import net.straylightlabs.hola.sd.Instance
import net.straylightlabs.hola.dns.Domain
import org.eclipse.californium.core.CoapClient
import org.eclipse.californium.core.CoapResponse
import org.eclipse.californium.core.CaliforniumLogger
import org.eclipse.californium.core.coap.CoAP
import org.eclipse.californium.core.coap.MediaTypeRegistry
import org.eclipse.californium.core.coap.Request
import org.eclipse.californium.core.coap.Response
import org.eclipse.californium.core.network.CoapEndpoint
import org.eclipse.californium.core.network.Endpoint
import org.eclipse.californium.core.network.EndpointManager
import org.eclipse.californium.core.network.config.NetworkConfig
import org.eclipse.californium.scandium.ScandiumLogger
import org.eclipse.californium.scandium.DTLSConnector
import org.eclipse.californium.scandium.config.DtlsConnectorConfig
import org.eclipse.californium.scandium.dtls.cipher.CipherSuite
import org.eclipse.californium.scandium.dtls.pskstore.InMemoryPskStore
import org.eclipse.californium.scandium.dtls.cipher.CipherSuite
import org.eclipse.californium.scandium.dtls.pskstore.PskStore
import org.eclipse.californium.scandium.dtls.pskstore.StaticPskStore
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
logger.setLevel(ch.qos.logback.classic.Level.INFO)
// Change PreSharedKey to that on IKEA Trådfri device
StaticPskStore pskStore = new StaticPskStore("Client_identity", "<change_to_PSK_printed_on_device>".getBytes() )
// Find IKEA Trådfri on the local network.
Service service = Service.fromName("_coap._udp")
Query query = Query.createFor(service, Domain.LOCAL)
Set<Instance> instances = query.runOnce()
if ( instances != null && instances.size() ){
InetSocketAddress serverAddress = null
DtlsConnectorConfig config = null
Instance firstInstance = instances.first()
println "Found IKEA trådfri gateway: ${firstInstance.getName()}"
Set<InetAddress> addresses = firstInstance.getAddresses()
addresses.each{
println "Address: ${it.getHostAddress()}"
// Use ipv4 addr.
if (it.getHostAddress().contains(".")){
serverAddress = new InetSocketAddress( it.getHostAddress(), firstInstance.getPort() );
ipaddr = it.getHostAddress()
}
}
println "Port: ${firstInstance.getPort()}"
String version = firstInstance.lookupAttribute("version")
if ( version != null && !version.equals("") ){
println "FW version: ${version}"
}
// Connect to IKEA Trådfri
CaliforniumLogger.initialize();
CaliforniumLogger.setLevel(java.util.logging.Level.INFO)
ScandiumLogger.initialize()
ScandiumLogger.setLevel(java.util.logging.Level.FINE)
config = new DtlsConnectorConfig.Builder( new InetSocketAddress(0) )
.setPskStore( pskStore )
.build()
DTLSConnector clientConnector = new DTLSConnector( config )
CoapClient client = new CoapClient.Builder( serverAddress.getHostName(), serverAddress.getPort() )
.path( "" )
.query( "" )
.create()
client.setEndpoint( new CoapEndpoint( clientConnector, NetworkConfig.getStandard() ) )
// request to "/.well-known/core"
def discovery = client.discover( null )
println "Discovery: ${ discovery }"
clientConnector.destroy()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment