RPL DIO Message Contents

The DIO message is the primary mechanism for RPL nodes to discover the DODAG, select their parents, and maintain the routing topology. Nodes periodically transmit DIO messages to advertise their presence and routing information, allowing other nodes to join the DODAG and maintain routing paths.

struct rpl_dio {
uip_ipaddr_t dag_id;
rpl_ocp_t ocp;
rpl_rank_t rank;
uint8_t grounded;
uint8_t mop;
uint8_t preference;
uint8_t version;
uint8_t instance_id;
uint8_t dtsn;
uint8_t dag_intdoubl;
uint8_t dag_intmin;
uint8_t dag_redund;
uint8_t default_lifetime;
uint16_t lifetime_unit;
rpl_rank_t dag_max_rankinc;
rpl_rank_t dag_min_hoprankinc;
rpl_prefix_t destination_prefix;
rpl_prefix_t prefix_info;
struct rpl_metric_container mc;
};
typedef struct rpl_dio rpl_dio_t;

The provided code defines a structure called rpl_dio that represents the RPL (Routing Protocol for Low-Power and Lossy Networks) DODAG Information Object (DIO) message. The DIO message is a crucial component of the RPL protocol and is used for network discovery, parent selection, and DODAG maintenance.

Here’s a breakdown of the fields within the rpl_dio structure:

  1. dag_id: The identifier of the DODAG (Destination-Oriented Directed Acyclic Graph) to which the node belongs.
  2. ocp: The Objective Code Point, which identifies the Objective Function used by the RPL instance.
  3. rank: The rank of the node within the DODAG, indicating its position in the routing hierarchy.
  4. grounded: A flag indicating whether the DODAG is grounded (i.e., has a border router connected to a larger infrastructure).
  5. mop: The Mode of Operation, which specifies the method used for forwarding data packets.
  6. preference: The preference value of the node, which can be used to influence the DODAG construction.
  7. version: The version number of the DODAG.
  8. instance_id: The identifier of the RPL instance.
  9. dtsn: The Destination Advertisement Trigger Sequence Number, used to trigger DODAG updates.
  10. dag_intdoubl: The DODAG Interval Doubling, which specifies the interval between successive DIO transmissions.
  11. dag_intmin: The minimum interval between successive DIO transmissions.
  12. dag_redund: The DODAG Redundancy Constant, which controls the redundancy of DIO transmissions.
  13. default_lifetime: The default lifetime of the DODAG, used for setting the lifetime of routing table entries.
  14. lifetime_unit: The unit of time for the default lifetime.
  15. dag_max_rankinc: The maximum rank increase allowed when calculating a new rank.
  16. dag_min_hoprankinc: The minimum increment in rank when going up one hop.
  17. destination_prefix: The destination prefix information.
  18. prefix_info: The prefix information option.
  19. mc: The Metric Container, which holds information about the path metrics.

Gnuplot ile Grafik Çizimi ve EPS-II

Verileri görselleştirmek ve analiz etmek, birçok alanda önemli bir görevdir. Bu görevi yerine getirmek için birçok grafik oluşturma aracı bulunmaktadır. Bu blog yazısında, GNUPLOT adlı güçlü bir araçtan bahsedeceğiz. GNUPLOT, verileri grafiklere dönüştürmek için kullanılan bir komut satırı aracıdır. Hem basit hem de karmaşık grafikler oluşturmak için geniş bir işlevselliğe sahiptir.

GNUPLOT, birçok veri formatını destekler ve kullanıcı dostu bir komut satırı arayüzüne sahiptir. Verileri içeren dosyaları okuyarak, çizgi grafikleri, sütun grafikleri, nokta grafikleri, histogramlar, yüzey grafikleri gibi farklı grafik türlerini oluşturabilir. Ayrıca, eksenlerin ölçeğini, renkleri, etiketleri, başlıkları ve diğer grafik özelliklerini özelleştirme imkanı sunar.

