Koneksi Ethernet TCP dengan Arduino

Koneksi Ethernet TCP dengan Arduino

Koneksi Ethernet TCP dengan Arduino

Dari sudut pandang perangkat lunak, membuat koneksi Ethernet dengan Arduino Ini sangat sederhana. Untuk melakukan ini, gunakan Perpustakaan Ethernet. Perpustakaan ini dirancang untuk a Perisai Ethernet yang berbasis terintegrasi W5100, namun terdapat papan atau modul lain yang berbeda dan/atau yang menggunakan papan atau modul terintegrasi lainnya, seperti ENC28J60. Untuk menyederhanakan penggunaannya dan meningkatkan kompatibilitas, perpustakaan lain (hampir) menggunakan hal yang sama API bahwa Perpustakaan Ethernet, Anda hanya perlu mengganti pustaka alternatif dengan pustaka asli atau memasukkannya (jika namanya berbeda) pada tempatnya meskipun fungsi yang sama (atau sangat mirip) digunakan dalam kode. Dalam kasus saya, saya menggunakan Perpustakaan UIPEthernet de Norbert Truchsess mengikuti proses yang sama yang akan saya jelaskan dalam teks ini.

Modul ENC28J60 untuk digunakan dengan perpustakaan UIPEthernet

1. Tentukan koneksi Ethernet

Apakah Anda akan mengambil peran tersebut pelanggan seperti itu Server, pertama-tama Anda harus menentukan koneksi dengan fungsi tersebut mulai() yang hanya dapat diteruskan sebagai parameter Alamat MAC dan tunggu server DHCP pada jaringan menetapkan a alamat IP dan konfigurasi lainnya atau dimungkinkan juga untuk menunjukkan (opsional) lebih banyak parameter hingga konfigurasi lengkap ditentukan:

  1. Dirección MAC (yang telah disebutkan)
  2. Alamat IP dari perisai atau modul
  3. Alamat IP server DNS (hanya satu server)
  4. alamat IP dari pintu gerbang
  5. Topeng bersih

Dianjurkan untuk menunjukkan semua parameter, kecuali pengurangannya adalah yang biasa, untuk menghindari konfigurasi yang salah (misalnya, gateway bukan alamat pertama jaringan).

Dari penjelasan di atas terlihat jelas bahwa data yang mewakili alamat IP harus cukup sering digunakan, itulah sebabnya perpustakaan menyertakan kelas tersebut Alamat IP dari mana untuk membuat instance objek alamat IP. Parameter yang mendefinisikannya adalah empat byte alamat IPV4

La Alamat MAC Ini didefinisikan untuk perpustakaan ini sebagai array 6-byte. Alamat MAC (seharusnya) merupakan pengidentifikasi unik di mana byte pertama menunjukkan pabrikan dan model dan byte terakhir menunjukkan perangkat tertentu. Yang terintegrasi ENC28J60 tidak menyertakan alamat MAC kecuali Anda memilih untuk juga membeli a Alamat MAC terintegrasi dari Microchip (atau seluruh blok YES alamat ke IEEE jika penggunaan perangkat cukup besar sehingga bermanfaat). Jika Anda tidak memiliki alamat MAC, Anda dapat membuatnya, berhati-hatilah agar tidak bertentangan dengan alamat lain di jaringan tempat perangkat berada.

Jika konfigurasi dilakukan dengan server DHCP dan bukan "dengan tangan", fungsinya IP lokal() Berguna untuk melihat alamat yang telah ditetapkan server ke modul. Untuk memperbarui alamat yang ditetapkan (jika waktu yang bersangkutan telah habis) itu Perpustakaan Ethernet menyediakan fungsinya menjaga() yang juga akan menginformasikan dengan mengembalikan kode yang sesuai dengan status perpanjangan:

  1. Operasi tersebut tidak membuahkan hasil
  2. Terjadi kesalahan saat memperbarui alamat IP
    Penggunaan alamat IP yang ditetapkan pada server yang sama tidak dapat diperpanjang
  3. Alamat IP berhasil diperbarui
  4. Pengikatan ulang alamat IP gagal
    Penggunaan alamat IP yang ditetapkan tidak dapat diperpanjang di server mana pun
  5. Alamat IP berhasil ditetapkan ulang

