android4.1.1 Settings WIFI模块浅析

[java] view plaincopy

  1. <span style="font-family: Arial, Helvetica, sans-serif;">Settings 中的WIFI功能主要在package/Settings/src/com/android/wifi/WifiSettings实现</span>

首先我们来看下WifiSettings类声明

[java] view plaincopy

  1. public class WifiSettings extends SettingsPreferenceFragment
  2. implements DialogInterface.OnClickListener  {
  3. ......
  4. }

继承SettingsPreferenceFragment,可见它是一个Fragment我们看到源码中的描述是这样的

/**
 * Two types of UI are provided here.
 *
 * The first is for "usual Settings", appearing as any other Setup fragment.
 *
 * The second is for Setup Wizard, with a simplified interface that hides the action bar
 * and menus.
 */

一、注册广播,接受相关wifi信息变化

WifiSettins类主要负责监测wifi状态,以及加载各个连接点,并负责Fragment界面的显示。
 在WifiSettings类中比较重要的一个类是WifiManager(稍后再说,一步一步来).
 在WifiSettings构造函数中初始化一个BroadcastReceiver,该BroadcastReceiver监测外部广播

[java] view plaincopy

  1. public class WifiSettings extends SettingsPreferenceFragment
  2. implements DialogInterface.OnClickListener  {
  3. ......
  4. public WifiSettings() {
  5. mFilter = new IntentFilter();//添加过滤器
  6. mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
  7. mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
  8. mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
  9. mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
  10. mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
  11. mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
  12. mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
  13. mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
  14. mReceiver = new BroadcastReceiver() {
  15. @Override
  16. public void onReceive(Context context, Intent intent) {
  17. handleEvent(context, intent);//事件处理函数
  18. }
  19. };
  20. mScanner = new Scanner();
  21. }
  22. ......
  23. @Override
  24. public void onResume() {
  25. super.onResume();
  26. if (mWifiEnabler != null) {
  27. mWifiEnabler.resume();
  28. }
  29. getActivity().registerReceiver(mReceiver, mFilter);//在onResume注册广播,获得相关wifi信息
  30. if (mKeyStoreNetworkId != INVALID_NETWORK_ID &&
  31. KeyStore.getInstance().state() == KeyStore.State.UNLOCKED) {
  32. mWifiManager.connect(mChannel, mKeyStoreNetworkId, mConnectListener);
  33. }
  34. mKeyStoreNetworkId = INVALID_NETWORK_ID;
  35. updateAccessPoints();
  36. }
  37. ......
  38. @Override
  39. public void onPause() {
  40. super.onPause();
  41. if (mWifiEnabler != null) {
  42. mWifiEnabler.pause();
  43. }
  44. getActivity().unregisterReceiver(mReceiver);//在onPause注销广播
  45. mScanner.pause();
  46. }
  47. ......
  48. }

广播的处理事件代码:

[java] view plaincopy

  1. private void handleEvent(Context context, Intent intent) {
  2. String action = intent.getAction();
  3. if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
  4. updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
  5. WifiManager.WIFI_STATE_UNKNOWN));
  6. } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||
  7. WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
  8. WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
  9. updateAccessPoints();
  10. } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
  11. //Ignore supplicant state changes when network is connected
  12. //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and
  13. //introduce a broadcast that combines the supplicant and network
  14. //network state change events so the apps dont have to worry about
  15. //ignoring supplicant state change when network is connected
  16. //to get more fine grained information.
  17. SupplicantState state = (SupplicantState) intent.getParcelableExtra(
  18. WifiManager.EXTRA_NEW_STATE);
  19. if (!mConnected.get() && SupplicantState.isHandshakeState(state)) {
  20. updateConnectionState(WifiInfo.getDetailedStateOf(state));
  21. }
  22. } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
  23. NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
  24. WifiManager.EXTRA_NETWORK_INFO);
  25. mConnected.set(info.isConnected());
  26. changeNextButtonState(info.isConnected());
  27. updateAccessPoints();
  28. updateConnectionState(info.getDetailedState());
  29. if (mAutoFinishOnConnection && info.isConnected()) {
  30. getActivity().finish();
  31. return;
  32. }
  33. } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
  34. updateConnectionState(null);
  35. }
  36. }

二、WifiMananger类是是操作wifi的核心类

WifiManager定义wifi各种状态、wifi Action、网络配置等

