/// <summary> /// Wifi 정보를 스캔합니다. /// 실제 스캔하는게 아닌 캐시된 정보를 가져옵니다. 만약 실제 스캔중이라면 Sleep 후, 스캔이 완료될 시 정보를 가져옵니다. 따라서 Thread를 권장합니다. /// </summary> public void Scan() { lock (lockObj) { wifiInfos.Clear(); string cmdResult = Cmd.Run("netsh wlan show networks mode=bssid"); int loofCount = 0; // 만약 스캔중이라면 while (cmdResult.Contains("BSSID") == false) { // 10초를 초과했다면 if (loofCount > 10) { MessageBox.Show("Wifi Scan TimeOut. \r\n\r\n", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Thread.Sleep(1000); cmdResult = Cmd.Run("netsh wlan show networks mode=bssid"); ++loofCount; } string[] lineStr = cmdResult.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < lineStr.Length; ++i) { string[] splitStr = lineStr[i].Split(new string[] { " : " }, StringSplitOptions.None); if (splitStr.Length != 2) { continue; } // 전후 공백 삭제. string key = splitStr[0].Trim(); string value = splitStr[1].Trim(); // 만약 키가 interface name이면 새로운 딕셔너리 생성. if (key == "Interface name") { wifiInfos.Add(value, new List <Dictionary <string, string> >()); continue; } // 만약 키에 SSID가 존재하면 interface 정보안에 새로운 리스트를 생성. if (key.Substring(0, 4) == "SSID") { wifiInfos.Last().Value.Add(new Dictionary <string, string>()); key = "SSID"; } // 만약 BSSID가 두 개 이상이라면. if (key.Length > 6 && key.Substring(0, 5) == "BSSID" && key.Substring(6, 1) != "1") { Dictionary <string, string> LastDict = wifiInfos.Last().Value.Last(); Dictionary <string, string> NewDict = new Dictionary <string, string>(); NewDict.Add("SSID", LastDict["SSID"]); NewDict.Add("Authentication", LastDict["Authentication"]); NewDict.Add("Encryption", LastDict["Encryption"]); wifiInfos.Last().Value.Add(NewDict); continue; } // 키와 값을 넣는다. wifiInfos.Last().Value.Last().Add(key, value); } } }