summaryrefslogtreecommitdiff
path: root/sensor/patchedBLE/examples/BLE_iBeacon/BLE_iBeacon.ino
blob: e43174d4d5106820485465d4f93bb35f327de91b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
   Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
   Ported to Arduino ESP32 by pcbreflux
*/
 
 
/*
   Create a BLE server that will send periodic iBeacon frames.
   The design of creating the BLE server is:
   1. Create a BLE Server
   2. Create advertising data
   3. Start advertising.
   4. wait
   5. Stop advertising.
   6. deep sleep
   
*/
#include "sys/time.h"
 
#include "BLEDevice.h"
#include "BLEUtils.h"
#include "BLEBeacon.h"
#include "esp_sleep.h"
 
#define GPIO_DEEP_SLEEP_DURATION     10  // sleep x seconds and then wake up 
RTC_DATA_ATTR static time_t last;        // remember last boot in RTC Memory 
RTC_DATA_ATTR static uint32_t bootcount; // remember number of boots in RTC Memory 
 
#ifdef __cplusplus
extern "C" {
#endif
 
uint8_t temprature_sens_read();
//uint8_t g_phyFuns; 
 
#ifdef __cplusplus
}
#endif
 
// See the following for generating UUIDs: 
// https://www.uuidgenerator.net/ 
BLEAdvertising *pAdvertising;
struct timeval now;
 
#define BEACON_UUID           "8ec76ea3-6668-48da-9866-75be8bc86f4d" // UUID 1 128-Bit (may use linux tool uuidgen or random numbers via https://www.uuidgenerator.net/) 
 
void setBeacon() {
 
  BLEBeacon oBeacon = BLEBeacon();
  oBeacon.setManufacturerId(0x4C00); // fake Apple 0x004C LSB (ENDIAN_CHANGE_U16!) 
  oBeacon.setProximityUUID(BLEUUID(BEACON_UUID));
  oBeacon.setMajor((bootcount & 0xFFFF0000) >> 16);
  oBeacon.setMinor(bootcount&0xFFFF);
  BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();
  BLEAdvertisementData oScanResponseData = BLEAdvertisementData();
  
  oAdvertisementData.setFlags(0x04); // BR_EDR_NOT_SUPPORTED 0x04 
  
  std::string strServiceData = "";
  
  strServiceData += (char)26;     // Len 
  strServiceData += (char)0xFF;   // Type 
  strServiceData += oBeacon.getData(); 
  oAdvertisementData.addData(strServiceData);
  
  pAdvertising->setAdvertisementData(oAdvertisementData);
  pAdvertising->setScanResponseData(oScanResponseData);
 
}
 
void setup() {
 
    
  Serial.begin(115200);
  gettimeofday(&now, NULL);
 
  Serial.printf("start ESP32 %d\n",bootcount++);
 
  Serial.printf("deep sleep (%lds since last reset, %lds since last boot)\n",now.tv_sec,now.tv_sec-last);
 
  last = now.tv_sec;
  
  // Create the BLE Device 
  BLEDevice::init("");
 
  // Create the BLE Server 
  // BLEServer *pServer = BLEDevice::createServer(); // <-- no longer required to instantiate BLEServer, less flash and ram usage 
 
  pAdvertising = BLEDevice::getAdvertising();
  
  setBeacon();
   // Start advertising 
  pAdvertising->start();
  Serial.println("Advertizing started...");
  delay(100);
  pAdvertising->stop();
  Serial.printf("enter deep sleep\n");
  esp_deep_sleep(1000000LL * GPIO_DEEP_SLEEP_DURATION);
  Serial.printf("in deep sleep\n");
}
 
void loop() {
}