GNUPLOT’ın avantajlarından biri, birçok işletim sistemi için mevcut olmasıdır. Linux, Windows ve macOS gibi yaygın kullanılan işletim sistemlerinde çalışabilir. GNUPLOT, açık kaynak bir yazılımdır ve sürekli olarak geliştirilmektedir, bu da kullanıcıların güncellemelere erişebilmesini sağlar. Verileri grafiklere dönüştürmek ve analiz etmek için GNUPLOT’ı kullanmak, veri görselleştirmesi konusunda etkili bir çözüm sunar. Hem basit hem de karmaşık grafikler oluşturabilme yeteneği sayesinde, kullanıcıların ihtiyaçlarına uygun çözümler sunar. GNUPLOT’ın esneklik, geniş grafik seçenekleri ve kullanıcı dostu arayüzü, veri analizi ve görselleştirmesi için güçlü bir araç olarak tercih edilmesini sağlar.

red = "#FF0000"
green = "#0000ff"
blue = "#00ff00"
skyblue = "#ff00ff"
son = "#800000"

set yrange [150:330]
set xrange [0.5:4]
set style data histogram
set style histogram cluster gap 1.5
set style fill solid border -1
set boxwidth 1.0

set xtics font 'Helvetica, 18'
set xlabel 'Proxy JRC' font 'Helvetica, 20'
set ylabel 'Average Time for Identity Verification (second)' font 'Helvetica, 20'
set grid ytics

set title 'A Network with 20 Nodes' font 'Helvetica, 30'

plot '20node_data_authentication' using 2:xtic(1) ti 'Centralized Authentication' fs pattern 1 lc rgb red,
'' using 3:xtic(1) ti 'Oracle' fs pattern 2 lc rgb green,
'' using 4:xtic(1) ti 'Cost Function 1' fs pattern 3 lc rgb blue,
'' using 5:xtic(1) ti 'Cost Function 2' fs pattern 4 lc rgb skyblue

set terminal postscript eps enhanced color solid linewidth 0.8 'Helvetica, 15'
set output '20node_data_authentication_temp.eps'

Yukarıdaki kod, GNUPLOT kullanarak bir histogram grafiği oluşturmak için bir örnektir. Aşağıda kodun adım adım açıklaması bulunmaktadır:

  1. Renk Değişkenleri:
    İlk olarak, grafikte kullanılacak renkleri tanımlamak için değişkenler oluşturulmuştur. Bu örnekte, “red”, “green”, “blue”, “skyblue” ve “son” adında beş renk değişkeni tanımlanmıştır.
  2. Eksen Ayarları:
    Grafikteki y ve x eksenlerinin sınırları ve görüntülenecek veri aralığı ayarlanmıştır. “set yrange” ve “set xrange” komutları ile y ve x eksenlerinin sınırları belirlenmiştir.
  3. Grafik Stili:
    Grafiğin histogram stiliyle çizilmesi için “set style data histogram” komutu kullanılmıştır. Ayrıca, çubuklar arasındaki boşluk, dolgu stili ve kenarlık ayarları da yapılmıştır.
  4. Eksen Etiketleri ve Başlık:
    X ve y eksenlerinin etiketleri “set xlabel” ve “set ylabel” komutlarıyla belirlenmiştir. Ayrıca, grafik başlığı “set title” komutu ile ayarlanmıştır.
  5. Veri Çizimi:
    Grafiğin çizimini yapmak için “plot” komutu kullanılmıştır. Bu komutta, çizilecek verilerin dosyadan okunması ve her bir veri setinin rengi, dolgu stili ve başlığı belirtilmiştir.
  6. Çıktı Ayarları:
    Grafiğin çıktısını almak için “set terminal” ve “set output” komutları kullanılmıştır. Bu örnekte, çıktı EPS formatında bir dosyaya kaydedilmiştir.

Son olarak, “replot” komutuyla grafiğin çizimi gerçekleştirilmiştir.

20node_data_authentication adlı veri dosyası;

Output;

Bu kod, “20node_data_authentication” adlı veri dosyasından verileri okuyarak, farklı veri setlerini histogram grafiği olarak çizmektedir. Grafikteki renkler, dolgu stilleri ve başlıklar, veri setlerini ayırt etmek için kullanılmaktadır.

