初探WiFi - Wifi开关、信息扫描

本文深入探讨了Android系统中的WiFi基本框架与操作方法,包括WiFi相关类与接口使用、查询网卡状态、权限注册及WiFi实例应用。通过具体代码示例展示了如何设置WiFi状态、扫描热点信息以及实现WiFi管理功能。

接触了很久前端控件的东西,要改改口味,学学后台相关的东西,就先看看WiFi呗。

1.1 Android中的WiFi基本框架

Java应用层     Java应用
Java框架层     Android.net.wifi     
             
                     WiFi的JNI 
C框架层         WAP适配层
                     Wap_supplicant程序
 
内核空间        WiFi内核驱动程序


1.2 Android中WiFi的基本操作

1.2.1 WiFi相关类和接口

(1)ScanResult
主要是通过WiFi来扫描获取机器周边的WiFi热点信息。包括接入点名称、信号强弱、加密模式、频率等。其构造函数中包含几个参数:
  BSSID:接入点的Mac地址
  SSID:接入点的名字
  Capabilities:接入点的加密方式
  Frequency:频率,每一个频道交互的MHz数
  Level:等级,主要来判断网络连接的优先数

(2)WifiConfiguration 配置WiFi 网络,设置加密方式等信息。

(3)WifiInfo 得到WiFi信息
  getBSSID() 获取BSSID
  getDetailedStateOf() 获取客户端的连通性
  getHiddenSSID() 获得SSID 是否被隐藏
  getIpAddress() 获取IP 地址
  getLinkSpeed() 获得连接的速度
  getMacAddress() 获得Mac 地址
  getRssi() 获得802.11n 网络的信号
  getSSID() 获得SSID
  getSupplicanState() 返回具体客户端状态的信息


(4)WifiManage 管理WiFi连接


1.2.2 查询WiFi网卡状态

WIFI网卡的状态是由一系列的整形常量来表示的。
  1.WIFI_STATE_DISABLED : WIFI网卡不可用     (1)
  2.WIFI_STATE_DISABLING : WIFI网卡正在关闭 (0)
  3.WIFI_STATE_ENABLED : WIFI网卡可用         (3)
  4.WIFI_STATE_ENABLING : WIFI网正在打开     (2) (WIFI启动需要一段时间)

  5.WIFI_STATE_UNKNOWN  : 未知网卡状态

1.2.3 注册权限

<!-- 以下是使用wifi访问网络所需的权限 --> 
//修改网络状态的权限 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>  
//修改WiFi状态的权限
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
//访问网络权限 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>  
//访问WiFi权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>


1.3 WiFi实例  设置WiFi状态,扫描热点信息

appstart.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
     >

 <LinearLayout
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >  
<Button  
    android:id="@+id/scan"  
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:text="扫描网络"  
    />  
<Button  
    android:id="@+id/start"  
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:text="打开Wifi"  
    />  
<Button  
    android:id="@+id/stop"  
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:text="关闭Wifi"  
    />  
<Button  
    android:id="@+id/check"  
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:text="Wifi状态"  
    />  
  <TextView  
    android:id="@+id/allNetWork"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"   
    android:text="当前没有扫描到Wifi网络"  
    />  
    </LinearLayout>
</ScrollView>

WifiAdmin.java   封装了队WIFI的相关操作,例如开启WIFI、关闭WIFI等。
package com.hillfly.com;

import java.util.List;

import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;

