Arduino ile Ethernet TCP bağlantısı

Arduino ile Ethernet TCP bağlantısı

Arduino ile Ethernet TCP bağlantısı

Yazılım açısından bakıldığında bağlantı kurma Ethernet ile Arduino O çok basit. Bunu yapmak için şunu kullanın: Ethernet kütüphanesi. Bu kütüphane bir amaç için tasarlanmıştır. Ethernet Kalkanı entegreye dayanan W5100, ancak başka farklı kartlar veya modüller de var ve/veya diğer entegre olanları kullananlar, örneğin ENC28J60. Kullanımını basitleştirmek ve uyumluluğu artırmak için diğer kütüphaneler (neredeyse) aynısını kullanır API o Ethernet kütüphanesi, kodda aynı (veya çok benzer) işlevler kullanılsa bile alternatif kitaplığı yalnızca orijinal kitapla değiştirmeniz veya yerine onu eklemeniz (ad farklı olduğunda) gerekecektir. Benim durumumda şunu kullanıyorum: UIPEthernet kütüphanesi de Norbert Truchsess Bu metinde anlatacağım sürecin aynısını takip ediyorum.

UIPEthernet kütüphanesiyle kullanım için ENC28J60 modülü

1. Ethernet bağlantısını tanımlayın

Rolünü benimseyip benimsemeyeceğiniz müşteri gibi sunucu, her şeyden önce fonksiyonla bağlantıyı tanımlamanız gerekir. başla () yalnızca parametre olarak aktarılabilen MAC adresi ve bir sunucuyu bekleyin DHCP ağda bir atama IP adresi ve konfigürasyonun geri kalanı veya konfigürasyonun tamamı tanımlanana kadar (isteğe bağlı olarak) daha fazla parametrenin belirtilmesi de mümkündür:

  1. Dirección MAC (ki zaten bahsedilmişti)
  2. IP adresi kalkanın veya modülün
  3. Sunucu IP adresi DNS (sadece bir sunucu)
  4. IP adresi Ağ geçidi
  5. Ağ maskesi

Yapılandırmanın doğru olmamasını (örneğin, ağ geçidinin ağın ilk adresi olmamasını) önlemek için, kesintileri olağan olmadığı sürece tüm parametrelerin belirtilmesi önerilir.

Yukarıdan, IP adreslerini temsil eden verilerin oldukça sık kullanılması gerektiği açıktır, bu nedenle kitaplık bu sınıfı içerir. IP adresi IP adresi nesnelerinin başlatılacağı yer. Bunu tanımlayan parametreler bir adresin dört baytıdır. IPV4

La MAC adresi Bu kitaplık için 6 baytlık bir dizi olarak tanımlanmıştır. MAC adresi, ilk baytların üreticiyi ve modeli, son baytların ise belirli cihazı belirttiği benzersiz bir tanımlayıcıdır (olması gerekir). Entegre ENC28J60 satın almayı tercih etmediğiniz sürece MAC adresi içermez. Microchip'ten entegre MAC adresi (veya bütün bir blok Evet adreslerinin IEEE Cihaz sayısı bunu değerli kılacak kadar büyükse). Bir MAC adresiniz olmadığında, cihazın bulunduğu ağdaki diğer adreslerle çakışmamasına dikkat ederek bir tane icat edebilirsiniz.

Yapılandırma "elle" yerine bir DHCP sunucusuyla yapılıyorsa, işlev yerelIP() Sunucunun modüle atadığı adrese başvurmanızda fayda var. Atanan adresi yenilemek için (ilgili süre dolmuşsa) Ethernet kütüphanesi işlevi sağlar sürdürmek() bu aynı zamanda yenileme durumuna karşılık gelen bir kod döndürerek de bilgi verecektir:

  1. Operasyonun hiçbir etkisi olmadı
  2. IP adresi yenilenirken hata oluştu
    Atanan IP adresinin aynı sunucuda kullanımı genişletilemedi
  3. IP adresi başarıyla yenilendi
  4. IP adresinin yeniden bağlanması başarısız oldu
    Atanan IP adresinin kullanımı hiçbir sunucuda genişletilemedi
  5. IP adresi başarıyla yeniden atandı

Buraya kadar gördüğünüz bilgilerle ağdaki bir DHCP sunucusu üzerinden IP adresini yapılandırarak Ethernet bağlantısının nasıl başlatılacağına dair bir örnek yazabilirsiniz. Aşağıdaki örnek kod, belirli aralıklarla IP adresini yenilemeye çalışır ve sonucu bildirir.

