Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 50821 сообщений
Cообщения с меткой

android - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Android Architecture Components. Часть 3. LiveData

Пятница, 21 Июля 2017 г. 19:15 (ссылка)

image

Компонент LiveData — предназначен для хранения объекта и разрешает подписаться на его изменения. Ключевой особенностью является то, что компонент осведомлен о жизненном цикле и позволяет не беспокоится о том на каком этапе сейчас находиться подписчик, в случае уничтожения подписчика, компонент отпишет его от себя. Для того чтоб LiveData учитывала жизненный цикл используется компонент Lifecycle, но также есть возможность использовать без привязки к жизненному циклу.



Сам компонент состоит из классов: LiveData, MutableLiveData, MediatorLiveData, LiveDataReactiveStreams, Transformations и интерфейса: Observer.



Класс LiveData, являет собой абстрактный дженериковый класс и инкапсулирует всю логику работы компонента. Соответственно для создания нашего LiveData холдера, необходимо наследовать этот класс, в качестве типизации указать тип который мы планируем в нем хранить, а также описать логику обновления хранимого объекта.



Для обновления значения мы должны передать его с помощью метода setValue(T), будьте внимательны поскольку этот метод нужно вызывать с main треда в противном случае мы получим IllegalStateException, если же нам нужно передать значение из другого потока можно использовать postValue(T), этот метод в свою очередь обновит значение в main треде. Интересной особенностью postValue(T) является еще то, что он в случае множественного вызова, не будет создавать очередь вызовов на main тред, а при исполнении кода в main треде возьмет последнее полученное им значение. Также в классе присутствует два калбека:

onActive() — будет вызван когда количество подписчиков изменит свое значение с 0 на 1.

onInactive() — будет вызван когда количество подписчиков изменит свое значение с 1 на 0.

Их назначение соответственно уведомить наш класс про то, что нужно обновлять даные или нет. По умолчанию они не имеют реализации, и для обработки этих событий мы должны переопределить эти методы.

Давайте рассмотрим как будет выглядеть наш LiveData класс, который будет хранить wife network name и в случае изменения будет его обновлять, для упрощения он реализован как синглтон.

public class NetworkLiveData extends LiveData {
  private Context context;
  private BroadcastReceiver broadcastReceiver;
  private static NetworkLiveData instance;

  public static NetworkLiveData getInstance(Context context){
      if (instance==null){
          instance = new NetworkLiveData(context.getApplicationContext());
      }
      return instance;
  }

  private NetworkLiveData(Context context) {
      this.context = context;
  }

  private void prepareReceiver(Context context) {
      IntentFilter filter = new IntentFilter();
      filter.addAction("android.net.wifi.supplicant.CONNECTION_CHANGE");
      filter.addAction("android.net.wifi.STATE_CHANGE");
      broadcastReceiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
              WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
              String name = wifiInfo.getSSID();
              if (name.isEmpty()) {
                  setValue(null);
              } else {
                  setValue(name);
              }
          }
      };
      context.registerReceiver(broadcastReceiver, filter);
  }

  @Override
  protected void onActive() {
      prepareReceiver(context);
  }

  @Override
  protected void onInactive() {
      context.unregisterReceiver(broadcastReceiver);
      broadcastReceiver = null;
  }
}




В целом логика фрагмента следующая, если кто то подписывается, мы инициализируем BroadcastReceiver который будет нас уведомлять об изменении сети, после того как отписывается последний подписчик мы перестаем отслеживать изменения сети.



Для того чтоб добавить подписчика есть два метода: observe(LifecycleOwner, Observer) — для добавления подписчика с учетом жизненного цикла и observeForever(Observer) — без учета. Уведомления об изменении данных приходят с помощью реализации интерфейса Observer, который имеет один метод onChanged(T).

Выглядит это приблизительно так:

public class MainActivity extends LifecycleActivity implements Observer {
  private TextView networkName;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      networkName = (TextView) findViewById(R.id.network_name);
      NetworkLiveData.getInstance(this).observe(this,this);
      //NetworkLiveData.getInstance(this).observeForever(this);
  }

  @Override
  public void onChanged(@Nullable String s) {
      networkName.setText(s);
  }
}




Примечание: Этот фрагмент только для примера,  не используйте этот код в реальном проекте. Для работы с LiveData лучше использовать ViewModel(про этот компонент в следующей статье) или позаботиться про отписку обсервера вручную.

