"Bạn có thể sẽ ngạc nhiên khi thấy một công ty cứu hộ giao thông như chúng tôi có mặt trên DEV.to. Chúng tôi không ở đây để nói về lốp xe hay ắc quy. Hôm nay, tôi muốn chia sẻ về một vấn đề rất 'đời thực' mà chúng tôi đã giải quyết bằng một chút code.
Vấn đề của chúng tôi là: Khi một cuộc gọi khẩn cấp đến vào lúc 3 giờ sáng từ một tài xế bị mắc kẹt trên cao tốc, tốc độ là tất cả. Hệ thống cũ của chúng tôi – một người trực và gọi điện cho các tài xế cứu hộ – đôi khi bị chậm, nhỡ cuộc gọi, hoặc thông tin truyền đi bị tam sao thất bản. Chúng tôi cần một hệ thống thông báo tức thì, đáng tin cậy và tự động. Và đây là cách chúng tôi đã làm."
- Các công cụ chúng tôi đã chọn (Our Tech Stack):
Twilio: Để có một số điện thoại ảo có thể nhận tin nhắn SMS và kích hoạt một hành động.
Discord: Nền tảng chat mà cả đội cứu hộ của chúng tôi đều dùng để liên lạc. Chúng tôi sẽ dùng Webhooks của nó.
Vercel/Netlify Functions (hoặc bất kỳ nền tảng Serverless nào): Để viết một đoạn mã nhỏ xử lý logic mà không cần quản lý máy chủ.
- Quy trình hoạt động (The Workflow):
Bước 1: Thiết lập số điện thoại Twilio.
Chúng tôi đăng ký một số điện thoại trên Twilio. Khi có tin nhắn SMS gửi đến số này, Twilio sẽ gửi một yêu cầu HTTP (webhook) đến một đường link URL mà chúng tôi cung cấp.
Bước 2: Viết hàm Serverless để xử lý tin nhắn.
Chúng tôi viết một hàm đơn giản bằng JavaScript (Node.js) trên Vercel. Hàm này làm 3 việc:
Nhận dữ liệu từ Twilio.
Phân tích nội dung tin nhắn (ví dụ: "Thủng lốp, QL5, biển số 15A-12345, sđt 09xxxxxxxx").
Định dạng lại thông tin cho dễ đọc.
// File: /api/dispatch.js
// Đây là một ví dụ về serverless function trên nền tảng như Vercel hoặc Netlify.
// Nó sẽ được kích hoạt mỗi khi Twilio nhận được tin nhắn và gửi webhook đến.
export default async function handler(req, res) {
// Chỉ chấp nhận phương thức POST từ Twilio
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method Not Allowed' });
}
try {
// Dữ liệu Twilio gửi đến nằm trong req.body
// Ví dụ tin nhắn SMS: "Thủng lốp, Cao tốc HN-HP km 52, 15A-12345, 0912345678"
const smsBody = req.body.Body;
const fromNumber = req.body.From; // Số điện thoại của người trực
if (!smsBody) {
return res.status(400).json({ error: 'Nội dung tin nhắn trống!' });
}
// 1. Phân tích nội dung tin nhắn
// Tách chuỗi bằng dấu phẩy, và dùng .trim() để xóa khoảng trắng thừa
const parts = smsBody.split(',').map(part => part.trim());
if (parts.length < 3) {
return res.status(400).json({ error: 'Định dạng tin nhắn không hợp lệ.' });
}
// Gán các phần đã tách vào những biến có ý nghĩa
const incidentType = parts[0];
const location = parts[1];
const licensePlate = parts[2];
const contactPhone = parts[3] || 'Không cung cấp'; // Số điện thoại liên hệ là không bắt buộc
// 2. Định dạng lại thông điệp để gửi qua Discord
const discordMessageContent = `
🚨 SỰ CỐ MỚI - YÊU CẦU CỨU HỘ 🚨
- Loại sự cố: ${incidentType}
- Vị trí: ${location}
- Biển số xe: ${licensePlate}
- SĐT liên hệ: ${contactPhone}
Tin nhắn được gửi từ số của người trực: ${fromNumber}
`;
// 3. Gửi đến Discord (Trong bài viết thực tế sẽ có code để gửi)
// console.log("Chuẩn bị gửi thông báo đến Discord:", discordMessageContent);
// await fetch(process.env.DISCORD_WEBHOOK_URL, { ... });
// 4. Phản hồi thành công cho Twilio
res.status(200).json({ success: true, message: 'Đã xử lý và chuẩn bị gửi thông báo.' });
} catch (error) {
console.error('Lỗi xử lý tin nhắn:', error);
res.status(500).json({ error: 'Đã có lỗi xảy ra.' });
}
}
Bước 3: Gửi thông báo đến kênh Discord của đội.
Hàm của chúng tôi sau khi xử lý xong sẽ gửi thông tin đó đến một kênh Discord riêng của đội thông qua Discord Webhook.
- Kết quả:
Bây giờ, khi người trực nhận cuộc gọi, họ chỉ cần nhắn một tin SMS đến số của Twilio. Ngay lập tức, toàn bộ đội cứu hộ sẽ nhận được thông báo trên kênh Discord với đầy đủ thông tin chi tiết.
🚨 SỰ CỐ MỚI 🚨
Loại: Thủng lốp
Vị trí: QL5, gần trạm thu phí
Biển số: 15A-12345
Số gọi: 09xxxxxxxx
@đội_trực_tối hãy xác nhận!
Phần 3: Kết bài - Giá trị và lời kêu gọi kết nối
"Dự án nhỏ này đã cải thiện thời gian phản ứng của chúng tôi một cách đáng kể và đảm bảo không một thông tin nào bị bỏ lỡ. Nó chứng tỏ rằng đôi khi, chỉ một vài dòng code và các dịch vụ API đơn giản cũng có thể tạo ra tác động lớn trong một ngành nghề rất truyền thống.
Đây chính là tinh thần giải quyết vấn đề của chúng tôi tại Cứu Hộ Trọng Hiền 24H. Chúng tôi không chỉ là một dịch vụ cứu hộ tại Hải Phòng; chúng tôi là một đội ngũ luôn tìm cách tốt hơn để giúp đỡ mọi người. Nếu bạn là một lập trình viên tại Việt Nam quan tâm đến việc công nghệ có thể giải quyết các bài toán thực tế như thế nào, chúng tôi rất muốn được kết nối và học hỏi."
Top comments (0)