mercoledì 8 aprile 2020

Android Studio WiFi Adb Plugin

Per programmare con Adb via WiFi si puo' fare in vari modi

Usando un plugin (la via piu' comoda) si puo' installare un plugin di Android Studio da File/Settings/Plugins e scegliendo per esempio Android WiFi ADB


Si aggiungera' una icona (in verde chiaro al centro nell'immagine successiva)


Si collega il telefono via USB agganciandosi alla stessa WiFi del portatile. Si clicca sull'icona, si attende la connessione e successivamente si puo' disconnettere il cavo USB

Altrimenti da shell si possono inviare i seguenti comandi

A cavo USB attaccato si digita

adb shell setprop service.adb.tcp.port 4444
adb tcpip 4444
adb connect ip_telefono:4444

OkHttp per Android

Per utilizzare chiamate HTTP in un progetto Android basato su Java (per Kotlin una libreria comoda e' Fuel ) si puo' utilizzare OKHttp anche se e' cosi' immediato utilizzarla

Per aggiungere la libreria al progetto si edita build.gradle(progetto) aggiugendo la riga in giallo

allprojects {    repositories {        google()
        jcenter()
        maven { url "https://jitpack.io" }            }}

e si aggiunge la libreria indicata dalla riga in giallo

dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.1.0'    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'    testImplementation 'junit:junit:4.12'    androidTestImplementation 'androidx.test.ext:junit:1.1.1'    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.github.felHR85:UsbSerial:6.1.0'    implementation("com.squareup.okhttp3:okhttp:4.5.0")}


Per prima cosa si aggiunge il permesso di accesso ad Internet nel Manifest

<uses-permission android:name="android.permission.INTERNET" />

In seguito si crea un directory xml in res e si crea un nuovo file XML denominato network_security_config.xml con i permessi di accesso alla rete




Per esempio qui si abilita il traffico HTTP (HTTPS e' default) verso tutti i domini
network_security_config.xml
-----------------------------------------
<?xml version="1.0" encoding="utf-8"?><network-security-config xmlns:android="http://schemas.android.com/apk/res/android">    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
-----------------------------------------

Si torna al Manifest e si aggiunge la riga in giallo
<application    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:networkSecurityConfig="@xml/network_security_config"    android:roundIcon="@mipmap/ic_launcher_round"    android:supportsRtl="true"


il metodo standard per implementare la chiamata e' creare una classe

public static class senddata {
    OkHttpClient client = new OkHttpClient();
    String run(String url) throws IOException {
        Request request = new Request.Builder()
                .url(url)
                .build();
        try (Response response = client.newCall(request).execute()) {
            return response.body().string();        }
    }
}


e poi chiamare il metodo per esempio in GET

senddata invio = new senddata();try {
    String response = invio.run("http://XXX.XXXX.XXX.XXX/seriale/index.php?stringa="+data.toString()+"&batteria="+percentage);} catch (IOException e) {
    e.printStackTrace();}

sabato 4 aprile 2020

Deriva termica su accelerometri MEMS

Stavo registrando dati con il telefono usando questa mia applicazione quando mi sono accorto che i dati non erano piu' stabili ma avevano una deriva. Rispetto alle prove precedenti stavo registrando usando come alimentazione del cellulare un pannello solare


Questi sono i grafici di pitch e roll in funzione del tempo. Come si vede i dati sono sincronizzati e seguono il ciclo diurno o meglio quello della temperatura (la prova e' durata tre giorni e nel giorno centrale era nuvoloso ed il minimo e' appena accennato)




Si tratta quindi di una deriva termica. Non avendo sul Nexus 5 un termometro (ho provato a loggare di dati del termometro della batteria ma sono dati completamente inutili con temperatura di 29 gradi C con una temperatura ambiente sempre inferiore ai 20 C)

C'e' un sistema semplice per ripulire la deriva termica e vedere se il telefono sta ruotando un pitch/roll o se e' solo l'effetto della temperatura

Tenendo il telefono fermo e plottando pitch vs roll si vede che le due misure sono fortemente correlate


il valore di R2 di correlazione e' di circa 0.8 (quindi abbastanza scarso) con una equazione

roll = 0.36pitch + 1.53

a questo punto si puo' calcolare, tramite questa formula, la distanza di ogni punto dalla retta di regressione. La distanza massima dei punti in condizioni statiche e' pari a 0.081 
Se la distanza di un punto, indipendentemente dalla temperatura, e' superiore al valore sopra riportato e' molto probabile che sia uno spostamento significativo e non una deriva termica

Per completezza questo e' il grafico in cui in ascisse ci sono i minuti da inizio ricarica solare ed in ordinata la percentuale di carica del telefono


giovedì 2 aprile 2020

JSON con GSON e Kotlin

Per leggere un file Json con Kotlin si puo' utilizzare la libreria GSON aggiungendo il gradle.build la seguente linea
implementation 'com.google.code.gson:gson:2.8.6'
facciamo per esempio che il file JSON ha il seguente tracciato

    val json = "{'cicli':26,'soglia': 1.5}"
si deve creare una classe che ricostruisce il tracciato record e crea dei metodi per leggere le proprieta'
class imposta(
var cicli:Int = 0,
var soglia:Float = 0.0f) {
fun Get_cicli():Int {
return cicli
}

fun Get_soglia():Float {
return soglia
}
override fun toString(): String {
return "${this.cicli}, ${this.soglia}"
}
}

dopo si cio' si puo' chiamare la funzione .fromJson per poter popolare le variabili
override fun onCreate(savedInstanceState: Bundle?) {
...........

val json = "{'cicli':26,'soglia': 1.5}"


var impostazioni = Gson().fromJson(json, imposta::class.java)
var prova = impostazioni.Get_cicli()
Log.d(
"imposta", impostazioni.toString())
Log.d(
"imposta", prova.toString())



martedì 31 marzo 2020

Phishing via SMS

Oggi mi e' arrivato questo SMS apparentemente proveniente dalla mia banca



ho cliccato sul link e si e' aperta una pagina con la richiesta di inserire le credenziali perche' il conto era stato limitato. Da cellulare la schermata era questa


Mi sono insospettito della URL ripristino-datiweb.com e mi sono spostato sul PC.
Una volta copiata la URL (https://ripristino-datiweb.com/verificapsd2/it/persone-e-famiglie/login-page.php?&sessionid=74c7228a6ce06a2603aa2b54e3237a8a&securessl=true) il browser mi reindirizzava in automatico a Google.com e non vedevo la schermata di login del cellulare

Lanciando la URL https://ripristino-datiweb.com la pagina era bianca con la sola scritta "Nice try :-("

(nessun altro codice ne' html ne' javascript)

Tra le altre cose sembra che il redirect basato sull'UserAgent sia gestito direttamente da Apache e non da una pagina web via Javascript con  qualche regola del tipo quella indicata a questo sito 


una ricerca sul whois riportata che la registrazione del sito e' su GoDaddy ed e' stato creato oggi

Domain Name: RIPRISTINO-DATIWEB.COM
Registry Domain ID: 2509476000_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.godaddy.com
Registrar URL: http://www.godaddy.com
Updated Date: 2020-03-31T16:07:06Z
Creation Date: 2020-03-31T16:07:06Z
Registry Expiry Date: 2021-03-31T16:07:06Z
Registrar: GoDaddy.com, LLC
Registrar IANA ID: 146
Registrar Abuse Contact Email: abuse@godaddy.com




sabato 28 marzo 2020

QTSensors su Ubuntu Touch (UBPorts) in QML

Visto che sto imparando a programmare UBPorts ho voluto provare a convertire questo progetto Android/Kotlin per QML. In pratica si tratta di leggere i valori dell'accelerometro e, ad intervalli regolari, inviare i dati ad server web con una richiesta GET


Per abilitare l'utilizzo della rete nella app si deve modificare il file apparmor
apparmor
===========================================
{
    "policy_groups": ["networking"],
    "policy_version": 16.04
}

===========================================


Main.qml
===========================================
/*
 * Copyright (C) 2020  Your FullName
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 3.
 *
 * ubuntu-calculator-app is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import QtQuick 2.7
import Ubuntu.Components 1.3
//import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import Qt.labs.settings 1.0

import QtSensors 5.0



MainView {
    id: root
    objectName: 'mainView'
    applicationName: 'acc2.luca.innocenti'
    automaticOrientation: true
   
    // variabili globali
    readonly property double radians_to_degrees: 180 / Math.PI
    property double pitch: 0.0
    property double roll: 0.0

    width: units.gu(45)
    height: units.gu(75)

    // un evento ogni 5 secondi
    Timer {
          interval: 5000
          running: true
          repeat: true
          onTriggered: {
            console.log("Timer")
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.open("GET", "http://192.168.1.102/index.php?pitch="+pitch.toFixed(3)+"&roll="+roll.toFixed(3), true); // false for synchronous request
            xmlHttp.send();

          }
      }


    Accelerometer {
        id: accel
        dataRate: 100
        active:true

        onReadingChanged: {
            var x = accel.reading.x
            var y = accel.reading.y
            var z = accel.reading.z
            pitch = calcPitch(x,y,z)
            roll = calcRoll (x,y,z)
            //etichetta.text=""+accel.reading.x+"\n"+accel.reading.y+"\n"+accel.reading.z
            etichetta.text = "Pitch : "+pitch.toFixed(1)+"\nRoll : "+roll.toFixed(1)

            function calcPitch(x,y,z) {
                return Math.atan2(y, z)*radians_to_degrees;

                }
            function calcRoll(x,y,z) {
                return Math.atan2(-x, Math.sqrt((y*y)+(z*z)))*radians_to_degrees;
                }

          }


        }



    Page {
        anchors.fill: parent

        header: PageHeader {
            id: header
            title: i18n.tr('acc2')
        }


        Label {
            anchors {
                top: header.bottom
                left: parent.left
                right: parent.right
                bottom: parent.bottom
            }
            id: etichetta
            text: i18n.tr('Luca')

            verticalAlignment: Label.AlignVCenter
            horizontalAlignment: Label.AlignHCenter
        }

    }
}

QML Mandelbrot in UBPorts / Ubuntu Touch

Ovviamente, visto che mi sono messo a studiare UBPorts, non poteva mancare un porting di Mandelbrot. La prima scelta e' stata QML che in pratica e' un sottoinsieme di HTML5 per quanto riguarda il codice

Il progetto completo in Clickable si trova a questo link
https://github.com/c1p81/lucainnoc-gmail.com

Piccola nota: il progetto e' dannatamente lento


Le icone nel progetto sono in formato .svg (Gimp non supporta direttamente questo formato)


===================================================================
/*
 * Copyright (C) 2020  Your FullName
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 3.
 *
 * ubuntu-calculator-app is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import QtQuick 2.7
import Ubuntu.Components 1.3
//import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import Qt.labs.settings 1.0
import QtQuick.Window 2.2


MainView {
    id: root
    objectName: 'mainView'
    applicationName: 'pixel.luca.innocenti'
    automaticOrientation: true

    width: Screen.width
    height: Screen.height

    Page {
        anchors.fill: parent

        header: PageHeader {
            id: header
            title: i18n.tr('Mandelbrot QML')
        }

Canvas {
id: canvas
width:  Screen.width
height:  Screen.height
  onPaint: {
      var context=canvas.getContext("2d")
           context.fillStyle="rgb(0,0,0)";
           context.fillRect(0, 0, width, height);
           var re_min = -2.0;
           var im_min = -1.2;
           var re_max = 0.7;
           var im_max = 1.2;
           var iterazioni = 25;
           var colori = ["#FFFFFF","#FF0000","#00FF00","#0000FF","#FF00FF","#FFFF00","#00FFFF","#FFaa00","#abcedf","#fedc0a","#ab16dd","#d00fba","#edabcc","#ddacff"];

           var r;
           var a,b;
           var x,y,x_new,y_new;
           var test;
           var k,j,i;
           var re_factor = (re_max-re_min);
           var im_factor = (im_max-im_min);
           for (var i=0;i<width;i++)
            {
            for (var j=0;j<height;j++)
             {
                 a = re_min+(j*re_factor/height);
                 b = im_min+(i*im_factor/width);
                 x = 0;
                 y = 0;
                 test = 0;
                 for (var k=0;k<iterazioni;k++)
                      {
                      x_new = (x*x)-(y*y)+a;
                      y_new = (2*x*y)+b;
                      if (((x_new*x_new)+(y_new*y_new))>4)
                            {
                              // colora il punto
                              r = k%12;
                              context.beginPath();
                              context.fillRect(i-1,j-1,1,1);
                              context.fillStyle=colori[r];
                              context.stroke();
                              break;
                            }
                      x = x_new;
                      y = y_new;
                      }
             }
           }
      }
}
}
}




Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...