package it.angelic.soulissclient.preferences; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; import android.util.Log; import android.widget.Toast; import java.net.InetAddress; import java.util.ArrayList; import java.util.List; import it.angelic.soulissclient.Constants; import it.angelic.soulissclient.R; import it.angelic.soulissclient.SoulissApp; import it.angelic.soulissclient.helpers.SoulissPreferenceHelper; import it.angelic.soulissclient.net.NetUtils; import it.angelic.soulissclient.net.UDPHelper; /** * Per funzionare dovresti aggiungere in SoulissApp un menù di configurazione * dove poter inserire i seguenti parametri: 1) Indirizzo IP da assegnare al * Gateway 2) Subnetmask 3) Gateway 4) SSID Rete Wireless a cui il nodo deve * collegarsi 5) Password rete wireless * <p/> * Il frame va inviato su vNet in broadcast (come quello per la ricerca del * gateway in automatico) con il payload formattato in questo modo: indirizzo ip * (4 byte) | subnetmask (4 byte) | gateway ip (4 byte) | lunghezza SSID (1 * byte) | lunghezza password (1 byte) | SSID (lunghezza SSID byte) | password * (lunghezza password byte). * <p/> * Il functional code associato è SETIP 0x3B. * <p/> * Questo frame va inviato solo su richiesta dell'utente e non ad ogni avvio e * deve esser possibile lasciare qualunque dei parametri non compilato, in quel * caso puoi utilizzare tutti zero. * <p/> * Ad esempio, se dovessero esserci solo le informazioni IP e non quelle per il * wifi il frame sarebbe: * <p/> * indirizzo ip (4 byte) | subnetmask (4 byte) | gateway ip (4 byte) | lenghezza * SSID (1 byte) = 1 | lunghezza password (1 byte) = 1 | SSID = 0 | password = * 0. * <p/> * Al contrario se dovessero esserci solo le informazioni del wifi, 0,0,0,0 (4 * byte) | 0,0,0,0 (4 byte) | 0,0,0,0 (4 byte) | lunghezza SSID (1 byte) | * lunghezza password (1 byte) | SSID | password. * <p/> * Souliss si aspetta una lunghezza fissa per i primi 4 parametri (4+4+4 byte) * ed una variabile per gli ultimi due parametri, con un minimo di 1 byte di * lunghezza e valore zero per entrambi. * * @author Del Pex */ public class BroadcastSettingsFragment extends PreferenceFragment { private SoulissPreferenceHelper opzioni; @Override public void onCreate(Bundle savedInstanceState) { opzioni = SoulissApp.getOpzioni(); // String settings; /* if (opzioni.isLightThemeSelected()) { getActivity().setTheme(R.style.LightThemeSelector); } else getActivity().setTheme(R.style.DarkThemeSelector);*/ super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings_broadcast); final EditTextPreference bcast_IP = (EditTextPreference) findPreference("bcast_IP"); final EditTextPreference bcast_subnet = (EditTextPreference) findPreference("bcast_subnet"); final EditTextPreference bcast_gateway = (EditTextPreference) findPreference("bcast_gateway"); final CheckBoxPreference bcast_isGateway = (CheckBoxPreference) findPreference("bcast_isgateway"); final CheckBoxPreference bcast_useDhcp = (CheckBoxPreference) findPreference("bcast_useDhcp"); final EditTextPreference bcast_ssid = (EditTextPreference) findPreference("bcast_ssid"); final EditTextPreference bcast_passwd = (EditTextPreference) findPreference("bcast_passwd"); final Preference sndBcast = findPreference("sndBcast"); if (bcast_subnet.getText() == null || bcast_subnet.getText().length() == 0) bcast_subnet.setText(NetUtils.getDeviceSubnetMaskString(getActivity())); bcast_subnet.setSummary(getString(R.string.bridge_subnet) + ": " + bcast_subnet.getText()); if (bcast_gateway.getText() == null || bcast_gateway.getText().length() == 0) bcast_gateway.setText(NetUtils.getDeviceGatewayString(getActivity())); bcast_gateway.setSummary(getString(R.string.bridge_gateway) + ": " + bcast_gateway.getText()); sndBcast.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { final List<Byte> bcastPayload = new ArrayList<>(); final List<Byte> ssidPayload = new ArrayList<>(); final List<Byte> passPayload = new ArrayList<>(); try { if (bcast_IP.getText().length() == 0) throw new Exception("empty parameter: IP address"); InetAddress i4 = InetAddress.getByName(bcast_IP.getText()); Log.d(it.angelic.soulissclient.Constants.TAG, "parsed bcast_IP parameter:" + i4.getHostAddress()); for (int tper = 0; tper < i4.getAddress().length; tper++) { bcastPayload.add(i4.getAddress()[tper]); } } catch (Exception e) { bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); } // SUBNET try { InetAddress is4 = InetAddress.getByName(bcast_subnet.getText()); Log.d(it.angelic.soulissclient.Constants.TAG, "parsed bcast_subnet parameter:" + is4.getHostAddress()); for (int tper = 0; tper < is4.getAddress().length; tper++) { bcastPayload.add(is4.getAddress()[tper]); } } catch (Exception e) { bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); } // GATEWAY try { InetAddress ig4 = InetAddress.getByName(bcast_gateway.getText()); for (int tper = 0; tper < ig4.getAddress().length; tper++) { bcastPayload.add(ig4.getAddress()[tper]); } Log.d(it.angelic.soulissclient.Constants.TAG, "parsed bcast_gateway parameter:" + ig4.getHostAddress()); } catch (Exception e) { bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); bcastPayload.add((byte) 0); } byte[] wifi = {0x0}; try { wifi = bcast_ssid.getText().getBytes(); Log.d(it.angelic.soulissclient.Constants.TAG, "parsed bcast_ssid parameter:" + bcast_ssid.getText()); int i = 0; while (i < wifi.length) { byte b = wifi[i]; ssidPayload.add(b);// lunghezza i++; } } catch (Exception e) { Log.e(it.angelic.soulissclient.Constants.TAG, "ERROR bcast_ssid parameter:" + bcast_ssid.getText() + e.getMessage()); } byte[] pass = {0x0}; try { pass = bcast_passwd.getText().getBytes(); Log.d(it.angelic.soulissclient.Constants.TAG, "parsed bcast_passwd parameter:" + bcast_passwd.getText()); for (byte b : pass) { passPayload.add(b);// lunghezza } } catch (Exception e) { Log.e(it.angelic.soulissclient.Constants.TAG, "ERROR bcast_passwd parameter:" + bcast_passwd.getText() + e.getMessage()); } new Thread(new Runnable() { @Override public void run() { UDPHelper.issueBroadcastConfigure(opzioni, Constants.Net.Souliss_UDP_function_broadcast_configure, bcastPayload, bcast_isGateway.isChecked(), bcast_useDhcp.isChecked()); Log.w(it.angelic.soulissclient.Constants.TAG, "Souliss_UDP_function_broadcast_configure sent"); if (ssidPayload.size() > 0) { UDPHelper.issueBroadcastConfigure(opzioni, Constants.Net.Souliss_UDP_function_broadcast_configure_wifissid, ssidPayload, null, null); Log.w(it.angelic.soulissclient.Constants.TAG, "Souliss_UDP_function_broadcast_configure_wifissid sent"); } if (passPayload.size() > 0) { UDPHelper.issueBroadcastConfigure(opzioni, Constants.Net.Souliss_UDP_function_broadcast_configure_wifipass, passPayload, null, null); Log.w(it.angelic.soulissclient.Constants.TAG, "Souliss_UDP_function_broadcast_configure_wifipass sent"); } final StringBuilder textOut = new StringBuilder(); int numSent= passPayload.size() + ssidPayload.size() + bcastPayload.size(); textOut.append(SoulissApp.getAppContext().getResources().getQuantityString(R.plurals.Bytes,numSent,numSent )).append(" "); textOut.append(SoulissApp.getAppContext().getString(R.string.command_sent)); getActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(SoulissApp.getAppContext(), textOut.toString(), Toast.LENGTH_SHORT).show(); } }); } }).start(); return true; } }); } }