Trong bối cảnh nhà thông minh ngày càng phát triển, việc tích hợp và kiểm soát mọi thiết bị từ một nền tảng duy nhất như Home Assistant trở thành mục tiêu hàng đầu của nhiều người yêu công nghệ. Tuy nhiên, thách thức thường phát sinh khi các thiết bị cũ hơn hoặc từ các nhà sản xuất nhất định không cung cấp khả năng tích hợp linh hoạt. Đèn Govee H615B là một ví dụ điển hình. Mặc dù Govee cung cấp cả API dựa trên web và API cục bộ, API web lại gặp hạn chế về tốc độ truy vấn (rate limits) rất nhanh, khiến việc điều chỉnh độ sáng hoặc màu sắc trở nên khó khăn. Thậm chí, tùy chọn kích hoạt API cục bộ lại bị vô hiệu hóa hoàn toàn trên một số đèn Govee, bao gồm cả Govee H615B.
Chính những hạn chế này đã thúc đẩy một hành trình khám phá sâu hơn: sử dụng kỹ thuật đảo ngược (Reverse Engineering) để kiểm soát đèn Govee H615B trực tiếp qua Bluetooth Low Energy (BLE), loại bỏ hoàn toàn sự phụ thuộc vào ứng dụng chính thức hay các dịch vụ đám mây bị giới hạn. Mục tiêu là biến một thiết bị tưởng chừng “khép kín” trở thành một phần linh hoạt trong hệ thống nhà thông minh tự quản, mang lại sự tự chủ và khả năng tùy biến không giới hạn cho người dùng.
Đánh giá Vấn đề và Chuẩn bị Công cụ
Khi bắt tay vào bất kỳ dự án Reverse Engineering nào, việc đầu tiên là đánh giá rõ vấn đề, xác định các công cụ sẵn có và đặt ra mục tiêu cuối cùng. Đối với việc kiểm soát đèn Govee H615B, các công cụ mà tác giả có trong tay bao gồm:
- MacBook M4 Pro: Một chiếc máy tính mạnh mẽ để chạy các công cụ phân tích và lập trình.
- Google Pixel 8 Pro: Điện thoại Android để ghi lại nhật ký Bluetooth HCI (Host Controller Interface).
- Ứng dụng Govee: Dùng để điều khiển đèn ban đầu, buộc giao tiếp qua Bluetooth LE khi không có kết nối mạng.
- Wireshark: Công cụ phân tích gói tin mạng mạnh mẽ, dùng để giải mã dữ liệu Bluetooth.
- Bleak: Một framework Bluetooth LE cho Python, giúp quét thiết bị và tương tác với chúng.
- Milk-V Duo S: Một microcontroller với nhân Arm và RISC-V, có khả năng chạy Python và hỗ trợ Wi-Fi/Bluetooth, được chọn làm nền tảng để triển khai script điều khiển.
Mục tiêu cuối cùng của dự án là phát triển một script Python có thể chạy trên Milk-V Duo S, chấp nhận các lệnh từ Home Assistant và sau đó phát đi các lệnh này đến đèn Govee qua Bluetooth. Điều này sẽ cho phép tích hợp hoàn toàn đèn vào hệ sinh thái nhà thông minh cục bộ mà không cần root điện thoại hoặc phụ thuộc vào bất kỳ dịch vụ đám mây nào của Govee.
Đặt lại Vấn đề: Xác định Công cụ và Mục tiêu Cuối cùng
Việc xác định đúng công cụ giúp tinh gọn quy trình Reverse Engineering. Điện thoại Google Pixel 8 Pro được ưu tiên vì khả năng ghi log Bluetooth HCI đáng tin cậy, tránh được các tùy chỉnh (OEM shenanigans) từ các nhà sản xuất khác có thể làm trống file log. Wireshark sẽ là “con mắt” để nhìn vào dữ liệu gói tin, trong khi Bleak và Python là “bàn tay” để viết mã điều khiển. Milk-V Duo S sẽ là “bộ não” của hệ thống tự động hóa. Mục tiêu là không chỉ bật/tắt đèn, mà còn có thể điều chỉnh màu sắc và độ sáng theo ý muốn, mang lại trải nghiệm tùy chỉnh tối đa.
Thu thập Dữ liệu Gói tin Bluetooth
Để hiểu cách đèn Govee H615B hoạt động và cách điều khiển chúng, bước quan trọng nhất là thu thập các gói tin Bluetooth được gửi giữa ứng dụng Govee và đèn. May mắn thay, hệ điều hành Android có tính năng ghi nhật ký Bluetooth HCI tích hợp, rất hữu ích cho mục đích này.
Bạn có thể kích hoạt tùy chọn này trong Developer Options trên điện thoại Android của mình. Nhật ký HCI là một bản ghi cấp độ rất thấp của mọi thứ điện thoại gửi đi và nhận về qua Bluetooth.
Lý do chọn Google Pixel 8 Pro thay vì các thiết bị khác là vì nhiều hãng điện thoại có thể sửa đổi hệ thống, dẫn đến file nhật ký Bluetooth HCI bị trống hoặc không đầy đủ. Với Pixel, việc thu thập nhật ký chứa dữ liệu thực sự trở nên dễ dàng và đáng tin cậy hơn.
Quy trình thu thập dữ liệu cụ thể như sau:
- Cài đặt ứng dụng Govee và đăng nhập vào tài khoản của bạn.
- Tắt Wi-Fi trên điện thoại. Điều này đảm bảo rằng ứng dụng Govee sẽ buộc phải sử dụng Bluetooth để điều khiển đèn, ghi lại các gói tin cần thiết vào nhật ký HCI.
- Thực hiện nhiều thao tác khác nhau với đèn: bật/tắt, thay đổi độ sáng, thay đổi màu sắc. Mỗi thao tác sẽ tạo ra các gói tin Bluetooth tương ứng.
- Kết nối Pixel 8 Pro với máy tính và kéo báo cáo lỗi (bug report) bằng lệnh
adb bugreport
. File nhật ký Bluetooth HCI (có đuôi .cfa) sẽ được tìm thấy trong thư mụcFS/data/misc/bluetooth/logs
sau khi giải nén báo cáo lỗi.
Cách Dễ Dàng Thu Thập Gói Tin trên Google Pixel
Nhật ký HCI là một bản ghi chi tiết về tất cả các giao tiếp Bluetooth của thiết bị, đặc biệt là các gói tin L2CAP (Logical Link Control and Adaptation Protocol), thường được sử dụng bởi các thiết bị Bluetooth Low Energy (BLE) để truyền thông tin. Việc thu thập dữ liệu chính xác là nền tảng để hiểu cách các lệnh được truyền đi và phản hồi.
Điện thoại Google Pixel 8 Pro dùng để ghi lại gói tin Bluetooth HCI, thiết yếu cho việc điều khiển đèn Govee
Khám phá Những Điều Cơ bản với Wireshark
Sau khi thu thập được file nhật ký Bluetooth HCI (.cfa), bước tiếp theo là mở nó bằng Wireshark để bắt đầu phân tích. Trong Wireshark, file .cfa này sẽ hiển thị các gói tin BTSnoop chứa dữ liệu L2CAP.
Để xác định thiết bị Govee H615B trong hàng loạt gói tin, chúng ta có thể kết hợp sử dụng thư viện Bleak trong Python. Bleak cho phép quét các thiết bị Bluetooth LE gần đó và hiển thị Mã định danh duy nhất toàn cầu (UUID) của chúng. Việc này giúp dễ dàng xác định UUID của đèn Govee H615B.
Màn hình hiển thị kết quả quét thiết bị Bluetooth Low Energy bằng thư viện Bleak trong Python, xác định đèn Govee H615B
Sau khi xác định được UUID, Bleak có thể được sử dụng để truy vấn các “đặc tính” (characteristics) của thiết bị. Đặc tính là các profile dữ liệu mà qua đó client (ứng dụng/thiết bị điều khiển) gửi lệnh và server (thiết bị Govee) nhận và thực thi. Các đặc tính quan trọng được xác định bao gồm:
- Handle: 0x0009, UUID: 00010203-0405-0607-0809-0a0b0c0d2b10
- Handle: 0x000d, UUID: 00010203-0405-0607-0809-0a0b0c0d2b11
- Handle: 0x0012, UUID: f000ffc1-0451-4000-b000-000000000000
- Handle: 0x0016, UUID: f000ffc2-0451-4000-b000-000000000000
Dựa trên nghiên cứu các thiết bị Govee khác, các đặc tính kết thúc bằng “b10” và “b11” dường như liên quan đến việc thiết lập trạng thái cho đèn. May mắn thay, Govee H615B không yêu cầu bước xác thực phức tạp khi kết nối lần đầu, điều này đơn giản hóa quá trình Reverse Engineering.
Một phát hiện quan trọng khác là đặc tính kết thúc bằng “b10” còn gửi các “thông báo” (notifications) từ đèn về thiết bị điều khiển. Điều này cho thấy chúng ta cần lắng nghe dịch vụ này để theo dõi trạng thái của đèn.
Bắt đầu từ những Điều Đơn giản: Phân tích Cơ bản Gói tin
Tiếp theo, việc tìm kiếm các gói tin “keep-alive” (giữ kết nối) là cần thiết. Trong log, có rất nhiều gói tin được gửi khoảng hai giây một lần với giá trị aa010000000000000000000000000000000000ab
. Các gói này có vẻ là để thông báo cho đèn Govee rằng thiết bị điều khiển vẫn đang hoạt động và sẵn sàng gửi/nhận thông tin. Các gói tin Bluetooth LE thường dài 20 byte (nếu không có MTU mở rộng), và các gói này được “đệm bằng số 0” (zero padding) để đạt độ dài đó. Ký tự 0xaa
ở đầu cho thấy đây là một gói tin keep-alive.
Giao diện Wireshark hiển thị gói tin thông báo từ đặc tính Bluetooth của đèn Govee, quan trọng cho việc lắng nghe trạng thái
Sau khi xác định các gói tin keep-alive, chúng ta có thể tập trung vào các lệnh bật/tắt đèn đã được ghi lại. Khi bật và tắt đèn trong ứng dụng, các gói tin sau đã được chuyển giao:
- Bật đèn:
3301010000000000000000000000000000000033
- Tắt đèn:
3301000000000000000000000000000000000032
Phân tích cấu trúc gói tin:
0x33
ở đầu gói tin dường như là một byte định danh lệnh.0x01
là loại lệnh.0x01
(đối với bật) và0x00
(đối với tắt) ở byte thứ ba cho thấy đây là một giá trị boolean điều khiển trạng thái bật/tắt.
Chúng ta đã có đủ thông tin để thử nghiệm bằng cách thiết lập một bộ nhận thông báo và gửi lại các lệnh này đến đèn. Hai chữ số cuối cùng của mỗi gói (ví dụ 33
và 32
) là một “checksum” (tổng kiểm tra), sẽ được giải thích chi tiết hơn sau.
Gói tin bật đèn Govee được phân tích trong Wireshark, tiết lộ cấu trúc lệnh điều khiển qua Bluetooth
Thiết lập Màu sắc và Độ sáng của Đèn
Hiện tại, chúng ta đã có thể bật và tắt đèn Govee H615B qua Bluetooth, đây là một bước tiến lớn. Nhưng đèn thông minh đầy màu sắc như Govee H615B còn có nhiều tính năng hơn là chỉ bật/tắt. Việc điều chỉnh màu sắc và độ sáng là những chức năng cốt lõi.
Khi thay đổi màu sắc của đèn thành màu đỏ trong ứng dụng, gói tin sau đã được ghi lại:
33050dfe0e1f00000000000000000000000d4
Trong gói tin này, 0x33
vẫn là byte định danh lệnh. Chuỗi fe0e1f
nổi bật như một mã màu hex. Khi chuyển đổi fe0e1f
từ hệ thập lục phân (hex) sang màu RGB thực tế, nó tương ứng với màu đỏ đậm, khớp với màu đã thiết lập trong quá trình thử nghiệm.
Tuy nhiên, vấn đề phát sinh khi muốn gửi một màu sắc mới. Chúng ta không thể chỉ đơn giản thay thế fe0e1f
bằng một mã màu hex khác và gửi đi. Lý do là sự hiện diện của byte cuối cùng trong gói tin, đó là một checksum (tổng kiểm tra). Checksum có vai trò xác nhận rằng dữ liệu đã đến nơi một cách nguyên vẹn và không bị lỗi hoặc thay đổi.
Cách tính Checksum:
Checksum được tính toán bằng cách thực hiện một phép toán XOR tích lũy (cumulative XOR operation) trên từng byte của 19 byte đầu tiên của gói tin. Phép toán XOR sẽ cho kết quả ‘1’ nếu hai giá trị đầu vào khác nhau.
Quy trình tính toán checksum như sau:
- Bắt đầu với giá trị
0x00
(nhị phân:00000000
). - Thực hiện phép XOR với byte đầu tiên của gói tin.
- Kết quả sau đó được XOR với byte tiếp theo, và cứ thế tiếp tục cho đến byte thứ 19.
- Kết quả cuối cùng của phép XOR tích lũy này sẽ là byte thứ 20, được thêm vào cuối gói tin.
Ví dụ, để thay đổi đèn sang màu magenta, mã hex #FF00FF
. Gói tin cần gửi sẽ có dạng:
33050d
ff00ff
0000000000000000000000
[checksum]
Áp dụng phép toán XOR tích lũy cho các byte của gói tin này (không tính byte checksum):
- Bắt đầu với
0x00
- XOR với
0x33
->0x33
- XOR với
0x05
->0x36
- … (tiếp tục XOR với từng byte của
0d
,ff
,00
,ff
, và các byte00
còn lại) - Kết quả cuối cùng thu được là
0xff
.
Vậy, gói tin hoàn chỉnh để đặt màu magenta sẽ là:
33050dff00ff00000000000000000000000d4ff
Việc tính toán checksum thủ công mỗi lần điều chỉnh màu sắc là không thực tế. Do đó, cần tự động hóa quá trình này trong Python. Bằng cách triển khai một phương thức nhận giá trị RGB hex, chèn chúng vào chuỗi lệnh và sau đó tính toán checksum để thêm vào cuối chuỗi, chúng ta có thể tạo ra các lệnh màu sắc mới một cách linh hoạt.
Gói tin điều chỉnh màu sắc đèn Govee trong Wireshark, cho thấy mã hex màu và cấu trúc gói lệnh
Cuối cùng, việc thiết lập độ sáng cũng được phân tích tương tự. Lệnh điều chỉnh độ sáng có dạng:
3304
[brightness]
00000000000000000000000000000000
[checksum]
Giá trị độ sáng là một byte duy nhất, dao động từ 00
(0%) đến FF
(255, tương ứng 100%). Checksum lại phải được tính toán tương tự. Ví dụ, để đặt độ sáng 100% (FF
), gói tin sẽ là:
3304ff00000000000000000000000000000000c8
Với những khám phá này, chúng ta đã hoàn toàn giải mã được cách điều khiển đèn Govee H615B:
- Bật và tắt đèn.
- Đặt màu sắc.
- Đặt độ sáng.
Tất cả đều được thực hiện mà không cần sử dụng ứng dụng chính thức của Govee hoặc bị giới hạn bởi API đám mây. Điều này không chỉ giải quyết vấn đề không thể sử dụng API cục bộ mà còn mở ra cánh cửa cho việc tự động hóa và tích hợp sâu hơn vào hệ thống nhà thông minh cá nhân.
Reverse Engineering: Một Hành trình Dài và Thú vị
Kỹ thuật đảo ngược (Reverse Engineering) có thể là một quá trình khó khăn, đầy rẫy những trở ngại và bế tắc. Tuy nhiên, nó cũng mang lại những phần thưởng xứng đáng khi bạn thành công giải mã được cách hoạt động của một thiết bị. Thường thì, nếu bạn đang thực hiện Reverse Engineering một thứ gì đó, đó là vì chưa có ai khác làm điều đó, đòi hỏi sự kiên trì và tư duy sáng tạo.
Trong trường hợp của đèn Govee H615B, tác giả đã may mắn khi quá trình xác định những gì cần thay đổi và cách thực hiện tương đối đơn giản. Từ tất cả dữ liệu thu thập được, một trang web điều khiển đèn trực tiếp từ trình duyệt đã được xây dựng thành công.
Giao diện điều khiển đèn Govee H615B thông qua trình duyệt web sau khi reverse engineering thành công, tích hợp với Home Assistant
Mục tiêu của bài viết này là dẫn dắt bạn qua các bước cần thiết khi thực hiện Reverse Engineering một thiết bị tương tự. Có vô số thiết bị thông minh giá rẻ trên thị trường yêu cầu một ứng dụng độc quyền để điều khiển. Mặc dù có thể tốn hàng giờ, thậm chí hàng ngày để “cày cuốc” trước máy tính, nhưng việc tìm ra cách tự mình kiểm soát chúng là hoàn toàn khả thi. Điều này biến một dự án cuối tuần tưởng chừng đơn giản thành một nỗ lực kéo dài nhiều ngày, nhưng với quyết tâm đi đến cùng, thành quả đạt được là vô cùng xứng đáng.
Bạn sẽ Đối mặt với Thất bại, nhưng Đừng để Chúng Cản bước
Hành trình Reverse Engineering chắc chắn sẽ có những lúc bạn cảm thấy nản lòng. Tuy nhiên, mỗi thất bại, mỗi bức tường gạch đều là một bài học quý giá. Có rất nhiều tài nguyên và cộng đồng trực tuyến sẵn sàng hỗ trợ bạn. Điều quan trọng là không ngừng thử nghiệm, tìm kiếm các mẫu và luôn giữ tinh thần khám phá. Chính sự kiên trì sẽ giúp bạn vượt qua những thách thức và cuối cùng đạt được mục tiêu kiểm soát hoàn toàn các thiết bị của mình.
Kết luận
Dự án Reverse Engineering đèn Govee H615B đã thành công rực rỡ, mang lại khả năng điều khiển hoàn toàn thiết bị này qua Bluetooth cục bộ, giải phóng chúng ta khỏi các hạn chế của API đám mây và sự phụ thuộc vào ứng dụng chính thức. Đây là một minh chứng mạnh mẽ cho việc người dùng hoàn toàn có thể nắm quyền kiểm soát các thiết bị thông minh của mình.
Từ đây, việc tích hợp đèn Govee H615B vào Home Assistant trở nên đơn giản. Bạn có thể triển khai một REST API sử dụng framework Flask trong Python để nhận lệnh từ Home Assistant. Sau đó, sử dụng tích hợp rest_command
trong Home Assistant để gửi các lệnh này tới script của bạn. Cuối cùng, tạo một template switch
hoặc input slider
, hoặc một Lovelace control
tùy chỉnh cho chức năng bật/tắt, độ sáng và màu sắc. Đây chính là phương pháp đã được áp dụng khi triển khai trên Milk-V Duo S, và nó hoạt động hoàn hảo. Mặc dù không được khám phá sâu trong bài viết này, bạn cũng có thể đánh giá trạng thái hiện tại của đèn Govee (bật hay tắt) bằng cách lắng nghe dữ liệu được broadcast bởi nó trong quá trình quét.
Nếu bạn đang sở hữu những chiếc đèn Govee H615B và muốn tự mình điều khiển chúng, hãy truy cập kho mã nguồn GitHub của tác giả tại https://github.com/Incipiens/Govee-H615B-Reverse-Engineered-Controls. Bạn chỉ cần địa chỉ MAC của đèn (có thể tìm bằng ứng dụng như nRF Connect trên điện thoại), và phần còn lại sẽ hoạt động. Đây thực sự là một quá trình học hỏi vô cùng bổ ích, và congnghemoi.net hy vọng bài viết này sẽ truyền cảm hứng cho bạn để khám phá sâu hơn về các thiết bị xung quanh mình, hiểu rõ cách chúng hoạt động và tự mình kiểm soát chúng. Hãy chia sẻ kinh nghiệm và thảo luận thêm với cộng đồng độc giả congnghemoi.net về những dự án Reverse Engineering thú vị của bạn!