mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 00:37:46 +08:00
Fixed Windows build, implemented wifi mapping example in Windows
This commit is contained in:
@@ -28,12 +28,50 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef WIFITHREAD_H_
|
||||
#define WIFITHREAD_H_
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <sys/ioctl.h>
|
||||
#ifdef _WIN32
|
||||
#ifndef UNICODE
|
||||
#define UNICODE
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
#include <wlanapi.h>
|
||||
#include <Windot11.h> // for DOT11_SSID struct
|
||||
#include <objbase.h>
|
||||
#include <wtypes.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// Need to link with Wlanapi.lib and Ole32.lib
|
||||
#pragma comment(lib, "wlanapi.lib")
|
||||
#pragma comment(lib, "ole32.lib")
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <rtabmap/core/UserDataEvent.h>
|
||||
#include <rtabmap/utilite/UTimer.h>
|
||||
|
||||
// A percentage value that represents the signal quality
|
||||
// of the network. WLAN_SIGNAL_QUALITY is of type ULONG.
|
||||
// This member contains a value between 0 and 100. A value
|
||||
// of 0 implies an actual RSSI signal strength of -100 dbm.
|
||||
// A value of 100 implies an actual RSSI signal strength of -50 dbm.
|
||||
// You can calculate the RSSI signal strength value for wlanSignalQuality
|
||||
// values between 1 and 99 using linear interpolation.
|
||||
inline int quality2dBm(int quality)
|
||||
{
|
||||
// Quality to dBm:
|
||||
if(quality <= 0)
|
||||
return -100;
|
||||
else if(quality >= 100)
|
||||
return -50;
|
||||
else
|
||||
return (quality / 2) - 100;
|
||||
}
|
||||
|
||||
|
||||
class WifiThread : public UThread, public UEventsSender
|
||||
{
|
||||
public:
|
||||
@@ -49,6 +87,79 @@ private:
|
||||
uSleep(1000/rate_);
|
||||
if(!this->isKilled())
|
||||
{
|
||||
int dBm = 0;
|
||||
#ifdef _WIN32
|
||||
//From https://msdn.microsoft.com/en-us/library/windows/desktop/ms706765(v=vs.85).aspx
|
||||
// Declare and initialize variables.
|
||||
HANDLE hClient = NULL;
|
||||
DWORD dwMaxClient = 2; //
|
||||
DWORD dwCurVersion = 0;
|
||||
DWORD dwResult = 0;
|
||||
|
||||
// variables used for WlanEnumInterfaces
|
||||
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
|
||||
PWLAN_INTERFACE_INFO pIfInfo = NULL;
|
||||
|
||||
// variables used for WlanQueryInterfaces for opcode = wlan_intf_opcode_current_connection
|
||||
PWLAN_CONNECTION_ATTRIBUTES pConnectInfo = NULL;
|
||||
DWORD connectInfoSize = sizeof(WLAN_CONNECTION_ATTRIBUTES);
|
||||
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_invalid;
|
||||
|
||||
dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
|
||||
if (dwResult != ERROR_SUCCESS)
|
||||
{
|
||||
UERROR("WlanOpenHandle failed with error: %u\n", dwResult);
|
||||
}
|
||||
else
|
||||
{
|
||||
dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
|
||||
if (dwResult != ERROR_SUCCESS)
|
||||
{
|
||||
UERROR("WlanEnumInterfaces failed with error: %u\n", dwResult);
|
||||
}
|
||||
else
|
||||
{
|
||||
// take the first interface found
|
||||
int i = 0;
|
||||
pIfInfo = (WLAN_INTERFACE_INFO *) & pIfList->InterfaceInfo[i];
|
||||
if(pIfInfo->isState == wlan_interface_state_connected)
|
||||
{
|
||||
dwResult = WlanQueryInterface(hClient,
|
||||
&pIfInfo->InterfaceGuid,
|
||||
wlan_intf_opcode_current_connection,
|
||||
NULL,
|
||||
&connectInfoSize,
|
||||
(PVOID *) &pConnectInfo,
|
||||
&opCode);
|
||||
|
||||
if (dwResult != ERROR_SUCCESS)
|
||||
{
|
||||
UERROR("WlanQueryInterface failed with error: %u\n", dwResult);
|
||||
}
|
||||
else
|
||||
{
|
||||
int quality = pConnectInfo->wlanAssociationAttributes.wlanSignalQuality;
|
||||
dBm = quality2dBm(quality);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UERROR("Interface not connected!");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pConnectInfo != NULL)
|
||||
{
|
||||
WlanFreeMemory(pConnectInfo);
|
||||
pConnectInfo = NULL;
|
||||
}
|
||||
|
||||
if (pIfList != NULL)
|
||||
{
|
||||
WlanFreeMemory(pIfList);
|
||||
pIfList = NULL;
|
||||
}
|
||||
#else
|
||||
// Code inspired from http://blog.ajhodges.com/2011/10/using-ioctl-to-gather-wifi-information.html
|
||||
|
||||
//have to use a socket for ioctl
|
||||
@@ -79,15 +190,7 @@ private:
|
||||
else if(((iw_statistics *)req.u.data.pointer)->qual.updated & IW_QUAL_DBM)
|
||||
{
|
||||
//signal is measured in dBm and is valid for us to use
|
||||
int level = ((iw_statistics *)req.u.data.pointer)->qual.level - 256;
|
||||
double stamp = UTimer::now();
|
||||
|
||||
// Create user data [level, stamp] with the value (int = 4 bytes) and a timestamp (double = 8 bytes)
|
||||
std::vector<unsigned char> data(sizeof(int) + sizeof(double));
|
||||
memcpy(data.data(), &level, sizeof(int));
|
||||
memcpy(data.data()+sizeof(int), &stamp, sizeof(double));
|
||||
this->post(new UserDataEvent(data));
|
||||
//UWARN("posting level %d dBm", level);
|
||||
dBm = ((iw_statistics *)req.u.data.pointer)->qual.level - 256;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -95,6 +198,18 @@ private:
|
||||
}
|
||||
|
||||
close(sockfd);
|
||||
#endif
|
||||
if(dBm != 0)
|
||||
{
|
||||
double stamp = UTimer::now();
|
||||
|
||||
// Create user data [level, stamp] with the value (int = 4 bytes) and a timestamp (double = 8 bytes)
|
||||
std::vector<unsigned char> data(sizeof(int) + sizeof(double));
|
||||
memcpy(data.data(), &dBm, sizeof(int));
|
||||
memcpy(data.data()+sizeof(int), &stamp, sizeof(double));
|
||||
this->post(new UserDataEvent(data));
|
||||
//UWARN("posting level %d dBm", dBm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user