Dengan informasi yang terlihat sejauh ini, Anda dapat menulis contoh bagaimana koneksi Ethernet akan dimulai dengan mengkonfigurasi alamat IP melalui server DHCP di jaringan. Contoh kode berikut mencoba memperbarui alamat IP setiap jangka waktu tertentu dan melaporkan hasilnya.

Contoh di bawah ini menetapkan alamat IP dan konfigurasi lainnya secara manual menggunakan objek Alamat IP agar lebih nyaman dibaca dan (dalam kasus kode yang lebih kompleks) untuk menghindari kesalahan yang dapat terjadi jika alamat ditulis (salah) setiap kali digunakan.

2. Mulai koneksi dalam mode klien atau server

Saat memulai koneksi dalam mode server, sistem mikrokontrol yang sedang dikembangkan mendengarkan permintaan dari sistem lain. Untuk memulai koneksi sebagai server, gunakan Server Ethernet() dan port tempat server akan mendengarkan ditunjukkan sebagai parameter. Server Ethernet() adalah konstruktor kelas Server, yang mendukung semua operasi Ethernet sebagai server. Meskipun hal yang paling ortodoks adalah melakukan panggilan ke konstruktor Server Ethernet(), tidak jarang kita menemukan beberapa contoh yang langsung menggunakan kelas tersebut Server atau perpustakaan alternatif untuk koneksi Ethernet yang memilih untuk menggunakan sistem instantiasi tersebut.

Koneksi sebagai klien adalah koneksi yang membuat permintaan ke sistem server, yang menunggunya dan menjawabnya sesuai dengan itu. Untuk memulai koneksi sebagai klien, gunakan Klien Ethernet() apa konstruktor kelasnya Pelanggan asal semua operasi Ethernet sebagai klien.

Berbeda dengan apa yang terjadi dengan mode server, yang diasumsikan berfungsi sejak kelas dipakai (walaupun kelas hanya akan merespons klien jika memang benar), Anda harus memverifikasi bahwa koneksi klien sudah siap sebelum menggunakannya. Objek klien yang dibuat saat koneksi dimulai dapat ditanyakan untuk melihat apakah tersedia. Misalnya, operasi kueri dapat dimasukkan dalam suatu struktur jika (Klien Ethernet) untuk mengeksekusinya hanya ketika koneksi klien tersedia.

3. Membangun koneksi sebagai klien

Seperti yang telah dikatakan, setelah koneksi dibuat, klienlah yang mengambil inisiatif untuk mengajukan pertanyaan. Server akan menunggu inisiatif itu dan akan meresponsnya. Oleh karena itu, klienlah yang terhubung ke server, untuk itu kami menggunakannya Menghubung() menunjukkan server sebagai parameter (alamat IP atau URL) dan pelabuhan pada orang yang mendengarkan.

Berdasarkan hasil operasi, fungsi akan mengembalikan nilai

  1. (KEBERHASILAN) Koneksi berhasil dibuat
  2. Membangun koneksi
  3. (WAKTU HABIS) Batas waktu telah berlalu tanpa koneksi dibuat
  4. (INVALID_SERVER) Server tidak ditemukan atau tidak merespons dengan benar
  5. (TERPOTONG) Sambungan terputus sebelum tersambung sepenuhnya
  6. (INVALID_RESPONSE) Respons server salah

Sebelum mulai membuat pertanyaan, perlu untuk memverifikasi bahwa koneksi berfungsi dengan baik terhubung() itu akan kembali benar jika sudah tersedia atau palsu jika tidak.

Contoh di bawah mengilustrasikan koneksi sebagai klien, memeriksa setiap 10 detik untuk melihat apakah ada koneksi ke server (ini tidak dimaksudkan untuk menjadi sesuatu yang produktif, hanya untuk menunjukkan sintaks fungsinya) sesuatu yang, omong-omong, server web produksi tidak akan terlalu menyukainya.

4. Kirim data