[java] view plaincopy

  1. public class WifiManager {
  2. .....
  3. public WifiManager(IWifiManager service, Handler handler) {
  4. mService = service;
  5. mHandler = handler;
  6. }
  7. ......
  8. }

从IWifiManager 可知道,它是通过远程调用,也就是基于RPC原理(有时间再总结一下)。
为了保证Settings和Wifi相互交互,注册相应的监听对象。

[java] view plaincopy

  1. public class WifiSettings extends SettingsPreferenceFragment
  2. implements DialogInterface.OnClickListener  {
  3. ......
  4. private WifiManager.ActionListener mConnectListener;//连接
  5. private WifiManager.ActionListener mSaveListener;//保存
  6. private WifiManager.ActionListener mForgetListener;//清除保存
  7. ......
  8. //继承SettingsPreferenceFragment并从写 onActivityCreated方法
  9. @Override
  10. public void onActivityCreated(Bundle savedInstanceState) {
  11. // We don‘t call super.onActivityCreated() here, since it assumes we already set up
  12. // Preference (probably in onCreate()), while WifiSettings exceptionally set it up in
  13. // this method.
  14. mP2pSupported = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT);
  15. mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
  16. mChannel = mWifiManager.initialize(getActivity(), getActivity().getMainLooper(), null);
  17. mConnectListener = new WifiManager.ActionListener() {
  18. public void onSuccess() {//连接成功
  19. }
  20. public void onFailure(int reason) {//连接失败
  21. Toast.makeText(getActivity(),
  22. R.string.wifi_failed_connect_message,
  23. Toast.LENGTH_SHORT).show();
  24. }
  25. };
  26. mSaveListener = new WifiManager.ActionListener() {
  27. public void onSuccess() {//保存成功
  28. }
  29. public void onFailure(int reason) {//保存失败
  30. Toast.makeText(getActivity(),
  31. R.string.wifi_failed_save_message,
  32. Toast.LENGTH_SHORT).show();
  33. }
  34. };
  35. mForgetListener = new WifiManager.ActionListener() {
  36. public void onSuccess() {//清除保存成功
  37. }
  38. public void onFailure(int reason) {//清除保存失败
  39. Toast.makeText(getActivity(),
  40. R.string.wifi_failed_forget_message,
  41. Toast.LENGTH_SHORT).show();
  42. }
  43. };
  44. if (savedInstanceState != null
  45. && savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
  46. mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
  47. mAccessPointSavedState = savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
  48. }
  49. final Activity activity = getActivity();
  50. final Intent intent = activity.getIntent();
  51. // first if we‘re supposed to finish once we have a connection
  52. mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
  53. if (mAutoFinishOnConnection) {
  54. // Hide the next button
  55. if (hasNextButton()) {
  56. getNextButton().setVisibility(View.GONE);
  57. }
  58. final ConnectivityManager connectivity = (ConnectivityManager)
  59. getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
  60. if (connectivity != null
  61. && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
  62. activity.finish();
  63. return;
  64. }
  65. }
  66. // if we‘re supposed to enable/disable the Next button based on our current connection
  67. // state, start it off in the right state
  68. mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
  69. if (mEnableNextOnConnection) {
  70. if (hasNextButton()) {
  71. final ConnectivityManager connectivity = (ConnectivityManager)
  72. getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
  73. if (connectivity != null) {
  74. NetworkInfo info = connectivity.getNetworkInfo(
  75. ConnectivityManager.TYPE_WIFI);
  76. changeNextButtonState(info.isConnected());
  77. }
  78. }
  79. }
  80. addPreferencesFromResource(R.xml.wifi_settings);//加载布局
  81. if (mSetupWizardMode) {
  82. getView().setSystemUiVisibility(
  83. View.STATUS_BAR_DISABLE_BACK |
  84. View.STATUS_BAR_DISABLE_HOME |
  85. View.STATUS_BAR_DISABLE_RECENT |
  86. View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS |
  87. View.STATUS_BAR_DISABLE_CLOCK);
  88. }
  89. // On/off switch is hidden for Setup Wizard
  90. if (!mSetupWizardMode) {
  91. Switch actionBarSwitch = new Switch(activity);
  92. if (activity instanceof PreferenceActivity) {
  93. PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
  94. if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
  95. final int padding = activity.getResources().getDimensionPixelSize(
  96. R.dimen.action_bar_switch_padding);
  97. actionBarSwitch.setPadding(0, 0, padding, 0);
  98. activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
  99. ActionBar.DISPLAY_SHOW_CUSTOM);
  100. activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
  101. ActionBar.LayoutParams.WRAP_CONTENT,
  102. ActionBar.LayoutParams.WRAP_CONTENT,
  103. Gravity.CENTER_VERTICAL | Gravity.RIGHT));
  104. }
  105. }
  106. mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);
  107. }
  108. mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
  109. getListView().setEmptyView(mEmptyView);
  110. if (!mSetupWizardMode) {
  111. registerForContextMenu(getListView());
  112. }
  113. setHasOptionsMenu(true);
  114. // After confirming PreferenceScreen is available, we call super.
  115. super.onActivityCreated(savedInstanceState);
  116. }
  117. ......
  118. }

