1. 一个配置好的WiFi模块,他会不停的向周围发射Beacon帧,此帧包含了模块的一般信息。
  2. android app连接前待熟悉它的工作流程。它的工作流程是先建立一个wifiutil类对象,然后实例化,需要重写配置方法,初始化方法,连接方法,实例化对象WiFimanager和connectactivymanager,它们都是上下文context产生的,有专门的生成函数官网和github上一大堆。配置是非常重要的,你待说明它的加密方式,和ssid,Bssid,mac等等。然后通过一些官方的函数接口来WiFi连接。那么它到底是怎么从名称,密码,ip地址,端口号到建立Bind的呢?
  3. 首先,app待配置手机自己的WiFi模块,配置好之后就是连接模块,app连接时通过socket向WiFi模块根据ip地址端口号发送连接帧,WiFi模块的socket服务监听接受到这一帧信息,里面包含了密码,密码校验通过建立连接,启动连接管理。(正点原子的WiFi模块建立连接后2秒没有收到客户端的消息,会把客户端给踢下线,所以心跳帧就很重要)。这时你发送的数据都会被WiFi模块转发给它的控制模块。
  4. 连接上之后需要建立通信,而在android app中一般不会轮询,而是通过线程,线程发送协议帧。协议帧是按照选择自定义的。
//获取WiFi管理模块,获取WiFi连接模块,需要注册表声明网络权限和WiFi状态权限
public class wifi_util extends Activity{
 private ConnectivityManager connectivityManager;
 private WifiManager mWifiManager;
 Context mcontext;
 private ConnectivityManager.NetworkCallback  networkcallback;
//构造函数
 wifi_util(Context context){
   this.mcontext=context;
   //sdk版本大于Q,小于Q,方法为wifimanager.connect(wifiname,wifipwd);
   this.connectivityManager = (ConnectivityManager)
                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
   this.mWifiManager = (WifiManager) mContext.getSystemService(WIFI_SERVICE);
   this.networkcallback=new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(@NonNull Network network) {
                super.onAvailable(network);
                Log.i(TAG, "onAvailable 切换到指定wifi成功");
                //connectivityManager.unregisterNetworkCallback(networkCallback);
                connectivityManager.bindProcessToNetwork(network);
            }

            @Override
            public void onUnavailable() {
                super.onUnavailable();
                Log.i(TAG, "onUnavailable 切换到指定wifi失败");
                connectivityManager.unregisterNetworkCallback(networkCallback);
            }
        };
}
//一个连接函数,
public void linktowifi(String wifiName,String wifiPwd){
     //网络说明,它是谁
      NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
                .setSsid(wifiName)
                .setWpa2Passphrase(wifiPwd)
                .build();
        Log.d(TAG, "changeToWifiAfterQ: "+wifiName+wifiPwd);
       //打包网络请求
        NetworkRequest request =
                new NetworkRequest.Builder()
                        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)//监听WiFi变化action
                        .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)//允许应用程序在此网络上通信
                        .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)//信任此网络
                        .setNetworkSpecifier(specifier)
                        .build();
  //请连接,并绑定回调函数
       connectivityManager.requestNetwork(request,networkcallback);
}
}
//需要字节流转成字符流,解包,如果需要告诉ui或者别的的可以用message
//上面只是连接网络,要接受发送数据还待有套接字
public void main(){
Socket socket=new Socket(ip,port);
OutputStream ops=new OutputStream();
InputStream ips=new InputStream();
Byte[] storgestr=new byte[1024];
int offset=0;
int rec_len=storgestr.length;
Byte[] send_buff=new byte[1024];
new Thread(()->{
     ips.read(storgestr,offset,rec_len);
System.sleep(1000);
}).start();
new Thread(()->{
     ops.write(send_buff);
System.sleep(1000);
}).start();
}