From 971185decfbc096fa281510617161d6c21ac476e Mon Sep 17 00:00:00 2001 From: Chatura Dilan Date: Thu, 30 Jun 2016 15:59:40 +0530 Subject: [PATCH] fixes for android sense client --- .../app/build.gradle | 8 + .../app/src/main/AndroidManifest.xml | 6 + .../sense/beacon/BeaconDetactorService.java | 13 +- .../bmonitor/BeaconMonitoringActivity.java | 121 +++++++++++ .../bmonitor/BluetoothLeDeviceStore.java | 193 +++++++++++++++++ .../sense/bmonitor/BluetoothLeScanner.java | 65 ++++++ .../sense/bmonitor/BluetoothUtils.java | 60 ++++++ .../sense/bmonitor/CsvWriterHelper.java | 43 ++++ .../sense/bmonitor/LeDeviceListAdapter.java | 154 +++++++++++++ .../android/sense/bmonitor/TimeFormatter.java | 35 +++ .../sense/bmonitor/UtcDateFormatter.java | 74 +++++++ .../realtimeviewer/ActivitySelectSensor.java | 3 +- .../iot/android/sense/siddhi/dto/BLE.java | 55 ----- .../core/SidhdhiQueryExecutor.java | 136 ------------ .../wrapper/SidhdhiWrapper.java | 59 ----- .../sense/siddhi/reader/BLEReader.java | 71 ------ .../app/src/main/res/drawable/beacon_red.png | Bin 0 -> 19250 bytes .../res/layout/activity_beacon_monitoring.xml | 34 +++ .../src/main/res/layout/list_item_device.xml | 203 ++++++++++++++++++ .../app/src/main/res/values/strings.xml | 71 ++++++ 20 files changed, 1080 insertions(+), 324 deletions(-) create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BeaconMonitoringActivity.java create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothLeDeviceStore.java create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothLeScanner.java create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothUtils.java create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/CsvWriterHelper.java create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/LeDeviceListAdapter.java create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/TimeFormatter.java create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/UtcDateFormatter.java delete mode 100755 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/dto/BLE.java delete mode 100755 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/eventprocessor/core/SidhdhiQueryExecutor.java delete mode 100755 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/eventprocessor/wrapper/SidhdhiWrapper.java delete mode 100755 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/reader/BLEReader.java create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/drawable/beacon_red.png create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/layout/activity_beacon_monitoring.xml create mode 100644 components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/layout/list_item_device.xml diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/build.gradle b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/build.gradle index 3c6c7507f..bf9860dba 100755 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/build.gradle +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/build.gradle @@ -11,6 +11,12 @@ android { versionName "1.0" } + repositories { + maven { + url "https://dl.bintray.com/alt236/maven" + } + } + buildTypes { release { minifyEnabled false @@ -53,5 +59,7 @@ dependencies { compile 'com.netflix.feign:feign-jaxrs:8.16.0' compile 'com.netflix.feign:feign-jackson:8.16.0' compile 'org.altbeacon:android-beacon-library:2.8.1' + compile 'uk.co.alt236:easycursor-android:1.0.0' + compile 'uk.co.alt236:bluetooth-le-library-android:1.0.0' } diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/AndroidManifest.xml b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/AndroidManifest.xml index d1857e436..7ba9b334c 100755 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/AndroidManifest.xml +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/AndroidManifest.xml @@ -78,6 +78,12 @@ android:label="Beacon Monitor" android:theme="@style/AppTheme.NoActionBar" > + + + diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/beacon/BeaconDetactorService.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/beacon/BeaconDetactorService.java index c3c66a52b..61e84c680 100755 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/beacon/BeaconDetactorService.java +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/beacon/BeaconDetactorService.java @@ -45,20 +45,29 @@ public class BeaconDetactorService extends Service implements BeaconConsumer { @Override public int onStartCommand(Intent intent, int flags, int startId) { + + new Thread(){ + @Override + public void run() { + iBeaconManager.bind(BeaconDetactorService.this); + } + }.start(); + + return START_STICKY; } @Override public void onCreate() { super.onCreate(); - iBeaconManager.bind(this); + final Handler handler = new Handler(); final Runnable runnable = new Runnable() { @Override public void run() { - stopSelf(); + //stopSelf(); } }; handler.postDelayed(runnable, 10000); diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BeaconMonitoringActivity.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BeaconMonitoringActivity.java new file mode 100644 index 000000000..23785db26 --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BeaconMonitoringActivity.java @@ -0,0 +1,121 @@ +/* + * + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.bmonitor; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.widget.ListView; + +import java.util.HashMap; +import java.util.Map; + +import agent.sense.android.iot.carbon.wso2.org.wso2_senseagent.R; +import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice; +import uk.co.alt236.easycursor.objectcursor.EasyObjectCursor; + +public class BeaconMonitoringActivity extends AppCompatActivity { + + private BluetoothLeScanner mScanner; + private BluetoothUtils mBluetoothUtils; + private LeDeviceListAdapter mLeDeviceListAdapter; + private BluetoothLeDeviceStore mDeviceStore; + + protected ListView mList; + + public static final int MINIMUM_DISTANCE = -70; + + public static Map itemMap; + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_beacon_monitoring); + + itemMap = new HashMap(); + itemMap.put("DC:5F:BD:68:88:D5", "Noodles"); + itemMap.put("EF:0F:50:D5:BA:A1", "Vegetables"); + itemMap.put("FA:F2:CF:84:C2:F7", "Oil"); + + mList = (ListView) this.findViewById(android.R.id.list); + + mDeviceStore = new BluetoothLeDeviceStore(); + mBluetoothUtils = new BluetoothUtils(this); + mScanner = new BluetoothLeScanner(mLeScanCallback, mBluetoothUtils); + startScan(); + } + + private final BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { + @Override + public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { + final BluetoothLeDevice deviceLe = new BluetoothLeDevice(device, rssi, scanRecord, System.currentTimeMillis()); + if(deviceLe!= null && deviceLe.getName()!= null && !deviceLe.getName().equals("Unknown Device")){ + mDeviceStore.addDevice(deviceLe); + + if(deviceLe.getRssi() > MINIMUM_DISTANCE){ + Object[] objects = new Object[4]; + objects[0] = deviceLe.getName(); + objects[1] = deviceLe.getAddress(); + objects[2] = deviceLe.getRssi(); + objects[3] = itemMap.get(device.getAddress()); + + new SendToSiddi().execute(objects); + } + + + final EasyObjectCursor c = mDeviceStore.getDeviceCursor(); + runOnUiThread(new Runnable() { + @Override + public void run() { + mLeDeviceListAdapter.swapCursor(c); + } + }); + } + } + }; + + private void startScan() { + + mLeDeviceListAdapter = new LeDeviceListAdapter(this, mDeviceStore.getDeviceCursor()); + mList.setAdapter(mLeDeviceListAdapter); + + final boolean mIsBluetoothOn = mBluetoothUtils.isBluetoothOn(); + final boolean mIsBluetoothLePresent = mBluetoothUtils.isBluetoothLeSupported(); + mBluetoothUtils.askUserToEnableBluetoothIfNeeded(); + if (mIsBluetoothOn && mIsBluetoothLePresent) { + mScanner.scanLeDevice(-1, true); + invalidateOptionsMenu(); + } + } + + + public class SendToSiddi extends AsyncTask{ + + @Override + protected Void doInBackground(Object... objects) { + + return null; + } + } +} diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothLeDeviceStore.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothLeDeviceStore.java new file mode 100644 index 000000000..141157501 --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothLeDeviceStore.java @@ -0,0 +1,193 @@ +/* + * + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.bmonitor; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice; +import uk.co.alt236.bluetoothlelib.device.beacon.BeaconType; +import uk.co.alt236.bluetoothlelib.device.beacon.BeaconUtils; +import uk.co.alt236.bluetoothlelib.device.beacon.ibeacon.IBeaconDevice; +import uk.co.alt236.bluetoothlelib.util.ByteUtils; +import uk.co.alt236.easycursor.objectcursor.EasyObjectCursor; + +public class BluetoothLeDeviceStore { + private final Map mDeviceMap; + + + public BluetoothLeDeviceStore() { + mDeviceMap = new HashMap<>(); + } + + public void addDevice(final BluetoothLeDevice device) { + if (mDeviceMap.containsKey(device.getAddress())) { + mDeviceMap.get(device.getAddress()).updateRssiReading(device.getTimestamp(), device.getRssi()); + } else { + mDeviceMap.put(device.getAddress(), device); + } + } + + public void clear() { + mDeviceMap.clear(); + } + + public EasyObjectCursor getDeviceCursor() { + return new EasyObjectCursor<>( + BluetoothLeDevice.class, + getDeviceList(), + "address"); + } + + public List getDeviceList() { + final List methodResult = new ArrayList<>(mDeviceMap.values()); + + Collections.sort(methodResult, new Comparator() { + + @Override + public int compare(final BluetoothLeDevice arg0, final BluetoothLeDevice arg1) { + return arg0.getAddress().compareToIgnoreCase(arg1.getAddress()); + } + }); + + return methodResult; + } + + private String getListAsCsv() { + final List list = getDeviceList(); + final StringBuilder sb = new StringBuilder(); + sb.append(CsvWriterHelper.addStuff("mac")); + sb.append(CsvWriterHelper.addStuff("name")); + sb.append(CsvWriterHelper.addStuff("firstTimestamp")); + sb.append(CsvWriterHelper.addStuff("firstRssi")); + sb.append(CsvWriterHelper.addStuff("currentTimestamp")); + sb.append(CsvWriterHelper.addStuff("currentRssi")); + sb.append(CsvWriterHelper.addStuff("adRecord")); + sb.append(CsvWriterHelper.addStuff("iBeacon")); + sb.append(CsvWriterHelper.addStuff("uuid")); + sb.append(CsvWriterHelper.addStuff("major")); + sb.append(CsvWriterHelper.addStuff("minor")); + sb.append(CsvWriterHelper.addStuff("txPower")); + sb.append(CsvWriterHelper.addStuff("distance")); + sb.append(CsvWriterHelper.addStuff("accuracy")); + sb.append('\n'); + + for (final BluetoothLeDevice device : list) { + sb.append(CsvWriterHelper.addStuff(device.getAddress())); + sb.append(CsvWriterHelper.addStuff(device.getName())); + sb.append(CsvWriterHelper.addStuff(TimeFormatter.getIsoDateTime(device.getFirstTimestamp()))); + sb.append(CsvWriterHelper.addStuff(device.getFirstRssi())); + sb.append(CsvWriterHelper.addStuff(TimeFormatter.getIsoDateTime(device.getTimestamp()))); + sb.append(CsvWriterHelper.addStuff(device.getRssi())); + sb.append(CsvWriterHelper.addStuff(ByteUtils.byteArrayToHexString(device.getScanRecord()))); + final boolean isIBeacon = BeaconUtils.getBeaconType(device) == BeaconType.IBEACON; + final String uuid; + final String minor; + final String major; + final String txPower; + final String distance; + final String accuracy; + + if (isIBeacon) { + final IBeaconDevice beacon = new IBeaconDevice(device); + uuid = String.valueOf(beacon.getUUID()); + minor = String.valueOf(beacon.getMinor()); + major = String.valueOf(beacon.getMajor()); + txPower = String.valueOf(beacon.getCalibratedTxPower()); + distance = beacon.getDistanceDescriptor().toString().toLowerCase(Locale.US); + accuracy = String.valueOf(beacon.getAccuracy()); + } else { + uuid = ""; + minor = ""; + major = ""; + txPower = ""; + distance = ""; + accuracy = ""; + } + + sb.append(CsvWriterHelper.addStuff(isIBeacon)); + sb.append(CsvWriterHelper.addStuff(uuid)); + sb.append(CsvWriterHelper.addStuff(minor)); + sb.append(CsvWriterHelper.addStuff(major)); + sb.append(CsvWriterHelper.addStuff(txPower)); + sb.append(CsvWriterHelper.addStuff(distance)); + sb.append(CsvWriterHelper.addStuff(accuracy)); + + sb.append('\n'); + } + + return sb.toString(); + } + + public void shareDataAsEmail(final Context context) { + final long timeInMillis = System.currentTimeMillis(); + + final String to = null; + final String subject = ""; + + final String message = ""; + + final Intent i = new Intent(Intent.ACTION_SEND); + i.setType("plain/text"); + try { + final File outputDir = context.getCacheDir(); + final File outputFile = File.createTempFile("bluetooth_le_" + timeInMillis, ".csv", outputDir); + outputFile.setReadable(true, false); + generateFile(outputFile, getListAsCsv()); + i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(outputFile)); + i.putExtra(Intent.EXTRA_EMAIL, new String[]{to}); + i.putExtra(Intent.EXTRA_SUBJECT, subject); + i.putExtra(Intent.EXTRA_TEXT, message); + context.startActivity(Intent.createChooser(i, "Email Subject")); + + } catch (final IOException e) { + e.printStackTrace(); + } + } + + private static FileWriter generateFile(final File file, final String contents) { + FileWriter writer = null; + try { + writer = new FileWriter(file); + writer.append(contents); + writer.flush(); + + } catch (final IOException e) { + e.printStackTrace(); + } finally { + try { + writer.close(); + } catch (final IOException e) { + e.printStackTrace(); + } + } + return writer; + } +} \ No newline at end of file diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothLeScanner.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothLeScanner.java new file mode 100644 index 000000000..a132d53ee --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothLeScanner.java @@ -0,0 +1,65 @@ +/* + * + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.bmonitor; + +import android.bluetooth.BluetoothAdapter; +import android.os.Handler; +import android.util.Log; + +public class BluetoothLeScanner { + private final Handler mHandler; + private final BluetoothAdapter.LeScanCallback mLeScanCallback; + private final BluetoothUtils mBluetoothUtils; + private boolean mScanning; + + public BluetoothLeScanner(final BluetoothAdapter.LeScanCallback leScanCallback, final BluetoothUtils bluetoothUtils) { + mHandler = new Handler(); + mLeScanCallback = leScanCallback; + mBluetoothUtils = bluetoothUtils; + } + + public boolean isScanning() { + return mScanning; + } + + public void scanLeDevice(final int duration, final boolean enable) { + if (enable) { + if (mScanning) { + return; + } + Log.d("TAG", "~ Starting Scan"); + // Stops scanning after a pre-defined scan period. + if (duration > 0) { + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + Log.d("TAG", "~ Stopping Scan (timeout)"); + mScanning = false; + mBluetoothUtils.getBluetoothAdapter().stopLeScan(mLeScanCallback); + } + }, duration); + } + mScanning = true; + mBluetoothUtils.getBluetoothAdapter().startLeScan(mLeScanCallback); + } else { + Log.d("TAG", "~ Stopping Scan"); + mScanning = false; + mBluetoothUtils.getBluetoothAdapter().stopLeScan(mLeScanCallback); + } + } +} diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothUtils.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothUtils.java new file mode 100644 index 000000000..5e664793c --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/BluetoothUtils.java @@ -0,0 +1,60 @@ +/* + * + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.bmonitor; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; + +public final class BluetoothUtils { + public final static int REQUEST_ENABLE_BT = 2001; + private final Activity mActivity; + private final BluetoothAdapter mBluetoothAdapter; + + public BluetoothUtils(final Activity activity) { + mActivity = activity; + final BluetoothManager btManager = (BluetoothManager) mActivity.getSystemService(Context.BLUETOOTH_SERVICE); + mBluetoothAdapter = btManager.getAdapter(); + } + + public void askUserToEnableBluetoothIfNeeded() { + if (isBluetoothLeSupported() && (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled())) { + final Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); + mActivity.startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); + } + } + + public BluetoothAdapter getBluetoothAdapter() { + return mBluetoothAdapter; + } + + public boolean isBluetoothLeSupported() { + return mActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE); + } + + public boolean isBluetoothOn() { + if (mBluetoothAdapter == null) { + return false; + } else { + return mBluetoothAdapter.isEnabled(); + } + } +} diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/CsvWriterHelper.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/CsvWriterHelper.java new file mode 100644 index 000000000..6c10210a2 --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/CsvWriterHelper.java @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.bmonitor; + +public class CsvWriterHelper { + private static final String QUOTE = "\""; + + public static String addStuff(final Integer text) { + return QUOTE + text + QUOTE + ","; + } + + public static String addStuff(final Long text) { + return QUOTE + text + QUOTE + ","; + } + + public static String addStuff(final boolean value) { + return QUOTE + value + QUOTE + ","; + } + + public static String addStuff(String text) { + if (text == null) { + text = ""; + } + text = text.replace(QUOTE, "'"); + + return QUOTE + text.trim() + QUOTE + ","; + } +} \ No newline at end of file diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/LeDeviceListAdapter.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/LeDeviceListAdapter.java new file mode 100644 index 000000000..da4370b89 --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/LeDeviceListAdapter.java @@ -0,0 +1,154 @@ +/* + * + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.bmonitor; + +import android.app.Activity; +import android.support.v4.widget.SimpleCursorAdapter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import java.text.DecimalFormat; + +import agent.sense.android.iot.carbon.wso2.org.wso2_senseagent.R; +import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice; +import uk.co.alt236.bluetoothlelib.device.beacon.BeaconType; +import uk.co.alt236.bluetoothlelib.device.beacon.BeaconUtils; +import uk.co.alt236.bluetoothlelib.device.beacon.ibeacon.IBeaconDevice; +import uk.co.alt236.easycursor.objectcursor.EasyObjectCursor; + +public class LeDeviceListAdapter extends SimpleCursorAdapter { + private final LayoutInflater mInflator; + private final Activity mActivity; + + public static final DecimalFormat DOUBLE_TWO_DIGIT_ACCURACY = new DecimalFormat("#.##"); + public static final String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + public LeDeviceListAdapter(final Activity activity, final EasyObjectCursor cursor) { + super(activity, R.layout.list_item_device, cursor, new String[0], new int[0], 0); + mInflator = activity.getLayoutInflater(); + mActivity = activity; + } + + @SuppressWarnings("unchecked") + @Override + public EasyObjectCursor getCursor() { + return ((EasyObjectCursor) super.getCursor()); + } + + @Override + public BluetoothLeDevice getItem(final int i) { + return getCursor().getItem(i); + } + + @Override + public long getItemId(final int i) { + return i; + } + + @Override + public View getView(final int i, View view, final ViewGroup viewGroup) { + final ViewHolder viewHolder; + // General ListView optimization code. + if (view == null) { + view = mInflator.inflate(R.layout.list_item_device, null); + viewHolder = new ViewHolder(); + viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); + viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); + viewHolder.deviceRssi = (TextView) view.findViewById(R.id.device_rssi); + viewHolder.deviceIcon = (ImageView) view.findViewById(R.id.device_icon); + viewHolder.deviceLastUpdated = (TextView) view.findViewById(R.id.device_last_update); + viewHolder.ibeaconMajor = (TextView) view.findViewById(R.id.ibeacon_major); + viewHolder.ibeaconMinor = (TextView) view.findViewById(R.id.ibeacon_minor); + viewHolder.ibeaconDistance = (TextView) view.findViewById(R.id.ibeacon_distance); + viewHolder.ibeaconUUID = (TextView) view.findViewById(R.id.ibeacon_uuid); + viewHolder.ibeaconTxPower = (TextView) view.findViewById(R.id.ibeacon_tx_power); + viewHolder.ibeaconSection = view.findViewById(R.id.ibeacon_section); + viewHolder.ibeaconDistanceDescriptor = (TextView) view.findViewById(R.id.ibeacon_distance_descriptor); + view.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) view.getTag(); + } + + final BluetoothLeDevice device = getCursor().getItem(i); + final String deviceName = device.getName(); + + final double rssi = device.getRssi(); + + if (deviceName != null && deviceName.length() > 0) { + viewHolder.deviceName.setText(deviceName + " (" + BeaconMonitoringActivity.itemMap.get(device.getAddress()) + ")"); + } else { + viewHolder.deviceName.setText(R.string.unknown_device); + } + + + if (BeaconUtils.getBeaconType(device) == BeaconType.IBEACON) { + final IBeaconDevice iBeacon = new IBeaconDevice(device); + final String accuracy = DOUBLE_TWO_DIGIT_ACCURACY.format(iBeacon.getAccuracy()); + + viewHolder.deviceIcon.setImageResource(R.drawable.beacon); + viewHolder.ibeaconSection.setVisibility(View.VISIBLE); + viewHolder.ibeaconMajor.setText(String.valueOf(iBeacon.getMajor())); + viewHolder.ibeaconMinor.setText(String.valueOf(iBeacon.getMinor())); + viewHolder.ibeaconTxPower.setText(String.valueOf(iBeacon.getCalibratedTxPower())); + viewHolder.ibeaconUUID.setText(iBeacon.getUUID()); + viewHolder.ibeaconDistance.setText( + mActivity.getString(R.string.formatter_meters, accuracy)); + viewHolder.ibeaconDistanceDescriptor.setText(iBeacon.getDistanceDescriptor().toString()); + } else { + if(device.getRssi() > BeaconMonitoringActivity.MINIMUM_DISTANCE){ + viewHolder.deviceIcon.setImageResource(R.drawable.beacon_red); + }else{ + viewHolder.deviceIcon.setImageResource(R.drawable.beacon); + } + + viewHolder.ibeaconSection.setVisibility(View.GONE); + } + + + final String rssiString = + mActivity.getString(R.string.formatter_db, String.valueOf(rssi)); + final String runningAverageRssiString = + mActivity.getString(R.string.formatter_db, String.valueOf(device.getRunningAverageRssi())); + + viewHolder.deviceLastUpdated.setText( + android.text.format.DateFormat.format( + TIME_FORMAT, new java.util.Date(device.getTimestamp()))); + viewHolder.deviceAddress.setText(device.getAddress()); + viewHolder.deviceRssi.setText(rssiString + " / " + runningAverageRssiString); + return view; + } + + static class ViewHolder { + TextView deviceName; + TextView deviceAddress; + TextView deviceRssi; + TextView ibeaconUUID; + TextView ibeaconMajor; + TextView ibeaconMinor; + TextView ibeaconTxPower; + TextView ibeaconDistance; + TextView ibeaconDistanceDescriptor; + TextView deviceLastUpdated; + View ibeaconSection; + ImageView deviceIcon; + } + +} \ No newline at end of file diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/TimeFormatter.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/TimeFormatter.java new file mode 100644 index 000000000..340a0211b --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/TimeFormatter.java @@ -0,0 +1,35 @@ +/* + * + * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed 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.bmonitor; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +public class TimeFormatter { + private final static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz"; + private final static SimpleDateFormat ISO_FORMATTER = new UtcDateFormatter(ISO_FORMAT, Locale.US); + + public static String getIsoDateTime(final Date date) { + return ISO_FORMATTER.format(date); + } + + public static String getIsoDateTime(final long millis) { + return getIsoDateTime(new Date(millis)); + } +} \ No newline at end of file diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/UtcDateFormatter.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/UtcDateFormatter.java new file mode 100644 index 000000000..bb3f52759 --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/bmonitor/UtcDateFormatter.java @@ -0,0 +1,74 @@ +/** + * **************************************************************************** + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + *

+ * GenieConnect Ltd. ("COMPANY") CONFIDENTIAL + * Unpublished Copyright (c) 2010-2013 GenieConnect Ltd., All Rights Reserved. + *

+ * NOTICE: + * All information contained herein is, and remains the property of COMPANY. + * The intellectual and technical concepts contained herein are proprietary to + * COMPANY and may be covered by U.S. and Foreign Patents, patents in process, and + * are protected by trade secret or copyright law. Dissemination of this + * information or reproduction of this material is strictly forbidden unless prior + * written permission is obtained from COMPANY. Access to the source code + * contained herein is hereby forbidden to anyone except current COMPANY employees, + * managers or contractors who have executed Confidentiality and Non-disclosure + * agreements explicitly covering such access. + *

+ * The copyright notice above does not evidence any actual or intended publication + * or disclosure of this source code, which includes information that is + * confidential and/or proprietary, and is a trade secret, of COMPANY. + *

+ * ANY REPRODUCTION, MODIFICATION, DISTRIBUTION, PUBLIC PERFORMANCE, OR PUBLIC + * DISPLAY OF OR THROUGH USE OF THIS SOURCE CODE WITHOUT THE EXPRESS WRITTEN + * CONSENT OF COMPANY IS STRICTLY PROHIBITED, AND IN VIOLATION OF APPLICABLE LAWS + * AND INTERNATIONAL TREATIES. THE RECEIPT OR POSSESSION OF THIS SOURCE CODE + * AND/OR RELATED INFORMATION DOES NOT CONVEY OR IMPLY ANY RIGHTS TO REPRODUCE, + * DISCLOSE OR DISTRIBUTE ITS CONTENTS, OR TO MANUFACTURE, USE, OR SELL ANYTHING + * THAT IT MAY DESCRIBE, IN WHOLE OR IN PART. + * **************************************************************************** + */ +package org.wso2.carbon.iot.android.sense.bmonitor; + +import android.annotation.SuppressLint; + +import java.text.DateFormatSymbols; +import java.util.Locale; +import java.util.TimeZone; + +public class UtcDateFormatter extends java.text.SimpleDateFormat { + private static final long serialVersionUID = 1L; + + private static final String TIME_ZONE_STRING = "UTC"; + private static final TimeZone TIME_ZONE_UTC = TimeZone.getTimeZone(TIME_ZONE_STRING); + + @SuppressLint("SimpleDateFormat") + public UtcDateFormatter(final String template) { + super(template); + super.setTimeZone(TIME_ZONE_UTC); + } + + @SuppressLint("SimpleDateFormat") + public UtcDateFormatter(final String template, final DateFormatSymbols symbols) { + super(template, symbols); + super.setTimeZone(TIME_ZONE_UTC); + } + + public UtcDateFormatter(final String template, final Locale locale) { + super(template, locale); + super.setTimeZone(TIME_ZONE_UTC); + } + + /* + * This function will throw an UnsupportedOperationException. + * You are not be able to change the TimeZone of this object + * + * (non-Javadoc) + * @see java.text.DateFormat#setTimeZone(java.util.TimeZone) + */ + @Override + public void setTimeZone(final TimeZone timezone) { + throw new UnsupportedOperationException("This SimpleDateFormat can only be in " + TIME_ZONE_STRING); + } +} \ No newline at end of file diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/realtimeviewer/ActivitySelectSensor.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/realtimeviewer/ActivitySelectSensor.java index fe6c4b093..f8d658f69 100755 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/realtimeviewer/ActivitySelectSensor.java +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/realtimeviewer/ActivitySelectSensor.java @@ -38,6 +38,7 @@ import android.widget.Toast; import android.app.AlertDialog; import android.content.DialogInterface; import org.wso2.carbon.iot.android.sense.RegisterActivity; +import org.wso2.carbon.iot.android.sense.bmonitor.BeaconMonitoringActivity; import org.wso2.carbon.iot.android.sense.data.publisher.DataPublisherReceiver; import org.wso2.carbon.iot.android.sense.data.publisher.DataPublisherService; import org.wso2.carbon.iot.android.sense.event.SenseScheduleReceiver; @@ -146,7 +147,7 @@ public class ActivitySelectSensor extends AppCompatActivity fbtnBeaconMonitor.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(getApplicationContext(), MonitoringActivity.class); + Intent intent = new Intent(getApplicationContext(), BeaconMonitoringActivity.class); startActivity(intent); diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/dto/BLE.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/dto/BLE.java deleted file mode 100755 index 0dec7d2ad..000000000 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/dto/BLE.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.siddhi.dto; - -public class BLE { - int id; - long timeStamp; - String location; - - public BLE(int id, String location){ - this.id = id; - this.location = location; - timeStamp = System.currentTimeMillis(); - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public long getTimeStamp() { - return timeStamp; - } - - public void setTimeStamp(long timeStamp) { - this.timeStamp = timeStamp; - } - - public String getLocation() { - return location; - } - - public void setLocation(String location) { - this.location = location; - } -} diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/eventprocessor/core/SidhdhiQueryExecutor.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/eventprocessor/core/SidhdhiQueryExecutor.java deleted file mode 100755 index 6496a40bc..000000000 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/eventprocessor/core/SidhdhiQueryExecutor.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * 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.siddhi.eventprocessor.core; - -import org.wso2.carbon.iot.android.sense.siddhi.dto.BLE; -import org.wso2.carbon.iot.android.sense.siddhi.eventprocessor.wrapper.SidhdhiWrapper; -import org.wso2.siddhi.core.SiddhiManager; -import org.wso2.siddhi.core.event.Event; -import org.wso2.siddhi.core.stream.input.InputHandler; -import org.wso2.siddhi.core.ExecutionPlanRuntime; -import org.wso2.siddhi.core.stream.output.StreamCallback; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - - -public class SidhdhiQueryExecutor implements Runnable { - - protected String query = null; - private static SiddhiManager siddhiManager = new SiddhiManager(); - private static final int INTERVAL = 3000; - - public volatile Thread sidhdiThread; - private ReadWriteLock rwlock = new ReentrantReadWriteLock(); - - //TODO have another array initialized so that a list of callbacks can be stored, String[] callbackList - public SidhdhiQueryExecutor(String query){ - this.query = query; - } - - public void run(){ - //TODO the array of callbacks needs to be passed to invoke - //TODO what is retruned should be a map of callbacks and outputs - ExecutionPlan executionPlan = new ExecutionPlan().invoke(); - - Thread thisThread = Thread.currentThread(); - - while (sidhdiThread == thisThread) { - InputHandler inputHandler = executionPlan.getInputHandler(); - - //Sending events to Siddhi - try { - List bleReadings = read(); - for(BLE ble : bleReadings){ - System.out.println("Publishing data..."); - inputHandler.send(new Object[]{ble.getId(), ble.getTimeStamp(), ble.getLocation()}); - } - - thisThread.sleep(INTERVAL); - } catch (InterruptedException e) { - e.printStackTrace(); - break; - } - } - } - - public List read() - { - List bleData; - rwlock.readLock().lock(); - try { - //TODO Reading BLE VALUES - bleData = SidhdhiWrapper.getBleData(); - } finally { - rwlock.readLock().unlock(); - } - return bleData; - } - - public void stop(){ - sidhdiThread = null; - } - - public void start(){ - sidhdiThread = new Thread(this); - sidhdiThread.start(); - } - - private class ExecutionPlan { - - private InputHandler inputHandler; - - public InputHandler getInputHandler() { - return inputHandler; - } - - //TODO should expect an array of callbacks - public ExecutionPlan invoke() { - - //Generating runtime - ExecutionPlanRuntime runtime = siddhiManager.createExecutionPlanRuntime(query); - - - - //TODO logic needs to be revised so that array of callbacks are processed - runtime.addCallback("dataOut", new StreamCallback() { - @Override - public void receive(Event[] events) { - System.out.println("Location Match event initiated."); - if (events.length > 0) { - //TODO Configure Event here! - System.out.println("Firing location match event..."); - } - } - }); - - - //Retrieving InputHandler to push events into Siddhi - inputHandler = runtime.getInputHandler("dataIn"); - - //Starting event processing - runtime.start(); - System.out.println("Execution Plan Started!"); - return this; - } - } - -} diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/eventprocessor/wrapper/SidhdhiWrapper.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/eventprocessor/wrapper/SidhdhiWrapper.java deleted file mode 100755 index e6db9c6a9..000000000 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/eventprocessor/wrapper/SidhdhiWrapper.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.siddhi.eventprocessor.wrapper; - -import org.wso2.carbon.iot.android.sense.siddhi.dto.BLE; -import org.wso2.carbon.iot.android.sense.siddhi.eventprocessor.core.SidhdhiQueryExecutor; -import org.wso2.carbon.iot.android.sense.siddhi.reader.BLEReader; - -import java.util.List; -import java.util.Map; - - -public class SidhdhiWrapper { - - private static List bleData; - - public static List getBleData() { - return bleData; - } - - public static void setBleData(List bleData) { - SidhdhiWrapper.bleData = bleData; - } - - public static void main(String args[]){ - String query = "@Import('iot.sample.input:1.0.0')\n" + - "define stream dataIn (id int, timestamp long, location string);\n" + - "\n" + - "@Export('iot.sample.output:1.0.0')\n" + - "define stream dataOut (action string, timestamp long);\n" + - "\n" + - "from every e1=dataIn[location=='loc_1'] -> e2=dataIn[location=='loc_2'] -> e3=dataIn[location=='loc_3']\n" + - "select 'x' as action, e3.timestamp\n" + - "insert into dataOut;"; - - BLEReader blEReader = new BLEReader(); - blEReader.start(); - - SidhdhiQueryExecutor queryExecutor = new SidhdhiQueryExecutor(query); - queryExecutor.start(); - } - -} diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/reader/BLEReader.java b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/reader/BLEReader.java deleted file mode 100755 index 36fb195f8..000000000 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/siddhi/reader/BLEReader.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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.siddhi.reader; - -import org.wso2.carbon.iot.android.sense.siddhi.dto.BLE; -import org.wso2.carbon.iot.android.sense.siddhi.eventprocessor.wrapper.SidhdhiWrapper; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -public class BLEReader implements Runnable{ - - private ReadWriteLock rwlock = new ReentrantReadWriteLock(); - List bleData = new ArrayList(); - public volatile Thread bleReader; - private static final int INTERVAL = 2000; - - public void run(){ - Thread thisThread = Thread.currentThread(); - while (bleReader == thisThread) { - write(); - try { - thisThread.sleep(INTERVAL); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - - public void stop(){ - bleReader = null; - } - - public void start(){ - bleReader = new Thread(this); - bleReader.start(); - } - - public void write() - { - rwlock.writeLock().lock(); - try { - bleData.add(new BLE(123, "loc_1")); - bleData.add(new BLE(123, "loc_2")); - bleData.add(new BLE(123, "loc_3")); - SidhdhiWrapper.setBleData(bleData); - } finally { - rwlock.writeLock().unlock(); - } - } -} diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/drawable/beacon_red.png b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/drawable/beacon_red.png new file mode 100644 index 0000000000000000000000000000000000000000..b86775de6f4e4559926817fd6a67ec74fda0dd14 GIT binary patch literal 19250 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 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/layout/list_item_device.xml b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/layout/list_item_device.xml new file mode 100644 index 000000000..46cd6c0ee --- /dev/null +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/layout/list_item_device.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/values/strings.xml b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/values/strings.xml index a335b9272..62002d605 100755 --- a/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/values/strings.xml +++ b/components/iot-plugins/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/res/values/strings.xml @@ -11,4 +11,75 @@ Hello blank fragment + + + + This is a sample application using the Bluetooth LE Library.\n\nGithub: https://github.com/alt236/Bluetooth-LE-Library---Android\n\nCopyright: Alexandros Schillings + Device Info + iBeacon Data + Raw Ad Records + RSSI Info + Scan Record + Advertisement: + As Array: + As String: + Bluetooth LE: + Bluetooth: + Bonding State: + Company ID: + Data: + Desc: + Device address: + Device Class: + Major Class: + Services: + Device Name: + Distance: + First RSSI: + First Timestamp: + Last RSSI: + Last Timestamp: + MAC: + Major: + Minor: + RSSI: + Running Average RSSI: + State: + TX Power: + UUID: + Updated: + Descriptor: + + + Connected + Disconnected + Invalid Device Data! + No data + Not supported + Off + On + Supported + unknown + Unknown characteristic + Unknown device + Unknown service + No known services + + %sm + %sdb + Items: %s + + + About + Connect + Disconnect + Scan + Stop + Share + + + Bluetooth LE Scan Results (%s) + Bluetooth LE Device GATT Results (%s, %s) + Please find attached the scan results. + Please select your email client: