Menu
×

Được chứng nhận

Ghi lại kiến ​​thức của bạn

Đăng nhập Đăng ký

Tạo Tài khoản Example.com.vn miễn phí để cải thiện trải nghiệm học tập của bạn

Người tìm đường và việc học của tôi

Theo dõi tiến độ học tập của bạn tại Example.com.vn và thu thập phần thưởng

Nâng cấp

Trở thành người dùng PLUS và mở khóa các tính năng mạnh mẽ (không có quảng cáo, lưu trữ, hỗ trợ, ..)

Bắt đầu từ đâu

Bạn không chắc chắn muốn bắt đầu từ đâu? Đi theo con đường được hướng dẫn của chúng tôi

Trình chỉnh sửa mã (Dùng thử)

Với trình chỉnh sửa mã trực tuyến của chúng tôi, bạn có thể chỉnh sửa mã và xem kết quả trong trình duyệt của mình

Video

Tìm hiểu những điều cơ bản về HTML qua video hướng dẫn thú vị và hấp dẫn

Mẫu

Chúng tôi đã tạo một loạt mẫu trang web đáp ứng mà bạn có thể sử dụng - miễn phí!

Web hosting

Lưu trữ trang web của riêng bạn và chia sẻ nó với mọi người với Example.com.vn Spaces

Tạo một máy chủ

Tạo máy chủ của riêng bạn bằng Python, PHP, React.js, Node.js, Java, C#, v.v.

Làm thế nào để

Bộ sưu tập lớn các đoạn mã cho HTML, CSS và JavaScript

Khung CSS

Xây dựng các trang web nhanh và phản hồi bằng cách sử dụng khung W3.CSS miễn phí của chúng tôi

Thống kê trình duyệt

Đọc xu hướng dài hạn của việc sử dụng trình duyệt

Tốc độ gõ

Kiểm tra tốc độ đánh máy của bạn

Đào tạo AWS

Tìm hiểu dịch vụ web của Amazon

Bộ chọn màu

Sử dụng công cụ chọn màu của chúng tôi để tìm các màu RGB, HEX và HSL khác nhau. Bánh xe màu hình tròn thể hiện sự chuyển màu trong quang phổ

Trò chơi mã

Trò chơi mã hóa W3Schools! Giúp linh miêu thu thập nón thông Logo Lynx

Đặt mục tiêu

Nhận hành trình học tập được cá nhân hóa dựa trên các kỹ năng và mục tiêu hiện tại của bạn

Bản tin

Tham gia bản tin của chúng tôi và có quyền truy cập vào nội dung độc quyền mỗi tháng

Việc làm

Thuê những tài năng công nghệ hàng đầu. Hợp lý hóa quy trình tuyển dụng của bạn để có đội ngũ phù hợp hoàn hảo

Lớp học

Hãy liên hệ để sử dụng Example.com.vn Plus và các chứng chỉ với tư cách là một tổ chức giáo dục

×
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP CÁCH W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS AN NINH MẠNG DỮ LIỆU KHOA HỌC

Node.js và Raspberry Pi - Máy chủ web với WebSocket


WebSocket là gì?

WebSocket cho phép giao tiếp hai chiều trong thời gian thực qua web.

WebSocket có thể chạy cùng với máy chủ HTTP thông thường. Bạn có thể nhấp vào nút trong trình duyệt web và bật GPIO trên Raspberry Pi để bật đèn trong nhà bạn. Tất cả đều diễn ra trong thời gian thực và với khả năng giao tiếp theo cả hai chiều!

Trong chương này, chúng ta sẽ thiết lập một máy chủ web với WebSocket. Sau đó, tạo giao diện người dùng trình duyệt để tương tác với ví dụ trước đây của chúng tôi về việc bật và tắt đèn LED bằng một nút .


Tôi cần những gì?

Đối với hướng dẫn này, bạn cần có Raspberry Pi. Trong các ví dụ của chúng tôi, chúng tôi sử dụng aa Raspberry Pi 3, nhưng hướng dẫn này sẽ hoạt động với hầu hết các phiên bản.

Đối với điều này bạn cần:

Nhấp vào các liên kết trong danh sách ở trên để xem mô tả về các thành phần khác nhau.

Lưu ý: Điện trở bạn cần có thể khác với điện trở chúng tôi sử dụng tùy thuộc vào loại đèn LED bạn sử dụng. Hầu hết các đèn LED nhỏ chỉ cần một điện trở nhỏ, khoảng 200-500 ohm. Nói chung, giá trị chính xác bạn sử dụng không quan trọng, nhưng giá trị của điện trở càng nhỏ thì đèn LED sẽ càng sáng.

