owlps/libowlps/owlps.h

264 lines
8.5 KiB
C

/*
* This file is part of the rtap localisation project.
*/
#ifndef _LIBOWLPS_H_
#define _LIBOWLPS_H_
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
#include <stdint.h> // We'll use <cstdint> with C++ 0x
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
// Port on which the positioning request is sent by the mobile:
#define OWL_DEFAULT_REQUEST_PORT 9900
// Port on which listeners and aggregator communicate:
#define OWL_DEFAULT_LISTENER_PORT 9901
// Port on which aggregator and positioning server communicate:
#define OWL_DEFAULT_AGGREGATION_PORT 9902
// Port on which autocalibration requests are sent by the listeners:
#define OWL_DEFAULT_AUTOCALIBRATION_REQUEST_PORT 9903
// Port on which the aggregator listens for hello messages from the
// listeners, and the listeners listen for orders from the aggregator:
#define OWL_DEFAULT_AUTOCALIBRATION_PORT 9904
// Port on which the mobile listens for its position:
#define OWL_DEFAULT_RESULT_PORT 9910
/* Boolean type */
typedef enum {owl_false, owl_true} owl_bool ;
#define OWL_BOOL_TO_STRING(B) ((B) ? "true" : "false")
/* Direction type */
enum {owl_north = 1, owl_east, owl_south, owl_west} ;
#define OWL_DIRECTION_MIN 1
#define OWL_DIRECTION_MAX 4
typedef uint8_t owl_direction ;
/* Timestamp type (struct timespec clone with fix-sized fields) */
typedef struct _owl_timestamp
{
uint32_t tv_sec ;
uint32_t tv_nsec ;
} owl_timestamp ;
// Length of a owl_timestamp when converted to string:
#define OWL_TIMESTAMP_STRLEN 22 // 22 = 10 digits, '.', 10 digits, '\0'
/* Message sent by the listener to the aggregator */
typedef struct _owl_captured_request
{
uint8_t type ; // Type of the captured request
uint8_t ap_mac_addr_bytes[ETHER_ADDR_LEN] ; // MAC of the listener
uint8_t mobile_mac_addr_bytes[ETHER_ADDR_LEN] ; // MAC of the mobile
uint8_t mobile_ip_addr_bytes[4] ; // IP of the mobile
owl_timestamp request_time ; // Request ID (timestamp on the mobile)
owl_timestamp start_time ; // Timestamp of arrival on the listener
uint8_t ss_dbm ; // Signal strength measured by the listener (dBm)
/* Calibration data */
float x_position ;
float y_position ;
float z_position ;
owl_direction direction ;
} owl_captured_request ;
/* Message sent by the aggregator to the positioning server containing
* the main data of a request */
typedef struct _owl_request
{
uint8_t type ; // Type of the request
uint8_t mobile_mac_addr_bytes[ETHER_ADDR_LEN] ; // MAC of the mobile
owl_timestamp request_time ; // Request ID (timestamp on the mobile)
uint16_t nb_info ; // Number of (listener MAC;signal strength) couples
/* Calibration data */
float x_position ;
float y_position ;
float z_position ;
owl_direction direction ;
} owl_request ;
/* Message sent by the aggregator to the positioning server refering to
* a request, indicating that an AP received the request with a given
* signal strength */
typedef struct _owl_request_info
{
uint8_t ap_mac_addr_bytes[ETHER_ADDR_LEN] ; // MAC of the listener
uint8_t ss_dbm ; // Signal strength measured by the listener (dBm)
} owl_request_info ;
/* Hello message sent by the listener to the aggregator */
typedef struct _owl_autocalibration_hello
{
uint8_t ap_mac_addr_bytes[ETHER_ADDR_LEN] ;
} owl_autocalibration_hello ;
/* Message sent to the listener to order an emission */
#define AUTOCALIBRATION_ORDER_SEND 1
typedef struct _owl_autocalibration_order
{
uint8_t order ;
} owl_autocalibration_order ;
/* Positioning request types */
#define OWL_REQUEST_NORMAL 0
#define OWL_REQUEST_CALIBRATION 1
#define OWL_REQUEST_AUTOCALIBRATION 2
#define OWL_REQUEST_GENERATED 3
#define OWL_REQUEST_IMPLICIT 10
#define OWL_REQUEST_UNDEFINED 255
/* Wi-Fi channel frequencies in MHz */
#define OWL_80211_MHZ_CHANNEL_1 2412
#define OWL_80211_MHZ_CHANNEL_2 2417
#define OWL_80211_MHZ_CHANNEL_3 2422
#define OWL_80211_MHZ_CHANNEL_4 2427
#define OWL_80211_MHZ_CHANNEL_5 2432
#define OWL_80211_MHZ_CHANNEL_6 2437
#define OWL_80211_MHZ_CHANNEL_7 2442
#define OWL_80211_MHZ_CHANNEL_8 2447
#define OWL_80211_MHZ_CHANNEL_9 2452
#define OWL_80211_MHZ_CHANNEL_10 2457
#define OWL_80211_MHZ_CHANNEL_11 2462
#define OWL_80211_MHZ_CHANNEL_12 2467
#define OWL_80211_MHZ_CHANNEL_13 2472
#define OWL_80211_MHZ_CHANNEL_14 2477
/* Wi-Fi channel frequencies in Hz */
#define OWL_80211_HZ_CHANNEL_1 2412000000ul
#define OWL_80211_HZ_CHANNEL_2 2417000000ul
#define OWL_80211_HZ_CHANNEL_3 2422000000ul
#define OWL_80211_HZ_CHANNEL_4 2427000000ul
#define OWL_80211_HZ_CHANNEL_5 2432000000ul
#define OWL_80211_HZ_CHANNEL_6 2437000000ul
#define OWL_80211_HZ_CHANNEL_7 2442000000ul
#define OWL_80211_HZ_CHANNEL_8 2447000000ul
#define OWL_80211_HZ_CHANNEL_9 2452000000ul
#define OWL_80211_HZ_CHANNEL_10 2457000000ul
#define OWL_80211_HZ_CHANNEL_11 2462000000ul
#define OWL_80211_HZ_CHANNEL_12 2467000000ul
#define OWL_80211_HZ_CHANNEL_13 2472000000ul
#define OWL_80211_HZ_CHANNEL_14 2477000000ul
/* Misc. */
// Length of a MAC address in string format (including '\0')
#define OWL_ETHER_ADDR_STRLEN 18
// Maximum length of an algorithm name (including '\0')
#define OWL_ALGORITHM_STRLEN 31
// Maximum length of an area name (including '\0')
#define OWL_AREA_STRLEN 31
// Maximum length of a coordinate X, Y or Z (including '\0')
#define OWL_COORDINATE_STRLEN 16
/* Global variables */
// Used to handle end of loops:
extern owl_bool owl_run ;
/* Error codes */
/* User interface */
// Wrong program invokation (command-line arguments):
#define OWL_ERR_BAD_USAGE 100
// Error when reading/parsing the configuration file:
#define OWL_ERR_CONFIG_FILE 101
/* System */
// Error when creating a thread:
#define OWL_ERR_THREAD_CREATE 110
// Wrong signal received:
#define OWL_ERR_BAD_SIGNAL 111
/* Network communication */
// Error when creating a socket:
#define OWL_ERR_SOCKET_CREATE 120
// Error when sending a message on a socket:
#define OWL_ERR_SOCKET_SEND 121
// Error when reading from a socket:
#define OWL_ERR_SOCKET_RECV 122
/* Network interface / capture */
// Error when opening the capture interface:
#define OWL_ERR_IFACE_PCAP_OPEN 130
// Error when reading the interface Wi-Fi mode:
#define OWL_ERR_IFACE_MODE_GET 131
// Error when setting the interface Wi-Fi mode:
#define OWL_ERR_IFACE_MODE_SET 132
/* Function headers */
// Misc
const char* owl_mac_bytes_to_string(const uint8_t *const mac_binary) ;
void owl_mac_bytes_to_string_r(const uint8_t *const mac_binary,
char mac_str[OWL_ETHER_ADDR_STRLEN]) ;
owl_bool owl_mac_equals(const uint8_t *const mac1,
const uint8_t *const mac2) ;
uint_fast8_t owl_frequency_to_channel(const uint_fast16_t channel) ;
// Time
int owl_msleep(uint32_t time_ms) ;
int owl_timestamp_now(owl_timestamp *const now) ;
owl_timestamp owl_timespec_to_timestamp(const struct timespec d) ;
owl_timestamp owl_timeval_to_timestamp(const struct timeval d) ;
owl_bool owl_timestamp_equals(const owl_timestamp d1,
const owl_timestamp d2) ;
owl_bool owl_timestamp_is_null(const owl_timestamp d) ;
uint64_t owl_timestamp_to_ms(const owl_timestamp d) ;
void owl_timestamp_to_string(char *const dst, const owl_timestamp src) ;
uint_fast32_t owl_time_elapsed_ms(const owl_timestamp d1,
const owl_timestamp d2) ;
owl_timestamp owl_time_elapsed(const owl_timestamp d1,
const owl_timestamp d2) ;
// Endianess
owl_timestamp owl_hton_timestamp(const owl_timestamp d) ;
owl_timestamp owl_ntoh_timestamp(const owl_timestamp d) ;
float owl_swap_float(const float f) ;
#if __BYTE_ORDER == __BIG_ENDIAN
# define owl_htonf(f) (f)
# define owl_ntohf(f) (f)
#else // __BYTE_ORDER == __BIG_ENDIAN
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define owl_htonf(f) owl_swap_float(f)
# define owl_ntohf(f) owl_swap_float(f)
# else // __BYTE_ORDER == __LITTLE_ENDIAN
# error "This program does not handle strange architectures."
# endif // __BYTE_ORDER == __LITTLE_ENDIAN
#endif // __BYTE_ORDER == __BIG_ENDIAN
// Network
int owl_create_udp_trx_socket(const char *const server_address,
const uint_fast16_t server_port,
struct sockaddr_in *const server_description,
struct sockaddr_in *const client_description) ;
int owl_create_udp_listening_socket(const uint_fast16_t port) ;
// Signals
void owl_sigint_handler(const int num) ;
void owl_sigterm_handler(const int num) ;
// Threads
void owl_close_fd(void *const fd) ;
void owl_close_file(void *const file) ;
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // _LIBOWLPS_H_