유니티에서 현재 연결된 WIFI SSID를 가져오는 방법
저같은 경우는 목표한 WIFI를 윈도우에서 잡고 있는지 확인하기 위해서, 현재 연결된 와이파이와 목표한 와이파이의 SSID를 비교하였습니다. 이 때 사용한 방법입니다.
우선 프로세스를 실행합니다.
using System.Diagnostics;
Process p = new Process();
p.StartInfo.FileName = "netsh.exe";
p.StartInfo.Arguments = "wlan show interfaces";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
p.WaitForExit();
위와 같이 프로세스를 실행하면, cmd 에서 netsh wlan show interfaces 를 명령한 값과 같은 결과를 호출합니다.
위와 같은 결과를 유니티에서 string으로 아래와 같이 가져옵니다.
p.StandardOutput.ReadToEnd()
그런데 이 결과를 받아오려면 한글이 깨집니다. 보통 외부 string 값을 가져올때 유니티에선 utf-8 로 인코딩하고 디코딩해서 가져와야한다고 알고있습니다.
// utf-8 인코딩
byte[] bytesForEncoding = Encoding.UTF8.GetBytes(p.StandardOutput.ReadToEnd());
string encodedString = Convert.ToBase64String(bytesForEncoding);
// utf-8 디코딩
byte[] decodedBytes = Convert.FromBase64String(encodedString);
string decodedString = Encoding.UTF8.GetString(decodedBytes);
하지만 위와 같은 방식으로도 똑같이 한글이 깨져있습니다. 이것저것 해봤는데 어쨋든 한글이 깨지네요... 일단 SSID는 영어라 안깨지기에 패스합니다. (혹시 방법을 아시는 분은 알려주셔서 내용을 공유해주세요!)
그럼 받아온 String 을 한 줄 한 줄 읽어가면서 SSID가 있는 줄을 찾아냅니다. 우선 읽기 쉽도록 공백을 모두 지우고, String이 몇 줄인지 카운트합니다.
string output = Regex.Replace(decodedString, " ", "");
int lineCount = output.Split('\n').Length;
그리고 한 줄 한 줄 읽어가면서 해당하는 줄에 "SSID:" 이라는 단어가 있는지 검색합니다. 만약 "SSID:" 가 있으면 이는 와이파이에 연결된 것이고, SSID가 없으면 와이파이가 꺼져있거나 연결되어 있지 않은 상황일것입니다.
어쨌든 SSID: 를 찾으면 이것을 ""으로 Replace() 해줍니다. 그러면 해당하는 줄에 남은 단어는 WIFI의 SSID가 됩니다.
string result = "";
StringReader sr = new StringReader(output);
for (int i = 0; i < lineCount; i++)
{
hasSSID = false;
string line = sr.ReadLine();
if (line == "") continue;
if (line.Contains("SSID:"))
{
line = line.Replace("SSID:", "");
result = line;
hasSSID = true;
break;
}
}