WiFi_TX.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. WiFi NAN driver
  3. with thanks to https://github.com/sxjack/uav_electronic_ids for WiFi calls
  4. */
  5. #include "WiFi_TX.h"
  6. #include <esp_wifi.h>
  7. #include <WiFi.h>
  8. #include <esp_system.h>
  9. #include "parameters.h"
  10. bool WiFi_NAN::init(void)
  11. {
  12. //use a local MAC address to avoid tracking transponders based on their MAC address
  13. uint8_t mac_addr[6];
  14. generate_random_mac(mac_addr);
  15. mac_addr[0] |= 0x02; // set MAC local bit
  16. mac_addr[0] &= 0xFE; // unset MAC multicast bit
  17. //set MAC address
  18. esp_base_mac_addr_set(mac_addr);
  19. wifi_config_t wifi_config {};
  20. WiFi.softAP("");
  21. esp_wifi_get_config(WIFI_IF_AP, &wifi_config);
  22. wifi_config.ap.ssid_hidden = 1;
  23. wifi_config.ap.channel = wifi_channel;
  24. if (esp_wifi_set_config(WIFI_IF_AP, &wifi_config) != ESP_OK) {
  25. return false;
  26. }
  27. if (esp_wifi_set_bandwidth(WIFI_IF_AP, WIFI_BW_HT20) != ESP_OK) {
  28. return false;
  29. }
  30. if (esp_read_mac(WiFi_mac_addr, ESP_MAC_WIFI_STA) != ESP_OK) {
  31. return false;
  32. }
  33. esp_wifi_set_max_tx_power(dBm_to_tx_power(g.wifi_power));
  34. return true;
  35. }
  36. bool WiFi_NAN::transmit(ODID_UAS_Data &UAS_data)
  37. {
  38. if (!initialised) {
  39. initialised = true;
  40. init();
  41. }
  42. uint8_t buffer[1024] {};
  43. int length;
  44. if ((length = odid_wifi_build_nan_sync_beacon_frame((char *)WiFi_mac_addr,
  45. buffer,sizeof(buffer))) > 0) {
  46. if (esp_wifi_80211_tx(WIFI_IF_AP,buffer,length,true) != ESP_OK) {
  47. return false;
  48. }
  49. }
  50. if ((length = odid_wifi_build_message_pack_nan_action_frame(&UAS_data,(char *)WiFi_mac_addr,
  51. ++send_counter,
  52. buffer,sizeof(buffer))) > 0) {
  53. if (esp_wifi_80211_tx(WIFI_IF_AP,buffer,length,true) != ESP_OK) {
  54. return false;
  55. }
  56. }
  57. return true;
  58. }
  59. /*
  60. map dBm to a TX power
  61. */
  62. uint8_t WiFi_NAN::dBm_to_tx_power(float dBm) const
  63. {
  64. if (dBm < 2) {
  65. dBm = 2;
  66. }
  67. if (dBm > 20) {
  68. dBm = 20;
  69. }
  70. return uint8_t((dBm+1.125) * 4);
  71. }