Wi-Fi Scan

1. Initiated by settings

frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java

onReceive(Context context, Intent intent)
  action=WifiManager.WIFI_STATE_CHANGED_ACTION
    updateWifiState
      mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_WIFI_STATE, state, 0).sendToTarget()


handleMessage(Message msg)
  case MSG_UPDATE_WIFI_STATE:
    mScanner.resume();
 
Scanner::resume() {
  sendEmptyMessage(MSG_SCAN)


handleMessage(Message message)
case MSG_SCAN
   mWifiManager.startScan()
 
frameworks/base/wifi/java/android/net/wifi/WifiManager.java 
startScan()  
  Log.i(TAG, "Process " + getCallerProcName() + " requested a scan");
  mService.startScan(null, null);
    
    
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
startScan(ScanSettings settings, WorkSource workSource) {
   mWifiStateMachine.startScan(Binder.getCallingUid(), scanRequestCounter++, settings, workSource);    
   
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
startScan(int callingUid, int scanCounter, ScanSettings settings, WorkSource workSource)   
  sendMessage(CMD_START_SCAN, callingUid, scanCounter, bundle);
    handleScanRequest(message);    DriverStartedState/ScanModeState
      startScanNative(freqs, hiddenNetworkIds, workSource))
        mWifiScanner.startScan(settings, nativeScanListener, workSource);
        
frameworks/base/wifi/java/android/net/wifi/WifiScanner.java
startScan(ScanSettings settings, ScanListener listener, WorkSource workSource) {
  mAsyncChannel.sendMessage(CMD_START_SINGLE_SCAN, 0, key, scanParams);        
  
frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
case CMD_START_SINGLE_SCAN
  tryToStartNewScan();
     mScannerImpl.startSingleScan(settings, this))
  
frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/HalWifiScannerImpl.java
startSingleScan(WifiNative.ScanSettings settings,WifiNative.ScanEventHandler eventHandler) {
  mSupplicantScannerDelegate.startSingleScan(settings, eventHandler);  
  
frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/SupplicantWifiScannerImpl.java
startSingleScan(WifiNative.ScanSettings settings, WifiNative.ScanEventHandler eventHandler)  
  processPendingScans();
     mWifiNative.scan(freqs, hiddenNetworkIdSet)
    
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java
scan(Set<Integer> freqs, Set<Integer> hiddenNetworkIds)   
  scanWithParams(freqList, hiddenNetworkIdList);
    doBooleanCommand(scanCommand.toString());
       Log.d(mTAG, "doBoolean: " + command)  doBoolean: SCAN TYPE=ONLY freq=*** scan_id=**


log:
22:34:08.932  8029  8029 I WifiManager: Process ndroid.settings requested a scan
22:34:08.933  2028  2378 D WifiStateMachine:  ConnectedState !CMD_START_SCAN  rt=315517/315517 1000 13 ic=0 proc(ms):0 rssi=-32 f=2447 sc=100 link=130 tx=14.2, 0.1, 0.0  rx=12.6 [on:2289 tx:1 rx:251 period:2344] from screen [on:103636 period:203700]
22:34:08.933  2028  2378 D WifiStateMachine:  L2ConnectedState !CMD_START_SCAN  rt=315517/315517 1000 13 ic=0 proc(ms):1 rssi=-32 f=2447 sc=100 link=130 tx=14.2, 0.1, 0.0  rx=12.6 [on:0 tx:0 rx:0 period:1] from screen [on:103636 period:203701]
22:34:08.933  2028  2378 D WifiStateMachine:  ConnectModeState !CMD_START_SCAN  rt=315518/315518 1000 13 ic=0 proc(ms):1 rssi=-32 f=2447 sc=100 link=130 tx=14.2, 0.1, 0.0  rx=12.6 [on:0 tx:0 rx:0 period:0] from screen [on:103636 period:203701]
22:34:08.934  2028  2378 D WifiStateMachine:  DriverStartedState !CMD_START_SCAN  rt=315518/315518 1000 13 ic=0 proc(ms):1 rssi=-32 f=2447 sc=100 link=130 tx=14.2, 0.1, 0.0  rx=12.6 [on:0 tx:0 rx:0 period:1] from screen [on:103636 period:203702]
22:34:08.935  2028  2391 I WifiHAL : Got channel list with 13 channels
22:34:08.935  2028  2391 I WifiHAL : Got channel list with 10 channels
22:34:08.936  2028  2391 I WifiHAL : Got channel list with 15 channels
22:34:08.936  2028  2391 D WifiNative-wlan0: doBoolean: SCAN TYPE=ONLY
22:34:08.936  2633  2633 D wpa_supplicant: wlan0: Control interface command 'SCAN TYPE=ONLY'

2. Initiated by WifiConnectivityManager       

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java       
handleScreenStateChanged/handleConnectionStateChanged/forceConnectivityScan()
  startConnectivityScan       
    localLog("startConnectivityScan: screenOn=" + mScreenOn...)
    startPeriodicScan(scanImmediately)
       startPeriodicSingleScan()
          startSingleScan(isFullBandScan);
          schedulePeriodicScanTimer(mPeriodicSingleScanInterval);
             Log.d(TAG, "schedulePeriodicScanTimer, scan interval: " + intervalMs);
             mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,... mPeriodicScanTimerListener, mEventHandler);
             
private final AlarmManager.OnAlarmListener mPeriodicScanTimerListener =
   new AlarmManager.OnAlarmListener() {
       public void onAlarm() {
           periodicScanTimerHandler();
       }
   };             
   
periodicScanTimerHandler() 
   localLog("periodicScanTimerHandler");
   startPeriodicSingleScan();   
   
 startPeriodicSingleScan()
    schedulePeriodicScanTimer   
    
 startSingleScan(boolean isFullBandScan)
    mScanner.startScan(settings, singleScanListener, WIFI_WORK_SOURCE);
    
frameworks/base/wifi/java/android/net/wifi/WifiScanner.java
startScan(ScanSettings settings, ScanListener listener, WorkSource workSource)     
  mAsyncChannel.sendMessage(CMD_START_SINGLE_SCAN, 0, key, scanParams);    


frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
case WifiScanner.CMD_START_SINGLE_SCAN:
   tryToStartNewScan();    



log:
22:31:31.631  2028  2378 D WifiStateMachine:  Enter DisconnectedState screenOn=true
22:31:31.631  2028  2378 D WifiConnectivityManager: handleConnectionStateChanged: state=2
22:31:31.631  2028  2378 D WifiConnectivityManager: startConnectivityScan: screenOn=true wifiState=2 scanImmediately=false wifiEnabled=true wifiConnectivityManagerEnabled=true
22:31:31.631  2028  2378 W AlarmManager: Unrecognized alarm listener com.android.server.wifi.WifiConnectivityManager$3@3893494
22:31:31.632  2028  2378 W AlarmManager: Unrecognized alarm listener com.android.server.wifi.WifiConnectivityManager$2@de8ab3d
22:31:31.632  2028  2378 E WifiScanner: listener cannot be found
22:31:31.632  2028  2378 D WifiConnectivityManager: schedulePeriodicScanTimer, scan interval: 15000
22:31:31.688  2028  2391 D WifiNative-wlan0: doBoolean: SCAN TYPE=ONLY


3. 公用log:
22:31:31.927  2028  2391 D WifiNative-wlan0: doBoolean: SCAN TYPE=ONLY
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: Control interface command 'SCAN TYPE=ONLY'
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: Setting scan request: 0.000000 sec
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: No enabled networks (1 disabled networks)
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: State: DISCONNECTED -> SCANNING
22:31:31.927  2633  2633 D wpa_supplicant: wpa_state_to_wapi_state wpa_state : 3 change to wapi_state
22:31:31.927  2633  2633 D wpa_supplicant: wpa_supplicant_set_state wapi_state : 3
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: Determining shared radio frequencies (max len 2)
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: Shared frequencies (len=0): completed iteration
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Add operating class 81
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Add operating class 81 (client only)
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Channels - hexdump(len=12): 01 02 03 04 05 06 07 08 09 0a 0b 0d
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Channels (client only) - hexdump(len=1): 0c
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Add operating class 115 (client only)
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Channels (client only) - hexdump(len=4): 24 28 2c 30
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Add operating class 124 (client only)
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Channels (client only) - hexdump(len=4): 95 99 9d a1
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Add operating class 125 (client only)
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Add operating class 125
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Channels - hexdump(len=1): a5
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Channels (client only) - hexdump(len=4): 95 99 9d a1
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Add operating class 130 (client only)
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Channels (client only) - hexdump(len=4): 24 28 2c 30
22:31:31.927  2633  2633 D wpa_supplicant: P2P: Update channel list
22:31:31.927  2633  2633 D wpa_supplicant: P2P: channels: 81:1,2,3,4,5,6,7,8,9,10,11,13 125:165
22:31:31.927  2633  2633 D wpa_supplicant: P2P: cli_channels: 81:12 115:36,40,44,48 124:149,153,157,161 125:149,153,157,161 130:36,40,44,48
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: Starting AP scan for wildcard SSID
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: Add radio work 'scan'@0x7fa742f300
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: First radio work item in the queue - schedule start immediately
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: Starting radio work 'scan'@0x7fa742f300 after 0.000020 second wait
22:31:31.927  2633  2633 D wpa_supplicant: wlan0: nl80211: scan request
22:31:31.928  2028  2672 D WifiMonitor: Event [IFNAME=wlan0 CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=]
22:31:31.928  2028  2672 D WifiMonitor: wlan0 cnt=56 dispatchEvent: CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00 SSID=
22:31:31.928  2028  2391 D WifiNative-wlan0: SCAN TYPE=ONLY: returned true
22:31:31.928  2028  2378 D WifiStateMachine:  DisconnectedState !SUPPLICANT_STATE_CHANGE_EVENT  rt=158513/158513 56 0 SSID:  BSSID: 00:00:00:00:00:00 nid: -1 state: SCANNING
22:31:31.928  2028  2378 D WifiStateMachine: SUPPLICANT_STATE_CHANGE_EVENT state=SCANNING -> state= SCANNING debouncing=false
22:31:31.928  2028  2378 D WifiStateMachine: setDetailed state, old =DISCONNECTED and new state=SCANNING hidden=false
22:31:31.930  2028  2378 D WifiStateMachine:  ConnectModeState !SUPPLICANT_STATE_CHANGE_EVENT  rt=158515/158515 56 0 SSID:  BSSID: 00:00:00:00:00:00 nid: -1 state: SCANNING
22:31:31.930  2028  2378 D WifiStateMachine:  DisconnectedState !CMD_GET_CONFIGURED_NETWORKS uid=1000  rt=158515/158515 1000 0 num=1
22:31:31.930  2028  2378 D WifiStateMachine:  ConnectModeState !CMD_GET_CONFIGURED_NETWORKS uid=1000  rt=158515/158515 1000 0 num=1
22:31:31.933  2028  2378 D SupplicantStateTracker: DefaultState{ when=0 what=147462 arg1=56 obj= SSID:  BSSID: 00:00:00:00:00:00 nid: -1 state: SCANNING target=com.android.internal.util.StateMachine$SmHandler }
22:31:31.934  2028  2378 D SupplicantStateTracker: Supplicant state: SCANNING
22:31:31.934  2028  2378 D SupplicantStateTracker: ScanState


22:31:31.967  2633  2633 D wpa_supplicant: Scan requested (ret=0) - scan timeout 30 seconds
22:31:31.967  2633  2633 D wpa_supplicant: nl80211: Ignored event (cmd=33) for foreign interface (ifindex 5 wdev 0x0)
22:31:31.967  2633  2633 D wpa_supplicant: nl80211: Drv Event 33 (NL80211_CMD_TRIGGER_SCAN) received for wlan0
22:31:31.967  2633  2633 D wpa_supplicant: wlan0: nl80211: Scan trigger
22:31:31.967  2633  2633 D wpa_supplicant: wlan0: Event SCAN_STARTED (47) received
22:31:31.967  2633  2633 D wpa_supplicant: wlan0: Own scan request started a scan in 0.000266 seconds
22:31:31.967  2028  2028 W ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.startService:1358 android.content.ContextWrapper.startService:613 android.content.ContextWrapper.startService:613 com.sonymobile.wifi.idd.IddUtils.startIddService:16 com.sonymobile.wifi.idd.IddReceiver.onReceive:27 
22:31:31.967  2028  2672 D WifiMonitor: Event [IFNAME=wlan0 CTRL-EVENT-SCAN-STARTED ]
22:31:31.968  2028  2672 D WifiMonitor: wlan0 cnt=57 dispatchEvent: CTRL-EVENT-SCAN-STARTED 
22:31:31.968  2028  2672 D WifiMonitor: handleEvent 14 CTRL-EVENT-SCAN-STARTED 
22:31:31.968  2028  2672 W WifiMonitor: handleEvent unknown: 14 CTRL-EVENT-SCAN-STARTED 


22:31:36.370  2633  2633 D wpa_supplicant: nl80211: Ignored event (cmd=34) for foreign interface (ifindex 5 wdev 0x0)
22:31:36.370  2633  2633 D wpa_supplicant: nl80211: Drv Event 34 (NL80211_CMD_NEW_SCAN_RESULTS) received for wlan0
22:31:36.370  2633  2633 D wpa_supplicant: wlan0: nl80211: New scan results available
22:31:36.370  2633  2633 D wpa_supplicant: nl80211: Scan probed for SSID ''
22:31:36.370  2633  2633 D wpa_supplicant: nl80211: Scan included frequencies: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472 5180 5200 5220 5240 5260 5280 5300 5320 5500 5520 5540 5560 5580 5600 5620 5640 5660 5680 5700 5720 5745 5765 5785 5805 5825
22:31:36.370  2633  2633 D wpa_supplicant: wlan0: Event SCAN_RESULTS (3) received
22:31:36.370  2633  2633 D wpa_supplicant: wlan0: Scan completed in 4.403258 seconds
22:31:36.371  2633  2633 D wpa_supplicant: nl80211: Received scan results (25 BSSes)
22:31:36.371  2633  2633 D wpa_supplicant: wlan0: BSS: Start scan result update 6
22:31:36.371  2633  2633 D wpa_supplicant: wlan0: BSS: Add new id 27 BSSID 14:75:90:31:3e:44 SSID 'TP-LINK602' freq 2462
22:31:36.371  2633  2633 D wpa_supplicant: wlan0: BSS: Add new id 28 BSSID 24:69:68:c4:59:d0 SSID '1082' freq 2462
22:31:36.371  2633  2633 D wpa_supplicant: wlan0: BSS: Add new id 29 BSSID 88:25:93:56:ba:d1 SSID 'huaduo' freq 2422
22:31:36.372  2633  2633 D wpa_supplicant: wlan0: BSS: Add new id 30 BSSID bc:0f:2b:7d:d9:ee SSID 'midea_ac_0617' freq 2447
22:31:36.372  2633  2633 D wpa_supplicant: wlan0: BSS: Add new id 31 BSSID ec:26:ca:dc:00:84 SSID 'CR7' freq 2437
22:31:36.372  2633  2633 D wpa_supplicant: wlan0: BSS: Remove id 5 BSSID 80:13:82:e7:fc:bc SSID 'wkwkwk' due to no match in scan
22:31:36.372  2633  2633 D wpa_supplicant: wlan0: BSS: Remove id 9 BSSID 64:09:80:7d:e9:97 SSID 'cbpm-keba_3f' due to no match in scan
22:31:36.372  2633  2633 D wpa_supplicant: BSS: last_scan_res_used=25/32
22:31:36.372  2633  2633 D wpa_supplicant: wlan0: Scan-only results received
22:31:36.373  2633  2633 D wpa_supplicant: wlan0: Radio work 'scan'@0x7fa742f300 done in 4.445170 seconds
22:31:36.373  2633  2633 D wpa_supplicant: wlan0: radio_work_free('scan'@0x7fa742f300: num_active_works --> 0
22:31:36.373  2633  2633 D wpa_supplicant: wlan0: State: SCANNING -> DISCONNECTED


4. auto connect after scanning finishes

After getting scanning result
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
onResults/onPnoNetworkFound
   handleScanResults
     localLog(listenerName + " onResults: start QNS");
     mQualifiedNetworkSelector.selectQualifiedNetwork
     localLog(listenerName + ": QNS candidate-" + candidate.SSID);
     connectToNetwork(candidate);  

22:34:03.105  2028  2378 D WifiConnectivityManager: SingleScanListener onFullResult: CU_4gtP capabilities [WPA2-PSK-CCMP][ESS]
22:34:03.105  2028  2378 D WifiConnectivityManager: SingleScanListener onFullResult: mali capabilities [WPA2-PSK-CCMP][ESS]
22:34:03.106  2028  2055 I BroadcastQueue: am_broadcast_finished: [background,0,Intent { act=android.net.wifi.STATE_CHANGE flg=0x4000010 (has extras) }]
22:34:03.108  2028  2378 D WifiConnectivityManager: SingleScanListener onFullResult: CU_kaola capabilities [WPA2-PSK-CCMP][ESS]
22:34:03.108  2028  2378 D WifiConnectivityManager: SingleScanListener onResults: start QNS
22:34:03.109  2028  2378 D WifiStateMachine: Supplicant is under steady state: DISCONNECTED
22:34:03.109  2028  2378 D WifiQualifiedNetworkSelector:: ==========start qualified Network Selection==========
22:34:03.109  2028  2378 D WifiQualifiedNetworkSelector:: Saved Network List
22:34:03.109  2028  2378 D WifiQualifiedNetworkSelector::     "CU_4gtP":1  User Preferred BSSID:null FQDN:null NETWORK_SELECTION_ENABLED Disable account: 0 0 0 0 0 0 0 0 0 0 Connect Choice:null set time:-1
22:34:03.110  2028  2391 I WifiHAL : Got channel list with 13 channels
22:34:03.110  2028  2378 D WifiQualifiedNetworkSelector::  skipped due to low signal
22:34:03.111  2028  2378 D WifiQualifiedNetworkSelector:: mali:ea:b1:fc:5b:1f:17 / CU_kaola:d4:f9:a1:70:be:6c /  skipped due to not saved
22:34:03.111  2028  2378 D WifiQualifiedNetworkSelector::  
22:34:03.111  2028  2378 D WifiQualifiedNetworkSelector::  skipped due to not valid SSID
22:34:03.111  2028  2378 D WifiQualifiedNetworkSelector::  RSSI score: 100 Secure network Bonus:2000 Score for scanResult: SSID: CU_4gtP, BSSID: 08:c0:21:13:46:2c, capabilities: [WPA2-PSK-CCMP][ESS], level: -31, frequency: 2447, timestamp: 309648574, distance: ?(cm), distanceSd: ?(cm), passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, 80211mcResponder: is not supported and Network ID: 1 final score:2100
22:34:03.111  2028  2378 D WifiQualifiedNetworkSelector:: 
22:34:03.111  2028  2378 D WifiQualifiedNetworkSelector:: reconnect from Disconnected to "CU_4gtP":1
22:34:03.111  2028  2391 I WifiHAL : Got channel list with 10 channels
22:34:03.112  2028  2378 D WifiConnectivityManager: SingleScanListener: QNS candidate-"CU_4gtP"
22:34:03.112  2028  2378 D WifiConnectivityManager: connectToNetwork: Reconnect from Disconnected to "CU_4gtP" : 08:c0:21:13:46:2c
22:34:03.119  2028  2378 D WifiStateMachine:  DisconnectedState !CMD_AUTO_CONNECT  rt=309703/309703 1 0 "CU_4gtP"WPA_PSK any roam=false
22:34:03.119  2028  2378 D WifiStateMachine:  ConnectModeState !CMD_AUTO_CONNECT  rt=309703/309703 1 0 "CU_4gtP"WPA_PSK any roam=false
22:34:03.119  2028  2378 D WifiStateMachine: CMD_AUTO_CONNECT sup state DisconnectedState my state DisconnectedState nid=1 roam=false
22:34:03.119  2028  2378 D WifiStateMachine: target set to "CU_4gtP":08:c0:21:13:46:2c
22:34:03.119  2028  2378 D WifiNative-wlan0: doBoolean: SET_NETWORK 1 bssid 08:c0:21:13:46:2c
22:34:03.160  2028  2378 D WifiNative-wlan0: SET_NETWORK 1 bssid 08:c0:21:13:46:2c: returned true
22:34:03.160  2028  2378 D WifiStateMachine: CMD_AUTO_CONNECT will save config -> "CU_4gtP" nid=1
22:34:03.160  2028  2378 D WifiConfigManager: WifiConfigManager saveNetwork, size=2 (for all users) SSID="CU_4gtP" Uid=1000/1000
22:34:03.160  2028  2378 D WifiNative-wlan0: doBoolean: SET_NETWORK 1 ssid 43555f34677450
22:34:03.203  2028  2378 D WifiNative-wlan0: doBoolean: SELECT_NETWORK 1
22:34:03.203  2633  2633 D wpa_supplicant: wlan0: Control interface command 'SELECT_NETWORK 1'
22:34:03.203  2633  2633 D wpa_supplicant: CTRL_IFACE: SELECT_NETWORK id=1
22:34:03.207  2028  2378 D WifiNative-wlan0: SELECT_NETWORK 1: returned true
22:34:03.208  2028  2378 D WifiNative-wlan0: doBoolean: RECONNECT
22:34:03.208  2633  2633 D wpa_supplicant: wlan0: Starting radio work 'connect'@0x7fa742f300 after 0.002311 second wait
22:34:03.208  2633  2633 I wpa_supplicant: wlan0: Trying to associate with SSID 'CU_4gtP'
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值