Şeker Hastalığı: Tanımı, Nedenleri ve Türleri

Şeker Hastalığı: Tanımı, Nedenleri ve Türleri

Günümüzde giderek artan bir sağlık sorunu olan şeker hastalığı (diyabet), vücudun kan şekeri seviyelerinin düzenlenmesinde sorun yaşandığında ortaya çıkan bir durumdur. İnsülin hormonunun yetersizliği veya etkinliğinin azalması sonucu kan şekerinin kontrol edilemez hale gelmesi, diyabetin temel belirtilerinden biridir. Pek çok insanın hayatını etkileyen bu hastalığın farklı türleri bulunmaktadır.  Tip 1, Tip 2 ve gestasyonel diyabet olmak üzere farklı türleri vardır.

1. Tip 1 Diyabet:

Tip 1 diyabet, genellikle çocukluk veya adolesan dönemlerinde başlayan otoimmün bir hastalıktır. Bağışıklık sistemi, pankreastaki beta hücrelerini hedef alır ve onları tahrip eder. Bu hücreler, vücutta insülin üretiminden sorumludur. İnsülinin eksikliği, kan şekerinin hücrelere taşınmasını engeller ve sonuç olarak kan şekerinin yükselmesine neden olur. Tip 1 diyabet hastaları, yaşamları boyunca günlük insülin enjeksiyonlarına veya insülin pompalarına ihtiyaç duyarlar.

2. Tip 2 Diyabet:

Tip 2 diyabet, genellikle ilerleyen yaşlarda ortaya çıkan ve en yaygın şeker hastalığı türüdür. Bu durumda, vücut hâlâ insülin üretir, ancak üretilen insülinin etkinliği azalır veya vücut hücreleri insüline karşı direnç geliştirir. Tip 2 diyabet genellikle obezite, hareketsiz yaşam tarzı, genetik yatkınlık ve yaşam tarzı faktörlerinin bir kombinasyonuyla ilişkilidir. İlk aşamalarda diyabetin kontrol altına alınması, sağlıklı bir diyet, egzersiz ve kilo kaybı gibi yaşam tarzı değişiklikleriyle mümkün olabilir. İlerleyen durumlarda, oral antidiyabetik ilaçlar veya insülin enjeksiyonları gerekebilir.

3. Gestasyonel Diyabet:

Gestasyonel diyabet, hamilelik sırasında beliren geçici bir diyabet türüdür. Hamilelik döneminde hormon seviyelerindeki değişiklikler, bazı kadınlarda insülin direncine neden olabilir. Bu durum, normalden daha yüksek kan şekeri seviyelerine yol açar. Gestasyonel diyabet genellikle gebelik sonrasında kendiliğinden düzelir, ancak hem anne hem de çocuk için sağlık risklerini artırabilir. Gestasyonel diyabet olan kadınlar, doğum sonrası diyabet riski altında olabilirler ve düzenli takip gerektirebilirler.

Sonuç:

Her tür şeker hastalığı, uygun tedavi ve yaşam tarzı değişiklikleriylekontrol altına alınabilir. Diyabetin erken teşhisi ve sürekli takibi önemlidir. Sağlıklı bir beslenme planı, düzenli egzersiz, ilaç tedavisi ve insülin enjeksiyonları, şeker hastalarının sağlıklı bir yaşam sürdürebilmelerine yardımcı olabilir. Ayrıca, diyabet riskini azaltmak için obeziteyle mücadele etmek, sağlıklı kiloyu korumak ve stresi yönetmek gibi önlemler almak da önemlidir.

Mehmed Talat Paşa

Mehmed Talat Paşa: Modernleşmenin Öncülerinden Bir Lider

Osmanlı İmparatorluğu’nun son dönemlerinde etkili olan İttihat ve Terakki Cemiyeti‘nin kurucularından ve önde gelen liderlerinden biri olan Mehmed Talat Paşa, tarih sahnesinde önemli bir rol oynamış bir devlet adamıdır. Cesareti, vizyonu ve liderlik becerileriyle tanınan Talat Paşa, modernleşme ve reform sürecinde öncü bir figür olarak hatırlanır.