三、用户on/off交互
用户通过Switch 开关按钮进行对wifi打开和关闭

[java] view plaincopy

  1. public class WifiSettings extends SettingsPreferenceFragment
  2. implements DialogInterface.OnClickListener  {
  3. ......
  4. public void onActivityCreated(Bundle savedInstanceState) {
  5. ......
  6. // On/off switch is hidden for Setup Wizard
  7. if (!mSetupWizardMode) {
  8. Switch actionBarSwitch = new Switch(activity);
  9. if (activity instanceof PreferenceActivity) {
  10. PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
  11. if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
  12. final int padding = activity.getResources().getDimensionPixelSize(
  13. R.dimen.action_bar_switch_padding);
  14. actionBarSwitch.setPadding(0, 0, padding, 0);
  15. activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
  16. ActionBar.DISPLAY_SHOW_CUSTOM);
  17. activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
  18. ActionBar.LayoutParams.WRAP_CONTENT,
  19. ActionBar.LayoutParams.WRAP_CONTENT,
  20. Gravity.CENTER_VERTICAL | Gravity.RIGHT));
  21. }
  22. }
  23. mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);//将actionBarSwitch传递给WifiEnabler
  24. }
  25. ......
  26. }
  27. ......
  28. }

WifiEnabler接受一个Switch对象和,并该对象进行操作
我们可以看下WifiEnabler这个类

