Bài 11 : Lập trình web-server trên Raspberry pi – phần 2

Bài 11 : Lập trình web-server trên Raspberry pi – phần 2

18:25 - 14/01/2019

Bài 11 : Lập trình web-server trên Raspberry pi – phần 2

Hướng cài đặt Hệ điều hành và Remote Desktop cho Raspberry Pi nhanh chóng và cực kỳ đơn giản
Remote Desktop Raspberry Pi không cần Wifi, mạng LAN và IP
Camera nhiệt giải pháp tuyệt vời cho mùa Covid-19
Lập trình cơ bản với OpenPLC trên Raspberry Pi
Hướng dẫn cài đặt OpenPLC trên Raspberry Pi

Trong phần trước của tutorial về lập trình web-server mình đã chia sẻ với các bạn những nền tảng kiến thức lập trình và công cụ các bạn cần cài đặt nều muốn tự tạo cho mình một web-server trên Raspberry.  Phần tiếp theo này mình sẽ tiếp tục chia sẻ một “chương trình” web-server nhỏ do mình tự viết để các bạn có thể nhìn tổng quan hơn về hệ thống. Ngoài ra cũng có thể lấy luôn chương trình của mình làm nền để xây dựng dự án của riêng mọi người.

Để xây dựng được một web-server thực sự tốt có lẽ  sẽ là cả một dãy núi kiến thức các bạn cần phải vượt qua. Kiến thức về lập trình web như HTML, CSS, Javascript, PHP, v.vv hay kiến thức về cơ sở dữ liệu sql. Thật sự rất khó khăn và tốn kém thời gian khi muốn thực hiện nếu bạn không phải là dân công nghệ thông tin. Tuy nhiên, mong muốn ứng dụng của các bạn đơn giản, cũng không phức tạp hoặc bạn có thể dựa trên những chương trình có sẵn thì khối lượng công việc sẽ được giảm xuống nhiều. Những người làm ứng dụng thường nói câu : “không làm lại chiếc bánh xe của người khác đã làm, hãy sử dụng nó để gây dựng chiếc xe cho riêng mình.”. Câu này rất phù hợp với người đã có nền tảng căn bản hoặc không chuyên và có lẽ dành cho mọi người khi chỉ mong muốn làm nhanh ứng dụng này.

Dưới đây là mô hình web-controler mình chia sẻ cho mọi người. Có những phần của mô hình đã hoàn thiện, có những phần mọi người phải tự thực hiện tùy theo yêu cầu của mỗi người.

Mô hình web-server

Hình 1 : mô hình web-controler

Kết nối giữa trình duyệt và Web-server.

Web-server sau khi cài đặt sẽ được người dùng truy cập thông qua trình duyệt trên máy tính hoặc điện thoại. Người dùng mở trình duyệt và nhâp địa chỉ “địa chỉa của Pi/thư mục web-server” ví dụ như : ”192.168.1.23/lazy-man”, địa chỉ của Pi là 192.168.1.23 và thư mục chứa web-server là lazy-man. Chúng ta không cần chỉ đích xác chương trình web-server (ví dụ như index.php) vì Apache sẽ tự động thay ta tìm tới file chương trình và thực thi file đó.

Ngay khi có tín hiệu yêu cầu từ trình duyệt gửi tới server. Server ngay lập tức đọc dữ liệu từ cơ sở dữ liệu sau đó trả dữ liệu đó dưới dạng HTML tới trình duyệt. Trình duyệt sẽ hiển thị dữ liệu đó lên màn hình. (Những thứ được hiển thị trên trình duyệt đều là HTML).

Kết nối giữa Web-server và Master.

Khi người dùng thực hiện một thao tác điều khiển nào đó trên trình duyệt ví như bật tắt một bóng đèn thì thông tin đó lại được gửi lên server. Server sẽ chuyển tiếp thông tín đó tới Master qua phương thức TCP/IP. Web-server lúc này sẽ là client của Master. Mọi người có thể xem thêm thông tin về phương thức này trong tutorial trước “mô hình Client-Server”. Sau khi gửi thông tin xong Server sẽ cập nhật thông tin vào cơ sở dữ liệu. Thông tin điều khiển cũng được hiển thị ngay trên trình duyệt.

Việc sử dụng cơ sở dữ liệu là điều cần thiết vì các thông tin trên trình duyệt chỉ là tạm thời, nếu không lưu trữ thì khi tắt bật lại trình duyệt thì thông tin đã không chính xác rồi. Ngoài ra thông tin được lưu cứng trong cơ sở dữ liệu sẽ phòng tránh các trường hợp sự cố phần cứng như mất nguồn .

Kết nối giữa Master và các thiết bị.

Phần này mình không thực hiện. Moi người có thể tự do lựa chọn phương thức kết nối không nhất thiết phải là TCP/IP mà có thể là RF, Zigbee hay bluetooth. Vì Master được viết bằng C – ngôn ngữ quen thuộc với lập trình viên nên mọi người có thể  trực tiếp vào chương trình Master. Có một đặc điểm chú ý là Master đang là server đối với client là web-server. Địa chỉ của web-server trong Master luôn là “127.0.0.1” vì cùng host (trên cùng một thiết bị). Đây là đặc điểm dùng làm nhận định thông tin điều khiển từ người dùng. Master sẽ dùng thông tin này để điều khiển các thiết bị.

Mọi người nên làm thông tin phản hồi từ thiết bị. Ví như nếu bật đèn thành công, thiết bị sẽ gửi lại thông tin thông báo cho Master là đã thực hiện thành công, ngược lại sẽ thông báo lỗi. Như vây hệ thống sẽ hoạt động hiệu quả hơn.


1. Cài đặt web-server


Chương trình web-server mình chia sẽ miễn phí với mọi người, mọi người có thể tự do chỉnh sửa, sử dụng.

Bước 1 - Tải chương trình web-server :

Mọi người truy cập vào github và tải chương trình về. Thư mục chứa chương trình là web-server nhé. Bỏ thư mục “lazy” vào thư mục chỉ “var/www/html”.

Chú ý và thư mục "www" thuộc quền của root nên các bạn phải sử dụng quền root để copy hoặc chuyển thư mục này sang quyền user thông thường :

Trong đó owner:goup là pi: pi. Có thể raspberry của ban đang dùng owner và group khác. Hãy kiểm tra nhóm của mình bằng lệnh : groups.

Bước 2 - Cài đặt cơ sở dữ liệu :

Mở thư mục sql/sql-function.php lên và sửa 2 dòng lệnh sau :

-      define("userName", "root") thành define("userName", "tên khi bạn cài đặt mysql, mặc định là root").

-      define("password", "password") thành define("password", "mật khẩu khi cài đặt mysql ứng với tên bên trên").

Trỏ con trỏ tới thư mục sql và thực hiện tạo cơ sở dữ liệu bằng lệnh :

php sql.php

Ngay sau lệnh này các bạn hãy restart lại rasspberry.

Chương trình sẽ tạo ra những ví dụ về những thiết bị điều khiển đơn giản mà chương trình hỗ trợ. Hãy thử điều khiển với những thiết bị đó trước khi tạo thiết bị của riêng mình. Để thuận tiện trong việc xem các project trong thư mục html, bạn có thể xóa tệp "index.html" đi. Khi nhập vaò "địa chỉ của pi" trên thanh nhập địa chỉ sẽ xuất hiện ra thông tin về project của bạn.

Mở trình duyệt lên và xem gõ “địa chỉ Pi/lazy”. Nếu trình duyệt hiển thị các thông tin về thiết bị thì các bạn đã cài đặt thành công. Ngoài ra các bạn cũng có thể truy cập trực tiếp vào mysql để xem. Database được tạo là “home” và table là “device”.

Hình 2 : kết quả sau khi cài đặt database

Bước 3 – Tạo lập Master :

Truy cập vào thư mục master và gõ lệnh sau :

gcc -std=c11 -Wall -g -D_BSD_SOURCE server-thread.c -o server-thread -lpthread
./server-thread

Bạn hãy thử điều khiển một vài thiết bị trên trình duyệt. Mọi thông tin điều khiển sẽ được hiển thị trên terminal.

Các thiết bị được hỗ trợ là các thiết bị bật tắt đơn giản. Có thể điều chỉnh thông tin cường độ. 

 

