Flutter ile Bluetooth Özellikli Termal Yazıcıya Veri Gönderme Uygulaması Geliştirme

Flutter ile Bluetooth Özellikli Termal Yazıcıya Veri Gönderme Uygulaması Geliştirme

Bluetooth teknolojisi, mobil uygulamaların çeşitli cihazlarla kablosuz iletişim kurmasını sağlar. Bu teknolojiyi kullanarak, Flutter ile geliştirilmiş bir mobil uygulama ile Bluetooth özellikli bir termal yazıcıya veri göndermek mümkündür. Bu makalede, Flutter framework'ü ile bir uygulama geliştirerek, kullanıcıdan alınan metni Bluetooth ile bağlı bir termal yazıcıya gönderme sürecini adım adım açıklayacağız.

Proje Açıklaması

Bu projede, kullanıcıya bir veri giriş kutusu sunulacaktır. Veri giriş kutusu, 3 satır yüksekliğinde olup, kullanıcının metin girmesine olanak tanıyacaktır. Aşağıda bir buton bulunacaktır. Kullanıcı, bu butona tıkladığında, veri giriş kutusundaki metin Bluetooth ile bağlı olan bir termal yazıcıya gönderilecektir.

Eğer Bluetooth bağlı değilse, alt kısımda yer alan bir yazı alanı, "Bağlı Değil" mesajını gösterecektir. Veri gönderme işlemi sırasında, kullanıcıya gönderiliyor mesajı verilecek ve işlem tamamlandığında başarılı bir şekilde gönderildiği bilgisi kullanıcıya iletilerek yazdırma işlemi gerçekleştirilecektir.

Uygulama Geliştirme Adımları

  1. Proje Başlatma ve Bluetooth Paketini Ekleyerek Ayarlar

    İlk olarak, Flutter projesi oluşturulmalı ve flutter_blue adlı Bluetooth paketi eklenmelidir.

dependencies:

flutter:

sdk: flutter

flutter_blue: ^0.7.3

 

Ardından, projeye flutter pub get komutu ile paketin eklenmesi sağlanmalıdır.

UI Tasarımı ve Bluetooth Cihazları Listeleme

Flutter ile UI tasarımını gerçekleştirebilir ve flutter_blue paketini kullanarak Bluetooth cihazlarını listeleyebilirsiniz.

// UI Tasarım ve Bluetooth Cihazları Listeleme Adımları

 

Bluetooth Cihazına Veri Gönderme Fonksiyonu Oluşturma

Veri giriş kutusundan alınan metni, seçilen Bluetooth cihazına göndermek için bir fonksiyon oluşturun.

// Bluetooth Cihazına Veri Gönderme Fonksiyonu

 

ESC İle Başlayan Yazıcı Komutları Hakkında Bilgilendirme

Yazıcıya metin gönderirken, ESC ile başlayan yazıcı komutları kullanılabilir. Bu komutlar, yazıcıyı özel ayarlar yapmaya ve metni düzenlemeye olanak tanır.

Örnek:

ESC A 1 // Kalın (bold) metin yapma komutu

Yazıcı komutları genellikle ESC/P (Escape/Printer) komut seti aracılığıyla gönderilir ve bu komut seti, yazıcıların işlevselliğini kontrol etmek için kullanılır. Bu komutlar, yazıcıların çeşitli ayarlarını, metin düzenlemelerini ve özel baskı modlarını belirleme yeteneği sağlar. Yazıcı komutları, genellikle belirli bir yazıcı modeline ve markasına bağlı olarak değişir.

