v0.0.5
This commit is contained in:
parent
aaccb27f22
commit
a784bd6549
4 changed files with 55 additions and 9 deletions
|
|
@ -11,7 +11,7 @@
|
|||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" />
|
||||
<supports-screens
|
||||
|
|
@ -28,10 +28,10 @@
|
|||
android:fullBackupOnly="false">
|
||||
|
||||
<service android:name=".WaterLevelService"
|
||||
android:foregroundServiceType="specialUse"
|
||||
android:foregroundServiceType="connectedDevice"
|
||||
android:exported="true">
|
||||
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||
android:value="Monitoring water levels via local network UDP packets for real-time sensor alerts." />
|
||||
<!-- <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||
android:value="Monitoring water levels via local network UDP packets for real-time sensor alerts." />-->
|
||||
<meta-data android:name="android.app.lib_name" android:value="service"/>
|
||||
<meta-data android:name="android.app.background_running" android:value="true"/>
|
||||
</service>
|
||||
|
|
|
|||
|
|
@ -65,9 +65,10 @@ public class WaterLevelService extends Service {
|
|||
|
||||
@Override
|
||||
public void run() {
|
||||
Log.d("UDP Service", "Thread initialising");
|
||||
Log.d("UDP Service", "Client Thread initialising");
|
||||
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(Context.WIFI_SERVICE);
|
||||
android.net.wifi.WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("water_level_lock");
|
||||
android.net.wifi.WifiManager.WifiLock wifiLock = wifi.createWifiLock(android.net.wifi.WifiManager.WIFI_MODE_FULL_HIGH_PERF, "WaterLevel:WifiLock");
|
||||
android.os.PowerManager pm = (android.os.PowerManager) getSystemService(Context.POWER_SERVICE);
|
||||
android.os.PowerManager.WakeLock wakeLock = pm.newWakeLock(android.os.PowerManager.PARTIAL_WAKE_LOCK, "WaterLevel:WakeLock");
|
||||
|
||||
|
|
@ -84,14 +85,26 @@ public class WaterLevelService extends Service {
|
|||
try {
|
||||
multicastLock.acquire();
|
||||
wakeLock.acquire();
|
||||
socket_recv = new DatagramSocket(8176);
|
||||
wifiLock.acquire();
|
||||
socket_recv = new DatagramSocket(8176, InetAddress.getByName("0.0.0.0"));
|
||||
socket_send = new DatagramSocket(8177);
|
||||
socket_recv.setBroadcast(true);
|
||||
socket_recv.setSoTimeout(4000);
|
||||
Log.d("UDP Service", "Created Sockets");
|
||||
int count = 0;
|
||||
while (!Thread.currentThread().isInterrupted()) {
|
||||
count++;
|
||||
if(count == 3) {
|
||||
Log.i("UDP Service", "Thread is running");
|
||||
count = 0;
|
||||
}
|
||||
byte[] buffer = new byte[4];
|
||||
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
|
||||
socket_recv.receive(packet);
|
||||
try {
|
||||
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
|
||||
socket_recv.receive(packet);
|
||||
} catch(java.net.SocketTimeoutException e) {
|
||||
continue;
|
||||
}
|
||||
float f = ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).getFloat();
|
||||
Log.d("UDP Service ", "Received packet: " + f);
|
||||
Log.d("UDP Service ", "Threshold is: " + alert_thres_distance);
|
||||
|
|
@ -128,6 +141,8 @@ public class WaterLevelService extends Service {
|
|||
catch (IOException e) {
|
||||
Log.e("UDP Service", "Socket Error", e);
|
||||
} finally {
|
||||
if (wifiLock.isHeld())
|
||||
wifiLock.release();
|
||||
if (multicastLock.isHeld())
|
||||
multicastLock.release();
|
||||
if (wakeLock.isHeld())
|
||||
|
|
|
|||
|
|
@ -39,6 +39,11 @@ void UDPListener::setDistance(double newDistance)
|
|||
emit distanceChanged();
|
||||
}
|
||||
|
||||
void UDPListener::continueDestruction()
|
||||
{
|
||||
destroyed = true;
|
||||
}
|
||||
|
||||
void UDPListener::resetAverages()
|
||||
{
|
||||
averages.clear();
|
||||
|
|
@ -117,10 +122,24 @@ void UDPListener::destroy()
|
|||
{
|
||||
qDebug() << "Destroying UDP Listener";
|
||||
timer->stop();
|
||||
connect(this, &UDPListener::stopWorker, worker, &Worker::stop);
|
||||
connect(worker, &Worker::stopped, this, &UDPListener::continueDestruction);
|
||||
emit stopWorker();
|
||||
while(!destroyed) {
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
thread->exit(0);
|
||||
thread->deleteLater();
|
||||
QCoreApplication::processEvents();
|
||||
QCoreApplication::processEvents();
|
||||
worker->deleteLater();
|
||||
QCoreApplication::processEvents();
|
||||
QCoreApplication::processEvents();
|
||||
thread->deleteLater();
|
||||
QCoreApplication::processEvents();
|
||||
QCoreApplication::processEvents();
|
||||
timer->deleteLater();
|
||||
QCoreApplication::processEvents();
|
||||
QCoreApplication::processEvents();
|
||||
qDebug() << "Deinitialized UDP Listener";
|
||||
}
|
||||
|
||||
|
|
@ -149,6 +168,13 @@ Worker::Worker(QObject *parent)
|
|||
|
||||
}
|
||||
|
||||
void Worker::stop()
|
||||
{
|
||||
disconnect(socket, nullptr, nullptr, nullptr);
|
||||
delete socket;
|
||||
emit stopped();
|
||||
}
|
||||
|
||||
void Worker::run()
|
||||
{
|
||||
using namespace std::chrono_literals;
|
||||
|
|
|
|||
|
|
@ -16,9 +16,11 @@ class Worker: public QObject {
|
|||
public:
|
||||
explicit Worker(QObject *parent = nullptr);
|
||||
signals:
|
||||
void stopped();
|
||||
void socketError(QString error);
|
||||
void datagramReceived(QByteArray data, QByteArray data2);
|
||||
public slots:
|
||||
void stop();
|
||||
void run();
|
||||
private slots:
|
||||
void socketDataReceived();
|
||||
|
|
@ -29,11 +31,13 @@ class UDPListener : public QObject
|
|||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
Q_PROPERTY(double distance READ distance WRITE setDistance NOTIFY distanceChanged FINAL)
|
||||
bool destroyed = false;
|
||||
public:
|
||||
explicit UDPListener(QObject *parent = nullptr);
|
||||
double distance() const;
|
||||
void setDistance(double newDistance);
|
||||
signals:
|
||||
void stopWorker();
|
||||
void showError(QString err);
|
||||
void distanceChanged();
|
||||
void startWorker();
|
||||
|
|
@ -41,6 +45,7 @@ signals:
|
|||
void disconnected();
|
||||
void distanceReceived(double dist, QString timestamp);
|
||||
public slots:
|
||||
void continueDestruction();
|
||||
void resetAverages();
|
||||
void setFlipBits(bool flip_bits);
|
||||
void setConfig(float distance, bool flip_bits);
|
||||
|
|
|
|||
Loading…
Reference in a new issue