Ngoài ra còn có thêm một bảng gửi thông tin riêng biệt. Với bảng thông tin này mọi ngươi có thể gửi mọi loại thông tin mình mong muốn.

Bảng thông tin đặc biệt

Nếu các bạn muốn làm các thiết bị khác mà không được hỗ trợ có thể dựa vào chương trình có sẵn để tạo thêm.


2. Các hàm chức năng


Các bạn có thể tạo thêm thiết bị để điều khiển hoặc xóa các thiết bị các bạn không mong muốn trong cơ sở dữ liệu. Dưới đây là các hàm chức năng trong cơ sở dữ liệu mà các bạn có thể sử dụng.

2.1)    Tạo một thiết bị điều khiển mới :

InsertObject($conn,object-type,object-name,initial-state,color,amplitude,icon)

Trong đó :

-      $conn : là biến liên kết tới mysql

-      object-type (string) : loại thiết bị, loại thiết bị khác nhau có cách điều khiển khác nhau. Hỗ trợ 2 lọai là "obj-slider" và "obj-button".

-      object-name (string) : tên thiết bị điều khiển.

-      initial-state : trạng thái thiết lập. 1 tương ứng với bật và 0 tương ứng với tắt.

-      color (string) : màu sắc cho giao diện điều khiển. Có 4 màu là blue (mặc định : NULL), green (flavor-green), orange (flavor-orange), violet (flavor-violet).

-      amplitude (number) : Mức hoạt động của thiết bị. Ví dụ như đèn sẽ sáng bao nhiều % so với định mức.

-      icon (string) : icon đại diện cho thiết bị. Mặc định là "fa-wrench". Xem tên các icon ở đây Font Awesome.

2.2)    Xoá một thiết bị điều khiển :

DeleteObject($conn, object-name)

Trong đó :

-      object-name (string) : tên thiết bị muốn xóa

2.3)    Update thông tin cho thiết bị

UpdateObject($conn, object-name,"name='value'")

Trong đó :

-      object-name (string) : tên thiết bị muốn update

-      name (string) : tên thuộc tính muốn thay đổi

-      value : giá trị muốn thay đổi.

2.4)    Thực thi file "sql.php"

php sql.php

Các bạn có thể xem hướng dẫn chi tiết hơn với video dưới đây. (Rât tiếc mình không có micro tốt - nghe rất nhiễu nên không thể nói trong video. Mọi người xem tạm nhé. )

 


3. Những hạn chế cần cải tiến


Vì mục đích chỉ để làm quen với nền tảng căn bản và mình cũng không phải dân IT nên chương trình cũng rất sơ sài và có thể sẽ bị mắc lỗi. Mọi thông tin đóng góp và hỗ trợ từ mọi người mình đều đón nhận nhiệt tình.

Hạn chế lớn nhất của chương trình trên là các thiết bị không được hỗ trợ đa dạng. Chỉ hỗ trợ loại thiết bị cơ bản là bật tắt. Chức năng cũng bị hạn chế theo. Do cơ sở dữ liệu các thiết bị nằm chung một bảng nên tính năng giông nhau – cũng là đặc điểm gây hạn chế. Đê khắc phục có thể tạo ra các bảng riêng biệt. Tuy nhiên mọi người phải tự code phần này. Ngoài ra muốn thêm thiết bị thì mọi người cũng phải tự lập trình html/css để hiển thị trên trình duyệt.

Hạn chế trên là lý do có bảng gửi thông tin đặc biệt để gửi bất kỳ thông tin mong muốn thay cho việc tạo dựng mới thiết bị.

Bài tiếp theo :

Bài 3 : Bản demo đầu cuối cho web-server

Xem list bài lâp trình cùa Raspberry Pi .


Để cập nhật các tin tức công nghệ mới các bạn làm theo hướng dẫn sau đây :


Các bạn vào Trang chủ >> Tin tức. ở mục này có các bài viết kỹ thuật thuộc các lĩnh vực khác nhau các bạn có thể lựa chọn lĩnh vực mà mình quan tâm để đọc nhé !!!

Các bạn cũng có thế kéo xuống cuối trang để xem những tin tức công nghệ mới nhất.