Talat Paşa’nın hayatı, çağının zorlu siyasi ve sosyal koşullarında büyük bir başarı hikayesini yansıtmaktadır. İttihat ve Terakki Cemiyeti’nin kurucularından biri olarak, Osmanlı İmparatorluğu’ndaki siyasi ortamı değiştirmeyi hedefleyen bir grup idealistin arasında yer aldı. Bu cemiyet, çağdaşlaşma ve reformları hayata geçirme amacı güden bir hareket olarak ön plana çıktı.

Talat Paşa, İkinci Meşrutiyet hareketinin gerçekleştiği dönemde aktif bir şekilde çalıştı. Meşrutiyetin ilanıyla birlikte, Osmanlı İmparatorluğu’nda demokratikleşme sürecinin başlamasında önemli bir rol oynadı. Meclis-i Mebusan’da (Osmanlı Parlamentosu) görev alarak, halkın temsilcisi olma sorumluluğunu üstlendi ve ülkenin yönetiminde etkin bir rol oynadı.

Talat Paşa’nın sadrazam olmasıyla birlikte, Osmanlı hükümetinin başına geçti ve ülkenin modernleşme çabalarını yönetti. Ekonomik, siyasi ve sosyal alanda reformlar gerçekleştirerek Osmanlı İmparatorluğu’nu daha güçlü bir devlet haline getirmeye çalıştı. Eğitim, adalet ve altyapı gibi alanlarda önemli adımlar attı. Modern eğitim kurumları kuruldu, yasalar yenilendi ve kamu hizmetlerinin etkinliği artırıldı.

Ancak, Talat Paşa’nın liderlik dönemi, Birinci Dünya Savaşı’nın gölgesinde kaldı. Osmanlı İmparatorluğu’nun savaşa girişi, Talat Paşa’nın liderliğinde hayata geçirildi. Bu politika, o dönemde yaşanan karmaşık siyasi ve askeri koşulların bir sonucu olarak ortaya çıktı. Ancak, Talat Paşa’nın liderlik tarzı ve politikaları, eleştirilere ve tartışmalara yol açtı. Bu konuda farklı görüşler bulunsa da, tarihçilerin üzerinde anlaştığı nokta, Talat Paşa’nın savaş sırasında zor bir dönemde kararlar almak zorunda kaldığıdır.

Birinci Dünya Savaşı’nın Osmanlı Devleti ve müttefikleri açısından sona ermesinin ardından Sadrazam Talât Paşa, 1918 yılı Ekim ayı başlarında görevinden istifa etti. Mehmed Talat Paşa, 1 Kasım 1918’de İttihat ve Terakki Fırkası’nın son kongresini yaparak partiyle ilişkisini sonlandırma kararı aldı. Aynı gün Berlin’e giden Talat Paşa, burada çeşitli maceralar yaşadı ve birkaç ev değiştirdi. Berlin’de siyasetten uzak durmadı ve Şark Kulübü’nü kurarak yurt dışında bulunan İttihat ve Terakki üyeleri ve diğer Müslüman ülkelerden burada yaşayan gençlerin bir araya gelmesine önemli katkılarda bulundu. Ancak, 1921 yılında Berlin’de Ermeni bir suikastçı tarafından kalleşçe suikasta kurban gitti. Talat Paşa, Birinci Dünya Savaşı sırasında Ermenilerin tehcir edilmesi kararında etkili olduğu düşünülen İttihat ve Terakki liderlerinden biriydi. Bu nedenle Ermeni Taşnaksutyun örgütü, intikamlarını almak amacıyla Talat Paşa ve diğer İttihat ve Terakki liderlerine suikastlar düzenlemeye karar verdi. Bu suikastlerin arkasında İngiltere’nin çıkarları olduğu ve İngiliz istihbaratının Talat Paşa’yı hedef aldığı belirtilmektedir. İngiltere, Talat Paşa’nın Türkiye ile adil bir antlaşma yapmaması durumunda İngiliz sömürgelerinde Pan-Turanist ve Pan-İslamist bir hareket başlatabileceği tehdidiyle karşı karşıya olduğunu düşünmekteydi. Talat Paşa’nın ölümü, o dönemdeki siyasi gerilimleri ve travmaları yansıtan bir olaydır. Mehmed Talat Paşa, Osmanlı İmparatorluğu’nun modernizasyon sürecinde önemli bir lider olarak hatırlanır. Özellikle İttihat ve Terakki Cemiyeti’nin ideallerini ve reform çabalarını destekleyerek ülkenin çağdaşlaşmasına katkıda bulundu. Ancak, liderliği sırasında yaşanan olaylar ve uygulanan politikalar hala tartışma konusu olup farklı bakış açılarına sahiptir.

