Hi,
I’m trying to come up with fairly complete example that allows me to do the
following:
Send a registerJar command to a raspberry pi to register an Edgent application
Send a ‘submit’ command to start the Edgent application
Close/stop the Edgent application
Here is what I have done so far and have not been successful:
1) “manually” start an application on a raspberry pi that creates an
IotProvider, and uses the AppService to creates and register this provider:
public class RunningApp {
public static void main(String[] args) throws Exception {
//DirectProvider provider = new DirectProvider();
File configFile = new File("./device_config.txt");
IotProvider provider = new IotProvider(topology -> new
IotfDevice(topology, configFile));
JsonControlService control = new JsonControlService();
provider.getServices().addService(ControlService.class,
control);
AppService.createAndRegister(provider, provider);
provider.start();
}
}
2) Put a jar file called SensorApp.jar on the pi in the same directory where
the ‘RunningApp’ is running.
3) Send a registerJar command that looks like the following:
command
:
"edgentControl"
date
:
1473800605520
payload
:
{args: ["/home/pi/slcQuarks/edgent/SensorApp.jar", ""], op: "registerJar",
alias: "edgent",…}
alias
:
"edgent"
args
:
["/home/pi/slcQuarks/edgent/SensorApp.jar", ""]
0
:
"/home/pi/slcQuarks/edgent/SensorApp.jar"
1
:
""
op
:
"registerJar"
type
:
“appService"
I get no errors coming from the RunningApp console, and just see this:
pi@raspberrypi:~/slcQuarks/edgent $ java -jar runningApp.jar
Sep 13, 2016 8:43:23 PM com.ibm.iotf.client.AbstractClient createClient
INFO: pool-1-thread-22-edgentIotDevicePubSub: Org ID = ni6dcf
Client ID = d:ni6dcf:raspberryPi3:Pi-SLC-Oakland
Sep 13, 2016 8:43:23 PM com.ibm.iotf.client.AbstractClient connect
INFO: pool-1-thread-22-edgentIotDevicePubSub: Connecting client
d:ni6dcf:raspberryPi3:Pi-SLC-Oakland to
ssl://ni6dcf.messaging.internetofthings.ibmcloud.com:8883 (attempt #1)...
Sep 13, 2016 8:43:25 PM com.ibm.iotf.client.AbstractClient connect
INFO: pool-1-thread-22-edgentIotDevicePubSub: Successfully connected to the IBM
Watson IoT Platform
Does anyone know what I am doing wrong?
I looked at the IotAppServiceTest and it appears to me that my jar file to be
loaded is correct.
Here is the code for the SensorApp:
import java.util.Date;
import java.util.concurrent.TimeUnit;
import com.google.gson.JsonObject;
import com.pi4j.system.SystemInfo;
import org.apache.edgent.connectors.iot.QoS;
import org.apache.edgent.connectors.iot.IotDevice;
import org.apache.edgent.function.BiConsumer;
import org.apache.edgent.topology.TStream;
import org.apache.edgent.topology.Topology;
import org.apache.edgent.topology.services.TopologyBuilder;
public class SensorApplications {
private static abstract class SensorApp implements TopologyBuilder {
@Override
public BiConsumer<Topology, JsonObject> getBuilder() {
return (t,c) -> t.strings(getName()).print();
}
}
public static class CpuSensorApp extends SensorApp {
@Override
public String getName() {
return "CpuSensorApp";
}
public void accept(IotDevice device, JsonObject config) {
TStream<Date> readingTime = device.topology().poll(() -> new
Date(), 1, TimeUnit.SECONDS);
TStream<JsonObject> cpuReading = readingTime.map(rt ->
{
JsonObject cpuInfo = new JsonObject();
cpuInfo.addProperty("ts",
System.currentTimeMillis());
try {
cpuInfo.addProperty("cpuTemperature",
SystemInfo.getCpuTemperature());
cpuInfo.addProperty("cpuVoltage",
SystemInfo.getCpuVoltage());
} catch(Exception e) {
throw new RuntimeException(e);
}
return cpuInfo;
});
cpuReading.print();
device.events(cpuReading, "cpuReading", QoS.FIRE_AND_FORGET);
}
}
public static class MemorySensorApp extends SensorApp {
@Override
public String getName() {
return "MemorySensorApp";
}
}
}
Thanks,
Susan