Khởi Đầu
Trong hệ sinh thái thiết bị thông minh hiện nay, thu thập dữ liệu là bước đầu tiên của hầu hết các ứng dụng. Cho dù đó là đồng hồ thông minh theo dõi nhịp tim hay thiết bị nhà thông minh đo nhiệt độ và độ ẩm, dữ liệu đều là nền tảng cho các quyết định và dịch vụ tiếp theo. Không có dữ liệu, không thể nói đến sự thông minh. Hệ điều hành HarmonyOS, hướng tới mọi tình huống sử dụng, cung cấp API cảm biến phong phú, giúp nhà phát triển dễ dàng kết nối và thu thập dữ liệu phần cứng từ các thiết bị.
Bài viết này sẽ dẫn bạn qua quy trình hoàn chỉnh của việc thu thập dữ liệu với một Demo đầy đủ, bao gồm xin phép → khởi tạo cảm biến → đọc dữ liệu → xử lý dữ liệu → lưu trữ hoặc tải lên. Chúng tôi cũng sẽ đưa ra các ví dụ cụ thể về mã trong các ngữ cảnh khác nhau (theo dõi sức khỏe, nhà thông minh, chiếu sáng thông minh) và giải thích logic chi tiết để bạn có thể bắt tay vào thực hiện chức năng thu thập dữ liệu riêng của mình ngay sau khi đọc xong.
Chuẩn Bị Cấu Hình
Để truy cập cảm biến trong HarmonyOS, bạn phải khai báo quyền trong file config.json của ứng dụng.
{
"module": {
"abilities": [
{
"name": "MainFunc",
"permissions": [
"harmony.permission.GYROSCOPE",
"harmony.permission.READ_SENSOR"
]
}
]
}
}
Lưu ý: Mỗi loại cảm biến yêu cầu quyền khác nhau, đặc biệt đối với các cảm biến liên quan đến quyền riêng tư như nhịp tim hoặc vị trí.
Ví Dụ Thực Hành: Thu Thập Dữ Liệu Gia Tốc Kế
Dưới đây là một Demo nhỏ chạy được, minh họa cách thu thập dữ liệu gia tốc kế.
// main.js
import sensorLib from '@harmony.sensor';
@Entry
@Component
struct MainView {
private accelData = "Chờ dữ liệu...";
private buffer = []; // Dùng để làm mượt dữ liệu
onShow() {
sensorLib.subscribe(sensorLib.SensorType.ACCELEROMETER, (data) => {
const x = data.x.toFixed(2);
const y = data.y.toFixed(2);
const z = data.z.toFixed(2);
this.buffer.push(parseFloat(x));
if (this.buffer.length > 5) {
this.buffer.shift();
}
const avgX = (this.buffer.reduce((sum, val) => sum + val, 0) / this.buffer.length).toFixed(2);
this.accelData = `X: ${avgX}, Y: ${y}, Z: ${z}`;
console.log("Dữ liệu gia tốc:", JSON.stringify(data));
});
}
onHide() {
sensorLib.unsubscribe(sensorLib.SensorType.ACCELEROMETER);
}
render() {
Column() {
Text("Demo Thu Thập Dữ Liệu Gia Tốc Kế")
.fontSize(20)
.margin({ top: 20, bottom: 20 })
Text(this.accelData).fontSize(18).margin(10)
}
.width('100%')
.height('100%')
.alignItems(HorizontalAlign.Center)
}
}
Giải Thích Chi Tiết Mã
- Nhập Thư Viện
import sensorLib from '@harmony.sensor';
Đây là thư viện cảm biến của HarmonyOS, chứa giao diện của hầu hết các loại cảm biến phổ biến.
- Định Nghĩa Biến Trạng Thái
private accelData = "Chờ dữ liệu...";
private buffer = [];
accelDatadùng để hiển thị trên giao diện người dùng.bufferlưu trữ 5 giá trị gần nhất của phương X để tránh dao động lớn.
- Kết Nối Cảm Biến
sensorLib.subscribe(sensorLib.SensorType.ACCELEROMETER, (data) => { ... });
Sử dụng hàm gọi lại để nhận dữ liệu gia tốc ở ba chiều.
- Làm Mượt Dữ Liệu
Lấy giá trị trung bình của 5 lần gần nhất để ổn định hiển thị.
- Hủy Kết Nối
sensorLib.unsubscribe(sensorLib.SensorType.ACCELEROMETER);
Nếu không hủy kết nối, cảm biến sẽ tiêu tốn nhiều năng lượng hơn.
Các Ứng Dụng Thực Tế Và Ví Dụ Mã
Theo Dõi Sức Khỏe (Đồng Hồ Hay Vòng Tay Thông Minh)
Ví dụ thu thập dữ liệu nhịp tim thời gian thực:
sensorLib.subscribe(sensorLib.SensorType.HEART_RATE, (data) => {
console.info("Nhịp tim hiện tại: " + data.bpm);
if (data.bpm > 120) {
console.warn("Nhịp tim cao, hãy nghỉ ngơi!");
}
});
Nhà Thông Minh (Kiểm Tra Nhiệt Độ Và Độ Ẩm)
Gửi dữ liệu nhiệt độ lên đám mây:
import net from '@harmony.net.http';
sensorLib.subscribe(sensorLib.SensorType.TEMPERATURE, (data) => {
console.info("Nhiệt độ hiện tại: " + data.temp);
let req = net.createRequest();
req.post("https://example.com/upload", {
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ type: "temperature", value: data.temp })
}, (err, resp) => {
if (err) {
console.error("Lỗi upload: " + err.message);
} else {
console.info("Upload thành công: " + resp.result);
}
});
});
sensorLib.subscribe(sensorLib.SensorType.HUMIDITY, (data) => {
console.info("Độ ẩm hiện tại: " + data.humidity);
});
Chiếu Sáng Thông Minh (Thu Thập Ánh Sáng)
Tự động bật đèn nếu môi trường quá tối:
sensorLib.subscribe(sensorLib.SensorType.LIGHT_INTENSITY, (data) => {
console.info("Cường độ ánh sáng hiện tại: " + data.lux);
if (data.lux < 50) {
console.info("Môi trường quá tối, bật đèn");
// Giả sử gọi module điều khiển đèn ở đây
}
});