Aşağıdaki örnek, IP adresini ve yapılandırmanın geri kalanını nesneleri kullanarak manuel olarak atar IP adresi okumayı daha rahat hale getirmek ve (daha karmaşık kod durumunda), adresin her kullanıldığında (yanlış) yazılması durumunda oluşabilecek hataları önlemek için.

2. Bağlantıyı istemci veya sunucu modunda başlatın

Sunucu modunda bağlantı başlatıldığında diğer sistemlerden gelen istekleri dinleyen, geliştirilmekte olan mikro kontrollü sistemdir. Bağlantıyı sunucu olarak başlatmak için şunu kullanın: EthernetSunucusu() parametre olarak sunucunun dinleyeceği port belirtilir. EthernetSunucusu() sınıfın kurucusudur sunucuSunucu olarak tüm Ethernet işlemlerini destekleyen. Her ne kadar en ortodoks şey yapıcıyı aramak olsa da EthernetSunucusu()doğrudan sınıfı kullanan bazı örnekler bulmak alışılmadık bir durum değildir. sunucu veya bu örnekleme sistemini kullanmayı seçen Ethernet bağlantısı için alternatif kütüphaneler.

İstemci olarak bağlantı, sunucu sistemine istekte bulunan, onları bekleyen ve bunlara uygun şekilde yanıt veren bağlantıdır. İstemci olarak bağlantı başlatmak için şunu kullanın: Ethernetİstemcisi() sınıfın kurucusu nedir müşteri Bir istemci olarak tüm Ethernet işlemlerinin kaynağı.

Sınıfın başlatıldığı andan itibaren çalıştığı varsayılan sunucu modunda olanın aksine (her ne kadar istemcilere yalnızca gerçekten öyleyse yanıt verecektir), kullanmadan önce istemci bağlantısının hazır olduğunu doğrulamanız gerekir. Bağlantı başlatıldığında oluşturulan istemci nesnesi, kullanılabilir olup olmadığını görmek için sorgulanabilir. Örneğin sorgu işlemleri bir yapıya dahil edilebilir. if(EthernetClient) bunları yalnızca istemci bağlantısı mevcut olduğunda yürütmek için.

3. İstemci olarak bağlantı kurun

Daha önce de belirtildiği gibi, bağlantı oluşturulduktan sonra sorgulama yapma inisiyatifini alan müşteri olur. Sunucu bu girişimi bekleyecek ve buna göre yanıt verecektir. Bu nedenle sunucuya bağlanan istemcidir, bunu yapmak için kullanırız bağlan () sunucuyu parametreler olarak belirtmek (IP adresi veya URL) ve liman dinleyen kişide.

İşlemin sonucuna göre fonksiyon değerleri döndürecektir.

  1. (BAŞARI) Bağlantı başarıyla kuruldu
  2. Bağlantının kurulması
  3. (ZAMAN AŞIMINA UĞRADI) Bağlantı kurulmadan zaman aşımı geçti
  4. (INVALID_SERVER) Sunucu bulunamadı veya doğru yanıt vermiyor
  5. (KILINMIŞ) Bağlantı tam olarak kurulmadan kesildi
  6. (GEÇERSİZ CEVAP) Sunucu yanıtı yanlış

Sorgulama yapmaya başlamadan önce fonksiyonla bağlantının çalışır durumda olduğunu doğrulamak gerekir. bağlı() geri dönecek gerçek zaten mevcutsa veya yanlış aksi takdirde.

Aşağıdaki örnek, istemci olarak bağlantıyı göstermektedir; sunucuyla bir bağlantı olup olmadığını her 10 saniyede bir kontrol eder (üretken bir şey olması amaçlanmamıştır, sadece işlevlerin sözdizimini göstermek içindir), bu arada, bir üretim web sunucusunu pek sevmem.

4. Veri gönder

