Last active
          August 4, 2017 11:21 
        
      - 
      
 - 
        
Save marcgeld/2f082584a311a87928cf37b7c21baad1 to your computer and use it in GitHub Desktop.  
    Connect to IKEA Trådfri Gateway Device via CoAP and DTLS
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | #!/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