LINUX.ORG.RU

Ответ на: комментарий от leg0las

Я что-то делаю не так. Но что, понять не могу.

Задача - сменить статический IP-адрес. Есть код:

public void button2_getIP_Click(View v) {
    	Context contex = getBaseContext();
    	
    	WifiManager wifiman = (WifiManager) contex.getSystemService(Context.WIFI_SERVICE);
    	WifiInfo wifiInf = wifiman.getConnectionInfo();
    	ip = wifiInf.getIpAddress();
    	String ipStr;
    	if (ip != 0) {
    		ipStr = String.format("%d.%d.%d.%d", (ip & 0xff), (ip >> 8 & 0xff), (ip >> 16 & 0xff), (ip >> 24 & 0xff));    	   	
    	} else {
    		ipStr = "No IP";
    	}
    	TextView tv = (TextView)findViewById(R.id.textView1);
    	tv.setText(">"+ipStr+"<");
    	
    }
    
public void button1_setIP_Click(View v) {
    	
    	/**/
		EditText et = (EditText)findViewById(R.id.editText1);
		String edittext = et.getText().toString();
		
		
		try {
			Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", "ifconfig eth0 down"});
			Process proc1 = Runtime.getRuntime().exec(new String[] {"su", "-c", "ifconfig eth0 192.168.2.5 netmask 255.255.0.0 up"});
			proc = Runtime.getRuntime().exec(new String[] {"su", "-c", "ifconfig eth0"});
			InputStream instr = proc.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(instr));
			StringBuilder total = new StringBuilder();
			String line;
			
			int counter = 0;
			while ((line = br.readLine()) != null ) {
				total.append(line);
				counter++;
			}			
			Toast.makeText(getBaseContext(), ">"+total.toString()+"<", Toast.LENGTH_LONG).show();
			
		} catch(IOException e) {
			e.printStackTrace();
			//tv.setText("CRASH!!!");
		}		
    }

Метод button1_setIP_Click отрабатывает на ура и говорит что ip поменян, но button2_getIP_Click возвращает старый ip-адрес.

Возможно, надо сохранить значение нового ip где-нибудь в файле?

Dennis7 ()
Ответ на: комментарий от leg0las

Или поставить NDK и накодить что-то вроде этого?

  struct ifreq ifr;
  in_addr_t in_addr;
  struct sockaddr_in sin;

  memset(&ifr, 0, sizeof(struct ifreq));
  memset(&sin, 0, sizeof(struct sockaddr_in));
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  sprintf(ifr.ifr_name, "eth0");
  in_addr = inet_addr("192.168.101.17");
  sin.sin_addr.s_addr = in_addr;
  memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr));
  io = ioctl(sockfd, SIOCSIFADDR, (char *)&ifr);

Dennis7 ()
Ответ на: комментарий от Dennis7

у меня есть сильные подозерния, что менять его надо через тот же сервис, через который ты его читаешь (или через другой какой-то сервис), а не через ифконфиг.

aol ★★★★★ ()
Последнее исправление: aol (всего исправлений: 1 )
Ответ на: комментарий от aol

Не нашел ни одного такого сервиса в SDK. На stackoverflow народ как раз и советует ifconfig.

Dennis7 ()
Ответ на: комментарий от aol

Этот самый сервис может менять с помощью того же ifconfig (и скорее всего меняет), так что не суть важно.

leg0las ★★★★★ ()
Ответ на: комментарий от Dennis7

Я не кодер. Могу сказать что когда ковырял связку инет via usb (девайс относительно недавно, wifi-роутера пока нет), то юзал именно ifconfig. прекрасно отправляет в даун/апает, с соответствующей индикацией отключения/включения.

leg0las ★★★★★ ()
Ответ на: комментарий от drF_ckoff

Проверено опытным путем

ifconfig wlan0 
Не возвращает ничего
ifconfig eth0
Возвращает тот же ip-адрес, что и wifiman.getConnectionInfo()

Dennis7 ()
Ответ на: комментарий от drF_ckoff

какой-то у них урезаный ifconfig... тогда в /proc/net/dev посмотри имена интерфейсов

Смотрел, там lo и eth0.

В любом случае всем спасибо. Решение нашел.

Путь и имя файла - «/data/data/com.android.providers.settings/databases/settings.db». Это файл БД SQLite.

А вот и ip-адрес:

sqlite> select * from system where name="wifi_static_ip";
134|wifi_static_ip|192.168.2.5

Dennis7 ()
Ответ на: комментарий от Dennis7

А можно еще проще:

Settings.System.putString(getContentResolver(), Settings.System.WIFI_STATIC_IP, "192.168.1.55");

Dennis7 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.