İşte genel olarak kullanılan bazı temel yazıcı komutları:

  1. ESC @ (0x1B, 0x40): Başlangıç Ayarı

    • ESC @ komutu, yazıcının başlangıç ayarlarını geri yükler. Genellikle yazıcıyı sıfırlamak için kullanılır.

  2. ESC A n (0x1B, 0x41, n): Yazı Tipi Ayarı

    • ESC A n komutu, yazı tipini belirler. n değeri genellikle şu şekilde kullanılır:

      • 0: Normal karakterler

      • 1: Kalın (bold) karakterler

      • 2: İtalik karakterler

      • 3: Altı çizili karakterler

  3. ESC E n (0x1B, 0x45, n): Altı Çizgi Ayarı

    • ESC E n komutu, altı çizgiyi açar (n değeri 1) veya kapatır (n değeri 0).

  4. ESC M n (0x1B, 0x4D, n): Satır İnterline Ayarı

    • ESC M n komutu, satır aralığını belirler. n değeri genellikle 0 ile 255 arasında bir tam sayıdır.

  5. ESC d n (0x1B, 0x64, n): Kağıt Kesme Ayarı

    • ESC d n komutu, kağıdın n satırda kesilmesini sağlar.

  6. ESC p x y dx dy (0x1B, 0x70, x, y, dx, dy): Bitmap Baskı Ayarı

    • ESC p x y dx dy komutu, bit eşlem resimlerin yazdırılması için kullanılır. x ve y, bit eşlem resminin başlangıç ​​konumunu belirlerken, dx ve dy boyutları belirler.

  7. ESC t n (0x1B, 0x74, n): Karakter Seti Ayarı

    • ESC t n komutu, kullanılacak karakter setini belirler. n genellikle aşağıdaki gibi kullanılır:

      • 0: USA (İngilizce)

      • 4: Finlandiya/Sweden

      • 5: İtalyanca

  8. ESC @ (0x1B, 0x40): Başlangıç Ayarı

    • ESC @ komutu, yazıcıyı sıfırlar ve başlangıç ayarlarına döndürür.

Bu komutlar, yazıcıların genel işlevselliğini kontrol etmek için yaygın olarak kullanılır. Ancak, yazıcı marka ve modellerine göre komut setleri değişebilir. Kullanılacak yazıcıya ait belgelere başvurmak, hangi komutların desteklendiğini ve nasıl kullanıldığını öğrenmek için önemlidir. Yazıcı belgelerinde, desteklenen ESC/P komutları ve kullanımları genellikle detaylı bir şekilde açıklanmaktadır.

Bu gibi komutları kullanarak, yazıcı üzerinde çeşitli ayarlamalar gerçekleştirebilirsiniz.

Şimdi ise Flutter ortamında yazılmış kodlara bakalım. Aşağıda, Bluetooth özelliği açık olan bir yazıcıya metin gönderme uygulaması bulunuyor.

 

import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Bluetooth Yazıcı Uygulaması',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  FlutterBlue flutterBlue = FlutterBlue.instance;
  List<BluetoothDevice> devicesList = [];
  TextEditingController textController = TextEditingController();

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

  void _startScanning() {
    flutterBlue.scanResults.listen((List<ScanResult> results) {
      for (ScanResult result in results) {
        if (!devicesList.contains(result.device)) {
          setState(() {
            devicesList.add(result.device);
          });
        }
      }
    });

    flutterBlue.startScan();
  }

  void _stopScanning() {
    flutterBlue.stopScan();
  }

  void _connectToDevice(BluetoothDevice device) async {
    _stopScanning();
    await device.connect();
    print('Bağlantı kuruldu: ${device.name}');
  }

  void _sendData(BluetoothDevice device) async {
    List<int> data = [27, 64]; // ESC @ komutu (ESC karakteri ve @ karakteri)
    data.addAll(textController.text.codeUnits);

    await device.writeCharacteristic(
      device.characteristics.firstWhere(
        (c) => c.uuid.toString() == "00002a58-0000-1000-8000-00805f9b34fb", // Yazıcıya gönderilecek karakteristik UUID'si
      ),
      data,
      type: CharacteristicWriteType.withoutResponse,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bluetooth Yazıcı Uygulaması'),
      ),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: TextField(
              controller: textController,
              maxLines: 3,
              decoration: InputDecoration(
                hintText: 'Metni buraya girin...',
                border: OutlineInputBorder(),
              ),
            ),
          ),
          devicesList.isEmpty
              ? CircularProgressIndicator()
              : Expanded(
                  child: ListView.builder(
                    itemCount: devicesList.length,
                    itemBuilder: (context, index) {
                      return ListTile(
                        title: Text(devicesList[index].name ?? 'Bilinmeyen Cihaz'),
                        subtitle: Text(devicesList[index].id.toString()),
                        onTap: () {
                          _connectToDevice(devicesList[index]);
                        },
                      );
                    },
                  ),
                ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          if (devicesList.isNotEmpty) {
            _sendData(devicesList[0]); // İlk listedeki cihaza gönderme
          }
        },
        child: Icon(Icons.send),
      ),
    );
  }
}