Android移动开发:WIFI热点通信(一)

本文详细介绍Android平台上WIFI热点通信的实现方法,包括热点创建、搜索和连接等关键步骤,并提供了核心代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android移动开发:WIFI热点通信(一)
http://tech.techweb.com.cn/thread-635449-1-1.html

(出处: TechWeb-技术社区)



今天主要讲解WIFI热点通信的前期准备工作:

          1.热点创建:创建指定名称的热点。

          2.热点搜索:搜索附近可用热点,生成列表。

          3.热点连接:在列表中点击指定名称的WIFI项,进行连接操作。


一.框架搭建

说明:

  1.几个权限:

  1.   <uses-permission android:name="android.permission.INTERNET" />
  2.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />7 q; Y; D3 s: [$ [
  3.     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />9 L0 C; }; i& `/ V! B% t
  4.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />7 S; F1 A# j( n: R) G. ^# @
  5.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />9 M0 X( s. a" k' Z* F% e
  6.     <uses-permission android:name="android.permission.WAKE_LOCK" />
复制代码
   2.相关类图:
 9 H2 P7 l' H  W: R$ O9 W7 p

二.模块讲解

    接下来通过以下三个部分功能来逐一剖析,在此之前首先看一张最终的效果图加深以下印象:

 / B: R- U  o5 ?8 c! ]( H- O

(由于本章讲解的部分是我的整个项目中的一部分,所以大家不用在意图片素材等其他细节)


2.1热点创建


点击WIFI管理界面中创建热点按钮,首先会检测当前WIFI是否可用,若可用则需将其关闭掉才能创建WIFI热点,因为手机热点把手机的接收GPRS或3G信号转化为WIFI信号再发出去,即你的手机就成了一个WIFI热点,所以共享和接收功能是不能同时进行的。之后就是创建指定名称的热点过程。热点创建时序图如下图所示。

几个核心方法:3 T8 A$ W) n# j

  • startApWifiHot()


  1. /**
  2. * create a hot wifi% ^5 S6 S3 A( G) B( L9 {- F/ E6 {" }

  3. * @param wifiName+ K1 E5 _1 \) T4 B
  4. */- ~/ ~2 c: k; _% m5 W/ p
  5. public boolean startApWifiHot(String wifiName) {
  6.     Log.i(TAG, "into startApWifiHot(String wifiName) wifiName = " + wifiName);* ?! I4 T2 K  p) G# q
  7.     if (wifiManager.isWifiEnabled()) {
  8.         wifiManager.setWifiEnabled(false);7 O7 O' {) K* k# q6 @
  9.     }% u1 r( F6 [! m8 {
  10.     if (mWifiHotAdmin != null) {
  11.         return mWifiHotAdmin.startWifiAp(wifiName);
  12.     }! l2 q1 }" T! D2 M9 {
  13.     Log.i(TAG, "out startApWifiHot(String wifiName)");
  14.     return false;
  15. }
复制代码
+ g4 B6 w5 r  I3 p4 w3 k
  • createWifiAp()
    9 k; W; A' w' [8 w/ ?9 E
  1. /**
  2. * start hot pot- Q; o" M# [. O; P
  3. * @param wifiName
  4. * @return; Z# t& d# M/ f7 G
  5. */0 P/ i/ c4 T  J; N3 {
  6. private boolean createWifiAp(String wifiName) {
  7.     Log.i(TAG, "into startWifiAp() 启动一个Wifi 热点!");* C* U' y" w+ h9 T; t  k5 j( P
  8.     Method method1 = null;0 q- F# C+ z/ z$ T4 d! K" @$ ^
  9.     boolean ret = false;5 y* E( t0 c4 n9 l/ }
  10.     try {( p/ m2 q0 |: ?3 b
  11.         //setWifiApEnabled is @hide, so reflect 
  12.         method1 = mWifiManager.getClass().getMethod("setWifiApEnabled",
  13.             WifiConfiguration.class, boolean.class);0 F/ X( w* [; f" K! f# a" i" b
  14.         WifiConfiguration apConfig = createPassHotWifiConfig(wifiName,Global.PASSWORD);  w' p# a3 K+ D
  15.         ret = (Boolean) method1.invoke(mWifiManager, apConfig, true);
  16.     } catch (IllegalArgumentException e) {. b# N% q7 b( n
  17.         e.printStackTrace();1 g( T$ ?+ J& j/ l! A$ l0 E
  18.         Log.d(TAG, "stratWifiAp() IllegalArgumentException e");
  19.     } 
  20.     Log.i(TAG, "out startWifiAp() 启动一个Wifi 热点!");' g6 d% Y: V& v7 k& d  b0 h
  21.     return ret;& V* j$ p7 C6 X) p) e8 H
  22. }
复制代码
5 y% ]1 H. h( m) u0 k" H5 G

2.2热点搜索

点击WIFI管理界面中搜索热点按钮,同创建一样,首先需要检测WIFI热点是否关闭,将其关闭掉后才能打开WIFI搜索功能。在搜索完成后系统会发送WIFI状态变化广播来通知消息栏,这里通过自定义广播接收器接收了搜索成功消息,最后通过回调MainActivity中disPlayWifiScanResult()来显示WIFI列表。

几个核心方法:

  • scanWifiHot()
    ! }8 H  W: c9 l# ]5 m
  1. /** scan wifi hot **/& I5 f/ d0 A: H* V  b
  2. public void scanWifiHot() {
  3.     Log.i(TAG, "into wifiHotScan()");# b% M: p+ U( n" C9 [( Z/ {5 G+ D
  4.     if(mWifiHotAdmin.isWifiApEnabled(wifiManager)) {2 i3 f1 f1 z$ o$ }& _+ `' T& g, f
  5.         mWifiHotAdmin.closeWifiAp();& B+ R6 ], Y8 N; v3 X0 V
  6.     }
  7.     if (!wifiIsOpen()) { // WIFI is close currently
  8.         //listen to the specified SSID wifi state 
  9.         registerWifiStateBroadcast("");
  10.         mWifiStateReceiver.setOperationsType(OperationsType.SCAN);% v! C, ?' H$ o# n: ~
  11.        " z- H$ ]  r. g& B9 Y. i( V
  12.         //open wifi
  13.         openWifi();; C( w5 p$ p8 Q, W2 u
  14.     } else { // WIFI is open currently
  15.         scanNearWifiHots();+ @% j2 e7 c9 q* \
  16.     }& j! D% x% o/ s! N
  17.     Log.i(TAG, "out wifiHotScan()");
  18. }
