STM32 ETHERNET #6.2 HTTP WEBSERVER CGI

Started by tha, March 18, 2022, 05:42:03 AM

Previous topic - Next topic

tha

https://controllerstech.com/stm32-ethernet-6-2-http-webserver-cgi/

STM32 ETHERNET #6.1 HTTP WEBSERVER CGI

นี่เป็นบทช่วยสอนอีกบทหนึ่งใน the STM32 ETHERNET series, และวันนี้เราจะมาดูวิธีใช้ the CGI (Common Gateway Interface) เพื่อรับ the data จาก the HTTP webserver. บทช่วยสอนนี้มีความต่อเนื่องมาจากบทที่แล้ว ดังนั้นโปรดตรวจสอบ the HTTP webserver Simple ก่อนดำเนินการต่อ เนื่องจากฉันจะทำการเปลี่ยนแปลงเพียงเล็กน้อยในโค้ดก่อนหน้าแทนที่จะสร้าง project ใหม่ที่นี่.

พิจารณาว่าคุณมีโปรเจ็กต์ก่อนหน้านี้ที่ทำงานได้แล้ว ฉันจะดำเนินการด้วย CGI ต่อไป

CGI (Common Gateway Interface) ถูกใช้อย่างปกติเพื่อรับบาง data จาก the webserver. ตัวอย่างเช่น, เราสามารถรับ the information ที่ป้อนเข้าใน a form, หรือใช้ the button บน the server เพื่อควบคุม the LED บน the MCU. นี่คือสิ่งที่เราจะเห็นใน tutorial ของวันนี้.

มาเริ่มกันด้วย the cube MX เปลี่ยนที่เราจำเป็นต้องทำ.

tha

                                                          CubeMX Configuration



ใน the setup ข้างบน, ผมแค่เปิดการใช้งาน(enable) the CGI (old style) ใน the HTTPD setup. ส่วนที่เหลือของ the configuration เป็นอย่างเดียวกับ the previous tutorial.

ตอนนี้เราต้องทำตามขั้นตอนเดียวกันกับที่กล่าวใน the previous tutorial, แค่มีการแก้ไขเล็กน้อย.

tha

                                                               The additional Setup

หลังจากการสร้าง the project, ถ้าคุณ build มันเป็นครั้งแรก, คุณจะได้รับข้อผิดพลาด ดังนั้น ส่วนนี้จะครอบคลุมถึงการตั้งค่าเพิ่มเติมที่เราต้องทำเพื่อลบข้อผิดพลาดเหล่านั้น

ก่อนอื่นให้ไปที่ LWIP->Target->lwipopts.h และเปลี่ยน the #define HTTPD_USE_CUSTOM_FSDATA 0



tha

ตอนนี้ เราต้องรวม (include) ไฟล์ "FsData.c" พร้อมกับทรัพยากรที่เราจะใช้สำหรับเว็บเซิร์ฟเวอร์

เราได้กล่าวถึงครั้งสุดท้ายนี้แล้วและภายในโฟลเดอร์  the Project\Middlewares\Third_Party\LwIP\src\apps\http, คุณมี  the files ที่แสดงข้างล่างแล้ว.


tha

ก่อนที่เราจะดำเนินการต่อและสร้างไฟล์ fsdata.c เราต้องสร้างหน้าเว็บสำหรับ the CGI.

ในบทช่วยสอนนี้ ฉันจะใช้ the form เพื่อรวบรวมชื่อและนามสกุลของบุคคล หลังจากนั้น ข้อมูลนี้จะถูกส่งผ่านไปยัง MCU ซึ่งเราจะสามารถใช้งานได้.



     •  ที่นี่ฉันได้สร้าง a form, ซึ่งมี 2 parameters คือ fname และ lname.

     •  data ใดก็ตามที่เราป้อนในพารามิเตอร์เหล่านี้จะถูกส่งต่อเป็นค่าของพวกมัน

     •  เมื่อเราได้รับ data ใน MCU แล้ว เราก็สามารถตรวจสอบพารามิเตอร์และดึงค่าของพารามิเตอร์นั้นมาประมวลผลต่อไปได้

     •  โปรดทราบว่าการดำเนินการถูกตั้งค่าให้เรียก form.cgi

tha

หลังจากเซฟไฟล์ในรูปแบบ .html เราจำเป็นต้องก๊อปปี้มันไปยังโฟลเดอร์ fs



ตอนนี้ได้เวลาสร้าง fsdata.c แล้ว และในการทำเช่นนั้น เราจะดับเบิลคลิกที่ makeFSdata เหมือนกับที่เราทำในบทช่วยสอนก่อนหน้านี้

นี่คือการตั้งค่า หากคุณ build โค้ดตอนนี้ ข้อผิดพลาดทั้งหมดจะหายไป

ตอนนี้เราจะเขียน the code สำหรับการเริ่มต้นของ the webserver.

tha

                                                        Some Insight into the CODE

Initialization Function



ที่นี่ เราจะเริ่มต้น the HTTPD ก่อน, เช่นเดียวกับที่เราทำในบทช่วยสอนก่อนหน้านี้. The SSI initialization ถูกรวมอยู่จากบทช่วยสอนก่อนหน้าด้วย แต่ไม่จำเป็นสำหรับ CGI.

CGI Handler รับ 2 parameters:

     •  The first parameter คือ the pointer ไปยัง the tCGI Structure ที่กำหนด the base filename (URL) ของ a CGI และ
         ฟังชั่นที่เกี่ยวข้องซึ่งจะถูกเรียกเมื่อ URL นั้นถูกร้องขอ

     •  The second parameter คือจำนวนของ CGI handler ที่เรากำลังใช้ใน code ของเรา.

tha

CGI HANDLER



CGI handler รับ 4 parameters

     •  iIndex จัดเตรียมให้มีดัชนีของ CGI ภายในอาร์เรย์ cgis ที่ส่งผ่านไปยัง http_set_cgi_handlers พารามิเตอร์นี้จะมีประโยชน์หาก
         คุณใช้ CGI handlers มากกว่า 1 ตัว

     •  iNumParams ให้ดัชนีของพารามิเตอร์ภายในหนึ่ง handler ตัวอย่างเช่น พารามิเตอร์นี้จะเป็น 0 สำหรับ fname และ 1 สำหรับ
         lname


     •  pcParam บรรจุชื่อของพารามิเตอร์และ pcValue บรรจุค่าของพารามิเตอร์นั้น

     •  ฟังก์ชันควรส่งคืนกลับตัวชี้ไปยัง a character string ซึ่งเป็นเส้นทางและชื่อไฟล์ของการตอบกลับที่จะถูกส่งไปยังเบราว์เซอร์ที่เชื่อมต่อ
         ตัวอย่างเช่น "/cgiform.html" หรือ "/response/error.ssi"

     •  หลังจากที่เราได้รับ the data จากเซิฟเวอร์แล้วเราจะเก็บเอาไว้ใน buffer (name) ของเรา the data จะถูกเก็บเป็น "fname
         lname
"