Seperti kelas lain yang lebih terkenal, seperti Serial, dan dengan penggunaan yang sebanding, kelas-kelas Pelanggan y Server memiliki fungsi

  • menulis(fakta) o menulis(penyangga, panjang)

    Mengirim informasi menggunakan objek klien atau server tempat informasi tersebut dipanggil. Parameter "data" adalah satu byte o tangki sedangkan "buffer" adalah array byte o tangki yang mana jumlah yang sama dengan "panjang" dikirim. Fungsi ini adalah yang digunakan untuk operasi biner, dibandingkan dengan dua fungsi berikutnya yang biasanya dicadangkan untuk mengirim teks.

  • mencetak(data, basis)

    Mengirimkan sebagai klien atau server (tergantung pada kelas yang digunakannya) informasi yang terkait dengan "data" sebagai teks. Jika informasi tidak dinyatakan sebagai teks (misalnya bilangan bulat) parameter opsional "base" dapat digunakan untuk memilih konversi, yang dapat berupa salah satu konstanta BIN, OCT, DEC atau HEX yang masing-masing menunjukkan. basis sesuai dengan biner (basis 2), oktal (basis 8), desimal (basis 10) dan heksadesimal (basis 16)

  • cetakln(data, basis)

    Operasi ini identik dengan yang sebelumnya kecuali untuk pengiriman, setelah informasi secara tegas ditunjukkan oleh parameter "data", pengangkutan kembali (kode 13 yang dapat direpresentasikan sebagai \r) dan akhir baris (kode 10, yang dapat berupa diwakili oleh \n) Kode-kode ini masing-masing sering disebut dengan akronim CR (Pengembalian Kereta) dan LF (Umpan Baris)

Tiga fungsi sebelumnya mengembalikan jumlah byte yang telah dikirim, begitu pula fungsi setara kelasnya Serial; Seperti disebutkan di atas, pengoperasiannya sebanding.

5. Menerima data

Seperti halnya operasi pengiriman data, operasi penerimaan sebanding dengan operasi yang banyak digunakan Serial. Protokol penerimaannya juga serupa: periksa apakah ada (cukup) data yang tersedia (tersedia) dan dalam hal ini membacanya


  • tersedia ()

    Mengembalikan jumlah byte yang tersedia untuk dibaca. Fungsi ini ada di kedua kelas Pelanggan sebagai Server; Dalam kasus pertama, ia melaporkan jumlah byte yang dikirim server sebagai respons terhadap permintaan dan tersedia untuk dibaca oleh klien (Baca baca), dan dalam kasus kedua klien (objek) yang telah melakukan operasi atau false jika tidak ada.

  • Baca()

    Digunakan untuk membaca informasi yang telah diterima. Fitur ini hanya tersedia di kelas Pelanggan. Jika aplikasi yang dikembangkan memenuhi peran server, untuk membaca informasi yang masuk, objek klien harus dibuat instance-nya dengan respon fungsi. tersedia () dibahas pada bagian sebelumnya.

Contoh berikut adalah "server caps" yang mendengarkan pada port 2000 dan merespons permintaan dengan apa pun yang dikirim dalam huruf besar semua jika memungkinkan. Itu bisa diuji, misalnya dengan Putty atau hanya dengan telnet 2000 Hal ini tentu sangat tidak praktis, tujuannya hanya untuk menunjukkan bagaimana cara memperoleh data yang dikirimkan oleh klien dari server.

6. Akhiri koneksi

Meskipun biasanya aplikasi server berjalan tanpa batas waktu, koneksi klien dibuat, dibuat koneksi, dan diakhiri, memungkinkan sumber daya dipulihkan dan digunakan dalam koneksi lain atau didedikasikan untuk penggunaan program lainnya. Fungsinya berhenti() dari kelas Pelanggan Ini digunakan untuk mengakhiri koneksi klien dan membebaskan sumber daya apa pun yang digunakannya.

Untuk server, fakta bahwa klien mengakhiri koneksi ketika objek informasi kueri telah dikirim atau diterima juga memungkinkannya mengosongkan sumber daya untuk mengalokasikannya ke koneksi lain atau tujuan berbeda. Singkatnya, meskipun tampak kecil, disarankan untuk mengakhiri koneksi ketika operasi klien berakhir.

Praktik baik lainnya saat mengakhiri koneksi klien adalah dengan mengosongkan yang digunakan kelas tersebut. Untuk melakukan ini, fungsi tersebut tersedia menyiram() harus dipanggil setelah mengakhiri koneksi klien dengan berhenti()

Contoh kueri HTTP GET

Untuk lebih memperjelas semua hal di atas, contoh permintaan yang lebih lengkap disertakan di bawah ini. TCP menggunakan permintaan GET menggunakan protokol HTTP. Dalam contoh, nilai yang diperoleh sensor analog yang terhubung ke papan Arduino dikirim ke server web yang menyimpannya dalam database.

Anda mungkin melewatkannya