复制代码

  • scanNearWifiHots()

  1. /** scan near wifi **/+ s' N0 P4 d2 E1 N' t
  2. private void scanNearWifiHots() {& D- t% M! Y! k/ @! E; M* j7 @! ?" E
  3.     registerWifiScanBroadcast();
  4.     //start scan, D, ~* K+ B/ t8 h
  5.     wifiManager.startScan();
  6. }
复制代码
说明:这里的扫描实现过程是通过调用系统中WifiManager中扫描功能。
  1.   /**6 ~7 p3 D6 A4 P# u' O
  2.      * Request a scan for access points. Returns immediately. The availability
  3.      * of the results is made known later by means of an asynchronous event sent8 Z0 F( |4 C8 e% S! ^/ a4 R/ W" L3 S
  4.      * on completion of the scan.3 b3 v* @0 D5 n! Y7 a. c. ~8 W
  5.      * @return {@code true} if the operation succeeded, i.e., the scan was initiated
  6.      */" S7 a) ?+ b- `9 s2 V
  7.     public boolean startScan() {
  8.         try {
  9.             mService.startScan(false);
  10.             return true;) i7 U1 f4 h2 W2 J3 u0 \/ F
  11.         } catch (RemoteException e) {" R1 e& _. T8 b2 @  b$ R2 a( e
  12.             return false;$ _( K4 a1 a# I9 m! y
  13.         }
  14.     }
复制代码

2.3热点连接

在搜索完成之后,需要在WIFI列表中找到游戏的热点,点击连接过程会处理一系列逻辑:当前WIFI可用、是否已经连接、注册WIFI状态变化广播等,之后,开启独立线程进行热点匹配连接,热点连接时序图如图所示。