В случае использования observe(this,this) при повороте экрана мы будем каждый раз отписываться от нашего компонента и заново подписываться. А в случае использование observeForever(this) мы получим memory leak.




Помимо вышеупомянутых методов в api LiveData также входит getValue(), hasActiveObservers(), hasObservers(), removeObserver(Observer observer), removeObservers(LifecycleOwner owner) в дополнительных комментариях не нуждаются.



Класс MutableLiveData, является расширением LiveData, с отличием в том что это не абстрактный класс и методы setValue(T) и postValue(T) выведены в api, тоесть публичные.

По факту класс является хелпером для тех случаев когда мы не хотим помещать логику обновления значения в LiveData, а лишь хотим использовать его как Holder.

void update(String someText){
      ourMutableLiveData.setValue(String);
}




Класс MediatorLiveData, как понятно из названия это реализация паттерна медиатор, на всякий случай напомню: поведенческий паттерн, определяет объект, инкапсулирующий способ взаимодействия множества объектов,  избавляя их от необходимости явно ссылаться друг на друга. Сам же класс расширяет MutableLiveData и добавляет к его API два метода: addSource(LiveData, Observer)  и removeSource(LiveData). Принцип работы с классом заключается в том что мы не подписываемся на конкретный источник, а на наш MediatorLiveData, а источники добавляем с помощью addSource(..). MediatorLiveData в свою очередь сам управляет подпиской на источники.  

Для примера создадим еще один класс LiveData, который будет хранить название нашей мобильной сети:

public class MobileNetworkLiveData extends LiveData {
  private static MobileNetworkLiveData instance;
  private Context context;

  private MobileNetworkLiveData(Context context) {
      this.context = context;
  }

  private MobileNetworkLiveData() {

  }

  @Override
  protected void onActive() {
      TelephonyManager telephonyManager = (TelephonyManager) context
              .getSystemService(Context.TELEPHONY_SERVICE);
      String networkOperator = telephonyManager.getNetworkOperatorName();
      setValue(networkOperator);
  }

  public static MobileNetworkLiveData getInstance(Context context) {
      if (instance == null) {
          instance = new MobileNetworkLiveData(context);
      }
      return instance;
  }

}




И перепишем наше приложение так чтоб оно отображало название wifi сети, а если подключения к wifi нет, тогда название мобильной сети, для этого изменим MainActivity:

public class MainActivity extends LifecycleActivity implements Observer {
  private MediatorLiveData mediatorLiveData;
  private TextView networkName;


  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      networkName = (TextView) findViewById(R.id.network_name);
      mediatorLiveData = new MediatorLiveData<>();
      init();
  }


  private void init() {
      final LiveData network = NetworkLiveData.getInstance(this);
      final LiveData mobileNetwork = MobileNetworkLiveData.getInstance(this);
      Observer networkObserver = new Observer() {
          @Override
          public void onChanged(@Nullable String s) {
              if (!TextUtils.isEmpty(s))
                  mediatorLiveData.setValue(s);
              else
                  mediatorLiveData.setValue(mobileNetwork.getValue());
          }
      };
      Observer mobileNetworkObserver = new Observer() {
          @Override
          public void onChanged(@Nullable String s) {
                  if (TextUtils.isEmpty(network.getValue())){
                      mediatorLiveData.setValue(s);
                  }
          }
      };
      mediatorLiveData.addSource(network, networkObserver);
      mediatorLiveData.addSource(mobileNetwork,mobileNetworkObserver);
      mediatorLiveData.observe(this, this);
  }


  @Override
  public void onChanged(@Nullable String s) {
      networkName.setText(s);
  }
}




Как мы можем заметить, теперь наш UI подписан на MediatorLiveData и абстрагирован от конкретного источника данных. Стоит обратить внимание на то что значения в нашем медиаторе не зависят напрямую от источников и устанавливать его нужно в ручную.



Класс LiveDataReactiveStreams, название ввело меня в заблуждение поначалу, подумал что это расширение LiveData с помощью RX, по факту же, класс являет собой адаптер с двумя static методами: fromPublisher(Publisher publisher), который возвращает объект LiveData и toPublisher(LifecycleOwner lifecycle, LiveData liveData), который возвращает объект Publisher. Для использования этого класса, его нужно импортировать отдельно:

compile «android.arch.lifecycle:reactivestreams:$version»



Класс Transformations, являет собой хелпер для смены типизации LiveData, имеет два static метода:

map(LiveData, Function)  - применяет в main треде реализацию интерфейса Function и возвращает объект LiveData

, где T — это типизация входящей LiveData, а P желаемая типизация исходящей, по факту же каждый раз когда будет происходить изменения в входящей LiveData она будет нотифицировать нашу исходящую, а та в свою очередь будет нотифицировать подписчиков после того как переконвертирует тип с помощью нашей реализации Function. Весь этот механизм работает за счет того что по факту исходящая LiveData, является MediatiorLiveData.


LiveData location = ...;

LiveData locationString = Transformations.map(location, new Function() {
  @Override
  public String apply(Location input) {
      return input.toString;
  }
});




switchMap(LiveData, Function>)  - похож к методу map с отличием в том, что вместо смены типа в функции мы возвращаем сформированный объект LiveData.

LiveData location = ...;
LiveData getPlace(Location location) = ...;

LiveData userName = Transformations.switchMap(location, new Function>() {
  @Override
  public LiveData apply(Location input) {
      return getPlace(input);
  }
});




Базовый пример можно посмотреть в репозитории: git    



Также полезные ссылки:

https://developer.android.com/topic/libraries/architecture/livedata.html

https://developer.android.com/reference/android/arch/lifecycle/LiveData.html
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/333890/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Wi-Fi адаптер через OTG

Четверг, 20 Июля 2017 г. 18:14 (ссылка)





Идея перевести сетевую карту телефона в режим монитора разрушилась по причине собственной наивности и незнания элементарной информации о том, что подавляющее большинство мобильных сетевых карт этот самый режим монитора и не поддерживают.



Идея реализации задумки с помощью внешнего беспроводного Wi-Fi адаптера или «свистка», поддерживающего желанный режим монитора, рушилась десятки раз из-за новых и новых ошибок и потери веры в то, что это вообще возможно, но переросла в данную статью.



Итак, как подключить внешний Wi-Fi адаптер к устройству на Android или бег с препятствиями на дистанции «вставил — netcfg wlan0 up»:



Должно быть в наличии:




  1. Телефон на Android

  2. Поддержка OTG и сам OTG

  3. Terminal Emulator

  4. ROOT

  5. Исходники ядра



    FAQ — структура выглядит так:



    Скриншот





  6. Внешний Wi-Fi адаптер («свисток»)

  7. Его firmware

  8. Linux дистрибутив

  9. ADB (не обязательно, но так удобнее)



Мой случай:




  1. Samsung GT-P5100 Galaxy Tab 2 10.1, Андроид 4.2.2

  2. OTG «30-pin — USB»

  3. Terminal Emulator for Android

  4. ROOT

  5. Исходники стокового ядра 3.0.31-1919150 с сайта Самсунг

  6. Адаптер TP-LINK TL-WN722N на чипсете AR9271

  7. ath9k_htc/htc_9271.fw

  8. Дистрибутив Ubuntu 15.04 в VMware

  9. android-tools-adb



Начну. Но попрошу учесть, что далее все рассматривается для вышеперечисленного набора и алгоритм, скорее всего, не является универсальным, но отклонения незначительны.



I. Старт



Первым делом необходимо добыть фирмварь вашего адаптера. Вставляю адаптер в компьютер и выполняю команду dmesg. Нахожу:



...
[ 256.815266] usbcore: registered new interface driver ath9k_htc
...


Где слово правее слова driver — искомая информация. У меня это — ath9k_htc. Гуглю для него firmware. Качаю. Закидываю .fw-файл на телефон в /system/etc/firmware



Затем устанавливаю ADB:



apt-get install android-tools-adb



Третьим этапом качаю тулчейн (компилятор под ARM) отсюда. Там большой архив, мне нужна лишь папка android-platform_prebuilt-android-sdk-adt_r20-0-ga4062cc.zip\android-platform_prebuilt-a4062cc\linux-x86\toolchain\arm-eabi-4.4.3, которую я распаковываю в произвольное место.



II. Разгон



Для начала пишу терминале:



export ARCH=arm
export CROSS_COMPILE=~/тот самый произвольный путь/arm-eabi-4.4.3/bin/arm-eabi-


Затем перехожу в терминале в каталог с исходниками ядра, загруженными ранее, пишу



make help и получаю тучу информации, среди которой нужно найти нечто, заканчивающееся на _defconfig, у меня это:



...
android_espresso10_omap4430_r02_user_defconfig - Build for android_espresso10_omap4430_r02_user
...


Скопировал, затем:



make android_espresso10_omap4430_r02_user_defconfig


И в завершении запускаю графическую конфигурацию ядра:



make menuconfig


Появляется вот такое окно:



Скриншот




Продвигаюсь по маршрутам:




  1. Networking support -> Wireless

    Спускаюсь к Generic IEEE 802.11 Networking stack (mac80211) и нажимаю на пробел, наблюдая появление значка М перед этим пунктом




  2. Device Drivers -> Network device support -> Wireless LAN

    Ставлю М у своего чипсета, в моем случае — Atheros Wireless Cards

    Затем перехожу в сам этот раздел и внутри отмечаю все тем же пробелом и знаком M нужный мне пункт.



    Скриншот



  3. Exit -> Do you wish to save your new configuration? -> Yes



Далее захожу в папку с исходниками ядра и открываю файл Makefile. Нахожу строку CFLAGS_MODULE = и дописываю туда -fno-pic так, чтобы получилось:

CFLAGS_MODULE = -fno-pic
Сохраняю. Возвращаюсь в терминал, а если вы его закрыли, то в и каталог с исходниками тоже, и выполняю сначала make modules_prepare, а следом просто make. Результат потребует ожидания. Мой итоговый набор:



MODPOST 8 modules
CC drivers/net/wireless/ath/ath.mod.o
LD [M] drivers/net/wireless/ath/ath.ko
CC drivers/net/wireless/ath/ath9k/ath9k_common.mod.o
LD [M] drivers/net/wireless/ath/ath9k/ath9k_common.ko
CC drivers/net/wireless/ath/ath9k/ath9k_htc.mod.o
LD [M] drivers/net/wireless/ath/ath9k/ath9k_htc.ko
CC drivers/net/wireless/ath/ath9k/ath9k_hw.mod.o
LD [M] drivers/net/wireless/ath/ath9k/ath9k_hw.ko
CC drivers/net/wireless/bcmdhd/dhd.mod.o
LD [M] drivers/net/wireless/bcmdhd/dhd.ko
CC drivers/scsi/scsi_wait_scan.mod.o
LD [M] drivers/scsi/scsi_wait_scan.ko
CC net/mac80211/mac80211.mod.o
LD [M] net/mac80211/mac80211.ko
CC net/wireless/cfg80211.mod.o
LD [M] net/wireless/cfg80211.ko


Потребуются модули (.ko-файлы), включающие слово ath и mac80211.ko. Переношу их на телефон.



Можно использовать adb, работая через компьютер, а можно не использовать и работать через терминал телефона, печатая команды пальцами по экрану. Я выбрал adb.



Напомню, как он работает. Подключаю телефон через USB (отладка, естественно, включена) и выполняю:



adb start-server

adb shell

su




Я в телефоне и под рутом.



Смотрю, какие модули уже есть командой lsmod и выгружаю их все, если это возможно, командой rmmod имямодуля



Затем перехожу в каталог с вышеперечисленными модулями:



cd /sdcard/ваш путь/



Можно убедиться в их наличии командой ls.



a@ubuntu:~/Kernel$ adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
a@ubuntu:~/Kernel$ adb shell
shell@android:/ $ su
root@android:/ # cd /sdcard/temp
root@android:/sdcard/temp # ls
ath.ko
ath9k_common.ko
ath9k_htc.ko
ath9k_hw.ko
mac80211.ko


Загружаю их командой insmod имямодуля в такой и только такой последовательности (иначе просто не загрузится, выдавая ошибку):



ath.ko

ath9k_hw.ko

ath9k_common.ko

mac80211.ko

ath9k_htc.ko



III. Препятствия



В этом и вся соль, без которой статья была бы слишком простой.



1. Версии



Естественно, первая ошибка возникает на первом этапе.



insmod ath.ko



insmod: init_module 'ath.ko' failed (Exec format error)


Смотрю, что скажет об этом буфер сообщений ядра, выполнив команду dmesg:



... ath: version magic '3.0.31 SMP preempt mod_unload modversions ARMv7 p2v8' should be '3.0.31-1919150 SMP preempt mod_unload modversions ARMv7 p2v8'


Не совпадают версии. 3.0.31 не есть 3.0.31-1919150.



Решение:



Открываю тот самый Makefile в исходниках ядра и в самом верху файла нахожу:
VERSION = 3

PATCHLEVEL = 0

SUBLEVEL = 31

EXTRAVERSION =

NAME = Sneaky Weasel
Дописываю к EXTRAVERSION = недостающий кусок версии -1919150 так, чтобы получилось:
VERSION = 3

PATCHLEVEL = 0

SUBLEVEL = 31

EXTRAVERSION = -1919150

NAME = Sneaky Weasel
И сохраняю.

Заключительный этап пройдет в каталоге /include/config, где в файле kernel.release я поменяю 3.0.31 на 3.0.31-1919150

Снова make modules_prepare, make и далее по предыдущему пункту.



2. ewma



Загружая mac80211.ko снова имею ошибку, о которой dmesg скажет следующее:



<4>[ 3491.160949] C1 [         insmod] mac80211: Unknown symbol ewma_add (err 0)
<4>[ 3491.161865] C1 [ insmod] mac80211: Unknown symbol ewma_init (err 0)


Решение:



Чудом прочитав на одном из англоязычных форумов опасное, но единственное в интернете, «решение», я перехожу в /net/mac80211/ и в файлах rx.c и sta_info.c и просто удаляю [либо комментирую (//)] строки ewma_add(&sta->avg_signal, -status->signal); и ewma_init(&sta->avg_signal, 1024, 8); соответственно.



Скриншоты








Опять перекомпилирую модули и двигаюсь дальше.



3. Светодиод



При загрузке ath9k_htc.ko и mac80211.ko очередные ошибки, у mac80211.ko это:



dmesg
<4>[ 2435.271636] C1 [         insmod] mac80211: Unknown symbol led_trigger_unregister (err 0)
<4>[ 2435.271820] C1 [ insmod] mac80211: Unknown symbol led_brightness_set (err 0)
<4>[ 2435.271972] C1 [ insmod] mac80211: Unknown symbol led_blink_set (err 0)
<4>[ 2435.272033] C1 [ insmod] mac80211: Unknown symbol led_trigger_register (err 0)
<4>[ 2435.272155] C1 [ insmod] mac80211: Unknown symbol led_trigger_event (err 0)




А у ath9k_htc.ko это:



dmesg
<4>[ 2709.396392] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_start_tx_ba_cb_irqsafe (err 0)
<4>[ 2709.396972] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_free_hw (err 0)
<4>[ 2709.397155] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_alloc_hw (err 0)
<4>[ 2709.397216] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_start_tx_ba_session (err 0)
<4>[ 2709.397369] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_register_hw (err 0)
<4>[ 2709.397430] C1 [ insmod] ath9k_htc: Unknown symbol led_classdev_unregister (err 0)
<4>[ 2709.397491] C1 [ insmod] ath9k_htc: Unknown symbol __ieee80211_create_tpt_led_trigger (err 0)
<4>[ 2709.397766] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_get_buffered_bc (err 0)
<4>[ 2709.397827] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_find_sta (err 0)
<4>[ 2709.398284] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_stop_tx_ba_cb_irqsafe (err 0)
<4>[ 2709.398376] C1 [ insmod] ath9k_htc: Unknown symbol wiphy_to_ieee80211_hw (err 0)
<4>[ 2709.398498] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_queue_delayed_work (err 0)
<4>[ 2709.398712] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_rx (err 0)
<4>[ 2709.398895] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_wake_queues (err 0)
<4>[ 2709.399230] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_tx_status (err 0)
<4>[ 2709.399291] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_stop_queues (err 0)
<4>[ 2709.399505] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_iterate_active_interfaces_atomic (err 0)
<4>[ 2709.399597] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_unregister_hw (err 0)
<4>[ 2709.399749] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_beacon_get_tim (err 0)
<4>[ 2709.399871] C1 [ insmod] ath9k_htc: Unknown symbol led_classdev_register (err 0)
<4>[ 2709.399932] C1 [ insmod] ath9k_htc: Unknown symbol ieee80211_queue_work (err 0)




Если ieee80211_-ошибки от ath9k_htc.ko это потому что я пытаюсь его загрузить до mac80211.ko, то led_-ошибки от обоих модулей от того, что телефон не понимает, что делать со светодиодом на моем адаптере. Тут два варианта развития событий.



В первом просто убирается в графической конфигурации ядра значок [] напротив

Networking support -> Wireless -> Enable LED triggers и Device Drivers -> LED Support.



А во втором этот самый значок заморожен и снять его нельзя. Это значит, что при выборе моего адаптера, автоматически выбирается «поддержка» светодиода, убрать которую нельзя. Конечно же, это мой случай:



Скриншоты






Решение:



Кнопка помощи по Device Drivers -> LED Support выводит следующую информацию по разделу:



Скриншот




Меня интересует:
Defined at drivers/leds/Kconfig
А значит все настройки хранятся в данном файле. Долго я мучал Kconfig в /drivers/leds/ пока не додумался посмотреть такой же файл в своем /drivers/net/wireless/ath/ath9k, где нашел ответ на свой вопрос:


config ATH9K_HTC

tristate «Atheros HTC based wireless cards support»

depends on USB && MAC80211

select ATH9K_HW

select MAC80211_LEDS

select LEDS_CLASS

select NEW_LEDS

select ATH9K_COMMON

...
Сходу удаляю строки, включающие страшное слово LED, получаю



config ATH9K_HTC

tristate «Atheros HTC based wireless cards support»

depends on USB && MAC80211

select ATH9K_HW

select ATH9K_COMMON

...
и сохраняю. Теперь можно снимать галочки:



Скриншоты




Здесь и вовсе исчез пункт:





Опять и снова перекомпиляция, новые модули и т.п.



Вуаля. Все модули загружены. Выключаю Wi-Fi на телефоне и подключаю адаптер. Но светодиод на нем, как вы уже догадались, работать не будет. Оно и не нужно.



4. Версия firmware



Если все необходимые модули загрузились, но после подключения адаптера к телефону вы не наблюдаете ничего нового в выводе команды netcfg, то на помощь приходит все тот же dmesg.



[ 7582.477874] C0 [ khubd] ath9k_htc 1-1:1.0: ath9k_htc: Please upgrade to FW version 1.3

...
Скриншот




Решение:



Просто качаем другой фирмварь, но уже требуемой версии, и кладем его вместо прошлого.



IV. Финиш



Теперь никаких проблем быть не должно. Выключаю родной Wi-Fi, все модули загружены, фирмварь нужной версии. Вставляю адаптер и netcfg впервые приносит счастье. Устанавливаю для появившегося сетевого интерфейса режим монитора и поднимаю его. Успех!







Родной Wi-Fi выключен




Ну а как и зачем зачастую используется режим монитора, вы и так все знаете. Спасибо за внимание!



Aircrack через OTG







Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/333806/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
lenov_ru

GTA VISA Remaster By Dr.Gh0sT (обновлено v 10.1) Mod » Клуб пользователей планшетов на ANDROID / Lenovo IdeaTab A2109 8GB / Samsung Galaxy Tab 2 7.0 / Asus Transformer TF700T / NVIDIA Tegra 3

Среда, 19 Июля 2017 г. 19:57 (ссылка)
lenov.ru/games/simulyatory/...0-mod.html


GTA VISA Remaster - Уникальный большой глобальный мод на популярную игру GTA San Andreas, мод абсолютно полностью переписывает игру под стиль известной нам игры GTA 5, не менее популярной и любимой

Комментарии (0)КомментироватьВ цитатник или сообщество
lenov_ru

PBA 2k17 v 3.2 (Mod) » Клуб пользователей планшетов на ANDROID / Lenovo IdeaTab A2109 8GB / Samsung Galaxy Tab 2 7.0 / Asus Transformer TF700T / NVIDIA Tegra 3

Вторник, 18 Июля 2017 г. 22:44 (ссылка)
lenov.ru/games/sports/29791...2-mod.html


PBA 2k17 - загрузите обновленный Mod PBA 2k17 с обновленными реестрами, новичками, импортом и новым пользовательским интерфейсом, который может вам понравиться. Выберите любимую или любую другую

Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<android - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda