Porting LWIP cho vi điều khiển STM32 (P3)

LWIP – Light weight IP là một bộ thư viện mã nguồn mở được thiết kế dành cho những hệ thống có tài nguyên tương đối hạn chế, phù hợp với các hệ thống nhúng. Hỗ trợ tương đối đầy đủ các giao thức mạng trên nền TCP/IP. Có thể hỗ trợ giao tiếp với vi điều khiển thông qua Serial hoặc Ethernet. TAPIT chia sẻ đến các bạn chuỗi bài viết hướng dẫn về lý thuyết thư viện, porting các function, kết nối MQTT, kết nối HTTP trên nền tảng LWIP và tối ưu chương trình trên vi điều khiển STM32.

Phần 1, mình đã giới thiệu đến các bạn bộ thư viện LWIP, hướng dẫn cách add thư viện, cách để port các file và port các function khi sử dụng LWIP. Xem tại đây.

Phần 2, mình đưa ra hướng dẫn thiết kế chương trình hàm main, các hàm chức năng và một số Demo. Xem tại đây.

Tại phần này, mình sẽ thử nghiệm thực hiện kết nối HTTP và MQTT trên nền tảng LWIP.

1. Kết nối HTTP

Mình sẽ thử nghiệm thực hiện 1 lệnh HTTP Get đến đường dẫn http://httpbin.org/get

1.1. Thiết kế chương trình

Ý tưởng của mình như sau:

  • Chờ cho PPP đã được kết nối.
  • Nếu đã kết nối thì truyền các thông số của HTTP URL vào hàm cấu hình.
  • Đăng kí các hàm callback nhận dữ liệu.
  • Thực hiện lệnh HTTP Get.

1.2. Lưu đồ thuật toán

  • Trong đó http_connection_t chứa các thông tin mà server sẽ kết nối đến, chứa các thông tin
http_connection_t proxy_addr Địa chỉ của server, có kiểu số nguyên dương 32 bit
proxy_port HTTP port (80,443…)
use_proxy 1 hoặc 0
httpc_result_fn Hàm nhận dữ liệu trả về của http
httpc_headers_done_fn Hàm callback khi socket nhận đủ dữ liệu của header
http_state_t Chưa toàn bộ internal state-machine, timeout, bộ đệm… của HTTP
  • Implement hàm xử lí khi nhận đủ header trong HTTP

  • Hàm nhận status của kết nối HTTP

  • Hàm cuối cùng chúng ta cần implement để nhận toàn độ data từ HTTP, hàm này chỉ được gọi khi thiết bị kết nối thành công và bắt đầu nhận dữ liệu. Khi nhận data và xử lí xong, hệ thống cần giải phóng memory cho HTTP bằng hàm “pbuf_free(p)”. Trong trường hợp có lỗi xảy xa, cần phải đóng kết nối bằng cách gọi hàm “tcp_close
  • Dữ liệu nhận về có độ dài “q->len”, nằm tại địa chỉ “q->payload”, ở demo này mình sẽ in dữ liệu nhận về qua cổng debug.

Vậy là các hàm callback xử lí dữ liệu đã xong, chúng ta khởi tạo tham số và tiến hành kết nối. Giả sử bạn cần kết nối đến “http://httpbin.org/get” thì các tham số truyền vào httpc_get_file_dns như sau:

  • Server name “org
  • Port 80
  • File “/get”

1.3. Kết quả thử nghiệm

2. Kết nối MQTT

Design state machine – Thiết kế máy trạng thái

– Ý tưởng của mình như sau

  • Kiểm tra xem PPP stack đã được kết nối hay chưa.
  • Nếu PPP đã kết nối thành công thì khởi tạo các tham số của mqtt như broker address, port…
  • Thực hiện phân giải domain name của mqtt broker sang địa chỉ IP.
  • Sau khi phân giải IP thành công thì thực hiện kết nối MQTT, gán trạng thái MQTT thành “Connecting”.
  • Nếu kết nối thành công thì gán trạng thái MQTT thành “Connected”, sau đó tiến hành subscribe vào các topic.
  • Nếu trạng thái MQTT bằng “Connected” thì định kì gửi bản tin ping, định kì resubcribe lại các topic cần thiết với chu kì đã biết trước.

– Các hàm callback của MQTT

  • Hàm phân giải DNS dns_gethostbyname với 2 tham số quan trọng truyền vào là broker name và hàm xử lí callback “mqtt_dns_found

– Hàm callback phân giải DNS (thành công hoặc thất bại), với kết quả nằm tại con trỏ “ipaddr”. Trong trường hợp con trỏ “ipaddr” khác null thì thiết bị đã phân giải DNS thành công.

– Hàm subcribe 1 topic, với các tham số chính truyền vào là topic name, QoS và callback

– Hàm publish data lên MQTT broker và callback

– Hàm nhận dữ liệu từ MQTT broker

3. Source code

Ở demo này, mình sử dụng 2 thiết bị là 1 kit STM32L083 và 1 kit STM32F4. Các bạn có thể tham khảo ở repository sau: https://github.com/huybk213/lwip_porting

Vậy là kết thúc chuỗi bài viết giới thiệu và hướng dẫn thực hành về LWIP. Tổng kết lại toàn bộ nội dung, mình đã giới thiệu đến các bạn:

  • Tổng quan về LWIP
  • Hướng dẫn khởi tạo Project và thêm thư viện LWIP
  • Thiết kế chương trình hàm main, các hàm chức năng và thực hiện Demo
  • Kết nối HTTP và MQTT trên nền tảng LWIP
  • Chia sẻ Source code mà mình đã từng thực hiện

Chúc các bạn thành công!

Cố vấn tại Cộng đồng Kỹ thuật TAPIT

Trần Văn Huy

Tìm hiểu thêm:
Fanpage Cộng đồng Kỹ thuật TAPIT: TAPIT – Learning, Research and Sharing Community