Talat Paşa’nın Meşhur sözleri, tarihteki yerini almıştır.

  1. Beni bir gün sokakta vuracaklar. Alnımdan kan akarak yere serileceğim, Yatakta ölmek nasip olmayacak. Ziyanı yok, varsın vursunlar. Vatan benim ölümümle bir şey kaybedecek değildir. Bir Talat gider, bin Talat yetişir!
  2. Millî mücadele muvaffak olacaktır, çünkü millî sınırlar dışında, Türk milletinin hakikaten sahip olduğu topraklar dışında emel beslemiyor. Bu toprağın sınırları millî misakla çizilmiştir.
  3. Bu harbin bize telkin ettiği en büyük ders asri bir milletin bilhassa ilim ve ahlakla yükselebileceği kanaatidir. Milletlerin tecrübeleri açık bir suretle gösteriyor ki, bir memlekette kanunun hakimiyetinin temin edilebilmesi için, evvelemirde ilmin ve ahlakın hakimiyetinin temin edilmesi gerekir. Gerçi bir devletin esas vazifesi kanuni bir adalet ve hürriyet vücuda getirmektir.
  4. Vatanın bütün çıkarlarından istifade eden bu halk onun (Türklerin) kaderlerine ve yüklerine asla katılmıyordu. Memleketin gerek saadetinden ve gerekli ızdıraplarından daima menfaatlar temin ediyorlardı. Vatan için hiçbir harbe iştirak etmediler ve bu uğurda bir damla kan bile dökmediler. Bilakis harp zamanlarında ticaretlerini devam ettiriyor ve taahhüt işlerine girişiyorlar, çok para kazanıyor ve iyi ve kötü günlerde rahat ve huzur içinde yaşıyorlardı. Bu lütuflara teşekkür olarak şimdi çoğunluğu teşkil eden (Türk) nüfusu kovmak ve istiklallerini temin üzere Osmanlı vatanının bir parçasını koparmak istiyorlar.

Kaynakça:

  1. https://turksandarmenians.marmara.edu.tr/tr/talat-pasanin-oldurulmesi-ve-katilin-yargilama-sureci/
  2. Avcı, Halil Ersin (2012), “Dış Destekli Uluslararası Terör Örgütü Örneği: Daşnaksutyun ve Faaliyetleri (1890-1922), Uluslararası Güvenlik ve Terörizm Dergisi, Cilt 3 (1), s. 89-101.
  3. Şakir, Ziya (2011), Yakın Tarihimizin Üç Büyük Adamı, Talât-Enver-Cemal Paşalar, İstanbul.

What are current transformers and what do they do?

Current transformers, often abbreviated as CTs, are vital components in electrical systems designed to measure and monitor electric current. They play a crucial role in ensuring the safety and efficiency of power distribution.

One of the main functions of current transformers is to step down high currents to levels that can be safely measured by instruments and protective devices. By reducing the current to a manageable level, CTs allow for accurate measurements and facilitate the operation of protective devices, such as circuit breakers.

In addition to measurement and protection, current transformers also serve as isolation devices. They create a galvanic separation between the high-voltage primary circuit and the low-voltage secondary circuit, providing a safe means of monitoring current without exposing instruments or personnel to high voltages.