几个核心方法:

  • connectToHotpot()
    9 X) B$ E! k3 _% ~, k1 ^
  1. /**
  2. * connect to hotpot
  3. - i  G. r; c! h; _- f+ s! c
  4. * @param ssid
  5. * @param wifiList
  6. * @param password
  7. */" |+ u& k4 V7 u4 Q! u# t
  8. public void connectToHotpot(String ssid, List<ScanResult> wifiList, String password) {
  9.     if (ssid == null || password.equals("") || !ssid.equals(Global.HOTPOT_NAME)) {4 \- d2 h# W0 h
  10.         Log.d(TAG, "WIFI ssid is null or ");; a) L$ D8 o8 J: M% {
  11.         mWifiBroadCastOperator.disPlayWifiConnResult(false, null);
  12.         return;
  13.      }5 y- s+ a2 Y2 C) M+ s2 V
  14.      if (ssid.equalsIgnoreCase(mSSID) && isConnecting) {# @" o6 d/ j0 R6 F+ Q* B- a
  15.         Log.d(TAG, "same ssid is  connecting!");
  16.         mWifiBroadCastOperator.disPlayWifiConnResult(false, null);  u7 t5 q8 ~3 n  }5 G
  17.         return;/ P/ E/ D9 l+ {
  18.      }
  19.     if (!checkCoonectHotIsEnable(ssid, wifiList)) {; p7 ?- I) \* _* l, R/ D* V8 [
  20.         Log.d(TAG, "ssid is not in the wifiList!");
  21.         mWifiBroadCastOperator.disPlayWifiConnResult(false, null);
  22.         return;; D+ F: I& F" V9 v" d
  23.     }2 L: Q8 ~2 S9 H
  24.     if (!wifiIsOpen()) {
  25.         //listen to ssid wifi! Y" a% j+ h; H( {  v  O% d; D
  26.         registerWifiStateBroadcast(ssid);
  27.         mWifiStateReceiver.setOperationsType(OperationsType.CONNECT);. s7 [+ J. F. P% `6 t( u8 G
  28.          & H  a: P4 ^  w. r! g
  29.         //open wifi+ V) C5 ^! P& D: N" g+ u, A1 F
  30.         openWifi();
  31.     } else {
  32.         // real connecting( j9 E3 A: V" ]% z- e
  33.         enableNetwork(ssid, password);
  34.     }
  35. }
复制代码
( h- a- N! ]; t' a: }8 H
  • enableNetwork()
    - r5 t8 K$ C+ L! s3 \/ f0 G
  1. /**
  2. * connect wifi hot really by thread4 B1 j" z. e( g+ V8 R' N1 E1 E) M
  3. 7 K3 ~* Y. p* R" g% T2 F, z
  4. * @param ssid, L- T7 I' G) o
  5. * @param password3 D) h$ m: |5 X+ u( y
  6. */
  7. private void enableNetwork(final String ssid, final String password) {
  8.     // delete more conneted wifi! _& b5 c' B. }* v5 N7 u
  9.     deleteMoreCon(ssid);
  10.     registerWifiConnectBroadCast();: m, d( D4 `, f; q
  11.      
  12.     new Thread(new Runnable() {
  13.         @Override* G* Q' p4 Z$ v
  14.         public void run() {; H, ~' ^/ f# R2 p
  15.              WifiConfiguration config = WifiHotConfigAdmin.createWifiNoPassInfo(ssid,             password);( V4 R) x% s9 {8 \0 P# Q5 u
  16.             // if connect is successful
  17.             isConnecting = connectHotSpot(config); 
  18.             mSSID = ssid;- z& o, a* e+ T& L
  19.             if (!isConnecting) {8 Q' e$ K0 ^1 k2 `
  20.                 Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) isConnecting             =" + isConnecting);) ^- b1 F2 C9 w4 ]% d3 z, S
  21.                 return;. f+ a( o7 q6 Y# H' z# W+ r* p+ m
  22.             }+ T: \9 K) R9 e
  23.         }
  24.     }).start();( P- `& P$ M4 W3 {1 X
  25. }
复制代码
  M0 z# _. c' e& X& P7 o
  • connectHotSpot()
    + b: V" L$ J7 q4 Q2 h/ Y7 l$ Y
  1.    /**5 D* R; y2 l. A  Z4 R( Z5 l
  2.      * connect wifi hot if successful
  3.      * + R9 Z! _0 Q. ?5 p0 j* }
  4.      * @param wifiConfig( A7 i/ S- V4 z
  5.      * @return0 I% j) ~1 T. [& Y+ g8 e
  6.      */6 P* m) T1 S' z
  7.     private boolean connectHotSpot(WifiConfiguration wifiConfig) {" j' [. e: b) B, E3 a9 q/ Q' s
  8.         Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig)");
  9.         
  10.         //the ID of the newly created network description5 h: R) }  [* [! I
  11.         int wcgID = wifiManager.addNetwork(wifiConfig);$ y  j1 a, H" e; I. x
  12.         Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) wcID = "+ wcgID);
  13.         if (wcgID < 0) {3 _3 @* R/ d3 G
  14.             return false;/ Q  y" a$ I6 Z4 P9 a4 R- c# b
  15.         }( _* j) z: _0 Z! k5 @# a8 C
  16.         boolean flag = wifiManager.enableNetwork(wcgID, true);8 @6 R' T# {: f; c( D
  17.         Log.i(TAG, "out enableNetwork(WifiConfiguration wifiConfig)");, C) w$ N( n4 t5 p0 D& _8 w
  18.         return flag;
  19.     }
复制代码
说明:连接热点的过程实质上就是获取热点配置信息,之后将其添加到自己的网络信息中同时使其可用。
 ; N, z* ~0 E: L& M
 5 j4 T! a/ I" i% f

至此,WIFI热点通信的前期工作已经完成,连接的手机端已在同一局域网内,若再有手机连接进来会自动为其分配该网段内的IP地址,接下来我们要做的就是在IP地址上实现数据的传输通信。在下一章中准备实现一个多人聊天室功能,希望能够帮助到大家!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值