Modifications for Android Sense app.

1. Updated agent enrollment process.
2. Fixed ArrayIndexOutOfBound exception when enrolling.
3. Added Network data to the event stream.
merge-requests/1/head
Menaka Jayawardena 8 years ago
parent 9e9a480486
commit 60cc084170

@ -37,6 +37,7 @@ import org.wso2.carbon.iot.android.sense.event.streams.application.ApplicationDa
import org.wso2.carbon.iot.android.sense.event.streams.audio.AudioData;
import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryData;
import org.wso2.carbon.iot.android.sense.event.streams.call.CallData;
import org.wso2.carbon.iot.android.sense.event.streams.data.NetworkData;
import org.wso2.carbon.iot.android.sense.event.streams.screen.ScreenData;
import org.wso2.carbon.iot.android.sense.event.streams.sms.SmsData;
import org.wso2.carbon.iot.android.sense.speech.detector.util.ProcessWords;
@ -277,6 +278,19 @@ public class DataPublisherService extends Service {
}
SenseDataHolder.resetApplicationDataHolder();
//Retrieve network data
List<NetworkData> networkDataList = SenseDataHolder.getNetworkDataHolder();
if (!networkDataList.isEmpty()) {
for (NetworkData networkData : networkDataList) {
Event event = new Event();
event.setTimestamp(networkData.getTimeStamp());
event.setDataType(networkData.getDataType());
event.setDataReceived(networkData.getDataReceived());
event.setDataSent(networkData.getDataSent());
events.add(event);
}
}
SenseDataHolder.resetNetworkDataHolder();
//publish the data
if (events.size() > 0 && LocalRegistry.isEnrolled(context)) {

@ -61,6 +61,17 @@ public class Event {
private String packageName;
private String action;
/**
* Network data
* Time stamp
* Data type
* Data sent
* Data received.
* */
private String dataType;
private long dataSent;
private long dataReceived;
private int getBattery() {
return battery;
}
@ -411,6 +422,36 @@ public class Event {
this.confidence = confidence;
}
public String getDataType() {
this.type = "data";
return dataType;
}
public void setDataType(String dataType) {
this.type = "data";
this.dataType = dataType;
}
public long getDataSent() {
this.type = "data";
return dataSent;
}
public void setDataSent(long dataSent) {
this.type = "data";
this.dataSent = dataSent;
}
public long getDataReceived() {
this.type = "data";
return dataReceived;
}
public void setDataReceived(long dataReceived) {
this.type = "data";
this.dataReceived = dataReceived;
}
public JSONObject getEvent() throws JSONException {
JSONObject jsonEvent = new JSONObject();
JSONObject jsonMetaData = new JSONObject();
@ -502,6 +543,10 @@ public class Event {
jsonPayloadData.put("application_name", getPackageName());
jsonPayloadData.put("action", getAction());
//Network data
jsonPayloadData.put("data_type", getDataType());
jsonPayloadData.put("data_received", getDataReceived());
jsonPayloadData.put("data_sent", getDataSent());
jsonEvent.put("payloadData", jsonPayloadData);

@ -56,6 +56,7 @@ public class SenseService extends Service {
SenseDataReceiverManager.registerActivityDataReceiver(this);
SenseDataReceiverManager.registerSmsDataReceiver(this);
SenseDataReceiverManager.registerAppDataReceiver(this);
SenseDataReceiverManager.registerNetworkDataReceiver(this);
//service will not be stopped until we manually stop the service
return Service.START_NOT_STICKY;
@ -69,6 +70,7 @@ public class SenseService extends Service {
SenseDataReceiverManager.unregisterActivityDataReceiver(this);
SenseDataReceiverManager.unregisterSmsDataReceiver(this);
SenseDataReceiverManager.unregisterAppDataReceiver(this);
SenseDataReceiverManager.unregisterNetworkDataReceiver(this);
SenseWakeLock.releaseCPUWakeLock();
super.onDestroy();

@ -26,6 +26,7 @@ import org.wso2.carbon.iot.android.sense.realtimeviewer.sensorlisting.SupportedS
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -65,7 +66,7 @@ public class SensorDataReader extends DataReader implements SensorEventListener
SensorData sensorInfo = senseDataStruct.get(sensor.getName());
sensorVector.add(sensorInfo);
Log.d(TAG, "Sensor Name " + sensor.getName() + ", Type " + sensor.getType() + " " +
", sensorValue :" + sensorInfo.getSensorValues());
", sensorValue :" + Arrays.toString(sensorInfo.getSensorValues()));
}
} catch (Throwable e) {
Log.d(TAG, "error on sensors");

@ -42,9 +42,9 @@ public class RealTimeSensorReader implements SensorEventListener {
RealTimeSensor realTimeSensor = new RealTimeSensor();
realTimeSensor.setName(supportedSensors.getType(event.sensor.getType()).toUpperCase());
realTimeSensor.setValueX(event.values[0] + "");
realTimeSensor.setValueY(event.values[1] + "");
realTimeSensor.setValueZ(event.values[2] + "");
realTimeSensor.setValueX(event.values == null ? "" : event.values[0] + "");
realTimeSensor.setValueY(event.values == null || event.values.length <= 1 ? "" : event.values[1] + "");
realTimeSensor.setValueZ(event.values == null || event.values.length <= 1 ? "" : event.values[2] + "");
TempStore.sensorDataMap.put(supportedSensors.getType(event.sensor.getType()), realTimeSensor);

@ -23,6 +23,7 @@ import org.wso2.carbon.iot.android.sense.constants.SenseConstants;
import org.wso2.carbon.iot.android.sense.util.dto.AccessTokenInfo;
import org.wso2.carbon.iot.android.sense.util.dto.AndroidConfiguration;
import org.wso2.carbon.iot.android.sense.util.dto.AndroidSenseManagerService;
import org.wso2.carbon.iot.android.sense.util.dto.ApiApplicationKey;
import org.wso2.carbon.iot.android.sense.util.dto.ApiApplicationRegistrationService;
import org.wso2.carbon.iot.android.sense.util.dto.ApiRegistrationProfile;
import org.wso2.carbon.iot.android.sense.util.dto.DynamicClientRegistrationService;
@ -98,41 +99,24 @@ public class SenseClientAsyncExecutor extends AsyncTask<String, Void, Map<String
responseMap.put(STATUS, "200");
AccessTokenInfo accessTokenInfo = null;
try {
//DynamicClientRegistraiton.
DynamicClientRegistrationService dynamicClientRegistrationService = Feign.builder()
.client(disableHostnameVerification).contract(new
JAXRSContract()).encoder(new JacksonEncoder()).decoder(new JacksonDecoder())
.target(DynamicClientRegistrationService.class, endpoint + SenseConstants.DCR_CONTEXT);
RegistrationProfile registrationProfile = new RegistrationProfile();
String applicationName = "android-sense:" + deviceId;
registrationProfile.setOwner(username);
registrationProfile.setClientName(applicationName);
registrationProfile.setCallbackUrl("");
registrationProfile.setGrantType("password refresh_token client_credentials");
registrationProfile.setApplicationType("device");
registrationProfile.setTokenScope("production");
OAuthApplicationInfo oAuthApplicationInfo = dynamicClientRegistrationService.register(registrationProfile);
//PasswordGrantType
TokenIssuerService tokenIssuerService = Feign.builder().client(disableHostnameVerification).requestInterceptor(
new BasicAuthRequestInterceptor(oAuthApplicationInfo.getClient_id(), oAuthApplicationInfo.getClient_secret()))
.contract(new JAXRSContract()).encoder(new JacksonEncoder()).decoder(new JacksonDecoder())
.target(TokenIssuerService.class, endpoint + SenseConstants.TOKEN_ISSUER_CONTEXT);
accessTokenInfo = tokenIssuerService.getToken("password", username, password);
//ApiApplicationRegistration
ApiApplicationRegistrationService apiApplicationRegistrationService = Feign.builder().client(disableHostnameVerification)
.requestInterceptor(new OAuthRequestInterceptor(accessTokenInfo.getAccess_token()))
.requestInterceptor(new BasicAuthRequestInterceptor(username, password))
.contract(new JAXRSContract()).encoder(new JacksonEncoder()).decoder(new JacksonDecoder())
.target(ApiApplicationRegistrationService.class, endpoint + SenseConstants.API_APPLICATION_REGISTRATION_CONTEXT);
ApiRegistrationProfile apiRegistrationProfile = new ApiRegistrationProfile();
apiRegistrationProfile.setApplicationName(applicationName);
apiRegistrationProfile.setConsumerKey(oAuthApplicationInfo.getClient_id());
apiRegistrationProfile.setConsumerSecret(oAuthApplicationInfo.getClient_secret());
apiRegistrationProfile.setApplicationName("android_sense_" + deviceId);
apiRegistrationProfile.setIsAllowedToAllDomains(false);
apiRegistrationProfile.setIsMappingAnExistingOAuthApp(true);
apiRegistrationProfile.setIsMappingAnExistingOAuthApp(false);
apiRegistrationProfile.setTags(new String[]{SenseConstants.DEVICE_TYPE});
String replyMsg = apiApplicationRegistrationService.register(apiRegistrationProfile);
ApiApplicationKey apiApplicationKey = apiApplicationRegistrationService.register(apiRegistrationProfile);
//PasswordGrantType
TokenIssuerService tokenIssuerService = Feign.builder().client(disableHostnameVerification).requestInterceptor(
new BasicAuthRequestInterceptor(apiApplicationKey.getConsumerKey(), apiApplicationKey.getConsumerSecret()))
.contract(new JAXRSContract()).encoder(new JacksonEncoder()).decoder(new JacksonDecoder())
.target(TokenIssuerService.class, endpoint + SenseConstants.TOKEN_ISSUER_CONTEXT);
accessTokenInfo = tokenIssuerService.getToken("password", username, password, "device_" + deviceId);
//DeviceRegister
AndroidSenseManagerService androidSenseManagerService = Feign.builder().client(disableHostnameVerification)

@ -22,6 +22,7 @@ import org.wso2.carbon.iot.android.sense.event.streams.application.ApplicationDa
import org.wso2.carbon.iot.android.sense.event.streams.audio.AudioData;
import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryData;
import org.wso2.carbon.iot.android.sense.event.streams.call.CallData;
import org.wso2.carbon.iot.android.sense.event.streams.data.NetworkData;
import org.wso2.carbon.iot.android.sense.event.streams.screen.ScreenData;
import org.wso2.carbon.iot.android.sense.event.streams.sms.SmsData;
import org.wso2.carbon.iot.android.sense.speech.detector.util.WordData;
@ -47,6 +48,7 @@ public class SenseDataHolder {
private static List<ActivityData> activityDataHolder;
private static List<SmsData> smsDataHolder;
private static List<ApplicationData> applicationDataHolder;
private static List<NetworkData> networkDataHolder;
//LocationData gps;
@ -141,6 +143,13 @@ public class SenseDataHolder {
return applicationDataHolder;
}
public static List<NetworkData> getNetworkDataHolder() {
if (networkDataHolder == null) {
networkDataHolder = new CopyOnWriteArrayList<>();
}
return networkDataHolder;
}
public static void resetSensorDataHolder() {
sensorDataHolder = null;
}
@ -188,4 +197,8 @@ public class SenseDataHolder {
public static void resetApplicationDataHolder() {
applicationDataHolder = null;
}
public static void resetNetworkDataHolder() {
networkDataHolder = null;
}
}

@ -35,6 +35,7 @@ import org.wso2.carbon.iot.android.sense.event.streams.activity.ActivityReceiver
import org.wso2.carbon.iot.android.sense.event.streams.application.ApplicationDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.call.CallDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.data.NetworkDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.screen.ScreenDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.sms.SmsDataReceiver;
@ -51,6 +52,8 @@ public class SenseDataReceiverManager {
private static ApplicationDataReceiver appDataReceiver;
private static NetworkDataReceiver networkDataReceiver;
private SenseDataReceiverManager() {
}
@ -171,5 +174,21 @@ public class SenseDataReceiverManager {
context.unregisterReceiver(appDataReceiver);
appDataReceiver = null;
}
} public static void registerNetworkDataReceiver(Context context) {
if (networkDataReceiver == null) {
networkDataReceiver = new NetworkDataReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_MANAGE_NETWORK_USAGE);
context.registerReceiver(networkDataReceiver, intentFilter);
}
}
public static void unregisterNetworkDataReceiver(Context context) {
if (networkDataReceiver != null) {
context.unregisterReceiver(networkDataReceiver);
}
networkDataReceiver = null;
}
}

@ -0,0 +1,43 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.util.dto;
/**
* This holds api application consumer key and secret.
*/
public class ApiApplicationKey {
private String client_id;
private String client_secret;
public String getConsumerKey() {
return this.client_id;
}
public void setClient_id(String consumerKey) {
this.client_id = consumerKey;
}
public String getConsumerSecret() {
return this.client_secret;
}
public void setClient_secret(String consumerSecret) {
this.client_secret = consumerSecret;
}
}

@ -21,5 +21,5 @@ public interface ApiApplicationRegistrationService {
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
String register(ApiRegistrationProfile registrationProfile);
ApiApplicationKey register(ApiRegistrationProfile registrationProfile);
}

@ -29,5 +29,5 @@ public interface TokenIssuerService {
@POST
@Produces(MediaType.APPLICATION_JSON)
AccessTokenInfo getToken(@QueryParam("grant_type") String grant, @QueryParam("username") String username,
@QueryParam("password") String password);
@QueryParam("password") String password, @QueryParam("deviceId") String deviceId);
}

Loading…
Cancel
Save