Current transformers come in various types and designs, including wound primary, bar-type, and bushing-mounted CTs. Each type is suitable for specific applications, depending on factors such as the current rating, voltage level, and physical constraints of the electrical system.

Overall, current transformers are indispensable in electrical systems, enabling accurate current measurement, protection, and isolation. Their proper selection, installation, and maintenance are essential for ensuring the reliable and efficient operation of power distribution systems.

Definition and Purpose of Current Transformers

1. Measure and Transform Current

CTs accurately scale down high currents to a level that can be safely handled by measuring instruments.

2. Protect Equipment

They safeguard equipment from damage by detecting and responding to abnormal currents and short circuits.

3. Precise Monitoring

Current transformers enable accurate monitoring and control of current flow in electrical systems.

Basic Principle

CTs work on the principle of magnetic induction to measure electric current. When an electric current flows through a conductor, it generates a magnetic field around it. This magnetic field can be harnessed by a current transformer to accurately measure the current passing through the conductor. The core of a current transformer is made of a highly permeable material, such as iron or ferrite, which enhances the magnetic properties. The primary winding is connected in series with the conductor carrying the current to be measured. As the current flows through the primary winding, it creates a magnetic field in the core. According to Faraday’s law of electromagnetic induction, any change in the magnetic field through a coil will induce a voltage across the coil. In the case of a current transformer, the secondary winding is wound around the core, and the induced voltage in the secondary winding is proportional to the primary current. This induced voltage in the secondary winding can then be measured and scaled down to represent the actual current passing through the primary conductor. By carefully selecting the turns ratio between the primary and secondary windings, current transformers can accurately step down the primary current to a lower, more manageable level for measurement purposes. Overall, current transformers provide a reliable and non-intrusive method of measuring electric current. Their use in various applications, from power distribution to industrial processes, helps ensure the safety, efficiency, and proper functioning of electrical systems.

Secondary Current

The primary current induces a secondary current in the CT’s winding, which is proportional to the primary current. This principle of electromagnetic induction forms the foundation of how current transformers (CTs) operate. CTs are vital components in electrical systems, designed to accurately measure and monitor electric current. When an electric current flows through the primary winding of a CT, it creates a magnetic field around the core. This magnetic field, in turn, induces a secondary current in the secondary winding of the CT. The secondary current is proportional to the primary current, allowing for accurate measurement and monitoring of the electrical current. By stepping down the primary current to a lower, more manageable level, CTs enable the use of instruments and protective devices that are designed to operate within specific current ranges. This ensures the safety and efficiency of power distribution systems by preventing overloads and facilitating proper circuit protection. CTs are available in various types and designs, including wound primary, bar-type, and bushing-mounted CTs. Each type has its own advantages and is suitable for specific applications based on factors like current rating, voltage level, and physical constraints of the electrical system. In summary, current transformers play a critical role in accurately measuring and monitoring electric currents in electrical systems. By utilizing the principle of electromagnetic induction, CTs enable safe and efficient operation of power distribution systems, contributing to the overall reliability and performance of electrical installations.

Types of Current Transformers

  1. Split-Core
    • Allows for easy installation without disconnecting the primary conductor.
  2. Wound
    • Features a circular magnetic core with a primary winding and a secondary winding.
  3. Toroidal
    • Consists of a donut-shaped core with the primary conductor passing through the center.

Applications of Current Transformers

  1. 5K -Industrial Systems
  2. 2K+ Power Plants

Advantages of Using Current Transformers

Accurate Monitoring : Enables precise measurement and control of current flow.

Equipment Protection: Ensures the safety and reliability of electrical devices and machinery.

Common Challenges and Limitations of Current Transformers

Accuracy Issues: May experience accuracy limitations based on load and environmental conditions.

Saturation: Can saturate under fault conditions, affecting accuracy and performance.

Temperature Effects: Performance may be impacted by extreme temperatures.

Conclusion and Key Takeaways

Essential Component

CTs are indispensable in ensuring safe and reliable electrical operations.

Continuous Advancements