[java] view plaincopy

  1. import android.content.BroadcastReceiver;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.content.IntentFilter;
  5. import android.net.NetworkInfo;
  6. import android.net.wifi.SupplicantState;
  7. import android.net.wifi.WifiInfo;
  8. import android.net.wifi.WifiManager;
  9. import android.provider.Settings;
  10. import android.widget.CompoundButton;
  11. import android.widget.Switch;
  12. import android.widget.Toast;
  13. import com.android.settings.R;
  14. import com.android.settings.WirelessSettings;
  15. import java.util.concurrent.atomic.AtomicBoolean;
  16. public class WifiEnabler implements CompoundButton.OnCheckedChangeListener  {
  17. private final Context mContext;
  18. private Switch mSwitch;
  19. private AtomicBoolean mConnected = new AtomicBoolean(false);
  20. private final WifiManager mWifiManager;
  21. private boolean mStateMachineEvent;
  22. private final IntentFilter mIntentFilter;
  23. private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
  24. @Override
  25. public void onReceive(Context context, Intent intent) {
  26. String action = intent.getAction();
  27. if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
  28. handleWifiStateChanged(intent.getIntExtra(
  29. WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN));
  30. } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
  31. if (!mConnected.get()) {
  32. handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState)
  33. intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
  34. }
  35. } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
  36. NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
  37. WifiManager.EXTRA_NETWORK_INFO);
  38. mConnected.set(info.isConnected());
  39. handleStateChanged(info.getDetailedState());
  40. }
  41. }
  42. };
  43. public WifiEnabler(Context context, Switch switch_) {
  44. mContext = context;
  45. mSwitch = switch_;
  46. mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
  47. mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
  48. // The order matters! We really should not depend on this. :(
  49. mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
  50. mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
  51. }
  52. public void resume() {
  53. // Wi-Fi state is sticky, so just let the receiver update UI
  54. mContext.registerReceiver(mReceiver, mIntentFilter);
  55. mSwitch.setOnCheckedChangeListener(this);
  56. }
  57. public void pause() {
  58. mContext.unregisterReceiver(mReceiver);
  59. mSwitch.setOnCheckedChangeListener(null);
  60. }
  61. public void setSwitch(Switch switch_) {
  62. if (mSwitch == switch_) return;
  63. mSwitch.setOnCheckedChangeListener(null);
  64. mSwitch = switch_;
  65. mSwitch.setOnCheckedChangeListener(this);
  66. final int wifiState = mWifiManager.getWifiState();
  67. boolean isEnabled = wifiState == WifiManager.WIFI_STATE_ENABLED;
  68. boolean isDisabled = wifiState == WifiManager.WIFI_STATE_DISABLED;
  69. mSwitch.setChecked(isEnabled);
  70. mSwitch.setEnabled(isEnabled || isDisabled);
  71. }
  72. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  73. //Do nothing if called as a result of a state machine event
  74. if (mStateMachineEvent) {
  75. return;
  76. }
  77. // Show toast message if Wi-Fi is not allowed in airplane mode
  78. if (isChecked && !WirelessSettings.isRadioAllowed(mContext, Settings.System.RADIO_WIFI)) {
  79. Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show();
  80. // Reset switch to off. No infinite check/listenenr loop.
  81. buttonView.setChecked(false);
  82. }
  83. // Disable tethering if enabling Wifi
  84. int wifiApState = mWifiManager.getWifiApState();
  85. if (isChecked && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) ||
  86. (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) {
  87. mWifiManager.setWifiApEnabled(null, false);
  88. }
  89. if (mWifiManager.setWifiEnabled(isChecked)) {
  90. // Intent has been taken into account, disable until new state is active
  91. mSwitch.setEnabled(false);
  92. } else {
  93. // Error
  94. Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show();
  95. }
  96. }
  97. private void handleWifiStateChanged(int state) {
  98. switch (state) {
  99. case WifiManager.WIFI_STATE_ENABLING:
  100. mSwitch.setEnabled(false);
  101. break;
  102. case WifiManager.WIFI_STATE_ENABLED:
  103. setSwitchChecked(true);
  104. mSwitch.setEnabled(true);
  105. break;
  106. case WifiManager.WIFI_STATE_DISABLING:
  107. mSwitch.setEnabled(false);
  108. break;
  109. case WifiManager.WIFI_STATE_DISABLED:
  110. setSwitchChecked(false);
  111. mSwitch.setEnabled(true);
  112. break;
  113. default:
  114. setSwitchChecked(false);
  115. mSwitch.setEnabled(true);
  116. break;
  117. }
  118. }
  119. private void setSwitchChecked(boolean checked) {
  120. if (checked != mSwitch.isChecked()) {
  121. mStateMachineEvent = true;
  122. mSwitch.setChecked(checked);
  123. mStateMachineEvent = false;
  124. }
  125. }
  126. private void handleStateChanged(@SuppressWarnings("unused") NetworkInfo.DetailedState state) {
  127. // After the refactoring from a CheckBoxPreference to a Switch, this method is useless since
  128. // there is nowhere to display a summary.
  129. // This code is kept in case a future change re-introduces an associated text.
  130. /*
  131. // WifiInfo is valid if and only if Wi-Fi is enabled.
  132. // Here we use the state of the switch as an optimization.
  133. if (state != null && mSwitch.isChecked()) {
  134. WifiInfo info = mWifiManager.getConnectionInfo();
  135. if (info != null) {
  136. //setSummary(Summary.get(mContext, info.getSSID(), state));
  137. }
  138. }
  139. */
  140. }
  141. }

WifiEnabler实现了CompoundButton.OnCheckedChangeListener接口类,可见它也是一个监听器,并且在构造函数中通过接受一个switch对象去观察switch状态。

时间: 2024-11-02 21:34:55

android4.1.1 Settings WIFI模块浅析的相关文章

Android4.4.2源码分析之WiFi模块(一)

由对Androidsetting的源码分析之WiFi模块的界面fragment为WiFisettings.java,关于setting模块的源码分析可以参考 Android系统源码剖析(一)---Settings 已经写了几篇关于Android源码的,源码代码量太大,所以如果想分析某个模块可能不知如何下手,说一下思路 1,分析源码英文阅读能力要够,想要分析某个模块一般找模块对应的英文,就是模块 2,找到之后首先查看清单配置文件Androidmani.fest,找到程序主界面activity 3,

Android4.4.2源码分析之WiFi模块(二)

