cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

Transferring Axeda Agent Uploaded Files to Thingworx

Level 5

Transferring Axeda Agent Uploaded Files to Thingworx

The following is a set of custom objects that will trigger from an Expression Rule, and cause a file uploaded by a remote agent to be sent on to the Thingworx platform instance of your choice once completed.  The expression rules should be configured as so:

  • ​Type: ​File
  • ​IF: ​1 == 1
  • ​THEN: ​ExecuteCustomObject("SendUploadedFiles")


SendUploadedFiles.groovy:

import com.axeda.drm.sdk.data.UploadedFile

import static com.axeda.sdk.v2.dsl.Bridges.*

logger.info("Executing AsyncExecutor")

//Spawn async thread for each upload

compressedFile.getFiles().each {

  UploadedFile upFile ->

    // last parameter is a timeout for the execution measured in seconds (200 minutes)

    customObjectBridge.initiateAsync("SendToThingWorx",

                                    [

                                      fileID: upFile.id,

                                      hint: parameters.hint,

                                      deviceID: context.device.id

                                    ], 200 * 60)

}

   

SendToThingworx.groovy:

import static com.axeda.sdk.v2.dsl.Bridges.*

import com.axeda.services.v2.*

import com.axeda.sdk.v2.exception.*

import groovyx.net.http.HTTPBuilder

import static groovyx.net.http.ContentType.*

import static groovyx.net.http.Method.*

import com.axeda.drm.sdk.data.*  // UploadedFileFinder stuff.

import com.axeda.drm.sdk.Context

import com.axeda.common.sdk.id.Identifier

import org.apache.commons.codec.binary.Base64

def retStr = "this is a sample groovy script. your username: ${parameters.username}\n"

def context = Context.getAdminContext()


def thingName = 'ExampleThing'

def thingworxHost = 'sample.cloud.thingworx.com'

def twxApplicationKey = '00000000-0000-0000-0000-00000000000'

def fileid = parameters.fileID

def finder = new UploadedFileFinder(context)

finder.setId( new Identifier( fileid.toLong()) )

UploadedFile uf = finder.find()

def is = new FileInputStream( uf.extractFile() )

retStr += "UF: ${uf.name} ${uf.fileSize} ${uf.actualFileName}\n"

logger.info  "UF: ${uf.name} ${uf.fileSize} ${uf.actualFileName}\n"

def bOut = new ByteArrayOutputStream()

int b = 0

int count = 0

while ( (b = is.read()) != -1  ) {

    count ++

    bOut.write(b)

}

is?.close()

byte[] bRes = bOut.toByteArray()

logger.info "Length: ${bRes.length}"

retStr += "Count: ${count}  Length: ${bRes.length}\n"

def b64 = new Base64()

def outputStr = b64.encodeBase64String(bRes)

retStr += "Length of base64 string: ${outputStr.length()}\n"

logger.info "Length of base64 string: ${outputStr.length()}\n"

logger.info "==========================================="

logger.info outputStr

logger.info "==========================================="

def http = new HTTPBuilder("https://${thingworxHost}")

http.request(POST, JSON) {

    uri.path = "/Thingworx/Things/${thingName}/Services/SaveBinary"

    body  = [path: uf.name, content: outputStr ]

    headers = [appKey: twxApplicationKey ,

                      Accept: 'application/json',

                      "content-type": "application/json"

            ]

    response.success = { resp ->

        println "POST response status: ${resp.statusLine}"

        logger.info "POST RESPONSE status: ${resp.statusLine}"

    }

    response.failure = { resp ->

        logger.info "RequestMessage: ${resp.statusLine}"

        logger.info "Request failed: ${resp.status}"

    }

}

return retStr

   
Tags (1)