Ongoing developments are enhancing the accuracy and efficiency of current transformers.

Flutter ile Bluetooth Cihazları Tarama ve Bağlantı Kurup/Kaldırma Uygulaması – 3 (Izınler ve Kontroller)

Flutter ile Bluetooth Cihazları Tarama ve Bağlantı Kurup/Kaldırma Uygulaması – 1 başlığı altında verilen kodda, import kısmında flutter_blue kutuphanesine prefix verilerek tanımlanmasının sebebi flutter_reactive_ble kutuphanesinin de BluetoothDevice sınıfına sahip olmasıdır. Hangi kutuphanenin BluetoothDevice sınıfını kullanacağımızı belirtmek için kütüphanelerin birine prefix vermemiz gerekti.

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_blue/flutter_blue.dart' as flutter_blue;
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:open_settings/open_settings.dart';
import 'package:permission_handler/permission_handler.dart';

flutter_blue kutuphanesine ait bir sınıf, metod veya özellik kullanıldığı zaman artık bunu belirtmemiz gerekmektedir. flutter_blue.FlutterBlue.instance veya flutter_blue.BluetoothDevice gibi kullanımlarının sebebi budur.

Uygulamanın amacı çevredeki bağlanabilecek cihazları taramak ve bu cihazlara bağlanıp, bağlı cihazlarla da bağlantıyı koparmak olduğundan iki tane boş liste tanımladık.

Bulunan cihazları listelemek için:

List<DiscoveredDevice> _discoveredDeviceList = [];

Bağlı olduğumuz cihazları listelemek için:

List<DiscoveredDevice> _connectedBluetoothDeviceList = [];

Konum ve bluetooth izinlerini uygulama başlatıldığında almak için _getBluetoothPermission(), _getLocationPermission(), _getPermissions() methodları initState içerisinde çağrıldılar.

@override
void initState() {
super.initState();

// setting devices orientation on landscape
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
]);

_getBluetoothPermission();
_getLocationPermission();
_getPermissions();
}

Uygulamaya ilk defa giriş yapıldığında konum ve bluetooth izinleri verilmemiş olacağından if bloğuna ilk olarak bluetoothPermission.isDenied ve locationPermission.isDenied koşullarıyla başladık böylece izin verildikten sonra bu koşullar false döndüreceğinden if bloğu tekrar koşmayacaktır.

İzinler verildikten sonra if bloğu bluetoothPermission.isDenied koşulunu sağlamayıp false’a düştüğü için sonraki koşmalarda else bloğu içerisindeki print komutu koşacak ve konsola Not Granted yazılacak, bu print komutunu Granted olarak değiştirmeniz daha doğru olur.

Future<bool> _getBluetoothPermission() async {
var bluetoothPermission = await Permission.bluetoothScan.status;

if (bluetoothPermission.isDenied) {
if (await Permission.bluetoothScan.request().isGranted) {
if (await Permission.bluetoothConnect.request().isGranted) {
print("Blueooth Permission: Granted");
return true; // Permission granted
}
}
} else {
print("Blueooth Permission: Granted");
}
return false;
}

Future<bool> _getLocationPermission() async {
var locationPermission = await Permission.location.status;

if (locationPermission.isDenied) {
if (await Permission.location.request().isGranted) {
if (await Permission.accessMediaLocation.request().isGranted) {
print("Location Permission: Granted");
return true; // Permission granted
}
}
} else {
print("Location Permission: Granted");
}
return false;
}

Alttaki _getPermissions metodunun tanımlanmasının sebebi ise yukarıdaki gibi izinleri teker teker çağırmak yerine tüm izinleri tek seferde çağırmayı denemek içindir. if bloğu içerisindeki koşulda tüm izinler izin verilmediği sürece true döndürmesi istenmiştir ama şuanki durumda izinlerden sadece birine bile izin verildiği taktirde await Permission.location.status.isDenied && await Permission.bluetoothScan.status.isDenied ifadesi false döndürür.

