| CodeGuru Home | VC++ / MFC / C++ | .NET / C# | Visual Basic | Newsletters | VB Forums | Developer.com | eBook Library |
|
|||||||
| Visual C++ Programming Ask questions about Windows programming with Visual C++ and help others by answering their questions. |
![]() |
|
|
Thread Tools | Rate Thread | Display Modes |
|
#1
|
|||
|
|||
|
I'm trying to obtain the SSID from a wireless router. I can already get the IP address but that does me no good since what I am using it for needs a static IP address. Anyone have any helpful hints???
Thank you David huffmand1@citadel.edu |
|
#2
|
|||
|
|||
|
Re: SSID using visual c++
What for?
__________________
Ciao, Andreas "Software is like sex, it's better when it's free." - Linus Torvalds Article(s): Allocators (STL) Function Objects (STL) |
|
#3
|
|||
|
|||
|
Re: SSID using visual c++
for a senior design project. We're setting up a model of transporting data to a driver via wimax but for budget and transmission issues we've down scaled it to wifi on our campus. Although we've done a lot of research and attempts at getting the SSID we haven't been successful. Our guidance from faculty is to search online for an already created API that does it for us, but so far no luck. So I decided to see if the forums approach might speed our success!! We know it's easily done since a computer automatically recognizes the SSID every time it sees a network, yet we can't find the code or construct the code that allows our design group to do this!
|
|
#4
|
||||
|
||||
|
Re: SSID using visual c++
You can use WMI to get it, but you can only get the SSID's of AP's you are currently associated with. (Not talking about profiles, but "active" connections.)
If you want know what AP's are currently visible, that's a little more work: like writing your own user mode NDIS protocol driver - or using Microsoft's (which they can change at any time). For the WMI approach, you would connect to "root\wmi" and query with: Code:
SELECT * FROM MSNdis_80211_ServiceSetIdentifier WHERE Active = true AND NOT InstanceName LIKE '%Packet Scheduler Miniport' gg |
|
#5
|
|||
|
|||
|
Re: SSID using visual c++
Are you saying that can be used with visual c++ or we'll have to use a different language? We have to create a way to automatically connect once we press the run button, show connection, and more, which we've already accomplished this using the IP address so we're hoping to stick with visual C++ if possible. the main reason we need the SSID is the same as the IP, so we can take it and compare it to a database of stored locations and calculate the direction a vehicle is moving.
|
|
#6
|
||||
|
||||
|
Re: SSID using visual c++
You can use WMI with Visual C++, but if you'll need to be familiar with COM client programming. You can also WMI with any automation scripting language (which may be easier for you).
I don't really understand your previous post. Do you need to establish a connection with a given AP - without using Wireless-Zero-Config (or the Wifi management software that came with your adapter)? >> which we've already accomplished this using the IP address Where are you getting an IP address? IPHelper API? gg |
|
#7
|
|||
|
|||
|
Re: SSID using visual c++
we use a wireless profile setup to automatically connect to wireless routers as it goes into dead space and loses connection and will automatically reconnect to the next router. With this we found some c++ code that alllow us to pull the IP address and we use that and compare it to pre-established variables that allows us to do our calculations... but our department head said he needed SSID for our final design. Can I possibly get some kind of example or quick tutorial on COM client programming bc due to our time constraints of this semester I think it would be easier for me to learn client programming vs. another language??
|
|
#8
|
||||
|
||||
|
Re: SSID using visual c++
Example WMI code using Window Script Hosting or C# are a dime a dozen. A quick Google of "MSNdis_80211_ServiceSetIdentifier" will turn up lots of examples (many of which aren't quit complete though). I've never seen a COM tutorial that comes close to a good book on the subject either.
Here's a complete (Visual) C++ example for posterity: Code:
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
using namespace std;
#ifndef UNICODE
# define UNICODE
#endif
#include <Windows.h>
#include <comdef.h>
#include <comutil.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
//------------------------------------------------------------------------------
_COM_SMARTPTR_TYPEDEF(IWbemLocator, __uuidof(IWbemLocator));
_COM_SMARTPTR_TYPEDEF(IWbemServices, __uuidof(IWbemServices));
_COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, __uuidof(IEnumWbemClassObject));
_COM_SMARTPTR_TYPEDEF(IWbemClassObject, __uuidof(IWbemClassObject));
//------------------------------------------------------------------------------
inline void TESTHR(HRESULT hr)
{
if (FAILED(hr))
_com_issue_error(hr);
}//TESTHR
//------------------------------------------------------------------------------
void report_com_error(_com_error &err)
{
cerr << "COM error : " << hex << setw(8) << err.Error() << dec << endl;
_bstr_t bstrSrc = err.Source();
wchar_t *src = (wchar_t*)bstrSrc;
if (src)
wcout << L", src=[" << src << L"]" << endl;
_bstr_t bstrDesc = err.Description();
wchar_t *desc = (wchar_t*)bstrDesc;
if (desc)
wcout << L", desc=[" << desc << L"]" << endl;
const wchar_t *errmsg = err.ErrorMessage();
if (errmsg)
{
wcout << L", msg=[" << errmsg << L"]" << endl;
LocalFree((HLOCAL)errmsg);
}//if
}//report_com_error
//------------------------------------------------------------------------------
struct CoInit
{
HRESULT hr;
CoInit() {hr = CoInitializeEx(0, COINIT_MULTITHREADED);}
~CoInit() {if (!FAILED(hr)) CoUninitialize();}
};//CoInit
//------------------------------------------------------------------------------
void WMI_Connect(IWbemServicesPtr &pSvc, const wchar_t *server)
{
IWbemLocatorPtr pLoc;
TESTHR(CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (void**)&pLoc));
TESTHR(pLoc->ConnectServer(_bstr_t(server), 0, 0, 0, 0, 0, 0, &pSvc));
TESTHR(CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE, 0, EOAC_NONE));
}//WMI_Connect
//------------------------------------------------------------------------------
struct SSID_Info
{
wstring adapter_name;
string ssid;
bool Connected() const {return !ssid.empty();}
};//SSID_Info
//------------------------------------------------------------------------------
void Get_SSID_Info(IWbemServicesPtr &pSvc, vector<SSID_Info> &vinfo)
{
vinfo.clear();
IEnumWbemClassObjectPtr pObjEnum;
const long flags = WBEM_FLAG_FORWARD_ONLY |
WBEM_FLAG_RETURN_IMMEDIATELY;
const wchar_t *query =
L"SELECT * FROM MSNdis_80211_ServiceSetIdentifier "
L"WHERE Active = true "
L"AND NOT InstanceName LIKE '%Packet Scheduler Miniport'";
TESTHR(pSvc->ExecQuery(_bstr_t("WQL"), _bstr_t(query),
flags, 0, &pObjEnum));
IWbemClassObjectPtr pMSNdis_SSID;
ULONG returned = 0;
for (;;)
{
HRESULT hr = pObjEnum->Next(WBEM_INFINITE, 1, &pMSNdis_SSID, &returned);
if (hr == WBEM_E_NOT_SUPPORTED)
break;
TESTHR(hr);
if (!returned)
break;
_variant_t vProp;
CIMTYPE cim_type;
TESTHR(pMSNdis_SSID->Get(L"InstanceName", 0, &vProp, &cim_type, 0));
SSID_Info sinfo;
sinfo.adapter_name = (const wchar_t*)(_bstr_t)vProp;
vProp.Clear(); // so we can re-use vProp
TESTHR(pMSNdis_SSID->Get(L"Ndis80211SsId", 0, &vProp, &cim_type, 0));
SAFEARRAY *psa = V_ARRAY(&vProp);
BYTE *psa_bytes;
TESTHR(SafeArrayAccessData(psa, (void**)&psa_bytes));
size_t ssid_len = *reinterpret_cast<unsigned __int32*>(psa_bytes);
sinfo.ssid.assign((const char*)psa_bytes + 4, ssid_len);
TESTHR(SafeArrayUnaccessData(psa));
vinfo.push_back(sinfo);
}//for
}//Get_SSID_Info
//------------------------------------------------------------------------------
int main()
{
CoInit com_init;
if (FAILED(com_init.hr))
{
cerr << "CoInitializeEx failed!" << endl;
return 1;
}//if
// one SSID_Info object per wireless adapter
vector<SSID_Info> ssid_info;
// do all the COM work in this try/catch
try
{
// do this only once per process
TESTHR(CoInitializeSecurity(0, -1, 0, 0, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, 0,
EOAC_NONE, 0));
// connect to WMI - do this only once for efficiency - connection will
// be closed when pSvc goes out of scope
IWbemServicesPtr pSvc;
WMI_Connect(pSvc, L"ROOT\\WMI");
// get a current snapshot of SSID info - this can be called multiple
// times while connected to WMI
Get_SSID_Info(pSvc, ssid_info);
}//try
catch (_com_error &err)
{
report_com_error(err);
return 1;
}//catch
if (ssid_info.empty())
{
cout << "No wireless adapters found." << endl;
}//if
else
{
vector<SSID_Info>::const_iterator it = ssid_info.begin(),
it_end = ssid_info.end();
for (; it != it_end; ++it)
{
wcout << L"Adapter: " << it->adapter_name << endl;
cout << " SSID: ";
if (it->Connected())
cout << it->ssid << endl;
else
cout << "<Not Connected>" << endl;
}//for
}//else
return 0;
}//main
|
|
#9
|
|||
|
|||
|
Re: SSID using visual c++
thank you for all the help!! the right wording for search engines goes a long way when doing the online research!! we appreciate everything, have a great new year.
|
|
#10
|
|||
|
|||
|
Re: SSID using visual c++
After running the code several times, we were only able to get the message "No wireless adapters found."
We ran the code one line at a time in debug mode and we noticed that after running the line: "vector<SSID_Info> ssid_info;" We Get: NAME: ssid_info VALUE: [0]() TYPE: std::vector<SSID_Info,std::allocator<SSID_Info> > We think that this line of code isn't running properly. The value shouldn't be [0]() unless there is not adapter, right? After this, the program continues to run and eventually outputs "No wireless adapters found." The computer we are using has the following specifications: Windows Edition: Windows Vista Home Premium Service Pack 1 System Info: HP Pavilion dv9000 class Intel Core 2 CPU T5300 @ 1.73 GHz, 2 GB RAM We were wondering if the code is specifically tailored for a system running Windows XP, and if not, if you had any insight as to what our problem may be. Thank you! Last edited by Huffmand; January 28th, 2009 at 02:28 PM. Reason: NAME, VALUE, TYPE values were not displayed correctly |
|
#11
|
|||
|
|||
|
Re: SSID using visual c++
Well...I don't know where the output comes from but it looks okay to me....that line constructs an empty vector....thus, I would expect it to have 0 elements....
You actually need to push something in the vector first....which the given line certainly does not. More interesting would be what the output is after the following line: Get_SSID_Info(...); But may be I am missing something here....
__________________
Ciao, Andreas "Software is like sex, it's better when it's free." - Linus Torvalds Article(s): Allocators (STL) Function Objects (STL) |
|
#12
|
|||
|
|||
|
Re: SSID using visual c++
Here is the information you requested. Look at the attached JPEG image to see the values after running "Get_SSID_Info(pSvc, ssid_info);"
|
|
#13
|
||||
|
||||
|
Re: SSID using visual c++
Code:
HRESULT hr = pObjEnum->Next(WBEM_INFINITE, 1, &pMSNdis_SSID, &returned);
if (hr == WBEM_E_NOT_SUPPORTED)
break;
TESTHR(hr);
if (!returned)
break;
The (documented) Native Wifi API should be used if you want XP SP2 and Vista support. gg |
|
#14
|
|||
|
|||
|
Re: SSID using visual c++
Thank you for pointing us in the right direction!!!
|
![]() |
| Bookmarks |
|
||||||
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|