Phantom TX Wlan Power

Einleitung

mmexport1466867145528
Die Phantom 3 Standard ist ein faszinierender und spannender Multikopter. Das Hauptargument im Vergleich zu Advanced und zur Professional Variante ist der niedrige Kaufpreis.

Leider verwendet die Phantom 3 im Gegensatz zu ihren teureren Brüdern nicht die Moderne light Bridge auf LTE Basis, sondern setzt auf das nur bedingt geeignete WLAN Protokoll.

Im Gegensatz zu vorherigen Versionen wird bei der Phantom 3 die WLAN Sendeleistung, die je nach Land an die entsprechenden Vorgaben angepasst sein muss, nicht mehr über die Hardware (einem Schalter im Inneren der Fernbedienung), sondern über die Firmware gesteuert.

Hier noch mal auf einen Blick die wichtigsten Unterschiede im Bezug auf die Sendeleistung

HardwareBezeichnungFCC (US)CE (Europa)
FernbedienungBetriebsfrequenz5,25 - 5,75 GHz5,25 - 5,75 GHz
Reichweite1000 m500 m
Sendeleistung (EIRP)19 dBm14 dBm
Live View
(Livebild in DJI-APP)
Betriebsfrequenz2.4 GHz ISM2.4 GHz ISM
Reichweite1000 m500 m
Sendeleistung (EIRP)27 dBm20 dBm

Über den Mechanismus, der entscheidet, mit welcher Sendeleistung die Phantom 3 betrieben wird, finden sich in Internetforen so einige Gerüchte. So gibt es zum Beispiel die Vermutung, dass bei der Registrierung des Multikopters über das Internet die Sendeleistung eingestellt wird.

In diesem Beitrag gehen wir der Sache mal etwas näher auf den Grund

DJI Android App

Um mehr herauszufinden, muss erstmal die Android App von DJI durch den Decompiler, um die Struktur besser analysieren zu können.

Eine kurze Suche nach GPS Koordinaten fördert sechs interessante Einträge zu Tage:

 55.529627, 15.702531, 2824.707
-29.63077,  24.718358, 1038.280
 18.20013,  78.10576,  1585.814
 24.41194, 93.17285, 1044.521
-23.950101, 135.518546, 4285.467
 35.628727, 129.950682, 643.505

Na das sieht doch verdächtig nach GPS Koordinaten mit Radius aus. Das sehen wir uns mal näher an. Also ab zu FreemapTools und das ganze in eine Karte eingezeichnet.


dji_ce_map-1024x733

Volltreffer. Es wird also Zeit, sich die App mal ein wenig genauer anzusehen.
Als erstes lohnt es sich, einen Blick darauf zu werfen, welche Funktionen diese Koordinaten verwenden.
Also wieder zurück zum Decompiler…


static {
a.a = new ArrayList();
a.a.add(new dji.b.f.a$a(55.529627, 15.702531, 2824707));
a.a.add(new dji.b.f.a$a(-29.63077, 24.718358, 1038280));
a.a.add(new dji.b.f.a$a(18.20013, 78.10576, 1585814));
a.a.add(new dji.b.f.a$a(24.41194, 93.17285, 1044521));
a.a.add(new dji.b.f.a$a(-23.950101, 135.518546, 4285467));
a.a.add(new dji.b.f.a$a(35.628727, 129.950682, 643505));
}

public static boolean a(double arg12, double arg14) {
float[] v8 = new float[3];
Iterator v11 = a.a.iterator();
do {
if(v11.hasNext()) {
Object v9 = v11.next();
Location.distanceBetween(((dji.b.f.a$a)v9).a, ((dji.b.f.a$a)v9).b, arg12, arg14, v8);
if(v8[0] > (((float)((dji.b.f.a$a)v9).c))) {
continue;
}

break;
}
else {
return false;
}
}
while(true);

boolean v0 = true;
return v0;
}

Interessant ist vor allem Zeile 17. Hier wird eine Android Funktion aufgerufen, die zwischen zwei GPS Koordinaten die Distanz errechnet. Den passenden Radius haben wir schon oben in der Tabelle.

Mit frida.re [1] kann diese Funktion zur Programmlaufzeit beobachtet werden.

Ein kurzer Test ergibt:

Die Funktion wird zyklisch jede Sekunde aufgerufen sobald die Phantom 3 GPS Kontakt hat. Dabei werden eindeutig die GPS Koordinaten aus der Phantom 3 verglichen. Also mit einem gefakten Handy GPS Standort lässt sich hier schon mal nichts ausrichten.

Wenn man dem Stack folgt findet man die nächste interessante Funktion


