Python ve Linux’ta Engellemeyen Girişe Giriş

Python ile Klavye Olaylarını Okuma

Çoğu programlama dili eğitimi, belirli bir noktada yürütmeyi durduran ve bir kullanıcıdan girdi bekleyen “geleneksel” uygulamalara odaklanır. Bu tür girdilere a denir. engelleme Bir kullanıcı giriş yönergesini yerine getirmek için bir şey yapana kadar bir programın daha fazla yürütülmesini engellemesi anlamında. Bu tür işleme, yardımcı program komut dosyaları için yararlı olsa da, kullanıcı girdisini beklerken başka bir şey yapması gereken uygulamalar için tamamen yararsızdır. Örneğin bilgisayar oyunları, kullanıcının bir şey yapmasını beklerken tüm eylemi durdurursa oldukça sıkıcı olur.

Engellemeyen girişin nasıl çalıştığının bir gösterimi öğreticimizde bulunabilir: Temel Raspberry Pi Elektronik Kontrolleri için Python’u Kullanma – özellikle adı verilen bölümde “Python’da GPIO Girişi: Örnek.” Bu gösteri, kod çalışmaya devam ederken, anlık anahtarlardan okunan girişi gösterir.

Bu programlama öğretici serisinde gösterilen kod örnekleri Python 3.9.2’yi kullanacak ve bir Raspberry Pi 4 Model B (verilen bağlantıdan satın alabilirsiniz); ancak, bu kod taşınabilir olmalıdır hemen hemen her Linux sistemi Bu, Python 3’ü destekler. Bu amaçla, bu kılavuz Python 3.9.12 çalıştıran Kali Linux ortamında kod gösterimlerini içerecektir. Raspberry Pi’yi birincil tanıtım cihazı olarak seçmenin nedeni, bu kodun işlevselliğini gelecekteki bir makalede genişletmekle daha fazla ilgilidir.

Platforma Bağlı Kod

Bu gün ve çağda, bir şeyi bir kez yazıp herhangi bir şey üzerinde çalıştırma fikri, çoğu programcının zihnine o kadar yerleşmiştir ki, herhangi bir şey yapmak için platforma özel veya İşletim Sistemine özel kod yazma düşüncesini eğlendirmek bile sapkınlık gibi gelir. Ancak, herhangi bir İşletim Sisteminde klavye ve fare girişi gibi şeyler çok düşük bir düzeyde işlenir. Bu tür girdileri engellemek için Java veya Python gibi (nispeten) platformdan bağımsız bir dil kullanılacak olsa bile, bu görevleri yerine getirecek kodun aynı hedeflere ulaşmak için çok farklı şekillerde çalışması gerekir.

Bu görevleri birden fazla ortamda (bir İşletim Sisteminin ve üzerinde çalıştığı donanımın bir kombinasyonu olarak tanımlanan bir ortam) soyutlamaya çalışan yazılım kitaplıkları veya modülleri bile, başlık altında, kodun bulunduğu her ortam için ayrı kodlara sahip olacaktır. kullanılması bekleniyor.

Yerel Kod ve Engellenmeyen Giriş

Birçok programcının şımartabileceği bir diğer “temel” rahatlık, birinin uzaktan kod çalıştırabileceği ve bir masaüstü veya dizüstü bilgisayarda kod çalıştırmaktan farklı bir şekilde çalışmadığı fikridir. Engellemeyen giriş ile çalışırken bu rahatlık genellikle pencereden dışarı atılır. Biri uzak bir bilgisayara bağlandığında SSH veya VNCyerel bilgisayardaki klavye, fare veya oyun denetleyicisi olayları tipik olarak uzak bilgisayardaki olaylar olarak aktarılmaz, bu nedenle burada sunulan tanıtım kodlarından herhangi birinin herhangi bir tür uzak bağlantı üzerinden çalıştırılması pek olası değildir.

Python, Giriş Aygıtları ve Linux ile Çalışma

Linux’ta herhangi bir giriş aygıtı tarafından oluşturulan veriler bir bilgisayara yazılır. karakter aygıt dosyası içinde saklanan /dev/girdi dizin. Bu dizinin içeriği bir Linux sisteminden diğerine değişir, ancak dosyalar aşağıdaki resimde gösterildiği gibi aynı genel yapıya sahiptir:

Şekil 1 – Raspberry Pi OS’de Giriş Aygıtı Listesi

Bu görüntü aynı konumu gösterir, ancak Kali Linux’ta:

Python'da Giriş Aygıtı Listeleme Örneği

Şekil 2 – Kali Linux’ta Giriş Aygıtı Listesi

Önemli bir not: Linux’taki tüm karakter aygıt dosyalarının bir “c” her zamanki yerine önek “-” aracılığıyla listelendiklerinde önek ls -al emretmek.

Şimdi, elbette, bu şu soruyu akla getiriyor: Bir kişi nasıl bağlanır? özel belirli bir dosyaya klavye gibi giriş aygıtı mı?

Okumak: Raspberry Pi ile Temel Elektronik Kontrolü

Python’da Cihaz Tanımlama

Bu dosyada cevaplanmıştır /proc/bus/giriş/cihazlar. Aşağıda bu dosyanın olası bir örneği verilmiştir:

Python Cihaz Tanımlama Eğitimi

Şekil 3 – EV hatları ve olay dosyası adlarının vurgulandığı örnek /proc/bus/input/devices dosyası

Vurgulanan bölümler EV satırını ve olay dosya adlarını temsil eder. EV satırı, Linux’a cihazın ne tür girdi olayları sağladığını söyler. Bağlantı için kısa açıklama /proc/bus/giriş/cihazlar klavyeye dosya kodudur EV=120013. Bu, en azından klavye girişi olan bir aygıtı temsil eden onaltılık bir sayıdır.

