- Απαιτούμενα στοιχεία
- Χρήση της εφαρμογής Android nRF Connect για ESP32 iBeacon
- Προγραμματισμός του ESP32 ώστε να λειτουργεί ως BLE iBeacon
Το ESP32 είναι πραγματικά μια ισχυρή συσκευή IoT με ενσωματωμένη υποστήριξη για Bluetooth και WiFi. Το ESP32 είναι προηγμένη έκδοση του προκατόχου του ESP8266 με επιπλέον δυνατότητες όπως RAM, ROM, GPIO Pins κ.λπ. Η μονάδα ESP32 υποστηρίζει τόσο κλασικό Bluetooth όσο και Bluetooth Low Energy (BLE), το κλασικό Bluetooth μπορεί να χρησιμοποιηθεί για τη μεταφορά τραγουδιών ή αρχείων και το BLE Η επιλογή μπορεί να χρησιμοποιηθεί για εφαρμογές βελτιστοποιημένες με μπαταρία, όπως Bluetooth beacons, fitness band, proximity s κ.λπ. Είναι επίσης δυνατό να χρησιμοποιήσετε το ESP32 ως σειριακό Bluetooth όπως τα HC-05 ή HC-06 modules για απλά έργα μικροελεγκτή.
Όπως γνωρίζουμε, το BLE μπορεί να λειτουργήσει σε δύο διαφορετικούς τρόπους - Λειτουργία διακομιστή και Λειτουργία πελάτη. Και οι δύο τρόποι έχουν συζητηθεί στα προηγούμενα ESP32 Tutorials:
- Διακομιστής ESP32 BLE - Υπηρεσία GATT για ένδειξη στάθμης μπαταρίας
- Πελάτης ESP32 BLE - Σύνδεση με Fitness Band για ενεργοποίηση λαμπτήρα
Σε αυτό το σεμινάριο θα δημιουργήσουμε ένα BLE iBeacon χρησιμοποιώντας το ESP32 όπου το ESP32 θα λειτουργεί ως διακομιστής και το smartphone θα λειτουργεί ως πελάτης. Υποθέτω ότι είστε ήδη εξοικειωμένοι με το πώς να χρησιμοποιήσετε την πλακέτα ESP32 με το Arduino IDE, αν δεν επιστρέψετε στην αρχή με το σεμινάριο ESP32.
Μπορείτε επίσης να μάθετε περισσότερα σχετικά με το τι είναι η τεχνολογία Beacon / iBeacon, μέσω των προηγούμενων έργων Bluetooth iBeacon χρησιμοποιώντας Raspberry Pi και HM-10 BLE iBeacon.
Απαιτούμενα στοιχεία
Σκεύη, εξαρτήματα:
- Διοικητικό Συμβούλιο ESP32
- Καλώδιο Micro USB
Λογισμικό:
- Arduino IDE
- Εφαρμογή Android: nRF Connect for Mobile (By Nordic Semiconductor)
Υπάρχουν πολλές εφαρμογές σαρωτή BLE, μία από αυτές που έχουμε χρησιμοποιήσει στο προηγούμενο έργο μας για το πώς να χρησιμοποιήσετε την ενότητα HM-10 BLE με το Arduino. Αυτή η εφαρμογή σαρωτή BLE παρέχει καλή γραφική διεπαφή (GUI), αλλά δεν διαθέτει επιπλέον πληροφορίες, επομένως σε αυτό το έργο χρησιμοποιούμε την εφαρμογή NRF Connect for Mobile.
Χρήση της εφαρμογής Android nRF Connect για ESP32 iBeacon
1. Πραγματοποιήστε λήψη της εφαρμογής nRF Connect από το Google Play Store και ανοίξτε την.
2. Η οθόνη μοιάζει παρακάτω. Οι χρήσιμες επιλογές για αυτό το έργο θα είναι "Σάρωση", "Σαρωτής" και "Πληροφορίες" όταν εντοπιστούν συσκευές.
Η επιλογή «Σάρωση» θα χρησιμοποιηθεί για να δείτε όλα τα διαθέσιμα iBeacons. Για να ξεκινήσετε την αναζήτηση για το iBeacon, τραβήξτε προς τα κάτω την οθόνη ή μεταβείτε στην επιλογή "Σάρωση" στην επάνω δεξιά γωνία της οθόνης. Αυτό θα ξεκινήσει την αναζήτηση των διαθέσιμων iBeacons.
3. Αφού κάνετε αναζήτηση στο iBeacon, θα μπορείτε να δείτε το RSSI, το UUID, το Major και το Minor του iBeacon. Το RSSI θα αλλάξει εάν αφαιρέσετε το κινητό ή το iBeacon το ένα από το άλλο. Εδώ σε αυτήν την οθόνη, το RSSI είναι (-37). Εκτός από αυτό υπάρχουν κάποιες λεπτομέρειες όπως το Όνομα εταιρείας Dummy, Τύπος συσκευής, Μήκος bytes, Το τοπικό όνομα ESP32. Εδώ είναι « ESP32 ως iBeacon ». Μπορείτε να αλλάξετε το τοπικό όνομα στο σκίτσο.
4. Αφού αφαιρέσετε το smartphone από το iBeacon, η τιμή RSSI αλλάζει από -37 σε -58. Αυτές οι τιμές θα συνεχίσουν να αλλάζουν εάν μετακινήσετε μία από τις συσκευές.
Οι αποδεκτές τιμές σήματος RSSI έχουν ως εξής:
Ισχύς σήματος | TL; Δρ | Απαιτείται για | |
---|---|---|---|
-30 dBm | Φοβερο | Μέγιστη εφικτή ισχύς σήματος. Ο πελάτης μπορεί να απέχει μόνο λίγα μέτρα από το AP για να το επιτύχει. Δεν είναι τυπικό ή επιθυμητό στον πραγματικό κόσμο. | ΟΧΙ |
-67 dBm | Πολύ καλά | Ελάχιστη ισχύς σήματος για εφαρμογές που απαιτούν πολύ αξιόπιστη, έγκαιρη παράδοση πακέτων δεδομένων. | VoIP / VoWiFi, ροή βίντεο |
-70 dBm | εντάξει | Ελάχιστη ισχύς σήματος για αξιόπιστη παράδοση πακέτων. | Ηλεκτρονικό ταχυδρομείο, ιστός |
-80 dBm | ΟΧΙ καλα | Ελάχιστη ισχύς σήματος για βασική συνδεσιμότητα. Η παράδοση πακέτων μπορεί να μην είναι αξιόπιστη. | ΟΧΙ |
-90 dBm | Αχρησιμοποίητο | Πλησιάζει ή πνίγεται στο θόρυβο. Οποιαδήποτε λειτουργικότητα είναι πολύ απίθανη. | ΟΧΙ |
Προγραμματισμός του ESP32 ώστε να λειτουργεί ως BLE iBeacon
Υπάρχει διαθέσιμο δείγμα προγράμματος ESP32 BLE iBeacon όταν εγκαθιστάτε την πλακέτα ESP32 στο Arduino IDE. Αλλά έχουμε επεξεργαστεί ελαφρώς αυτό το σκίτσο σε αυτό το σεμινάριο, η ολοκληρωμένη έκδοση του δείγματος προγράμματος δίνεται στο τέλος αυτού του σεμιναρίου.
Για να ανοίξετε το Δείγμα προγράμματος του ESP32 BLE_iBeacon, ακολουθήστε τα παρακάτω βήματα.
- Ανοίξτε το Arduino IDE και επιλέξτε "ESP32 Dev Module". (Εάν δεν βρείτε αυτόν τον πίνακα, ελέγξτε αν έχετε εγκαταστήσει το πακέτο ESP32 Board)
- Μεταβείτε στο Αρχείο > Παραδείγματα > ESP32 BLE Arduino > BLE_iBeacon
- Ανοίξτε το σκίτσο "BLE_iBeacon".
Τώρα υπάρχει μια μικρή τροποποίηση στον κώδικα που γίνεται σε αυτό το σεμινάριο. Το όνομα ESP32 θα ενημερωθεί επίσης σε αυτό το σχέδιο. Ξεκινήστε λοιπόν με τη συμπερίληψη των απαραίτητων βιβλιοθηκών που θα χρησιμοποιηθούν στη δημιουργία διακομιστή BLE και iBeacon.
# συμπερίληψη "sys / time.h"
Αυτή είναι μια βιβλιοθήκη ώρας για να λάβετε την τρέχουσα ώρα του συστήματος. Περιλαμβάνει λειτουργίες όπως tv_sec, gettimeofday () κ.λπ. Για περισσότερες πληροφορίες, μπορείτε να επισκεφθείτε την επίσημη έκδοση UNIX του « sys / time.h».
Στη συνέχεια, περιλαμβάνονται οι βιβλιοθήκες ESP32 BLE, οι οποίες περιέχουν πολλές λειτουργίες που χρησιμοποιούνται για την κατασκευή του ESP32 σε διαφορετικές διαμορφώσεις, όπως BLE Client ή BLE Server.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
Η βιβλιοθήκη iBeacon περιλαμβάνεται η οποία ορίζει την ESP32 ως iBeacon. Μαζί με αυτό, η βιβλιοθήκη βαθύ ύπνου περιλαμβάνεται στο ESP32. Η βιβλιοθήκη θα χρησιμοποιηθεί για την αποστολή ESP32 σε κατάσταση βαθιάς αναστολής για καθορισμένο χρονικό διάστημα.
# συμπερίληψη "BLEBeacon.h" #include "esp_sleep.h"
Ορίστε τη διάρκεια ύπνου για ESP32. Εδώ το ESP32 θα βρίσκεται σε βαθύ ύπνο για διάρκεια 10 δευτερολέπτων και θα διαφημιστεί και θα πάει πάλι σε βαθύ ύπνο για 10 δευτερόλεπτα.
# καθορισμός GPIO_DEEP_SLEEP_DURATION 10
Εδώ ορίζεται το RTC_DATA_ATTR. Σημειώστε ότι εάν ορίσετε μια καθολική μεταβλητή με το χαρακτηριστικό RTC_DATA_ATTR, η μεταβλητή θα τοποθετηθεί στη μνήμη RTC_SLOW_MEM. Έτσι, η δομή δηλώθηκε ως RTC_DATA_ATTR και η αντιγραφή της δυναμικής μνήμης σε αυτήν τη δομή πριν από έναν βαθύ ύπνο βοηθά στην ανάκτηση αυτής σε δυναμική μνήμη μετά την αφύπνιση. Με απλά λόγια, εξοικονομούμε χρόνο στη στατική μνήμη από τη δυναμική μνήμη για να την ανακτήσουμε ξανά μετά από έναν βαθύ ύπνο. Εδώ ορίζονται οι δύο μεταβλητές. Το « τελευταίο » χρησιμοποιείται για να πάρει την τελευταία φορά που το ESP32 πήγε σε βαθύ ύπνο και το bootcount χρησιμοποιείται αριθμός μετρήσεων επαναφοράς.
RTC_DATA_ATTR στατικό time_t τελευταία; RTC_DATA_ATTR στατικό uint32_t bootcount;
Στη συνέχεια, ορίστε τον τύπο διαφήμισης BLE. Ο ορισμός γίνεται ως εξής.
BLEAdvertising * pAdvertising;
Το χρονικό διάστημα ορίζεται ως δομή για πρόσβαση στην τρέχουσα ώρα.
δομή χρονικού διαστήματος τώρα
Επίσης ορίζεται το UUID. Τα UUID μπορούν να δημιουργηθούν από αυτόν τον σύνδεσμο .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
Τώρα δημιουργήστε μια συνάρτηση που θα περιέχει χαρακτηριστικά iBeacon όπως UUID, Major, Minor, κ.λπ. Σε αυτήν τη συνάρτηση δημιουργήστε μια παρουσία για BLE ως iBeacon και ορίστε ένα ψεύτικο αναγνωριστικό κατασκευαστή, UUID, σημαντικό και δευτερεύον για το ESP32 ως iBeacon.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
Ορίστε τη σημαία ως 0x04 έτσι ώστε να εξάγει το BrEdrNotSupported στο σαρωτή.
oData.setFlags (0x04);
Ορίστε δεδομένα διαφήμισης για δημοσίευση.
std:: string strServiceData = "";
Προσθέστε τη συμβολοσειρά μία μετά την άλλη για διαφήμιση.
strServiceData + = (char) 26; // Len strServiceData + = (char) 0xFF; // Πληκτρολογήστε strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
Ξεκινήστε τη διαφήμιση δημοσιεύοντας δεδομένα.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
Ξεκινήστε τη σειριακή οθόνη με ρυθμό baud 115200 και λάβετε χρόνο. Επίσης, αυξάνει την bootcount να αποθηκεύσετε τον αριθμό των Επαναφέρει.
Serial.begin (115200); gettimeofday (& τώρα, NULL); Serial.printf ("έναρξη ESP32% d \ n", bootcount ++);
Αποθηκεύστε την τρέχουσα ώρα στη στατική μνήμη.
τελευταία = τώρα.tv_sec;
Δημιουργήστε μια συσκευή BLE και ονομάστε την όπως θέλετε. Εδώ το ESP32 ονομάζεται " ESP2 ως iBeacon ". Σημειώστε ότι τα ονόματα μπορεί να είναι μεγάλα, αλλά αυτή η έκδοση κώδικα ξεκίνησε την υποστήριξη για μεγάλα ονόματα.
BLEDevice:: init ("ESP32 ως iBeacon");
Δημιουργήστε διακομιστή BLE για να διαφημίσετε και να ξεκινήσετε.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
Στη συνέχεια, ρυθμίστε το ESP32 σε λειτουργία iBeacon.
setBeacon ();
Ξεκινήστε τη διαφήμιση και μετά σταματήστε τη διαφήμιση και πηγαίνετε σε βαθύ ύπνο για 10 δευτερόλεπτα.
pAdvertising-> start (); pAdvertising-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
Τέλος, συνδέστε τον πίνακα ανάπτυξης του ESP32 με το φορητό υπολογιστή σας χρησιμοποιώντας ένα καλώδιο Micro USB και ανεβάστε τον κωδικό στο ESP32 χρησιμοποιώντας το Arduino IDE. Στη συνέχεια, ανοίξτε την εφαρμογή Android nRF Connect στο smartphone σας και ξεκινήστε τη σάρωση. Θα βρείτε το ESP32 ως εκπομπή iBeacon όπως φαίνεται στην παρακάτω εικόνα:
Έτσι το ESP32 μπορεί να χρησιμοποιηθεί ως BLE Beacon για τη διαφήμιση UUID, Major και Minor. Αν θέλετε να μάθετε περισσότερα για το iBeacon, ακολουθήστε το προηγούμενο σεμινάριό μας για το HM10 ως iBeacon. Επίσης, εάν έχετε οποιαδήποτε αμφιβολία, τότε σχολιάστε παρακάτω ή κάντε ερωτήσεις στα φόρουμ.
Ο πλήρης κώδικας με ένα βίντεο εργασίας δίνεται παρακάτω.
/>