public class DataRcSetPowerMode extends u implements d {
public enum DJIRcPowerMode {
public static final enum DJIRcPowerMode a;
public static final enum DJIRcPowerMode b;
public static final enum DJIRcPowerMode c;
private int d;

static {
DJIRcPowerMode.a = new DJIRcPowerMode("CE", 0, 0);
DJIRcPowerMode.b = new DJIRcPowerMode("FCC", 1, 1);
DJIRcPowerMode.c = new DJIRcPowerMode("OTHER", 2, 100);
DJIRcPowerMode.e = new DJIRcPowerMode[]{DJIRcPowerMode.a, DJIRcPowerMode.b, DJIRcPowerMode
.c};
}

Mit frida ist es zum Glück problemlos möglich die Klasse so anzupassen, dass die Funktion den FCC Wert zurückgibt.

Um zu überprüfen, wie sich die Änderung auswirkt, hilft nur der Spectrum Analyser weiter.
4282016182833-1024x627

Ergebnis: Bei 5 GHz gibt es tatsächlich eine Änderung. Im ISM Band bei 2.4 GHz tut sich leider noch nicht so viel.

Also nochmal zurück zum Decompiler und siehe da, es gibt noch eine zweite Funktion:


public class DataWifiSetPowerMode extends u implements d {
public enum DJIWifiPowerMode {
public static final enum DJIWifiPowerMode c;
private int d;

static {
DJIWifiPowerMode.a = new DJIWifiPowerMode("FCC", 0, 0);
DJIWifiPowerMode.b = new DJIWifiPowerMode("CE", 1, 1);
DJIWifiPowerMode.c = new DJIWifiPowerMode("OTHER", 2, 100);
DJIWifiPowerMode.e = new DJIWifiPowerMode[]{DJIWifiPowerMode.a, DJIWifiPowerMode.b, DJIWifiPowerMode
.c};
}

Ein kleiner Patch für beide Funktionen zeigt tatsächlich das gewünschte Ergebnis. Die Phantom 3 ist im FCC Modus mit erhöhter Sendeleistung.

Da das Frida Framework nicht besonders alltagstauglich ist, muss eine elegantere Lösung her. Für solche Zwecke eignet sich das xposed framework [2] besser. Es setzt allerdings einen root Zugang zu einem Android Smartphone / Tablet voraus.

Das zugehörige Xposed Modul wird in den nächsten Wochen für die neue DJI Go Version 3.0 angepasst. Hinweis: dieses Modul darf nur eingesetzt werden, wenn der Betreiber der Phantom 3 sich in einem Bereich befindet, in dem eine höhere Sendeleistung legal ist.

Firmware der Phantom 3S

Nach der App ist auch die Firmware auf der Phantom 3 einen Blick wert. Erfreulicherweise hat bereits vor einigen Monaten jemand die root Zugangsdaten für den FTP Zugang zur Fernbedienung und der Phantom 3S in einem chinesischen Forum veröffentlicht. Mit Benutzername: root und dem Passwort Big~9China erhält man unter den IP Adressen (wenn man mit dem WLAN Netz der Fernbedienung verbunden ist) über 192.168.1.1 und 192.168.1.2 Zugriff auf Fernbedienung beziehungsweise die Phantom 3S

Auszug aus /etc/config/rcS

insmod /lib/modules/3.10.49/ath.ko
country=`fw_printenv -n country`
if [ $country = "GB" ];then
insmod /lib/modules/3.10.49/ath9k_hw.ko cert_country=1
else
insmod /lib/modules/3.10.49/ath9k_hw.ko
fi
insmod /lib/modules/3.10.49/ath9k_common.ko
insmod /lib/modules/3.10.49/ath9k.ko

ifconfig lo 127.0.0.1 up
/usr/sbin/udhcpd -S /etc/udhcpd.conf &
#telnetd -l /bin/ash &
mkdir -m 0755 -p /var/run/vsftpd
/usr/sbin/vsftpd &
djiled.sh &

iw phy phy0 set retry short 1 long 1
iw phy phy0 set rts off
iw phy phy0 set frag 256
iw dev wlan0 set noack_map 0x00c0

Interessant ist auf den ersten Blick der WLAN Treiber.

Allerdings ist nicht ganz ersichtlich wie der WLAN Treiber parametriert wird. Skalieren übliche Werte wie TXPOWER direkt mit der Sendeleistung? Auch dürfte eine einfache Änderung hier nicht reichen, da die Werte, wie oben beschrieben, im Sekundentakt von der DJI Go App überschrieben werden.

Sinnvoller ist es die Software zur Steuerung auf der Phantom 3 und auf der Fernbedienung näher zu analysieren. Dies wird Gegenstand eines der nächsten Beiträge auf dieser Seite sein.

Warnung: Wenn jemand beschließen sollte Werte oder die Software in der Phantom 3 zu verändern: Bitte sei äußerst vorsichtig und verantwortungsvoll. Durch falsche Werte kann die Hardware beschädigt werden. Welche Folgen das im Betrieb haben kann, dürfte sich jeder selber ausmalen können.
Wie die Tabelle oben zeigt, liegt beispielsweise die Sendeleistung der Fernbedienung im 5GHz Band bei maximal 14dBm.

[1] http://frida.re
[2] http://forum.xda-developers.com/showthread.php?t=3034811

Leave a Reply

Your email address will not be published.