- BLE (Bluetooth Low Energy) ile ilgili terminolojiler
- Donanımı hazırlama
- GATT hizmetini kullanarak Pil Seviyesi Göstergesi için ESP32'yi programlama
- GATT hizmetinizi ESP32 BLE'de test etme
Kablosuz Kulaklıklar, Spor bantları, Bluetooth Hoparlörler, Kulak İçi kulaklıklar, Cep telefonları, Dizüstü Bilgisayarlar… Çevremizde çok fazla Bluetooth cihazı var ve bu cihazların çoğu pille çalışıyor. Cep telefonunuza bir Bluetooth cihazı bağladığınızda, bağlı cihazın bir bilgisayar veya ses cihazı veya bir cep telefonu olduğunu otomatik olarak nasıl anladığını hiç merak ettiniz mi? Bazı cihazlar için telefonumuz, bağlı cihazın pil yüzdesini bildirim çubuğunda otomatik olarak gösterebilir. Bütün bunlar kendi kendine nasıl oluyor? Telefon ile Bluetooth cihazı arasında paylaşılan bazı ortak protokoller olmalıdır!
Merak etmeye devam edin, popüler ESP32 modülüyle Bluetooth Düşük Enerjiyi (kısaca BLE) anlamaya çalışırken bu soruların cevaplarını alacaksınız. ESP32'deki Klasik Bluetooth'un aksine, BLE yalnızca bir iletişim etkinleştirildiğinde çalışır ve aksi takdirde uyku modunda kalır, bu onu pille çalışan uygulamalar için doğru seçim yapar. BLE ayrıca örgü ağlar oluşturabilir ve Beacon olarak hareket edebilir. Normalde bir BLE modülleri sunucu veya istemci olarak çalışır, burada sunucu olarak ESP32 BLE kullanacağız.
Burada, anlaşılma kolaylığı için tam ESP32 Bluetooth'u üç bölüme ayırdık.
1. ESP32'de Seri Bluetooth, Cep Telefonundan LED geçiş
2 . GATT Hizmetini kullanarak Pil seviyesi verilerini Cep Telefonuna göndermek için BLE sunucusu
3. BLE istemcisi, BLE cihazlarını tarar ve işaretçi görevi görür.
İlk makaleyi zaten ele aldık; Bu makalede , ESP32 BLE'nin bir sunucu olarak çalışmasını ve pil seviyesi bilgilerini göndermek için GATT Hizmetini nasıl kullanacağımızı öğreneceğiz. Test amacıyla BLE GATT servisi aracılığıyla ESP32'den pil yüzdesi olarak kodlanmış değerleri cep telefonumuza göndereceğiz, bu şekilde Mobil cihazımız ESP32'nin pil yüzdesine göndermeye çalışan pille çalışan bir Bluetooth cihazı olduğunu varsayacaktır. Ayrıntılara girmeden önce Bluetooth Düşük Enerji ile ilgili birkaç terminolojinin altını çizeceğiz.
BLE (Bluetooth Low Energy) ile ilgili terminolojiler
BLE Sunucusu: Daha önce de belirtildiği gibi, BLE bir Sunucu veya bir istemci olarak çalışmak üzere programlanabilir. Bir sunucu olarak çalışırken, BLE yalnızca veri sağlayabilir, bir bağlantı başlatamaz. Örnek bir fitness grubu olabilir. Bir Sunucu, yalnızca müşteri isterse bilgi gönderebilir.
En yaygın olarak ESP32'nin BLE'si bir Sunucu kullanılır. Her Sunucu, içinde bir veya daha fazla Hizmete sahip olacak ve benzer şekilde her hizmet, kendisiyle ilişkili bir veya daha fazla özelliğe sahip olacaktır. Bir Karakteristik, içinde sıfır, bir veya birden fazla Tanımlayıcıya sahip olabilir. Her Hizmet, özellik veya Tanımlayıcı, UUID adı verilen kendi önceden tanımlanmış benzersiz kimliğine sahip olacaktır.
BLE İstemcisi: İstemci, diğer Bluetooth cihazlarını tarayabilir ve dinleyebilir. Bir örnek cep telefonunuz olabilir. Çoğu BLE donanım cihazının sunucu ve istemci olarak çalışabileceğini, cihazın rolüne karar verenin yazılım olduğunu unutmayın.
Çevresel Aygıt / Merkezi Aygıt: Bir BLE ağında yalnızca bir Merkezi Aygıt olabilir, ancak gerektiği kadar Çevresel aygıtlara sahip olabilir. Merkezi Cihaz aynı anda tüm çevresel cihazlara bağlanabilir, ancak çevresel cihaz yalnızca Merkezi Cihaza bağlanabilir, bu şekilde iki çevresel cihaz birbiriyle veri paylaşamaz. Merkezi cihaz için en iyi örnek akıllı Telefonlarımız ve Çevresel cihazlarımız için Bluetooth kulaklığımız veya fitness bantlarımız olacaktır.
BLE Reklamcılığı: BLE Reklamcılığı, Bluetooth cihazının eşleşmesi ve bir bağlantı kurabilmesi için herkes tarafından görülebilir olmasını sağlayan geeky terimidir. Tek yönlü bir iletişim olarak düşünülebilir. Burada sunucu, bir sunucunun onu almasını bekleyen reklam verilerini sürdürür. BLE Beacon, bir BLE türüdür.
UUID (Evrensel Benzersiz Tanımlayıcı): Her BLE Bluetooth cihazına, programcı tarafından programlandığında bir Evrensel Benzersiz Tanımlayıcı Numarası verilir. Bu tanımlayıcıyı, BLE cihazının işlevselliğini / rolünü temsil eden bir sayı dizisi olarak düşünebilirsiniz. Yine iki tür UUID vardır. Biri Hizmet UUID'sidir ve diğeri de Karakteristik UUID'dir.
GATT Hizmeti: GATT, Genel Öznitelik Profili anlamına gelir; bu, iki BLE cihazının her zaman iletişim kurması gereken bazı standart yolları tanımlar. Bu Öznitelik (ATT) Protokolü önceden tanımlanmıştır ve tüm BLE cihazları için ortaktır, bu şekilde herhangi iki BLE cihazı birbirini tanımlayabilir. Yani GATT, önceki sorumuzun cevabıydı.
İki BLE cihazının veri göndermesi gereken teknik, hizmetler ve özellikler adı verilen kavramla tanımlanır.
BLE Hizmeti / BLE özelliği: Hizmet UUID'si bize BLE cihazının ne tür hizmet gerçekleştireceğini söyler ve Karakteristik UUID, bu hizmet tarafından gerçekleştirilecek parametrelerin veya işlevlerin neler olduğunu söyler. Dolayısıyla, her Hizmetin altında bir veya daha fazla özellik olacaktır. Tamam! Programcı bu UUID'yi nereden alıyor? Her UUID zaten GATT (Genel Öznitelik Profili) tarafından tanımlanmıştır, web sitelerini ziyaret edebilir ve proje için gereken UUID'yi seçebilirsiniz. Başımızın biraz üzerinden geçtiğini biliyorum; bir örnekle anlamaya çalışalım.
Bir ses çaların BLE cihazını varsayalım. Başlangıçta telefonunuzla eşleştirdiğinizde, telefonunuz bunu bir ses cihazı olarak tanımlar ve ayrıca durum çubuğunda pil seviyesini görüntüler. Bu nedenle, bunun gerçekleşmesi için ses oynatıcının bir şekilde telefonunuza pil seviyesini ve pilindeki şarj yüzdesini paylaşmaya istekli olduğunu söylemesi gerekir. Bu, UUID kullanılarak yapılır, BLE zarının pil seviyesi hakkında ayrıntılar sağlayacağını söyleyen belirli bir UUID vardır, bu UUID, hizmet türünün Hizmet UUID olarak adlandırıldığını söyler , yine yapılması gereken çok fazla parametre olabilir. Pilin değeri böyle bir parametrede olduğu gibi bir hizmeti tamamlamak için değiştirilir, her parametrenin kendi UUID'si olur ve bunlara Karakteristik UUID adı verilir .Bir özellik tarafından gerçekleştirilen genel işlev Okuma, Yazma, Bildirme ve Göstermedir.
BLE Tanımlayıcı: Tanımlayıcı, Karakteristik içerisinde bulunan isteğe bağlı bir özelliktir. Bir Tanımlayıcı normalde bir Karakteristike nasıl erişileceğini belirtir.
BLE Beacon: Bir Bluetooth Beacon, kullanıcı bir menzile girdiğinde (yakınlık) önceden tanımlanmış bazı eylemler gerçekleştiren bir yakınlık anahtarı gibidir. Her zaman kimliğini duyurur ve bu nedenle her zaman eşleşmeye hazırdır.
BLE2902: Bu konuda hala şüpheliyim, ancak bunu istemci tarafında, sunucuyu bildirimi Açma veya Kapatma konusunda bilgilendiren bir yazılım parçası olarak düşünebilirsiniz, bu, güç tasarrufu yapmamıza yardımcı olacaktır.
Umarım kabaca bir fikriniz vardır, iyi olan şey, kütüphaneler olsa bile tüm el işleri bizim için zaten yapıldığından fazla bir şey bilmemize gerek olmamasıdır.
Donanımı hazırlama
Proje donanım kurulumu gerektirmez, ancak Arduino IDE'nize ESP32 kartı ayrıntılarını eklediğinizden ve her şeyin beklendiği gibi çalışıp çalışmadığını kontrol etmek için minimum örnek yanıp sönme programını denediğinizden emin olun. Bunu nasıl yapacağınız konusunda şüphelisiniz, aynısını yapmak için ESP32 ile Arduino ile Başlarken öğreticisini takip edebilirsiniz.
Ayrıca, BLE hizmetlerini test etmek için, doğrudan PlayStore'dan indirilebilen nRF android uygulamasını cep telefonumuzda kullanacağız. Ayrıca, Iphone kullanıcıları için Itunes Store'da da mevcuttur. BLE ile uzun süre çalışmayı planlıyorsanız, bu uygulama hata ayıklama amacıyla gerçekten kullanışlı olacaktır.
GATT hizmetini kullanarak Pil Seviyesi Göstergesi için ESP32'yi programlama
Bu zamana kadar GATT hizmetinin ne olduğu ve Hizmet ve karakteristik modeller kullanılarak nasıl uygulandığı konusunda adil bir fikriniz olduğunu varsayıyorum. Şimdi, Arduino IDE'yi kullanarak ESP32'de nasıl uygulandığını öğrenmek için programa dalalım. Devam etmeden önce, bu alanı Andreas Spiess'e BLE videosu için teşekkür etmek için kullanmak istiyorum.
Programa, gerekli kütüphaneleri taslağımıza aktararak başlıyoruz. ESP32'nin BLE işlevini kullanmak için yapılandırılması gereken çok şey var, umarım bizim için çok çalışmış olan ve kitaplıkları sağlayan Neil Kolban sayesinde. Kitaplıkların işlevselliğini anlamak istiyorsanız, github sayfasındaki belgelerine bakabilirsiniz.
#Dahil etmek
Ardından, Bluetooth cihazımız için Sunucu Geri Arama işlevini tanımlamalıyız. Bundan önce, BLE'de geri arama işlevinin ne olduğunu anlayalım.
BLE'de geri arama işlevi nedir?
Ne zaman BLE Sunucusu gibi çalıştığını bir sunucu geri arama işlevini tanımlamak önemlidir. BLE ile ilişkili birçok geri arama türü vardır, ancak basitleştirmek gerekirse, bunları, eylemin tamamlandığından emin olmak için gerçekleştirilen bir onay olarak kabul edersiniz. İstemci ile sunucu arasındaki bağlantının başarıyla kurulduğundan emin olmak için bir sunucu geri araması kullanılır.
Bir sunucu geri araması gerçekleştirmek için aşağıdaki kod satırlarını kullanıyoruz.
bool _BLEClientConnected = yanlış; sınıf MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
İçinde boşluk kurulum fonksiyonu, biz 115200 de seri iletişim başlatmak ayıklama ve ardından Bluetooth Cihazı başlatmak yoluyla InitBLE fonksiyonu.
geçersiz kurulum () { Serial.begin (115200); Serial.println ("Pil Seviyesi Göstergesi - BLE"); InitBLE (); }
İnitBLE sihir bütün yerdir. Biz zorundayız Bluetooth sunucu oluşturmak ve Batarya Seviye servisini kullanmak burada. Ancak bundan önce, pil Seviyesini okumak için Hizmet, Karakteristik ve Tanımlayıcı için UUID'yi tanımlamamız gerekir. Tüm UUID, Bluetooth GATT servis web sitesinden edinilebilir. Bizim durumumuz için Pil servisini kullanmaya çalışıyoruz ve bunun için UUID aşağıda gösterildiği gibi 0X180F olarak tanımlanmıştır.
Ardından, bu hizmetle ilişkili Karakteristiği bilmemiz gerekiyor. Sadece Pil Servisine tıkladığınızda, Pil Seviyesinin özelliklerin adı olduğu ve 0 ile 100 arasında bir değer aldığı belirtilen Servis Özellikleri sayfasına yönlendirileceksiniz. Ayrıca sadece iki tane gerçekleştirebileceğimizi unutmayın. Bu özelliğe sahip eylemler, biri yapılması zorunlu olan Okuma, diğeri ise İsteğe Bağlı olan Bildirdir. Bu yüzden zorunlu olan pil değerini müşteriye (Telefon) göndermemiz gerekiyor ve gerekirse telefona hangisinin isteğe bağlı olduğunu bildirebiliriz.
Ancak bekleyin , Karakteristik Pil Seviyesi için UUID değerini hala bulamadık. Bunu yapmak için Pil Özellikleri sayfasına girin ve Pil Seviyesi adını arayın, UUID'sini 0X2A19 olarak bulacaksınız, aynı anlık görüntüsü aşağıda gösterilmektedir.
Artık tüm değerlere sahip olduğumuza göre, onu aşağıda gösterildiği gibi programa koyalım. Adı BatterySerivce , BatteryLevelCharacteristic ve BatteryLevelDescriptor biz programda kullandığınızı Servisi, Karakteristik ve Tanımlayıcı başvurmak için kullanıcı tanımlı değişkenlerdir. Tanımlayıcı 0X2901 Değeri, değerin boyutu 8 bit olduğunda kullanılır, daha fazla bilgi Açıklayıcı Açıklama sayfasında bulunabilir.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
İnitBLE işlevine geri dönülüyor . Önce BLE sunucusunu başlatmalı ve bir isimle reklamını yapmalıyız. Aşağıdaki satırlar sunucusu olarak ble başlatmak için kullanılır. BLe sunucuma verdiğim isim “BLE Bataryası”, ancak kendinizinkini seçebilirsiniz.
BLEDevice:: init ("BLE Bataryası"); // BLE Sunucusunu Oluşturun BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (yeni MyServerCallbacks ());
Daha sonra, UUID'yi zaten tanımladığımız için GATT hizmetini başlatmalıyız çünkü aşağıdaki satırı kullanarak hizmeti basitçe başlatabiliriz.
// BLE Hizmetini Oluşturun BLEService * pBattery = pServer-> createService (BatteryService);
Hizmet başlatıldıktan sonra tanımlayıcıyı karakteristiklerle ilişkilendirebilir ve değerleri belirleyebiliriz. BLE2902 hizmeti de aşağıda gösterildiği gibi buraya eklenir.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Yüzde 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (yeni BLE2902 ());
Sonunda her şey ayarlandı, şimdi geriye kalan tek şey , ESP32'den reklam vermesini istemektir, böylece telefonumuz gibi diğer cihazlar onu keşfedebilir ve ona bağlanabilir ve bir istemciye bağlandığında, pil hizmetini başlatmalıdır ki bu da yapılabilir. aşağıdaki satırlar.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Reklam vermeye başlayın pServer-> getAdvertising () -> start ();
Yani şimdiye kadar o kadar iyi ki, son adım, tanımlayıcıya, müşteriye gönderilmesi gereken yüzde olarak pilin değerinin ne olduğunu söylemektir (Telefon). Bu değer, daha önce okuduğumuz gibi 0-100 arasında olabilir, işleri basitleştirmek için, pilin değerini 57 olarak kodladım ve ardından her 5 saniyede bir artırdım ve 100'e ulaştığında 0'dan başlayacağım. Yapılacak kod. bu aşağıda gösterilmiştir. Gönderilen değerin unit8_t biçiminde olduğuna dikkat edin.
uint8_t seviye = 57; void döngü () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); gecikme (5000); seviye ++; Serial.println (int (seviye)); eğer (int (seviye) == 100) seviye = 0; }
GATT hizmetinizi ESP32 BLE'de test etme
Yukarıda açıklanan komple kod sayfanın sonunda verilmiştir. Kodu ESP32 kartınıza yükleyin. Telefonunuz yüklendikten sonra "BLE Pil" Eşleştir adlı bir Bluetooth cihazı bulmalıdır.
Ardından nRF android uygulamasını kurun ve açın ve BLE Battery BLE cihazına bağlanın. Pil Servisi bölümünü genişletin ve aşağıdaki ekranı bulmalısınız.
Gördüğünüz gibi Uygulama, BLE'nin Pil Hizmeti sağladığını ve programda kullandığımız UUID nedeniyle Pil Seviyesi özelliklerine sahip olduğunu otomatik olarak belirlemiştir. Aynı zamanda% 67 olan mevcut pil değerinin 5 saniye beklediğini ve arttığını da görebilirsiniz.
BLE'yi kullanmanın en güzel yanı, artık BLE ile çalışan herhangi bir uygulamanın ESP32'nizin pil seviyesini bildiren BLE cihazı olduğunu düşünmesidir. Denemek için BatON adlı bir uygulama kullandım ve uygulama ESP32'yi pille çalışan Bluetooth cihazı olarak belirledi ve telefonumda bu şekilde yüzde bildirimini verdi.
Güzel!! Sağ? Ben de göstermiştir Aşağıdaki videoda tam çalışma. Artık ESP32 ile BLE Pil servislerini nasıl kullanacağınızı öğrendiğinize göre Nabız hızı, HID, Kalp Atış Hızı gibi çok ilginç diğer GATT servislerini de deneyebilirsiniz.