Bunun cihazı gerçek dosyaya bağlayan kısmı, olayX değer. Yukarıdaki örnekte, klavyenin kendisi EV=120013 dosyaya karşılık gelir /dev/input/event0.

Not: ile birden fazla cihaz olabilir tuş takımı adlarında ve kodlu birden fazla cihazda EV=120013, klavyeler değil. Daha sonra sunulan tanıtım kodu, bu cihazlardan hangisinin aslında klavye olduğunu ayırt etmeye çalışacaktır.

Karakter Aygıt Dosyası Verilerini Okuma

dosyadan beri /dev/input/event0 “normal” bir dosya gibi çalışır, komut kullanılarak okunabilir sudo cat /dev/input/event0.

Bir tuşa her basıldığında çıktı değişir. Her tuşa basıldığında çoklu Etkinlikler. Kullanıcının ne yaptığına bağlı olarak, genellikle bir tuşa basmak ve bırakmakla ilgili 4 olay vardır. Birden fazla tuşa basılırsa veya basılı tutulursa daha fazla olay oluşturulabilir. Bu tür her eylem, bu dosyaya ham olay verilerinin yazılmasına neden olur. Ham ve filtrelenmemiş ikili veriler olduğundan, bu, bazı ek işlemler olmadan hiçbir şey için açıkça kullanışlı değildir.

Okumak: Temel Raspberry Pi Elektronik Kontrolleri için Python’u Kullanma

Linux’ta Etkinlik Ayrıntıları

Bir Linux olayının boyutu çevreye bağlıdır ve bunu hesaplamanın en iyi yolu, Linux Başlık dosyalarını okumak ve boyutu yazdırmak için bir C++ programı kullanmaktır. Bu değer daha sonra bir Python betiğinde kullanılabilir veya ikili olay verilerini tutabilen bir Python yapısını düzgün bir şekilde oluşturmak için kullanılabilir.

Linux Başlık dosyalarının doğrudan C veya C++ kaynak kodu tarafından okunması amaçlandığından, bunu Python’da yapmanın kolay bir yolu yoktur. Ancak, bu dosyalardaki tüm bilgiler başka kullanımlar için çıkarılabilir.

Aşağıdaki resim, adresinde bulunan bir C başlık dosyasında belirtilen bir girdi olayının tanımını göstermektedir. /usr/include/linux/input.hbelirli tanım kırmızıyla vurgulanarak:

C'de Örnek Başlık Dosyası girişi

Şekil 4 – Giriş olayı tanımını içeren C Başlık Dosyası

C programlama dilinde, bir olay aşağıdaki veri bileşenleri kullanılarak genel olarak tanımlanır:

  • Olayın meydana geldiği tarih ve saat, mikrosaniyeye kadar.
  • bu tip olayın. Etkinlik Türleri C sayısal sabitleri olarak tanımlanır /usr/include/linux/input-event-codes.h.
  • Makalenin bu bölümü odaklanırken Klavye Etkinlikleridiğer tüm girdi olayları da bu dosyada tanımlanmıştır.
  • Olay kodklavye olayı olması durumunda basılan veya bırakılan tuşa karşılık gelir.
  • Anahtar kodları ayrıca şurada tanımlanmıştır: /usr/include/linux/input-event-codes.h.
  • bu değer olayın bir klavye olayı olması durumunda basılan tuşa ve tuşun serbest bırakılmasına karşılık gelir.
  • Bu, aşağıdakilere atıfta bulunur: eylem tuşuna basıldığında veya bırakıldığında.

Bir olayın boyutunu hesaplamanın en güvenilir yolu, bir olayı somutlaştırmak için bir C veya C++ programı kullanmaktır. input_event yapı ve aşağıdaki C++ kodunda gösterildiği gibi boyutunu doğrudan okuyun:

// get-sizeof-input-event.cpp
#include 
#include <linux/input.h>

using namespace std;

// Use the definition of an input_event structure in /usr/include/linux/input.h
// to create an instance of that structure.
struct input_event event;

int main(int argc, char *argv[]) 
	{
		// Calculate the size of that instantiation of that structure.
		int eventSize = sizeof(event);

		// Print this information to the console.
		cout << "The size of an input event is [" << eventSize << "] bytes." << endl;
		return 0;
	}



Listing 1 - C++ Code to evaluate the size of an input event.

Çalıştırılmadan önce C/C++ kodunun derlenmesi gerekir. Bu, kullanılarak yapılır g++ genellikle çoğu Linux kurulumunda bulunan derleyici. Varsayılan olarak, bu derleyici başarıyla derlenmiş bir C/C++ yürütülebilir dosyasını adlandıracaktır. a.out ve yürütülebilir izinler verin:

Giriş Olayları Kod Örneği C++

Şekil 5 – Bir girdi olayının boyutunu elde etmek için C++ kodunu derlemek ve çalıştırmak.

Not: Olay boyutu bir Linux ortamından diğerine değişebilir. Belirli bir olay boyutunu sabit kodlamayın, bunun yerine her zaman hesaplayın.

Python’da Blok Dışı Girdi Üzerine Son Düşünceler

Artık bilgilerimizi başarılı bir şekilde topladığımıza göre, kullanışlı C++ kodumuz sayesinde, bu verileri bir programda kullanabilmemiz için araya sokmak ve yakalamak için bazı Python betikleri yazabiliriz. Bu Python kodunun gözden geçirilmesi, burada bulabileceğiniz bu dizinin ikinci bölümünde gerçekleşir: Python ile Klavye Olaylarını Okuma.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.