Diğer daha iyi bilinen sınıflar gibi, örneğin Serive karşılaştırılabilir kullanımla, sınıflar müşteri y sunucu işlevlere sahip olmak

  • yazmak(hakikat) o yazmak(tampon, uzunluk)

    Bilgiyi, çağrıldığı istemci veya sunucu nesnesini kullanarak gönderir. "Veri" parametresi tek bir parametredir bayt o tank "tampon" bir dizi iken bayt o tank "uzunluğa" eşit bir miktar gönderilir. Bu işlev, genellikle metin göndermek için ayrılan sonraki iki işlevle karşılaştırıldığında, ikili işlemler için kullanılan işlevdir.

  • baskı(veri tabanı)

    "Veri"ye karşılık gelen bilgiyi metin olarak istemci veya sunucu olarak (kullanıldığı sınıfa bağlı olarak) gönderir. Bilgi metin olarak ifade edilmiyorsa (örneğin bir tamsayıysa), dönüşümü seçmek için isteğe bağlı "taban" parametresi kullanılabilir; bu, sırasıyla BIN, OCT, DEC veya HEX sabitlerinden biri olabilir. ikili (taban 2), sekizli (taban 8), ondalık (taban 10) ve onaltılı tabana (taban 16) karşılık gelen tabanlar

  • yazdır(veri tabanı)

    İşlem, "data" parametresi tarafından açıkça belirtilen bilgiden sonra bir satırbaşı (kod 13, \r olarak temsil edilebilir) ve bir satır sonu (kod 10, kod XNUMX) gönderilmesi dışında öncekiyle aynıdır. \n ile temsil edilir) Bu kodlar sıklıkla sırasıyla kısaltmayla anılır. CR (Taşıma İadesi) ve LF (Satır Besleme)

Önceki üç işlev, sınıfın eşdeğer işlevleri gibi, gönderilen bayt sayısını döndürür Seri; Yukarıda belirtildiği gibi operasyon karşılaştırılabilir.

5. Verileri alın

Veri gönderme işlemlerinde olduğu gibi, alma işlemleri de yaygın olarak kullanılanlarla karşılaştırılabilir. Seri. Alma protokolü de benzerdir: (yeterli) veri olup olmadığını kontrol edin (mevcut) ve bu durumda bunları okuyun


  • mevcut ()

    Okunabilecek bayt sayısını döndürür. Bu fonksiyon her iki sınıfta da mevcut müşteri olarak sunucu; İlk durumda, sunucunun bir isteğe yanıt olarak gönderdiği ve istemcinin okuyabileceği bayt sayısını bildirir (okumak) ve ikinci durumda, bir işlemi gerçekleştiren istemci (nesne) veya eğer yoksa false.

  • oku ()

    Alınan bilgilerin okunması için kullanılır. Bu özellik yalnızca sınıfta mevcuttur müşteri. Geliştirilmekte olan uygulama sunucu rolünü yerine getiriyorsa, gelen bilgiyi okumak için fonksiyonun yanıtıyla bir istemci nesnesinin başlatılması gerekir. mevcut () önceki bölümde tartışılmıştı.

Aşağıdaki örnek, 2000 numaralı bağlantı noktasını dinleyen ve mümkün olduğunda tamamı büyük harflerle gönderilenlerle isteklere yanıt veren bir "büyük harf sunucusudur". Örneğin şu şekilde test edilebilir: PuTTY veya basitçe Telnet 2000 Kesinlikle çok pratik değil, amacı sadece istemci tarafından kendisine gönderilen verilerin sunucudan nasıl alınacağını göstermektir.

6. Bağlantıyı sonlandırın

Bir sunucu uygulamasının süresiz olarak çalışması olağan olmakla birlikte, istemci bağlantıları kurulur, bağlantılar kurulur ve sonlandırılır, böylece kaynakların kurtarılmasına ve diğer bağlantılarda kullanılmasına veya programın diğer kullanımlarına tahsis edilmesine olanak sağlanır. İşlev Dur() sınıfın müşteri Bir istemci bağlantısını sonlandırmak ve kullandığı kaynakları serbest bırakmak için kullanılır.

Sunucu için, sorgunun bilgi nesnesi gönderildiğinde veya alındığında istemcinin bağlantıyı sonlandırması, aynı zamanda kaynakların başka bağlantılara veya farklı amaçlara tahsis edilmesi için serbest bırakılmasına da olanak tanır. Kısaca her ne kadar küçük gibi görünse de client'ın işlemleri sona erdiğinde bağlantının sonlandırılması tavsiye edilir.

İstemci bağlantısını sonlandırırken başka bir iyi uygulama da istemciyi boşaltmaktır. sınıfın kullandığı. Bunu yapmak için işlev mevcuttur floş () ile istemci bağlantısı kesildikten sonra çağrılmalıdır Dur()

HTTP GET sorgu örneği

Yukarıdakilerin tümünü daha iyi açıklığa kavuşturmak için aşağıda daha eksiksiz bir istek örneği bulunmaktadır. TCP GET isteklerini kullanarak HTTP protokolü. Örnekte Arduino kartına bağlı analog sensörler tarafından elde edilen değerler, bunları bir veritabanında saklayan bir web sunucusuna gönderilmektedir.

Yorum Ekle

Kaçırmış Olabilirsiniz