public class WifiAdmin {
    //定义一个WifiManager对象
    private WifiManager mWifiManager;
    //定义一个WifiInfo对象
    private WifiInfo mWifiInfo;
    //扫描出的网络连接列表
    private List<ScanResult> mWifiList;
    //网络连接列表
    private List<WifiConfiguration> mWifiConfigurations;
    WifiLock mWifiLock;
    public WifiAdmin(Context context){
        //取得WifiManager对象
        mWifiManager=(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        //取得WifiInfo对象
        mWifiInfo=mWifiManager.getConnectionInfo();
    }
    //打开wifi
    public void openWifi(){
        if(!mWifiManager.isWifiEnabled()){
            mWifiManager.setWifiEnabled(true);
        }
    }
    //关闭wifi
    public void closeWifi(){
        if(mWifiManager.isWifiEnabled()){
            mWifiManager.setWifiEnabled(false);
        }
    }
     // 检查当前wifi状态  
    public int checkState() {  
        return mWifiManager.getWifiState();  
    }  
    //锁定wifiLock
    public void acquireWifiLock(){
        mWifiLock.acquire();
    }
    //解锁wifiLock
    public void releaseWifiLock(){
        //判断是否锁定
        if(mWifiLock.isHeld()){
            mWifiLock.release();
        }
    }
    //创建一个wifiLock
    public void createWifiLock(){
        mWifiLock=mWifiManager.createWifiLock("test");
    }
    //得到配置好的网络
    public List<WifiConfiguration> getConfiguration(){
        return mWifiConfigurations;
    }
    //指定配置好的网络进行连接
    public void connetionConfiguration(int index){
        if(index>mWifiConfigurations.size()){
            return ;
        }
        //连接配置好指定ID的网络
        mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId, true);
    }
    public void startScan(){
        mWifiManager.startScan();
        //得到扫描结果
        mWifiList=mWifiManager.getScanResults();
        //得到配置好的网络连接
        mWifiConfigurations=mWifiManager.getConfiguredNetworks();
    }
    //得到网络列表
    public List<ScanResult> getWifiList(){
        return mWifiList;
    }
    //查看扫描结果
    public StringBuffer lookUpScan(){
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<mWifiList.size();i++){
            sb.append("Index_" + new Integer(i + 1).toString() + ":");
             // 将ScanResult信息转换成一个字符串包  
            // 其中把包括:BSSID、SSID、capabilities、frequency、level  
            sb.append((mWifiList.get(i)).toString()).append("\n");
        }
        return sb;  
    }
    public String getMacAddress(){
        return (mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();
    }
    public String getBSSID(){
        return (mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();
    }
    public int getIpAddress(){
        return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();
    }
    //得到连接的ID
    public int getNetWordId(){
        return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();
    }
    //得到wifiInfo的所有信息
    public String getWifiInfo(){
        return (mWifiInfo==null)?"NULL":mWifiInfo.toString();
    }
    //添加一个网络并连接
    public void addNetWork(WifiConfiguration configuration){
        int wcgId=mWifiManager.addNetwork(configuration);
        mWifiManager.enableNetwork(wcgId, true);
    }
    //断开指定ID的网络
    public void disConnectionWifi(int netId){
        mWifiManager.disableNetwork(netId);
        mWifiManager.disconnect();
    }
}

WifiActivity.java

package com.hillfly.com;

import java.util.List;

import android.app.Activity;
import android.net.wifi.ScanResult;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class WifiActivity extends Activity {
    /** Called when the activity is first created. */
	  private TextView allNetWork;  
	    private Button scan;  
	    private Button start;  
	    private Button stop;  
	    private Button check;  
	    private WifiAdmin mWifiAdmin;  
	    // 扫描结果列表  
	    private List<ScanResult> list;  
	    private ScanResult mScanResult;  
	    private StringBuffer sb=new StringBuffer();  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.appstart);
        mWifiAdmin = new WifiAdmin(WifiActivity.this);  
        init();  
    }
    public void init(){
        allNetWork = (TextView) findViewById(R.id.allNetWork);  
        scan = (Button) findViewById(R.id.scan);  
        start = (Button) findViewById(R.id.start);  
        stop = (Button) findViewById(R.id.stop);  
        check = (Button) findViewById(R.id.check); 
        scan.setOnClickListener(new MyListener());  
        start.setOnClickListener(new MyListener());  
        stop.setOnClickListener(new MyListener());  
        check.setOnClickListener(new MyListener());  
    }
    private class MyListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch (v.getId()) {
			case R.id.scan://扫描网络
				  getAllNetWorkList();  
				break;
           case R.id.start://打开Wifi
        		mWifiAdmin.openWifi();
				Toast.makeText(WifiActivity.this, "状态:"+mWifiAdmin.checkState(), 1).show();
				break;
           case R.id.stop://关闭Wifi
				mWifiAdmin.closeWifi();
				Toast.makeText(WifiActivity.this, "状态:"+mWifiAdmin.checkState(), 1).show();
				break;
           case R.id.check://Wifi状态
        	   Toast.makeText(WifiActivity.this, "状态:"+mWifiAdmin.checkState(), 1).show();
				break;
			default:
				break;
			}
		}
    	
    }
    public void getAllNetWorkList(){
    	  // 每次点击扫描之前清空上一次的扫描结果  
    	if(sb!=null){
    		sb=new StringBuffer();
    	}
    	//开始扫描网络
    	mWifiAdmin.startScan();
    	list=mWifiAdmin.getWifiList();
    	if(list!=null){
    		for(int i=0;i<list.size();i++){
    			//得到扫描结果
    			mScanResult=list.get(i);
    			sb=sb.append(mScanResult.BSSID+"  ").append(mScanResult.SSID+"   ")
    			.append(mScanResult.capabilities+"   ").append(mScanResult.frequency+"   ")
    			.append(mScanResult.level+"\n\n");
    		}
    		allNetWork.setText("扫描到的wifi网络:\n"+sb.toString());
    	}
    }
}


手机测试结果:

转载于:https://my.oschina.net/hillfly/blog/174770

### 关于2024年智驾技术初探及相关GI框架或工具 #### 自动驾驶的技术趋势 随着人工智能和机器学习的发展,自动驾驶领域正在经历快速变革。到2024年,自动驾驶的核心技术主要集中在感知、决策和控制三个层面。感知层通过传感器融合实现高精度地图构建与实时环境监测;决策层则依赖深度强化学习模型来优化路径规划与行为预测;而控制层则更加注重车辆动态学建模与执行器协同控制[^1]。 #### GI(图形界面)框架的应用场景 在自动驾驶开发过程中,GI框架主要用于数据可视化、仿真测试以及人机交互等方面。以下是几个常见的GI框架及其特点: - **Qt Framework**: 提供跨平台支持,适合用于创建复杂的用户界面。其丰富的API库能够满足高性能需求下的图像渲染与事件处理功能[^4]。 - **Electron**: 虽然性能上可能不如原生应用高效,但对于需要快速迭代并希望利用Web前端技术栈的团队而言是一个不错的选择。它允许开发者使用HTML/CSS/JavaScript构建桌面应用程序[^5]。 - **Tkinter (Python)**: 如果项目规模较小或者仅作为原型验证阶段,则可以考虑采用简单易用且内置支持良好的Tkinter来进行初步界面搭建[^3]。 #### 工具推荐 针对具体任务可以选择不同的专用工具集: - 数据标注:LabelImg, CVAT. - 模拟训练:CARLA Simulator, LGSVL Simulator. - 性能评估:Autoware.Auto. ```python import cv2 as cv from tkinter import Tk, Label, Button def greet(): print("Hello!") root = Tk() label = Label(root,text="Welcome to Autonomous Driving!") button = Button(root,text="Start",command=greet) label.pack(side='top') button.pack() root.mainloop() ``` 上述代码片段展示了如何利用Python中的Tkinter模块建立一个基本窗口程序,这可用于展示简单的状态信息或其他轻量级操作提示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值