Bunun için && (AND) ifadesi yerine || (OR) ifadesi kullanmamız gerekmektedir veya her iki ifadenin de başına ! işareti koyabilirsiniz. Böylece sadece tüm izinler verildiği takdirde koşulumuz false döndürür ve if bloğu koşmaz.

Future<void> _getPermissions() async {
// Requesting multiple permissions at once.
if (!await Permission.location.status.isDenied &&
!await Permission.bluetoothScan.status.isDenied) {
Map<Permission, PermissionStatus> statuses = await [
Permission.location,
Permission.bluetoothScan,
].request();
print(statuses[Permission.location]);
print(“\n”);
print(statuses[Permission.bluetoothScan]);
}
}

Çevredeki cihazları taramamız için gereken şartlar sadece izinler değil, aynı zamanda taramaya çalıştığımız zamanda hem bluetooth hem de konum özelliklerinin o anda açık olması gerekmektedir. Bunu kontrol etmek için de _chechkIfBluetoothIsOn ve _chechkIfLocationIsOn methodlarını tanımladık.

Future<bool> _chechkIfBluetoothIsOn() async {
// Check bluetooth service status
var isBluetoothOn = await Permission.bluetooth.serviceStatus.isEnabled;

if (!isBluetoothOn) {
// propmpt user to enable the bluetooth if the bluetooth is off
showDialog(
context: context,
builder: (_) => AlertDialog(
title:
Text("Bluetooth Özelliği ${isBluetoothOn ? "Açık" : "Kapalı"}"),
content: const Text(
"Bu özelliği kullanmak için bluetooth özelliğinin açık olması gerekir."),
actions: [
ElevatedButton(
onPressed: () =>
Navigator.of(context, rootNavigator: true).pop(false),
child: Text(isBluetoothOn ? "Kapat" : "Vazgeç")),
ElevatedButton(
// make the button not intractable when the location is on
onPressed: () async => isBluetoothOn
? null
: {
Navigator.of(context, rootNavigator: true).pop(),
await OpenSettings.openBluetoothSetting(),
},
child: Text(isBluetoothOn ? "" : "Aç")),
],
elevation: 12.0,
backgroundColor: Colors.white,
),
barrierDismissible: true,
);
} else {
//dismiss dialog box
}
return isBluetoothOn;
}

Burada bluetooth servisi açık değilse kullanıcıyı AlertDialog ile uyarıyoruz ve bluetooth servisini açması için yönlendiriyoruz.

await OpenSettings.openBluetoothSetting() satırının amacı Aç tuşuna tıklandığında kullanıcıyı bluetooth ayarlarına yönlendirmek, bu methodu ‘open_settings‘ kutuphanesini import ederek kullanabiliyoruz.


Navigator.of(context, rootNavigator: true).pop(), satırı ise kullanıcıyı yönlendirdiğimizde AlertDialog’u kapatmak içindir, böylece kullanıcı izin verip uygulamaya döndüğünde AlertBox ile karşılaşmayacak.

İlk başlıkta verilen kodda Scan Devices ve List Connected Devices tuşlarında hem if koşulunda hem de ek olarak onPressed metodu altında bluetooth ve konum izinleri istendiğinden iki tane AlertDialog üst üste oluşturulmaktadır. Bu durumu çözmek için _chechkIfBluetoothIsOn ve _checkIfLocationIsOn satırları “Scan Devices” ve “List Connected Devices” tuşlarının onPressed metodundan silinebilir.

TextButton(
onPressed: () async {
_getPermissions();
/* _chechkIfBluetoothIsOn();
_checkIfLocationIsOn(); */

if (await _chechkIfBluetoothIsOn() &&
await _checkIfLocationIsOn()) {
_scanForAvaileableBluetoothDevices();
} else {
print(
"Blueooth veya Location özellikleri açık olmadığından tarama yapılamadı.");
}
},
child: const Text('Scan Devices'),

Yukarıda gösterildiği gibi bu iki satırı yorum satırı da yapabilirsiniz, aynı durum “List Connected Devices” tuşu için de geçerlidir ve aynı işlemi o tuş için de uygulayabilirsiniz.