So với ví dụ trước đó của chúng tôi, điều mới duy nhất chúng tôi cần là thiết lập máy chủ web và cài đặt mô-đun socket.io.


Máy chủ web cho Raspberry Pi và Node.js

Tiếp theo các chương trước trong hướng dẫn Node.js này, hãy thiết lập một máy chủ web có thể phân phát các tệp HTML.

Trong thư mục "nodetest" của chúng tôi, hãy tạo một thư mục mới mà chúng tôi có thể sử dụng cho các tệp html tĩnh:

pi@w3demopi:~/nodetest $ mkdir public

Bây giờ hãy thiết lập một máy chủ web. Tạo tệp Node.js để mở tệp được yêu cầu và trả về nội dung cho máy khách. Nếu có vấn đề gì xảy ra, hãy đưa ra lỗi 404.

pi@w3demopi:~/nodetest $ nano webserver.js

máy chủ web.js:

var http = require('http').createServer(handler); //require http server, and create server with function handler()
var fs = require('fs'); //require filesystem module

http.listen(8080); //listen to port 8080

function handler (req, res) { //create server
  fs.readFile(__dirname + '/public/index.html', function(err, data) { //read file index.html in public folder
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'}); //display 404 on error
      return res.end("404 Not Found");
    }
    res.writeHead(200, {'Content-Type': 'text/html'}); //write HTML
    res.write(data); //write data from index.html
    return res.end();
  });
}

Chuyển đến thư mục "công khai":

pi@w3demopi:~/nodetest $ cd public

Và tạo một tệp HTML, index.html:

pi@w3demopi:~/nodetest/public $ nano index.html

chỉ mục.html:

<!DOCTYPE html>
<html>
<body>

<h1>Control LED light</h1>
<input id="light" type="checkbox">LED

</body>
</html>

Tập tin này sẽ không có bất kỳ chức năng nào. Hiện tại nó chỉ là một phần giữ chỗ. Hãy xem máy chủ web có hoạt động không:

pi@w3demopi:~/nodetest/public $ cd ..
pi@w3demopi:~/nodetest $ node webserver.js

Mở trang web trong trình duyệt bằng https://[RaspberryPi_IP]:8080/:

Máy chủ web hiện đã hoạt động và chúng ta có thể chuyển sang phần WebSocket.


Cài đặt socket.io cho Node.js

Sau khi thiết lập máy chủ web, hãy cập nhật các gói hệ thống Raspberry Pi của bạn lên phiên bản mới nhất.

Cập nhật danh sách gói hệ thống của bạn:

pi@w3demopi:~ $ sudo apt-get update

Nâng cấp tất cả các gói đã cài đặt của bạn lên phiên bản mới nhất:

pi@w3demopi:~ $ sudo apt-get dist-upgrade

Làm điều này thường xuyên sẽ giúp cài đặt Raspberry Pi của bạn được cập nhật.

Để tải xuống và cài đặt phiên bản socket.io mới nhất, hãy sử dụng lệnh sau:

pi@w3demopi:~ $ npm install socket.io --save


Thêm WebSocket vào máy chủ web của chúng tôi

Bây giờ chúng ta có thể sử dụng WebSocket trong ứng dụng của mình. Hãy cập nhật tệp index.html của chúng tôi:

chỉ mục.html:

<!DOCTYPE html>
<html>
<body>

<h1>Control LED light</h1>
<p><input type="checkbox" id="light"></p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script> <!-- include socket.io client side script -->
<script>
var socket = io(); //load socket.io-client and connect to the host that serves the page
window.addEventListener("load", function(){ //when page loads
  var lightbox = document.getElementById("light");
  lightbox.addEventListener("change", function() { //add event listener for when checkbox changes
    socket.emit("light", Number(this.checked)); //send button status to server (as 1 or 0)
  });
});
socket.on('light', function (data) { //get button status from client
  document.getElementById("light").checked = data; //change checkbox according to push button on Raspberry Pi
  socket.emit("light", data); //send push button status to back to server
});
</script>

</body>
</html>

Và tệp webserver.js của chúng tôi:

máy chủ web.js:

var http = require('http').createServer(handler); //require http server, and create server with function handler()
var fs = require('fs'); //require filesystem module
var io = require('socket.io')(http) //require socket.io module and pass the http object (server)

http.listen(8080); //listen to port 8080

function handler (req, res) { //create server
  fs.readFile(__dirname + '/public/index.html', function(err, data) { //read file index.html in public folder
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'}); //display 404 on error
      return res.end("404 Not Found");
    }
    res.writeHead(200, {'Content-Type': 'text/html'}); //write HTML
    res.write(data); //write data from index.html
    return res.end();
  });
}

io.sockets.on('connection', function (socket) {// WebSocket Connection
  var lightvalue = 0; //static variable for current status
  socket.on('light', function(data) { //get light switch status from client
    lightvalue = data;
    if (lightvalue) {
      console.log(lightvalue); //turn LED on or off, for now we will just show it in console.log
    }
  });
});

Hãy kiểm tra máy chủ:

pi@w3demopi:~ $ node webserver.js

Mở trang web trong trình duyệt bằng https://[RaspberryPi_IP]:8080/:

Bây giờ máy chủ sẽ xuất tất cả các thay đổi đối với hộp kiểm ra bảng điều khiển trên Raspberry Pi.

Máy khách đang gửi các thay đổi đến máy chủ và máy chủ đang phản hồi.

Hãy thêm đèn LED điều khiển bằng nút nhấn từ chương trước.


Thêm phần cứng và gửi phản hồi cho Khách hàng

Hãy cập nhật lại tệp webserver.js của chúng tôi. Chúng ta sẽ sử dụng rất nhiều mã từ chương LED điều khiển bằng nút nhấn.

máy chủ web.js:

var http = require('http').createServer(handler); //require http server, and create server with function handler()
var fs = require('fs'); //require filesystem module
var io = require('socket.io')(http) //require socket.io module and pass the http object (server)
var Gpio = require('onoff').Gpio; //include onoff to interact with the GPIO
var LED = new Gpio(4, 'out'); //use GPIO pin 4 as output
var pushButton = new Gpio(17, 'in', 'both'); //use GPIO pin 17 as input, and 'both' button presses, and releases should be handled

http.listen(8080); //listen to port 8080

function handler (req, res) { //create server
  fs.readFile(__dirname + '/public/index.html', function(err, data) { //read file index.html in public folder
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'}); //display 404 on error
      return res.end("404 Not Found");
    }
    res.writeHead(200, {'Content-Type': 'text/html'}); //write HTML
    res.write(data); //write data from index.html
    return res.end();
  });
}

io.sockets.on('connection', function (socket) {// WebSocket Connection
  var lightvalue = 0; //static variable for current status
  pushButton.watch(function (err, value) { //Watch for hardware interrupts on pushButton
    if (err) { //if an error
      console.error('There was an error', err); //output error message to console
      return;
    }
    lightvalue = value;
    socket.emit('light', lightvalue); //send button status to client
  });
  socket.on('light', function(data) { //get light switch status from client
    lightvalue = data;
    if (lightvalue != LED.readSync()) { //only change LED if status has changed
      LED.writeSync(lightvalue); //turn LED on or off
    }
  });
});

process.on('SIGINT', function () { //on ctrl+c
  LED.writeSync(0); // Turn LED off
  LED.unexport(); // Unexport LED GPIO to free resources
  pushButton.unexport(); // Unexport Button GPIO to free resources
  process.exit(); //exit completely
});

Hãy kiểm tra máy chủ:

pi@w3demopi:~ $ node webserver.js

Mở trang web trong trình duyệt bằng https://[RaspberryPi_IP]:8080/:

Bây giờ máy chủ sẽ xuất tất cả các thay đổi đối với hộp kiểm ra bảng điều khiển trên Raspberry Pi.

Máy khách đang gửi các thay đổi đến máy chủ và máy chủ đang phản hồi.

Kết thúc chương trình bằng Ctrl+c .


×

Liên hệ bán hàng

Nếu bạn muốn sử dụng dịch vụ của Example.com.vn với tư cách là một tổ chức giáo dục, nhóm hoặc doanh nghiệp, hãy gửi email cho chúng tôi:
[email được bảo vệ]

Báo cáo lỗi

Nếu bạn muốn báo cáo lỗi hoặc nếu bạn muốn đưa ra đề xuất, hãy gửi email cho chúng tôi:
[email được bảo vệ]

Example.com.vn được tối ưu hóa cho việc học tập và đào tạo. Các ví dụ có thể được đơn giản hóa để cải thiện khả năng đọc và học. Các hướng dẫn, tài liệu tham khảo và ví dụ liên tục được xem xét để tránh sai sót, nhưng chúng tôi không thể đảm bảo tính chính xác hoàn toàn của mọi nội dung. Khi sử dụng W3Schools, bạn đồng ý đã đọc và chấp nhận các điều khoản sử dụng , chính sách cookie và quyền riêng tư của chúng tôi.

Bản quyền 1999-2024 của Refsnes Data. Đã đăng ký Bản quyền. Example.com.vn được cung cấp bởi W3.CSS .