接着上一篇继续对WiFi源码的分析 Android4.4.2源码分析之WiFi模块(一) onResume方法中 6>,首先是调用WiFiEnabler的resume方法对switch进行管理 接下来注册广播 getActivity().registerReceiver(mReceiver, mFilter); 广播监听的action如下 //wifi状态改变的action mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); //W

移植 wifi模块

本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中WiFi选项,将其置为on(打开),但最终结果是自动变成off(关闭).正在打开Wi-Fi.正在扫描等一系列不能正常打开WiFi的提示. 2.问题分析流程 WiFi打不开从硬件和软件两方面进行定位,一般是先硬件,然后软件.总体分析流程如图: 3.确认硬件可以识别 8192CU WiFi模块是基于usb接

用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯

最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 WIFI模块实现了这个功能.下面向大家就简单分享一下. 工具:网络调试助手  ESP8266  STM32F1开发板 首先,用网络调试助手来虚拟一个服务器,如下: 有了服务器后,接下来我们就要用WIFI来连接这个服务器.ESP8266 有三种工作模式,由于项目要求,我选用了STA中的客户端模式.下面

树莓派3uart wifi模块调试 (浪费了我3天时间的宝贵经验)

最开始我是连接一个wifi模块到我的arduino uno上,可是uno只有一个uart并且这个uart和usb串口相连的.出现了一些和很奇怪的问题.进入设置模式(m0=1 , m1=1)后,确实能够设置,设置的参数都保存成功了,但是使用c3c3c3无法获取到版本没有任何返回,可能当时是我的rx数据线的没有接触的问题. 后来我将两块uart wifi模块通讯,在电脑上外接usb转串口 (2个usb转换器,通讯一点问题没有,使用linux的minicom. minicom一定要将硬件流控制关闭,8

智能家居常用WiFi模块

WiFi模块 WiFi模块就是整个系统的控制中心,控制很简单,就是输出一个开关信号控制继电器,而这个模块的核心是WiFi的连接,手机连接WiFi时需要扫描,输入密码,而这类本身没有屏幕和键盘的硬件设备,要想快捷的接入WiFi网络就需要更加便捷的连接方案,这就是这些模块厂家的主要工作了,所以这些模块都提供类似的连接方案,即手机APP扫描WiFi,在APP上输入对应WiFi的连接密码后自动由APP发送到模块,完成模块和WiFi的连接,本质上是一样的,只是叫的名字不同而已,有的叫SimpleLink有

【手把手教你树莓派3 (二)】 启动wifi模块

概述 树莓派3内置了wifi和蓝牙模块,我们不用像以前的版本那样,再去购买一个外接的模块练到raspberry上. 当我们第一次启动了树莓派的时候,必然使用了网线,但是之后的每一次使用,我们当然更希望使用wifi连接树莓派和路由器,而且wifi模块内置在树莓派3中,何乐而不为? 下面介绍下如何启动wifi模块,这时还是要借助网线的. 使用图形界面: 这个很简单了,我们只要像以往的Linux系统一样,在右上角的菜单栏里面选择wifi,输入密码就可以了. 使用命令行: 当然,对于木有显示器的童靴,只

esp8266 wifi模块刷nodemcu固件并蓝牙串口调试

esp8266 wifi模块价格十分实惠.出厂是默认带AT指令的系统,通过串口使用at命令进行交互.但是可以刷别的固件,例如nodemcu. nodemcu可以用lua脚本控制模块,而且lua脚本的优势是非常容易编写,也不需要编译.本文简单的介绍一下在esp8266模块上烧写nodemcu固件,并简单的通过串口让模块接入AP. 下载nodemcu_flasher64bit.exe  这是一个nodemcu固件的烧写软件.我下载的是64为版本.32为版本地址为:http://www.nodemcu

Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析

转: http://blog.csdn.net/zqixiao_09/article/details/51146149 前面学习了SDIO接口的WiFi驱动,现在我们来学习一下USB接口的WiFi驱动,二者的区别在于接口不同.而USB接口的设备驱动,我们前面也有学习,比如USB摄像头驱动.USB鼠标驱动,同样都符合LinuxUSB驱动结构: USB设备驱动(字符设备.块设备.网络设备) | USB 核心 | USB主机控制器驱动 不同之处只是在于USB摄像头驱动是字符设备,而我们今天要学习的Wi