Lại tản mạn về vai trò của Linux

Nghe đồn giới IoT muốn ứng dụng Bluetooth LE nhưng gặp khó.

Quay đi quay lại thì mình thấy thư viện về Bluetooth có độ hoàn thiện nhất là BlueZ. Khó ở đây là thư viện này được tạo ra với mục đích dành cho viết ứng dụng Linux, vì nó dùng event loop của GLib ở trỏng. GLib là một trong những thành phần lõi của bộ GTK, bộ toolkit dành cho lập trình giao diện đồ họa của Linux. Đã thế nó còn dùng D-Bus nữa chứ. D-Bus là một đường giao tiếp chung, cho phép các ứng dụng desktop giao tiếp với nhau. Sau đây là ví dụ về ứng dụng của D-Bus: Vào thời mà Yahoo Messenger còn phổ biến, dân Linux thường chat Yahoo bằng một phần mềm "nhiều trong một" tên là Pidgin (ngoài Yahoo ra, còn có thể chat cùng lúc với Google Hangout, Facebook Messenger). Phần mềm này có khả năng thú vị là nhận biết khi nào máy bạn đang có mạng, rớt mạng để hiện chỉ thị tương ứng (trạng thái màu xám, các avatar bạn bè bị phủ màu xám). Khi có mạng trở lại thì phần mềm này sẽ tự đổi trạng thái, tự đăng nhập vào các dịch vụ chat và cập nhật danh sách bạn bè. Để nhận biết tình trạng mạng, nó không chơi trò cơ bắp là liên tục kết nối đại vào server nào đấy. Thay vì vậy nó trao đổi với một phần mềm khác tên là NetworkManager. Khi rớt mạng hoặc có mạng, NetworkManager sẽ thông báo trên đường D-Bus và các phần mềm khác "đăng ký" vào D-Bus sẽ nhận được tin.

Đối với những người cần dùng thiết bị USB-3G (như cục D-Com 3G của Viettel chẳng hạn), trên Linux cũng có một phần mềm tên là ModemManager, chạy ngầm để khai thác thiết bị này, ví dụ như chọn sóng của nhà mạng nào, nhập username, password để quay số vào nhà mạng đó, bật sang chế độ data, gửi tin nhắn SMS v.v. ModemManager cũng cho phép giao tiếp qua D-Bus. Chẳng hạn khi cắm thiết bị vào thì danh mục của Network Manager sẽ xuất hiện mục để kết nối mạng 3G, hoặc bạn có thể viết ứng dụng riêng để gửi tin nhắn SMS, lấy các danh bạ lưu trong SIM, tất cả bằng việc giao tiếp với ModemManager qua D-Bus.

...

Python và cách tiết kiệm dung lượng cho phần mềm nhúng

Khi tôi bắt đầu bước chân vào mảng IoT đầu năm 2016, tôi bắt đầu lân la tiếp xúc với cộng đồng làm IoT Việt Nam (trên Facebook là chính). Ở Việt Nam, lực lượng tech làm IoT đa phần là dân điện tử đi lên, thế nên tôi hay gặp những câu hỏi như "nên dùng ngôn ngữ nào để lập trình nhúng" từ những bạn sinh viên mới. Tôi cũng ngạc nhiên khi thấy các bạn kháo nhau dùng NodeJS, theo phong trào.

Nếu cần dùng các ngôn ngữ biên dịch như C++, Go thì không nói. Nhưng nếu dùng ngôn ngữ thông dịch thì Python nên được dùng hơn NodeJS/JavaScript. Một khía cạnh nên tính đến là độ lớn file cần lưu trữ. Các board máy tính nhúng chạy Linux thường dùng thẻ nhớ, hoặc bộ nhớ flash trong (còn có cách gọi khác là NAND Flash, SPI Flash, eMMC) để thay thế ổ cứng (HDD) nên có dung lượng khiêm tốn. Nếu cách lưu trữ không phù hợp, có khi thư viện đã ngốn hết không gian lưu trữ đáng lẽ phải dành cho chương trình và dữ liệu (data).

Thứ nhất, cách quản lý các gói thư viện phụ thuộc của NodeJS cực kỳ tốn dung lượng, với sự trùng lắp các file thư viện.

node_modules

...

Dựng mạng VPN với WireGuard

Tiếp nối bài trước, Câu chuyện sử dụng VPN, tôi xin mô tả cách dựng một mạng VPN cho mục đích cá nhân bằng phần mềm WireGuard.

Mục đích sử dụng mạng VPN của tôi chỉ là để truy cập từ xa vào các thiết bị IoT của tôi nên mô hình VPN của tôi chỉ phù hợp với nhu cầu đó. Nếu bạn cần dùng VPN cho mục đích khác, ví dụ để vượt tường lửa, truy cập vào website bị chặn, thì bạn không nên trông đợi gì vào bài viết này.

Trước khi bắt tay vào việc, ta cần mường tượng sơ đồ mạng sẽ như thế nào:

Sơ đồ

...

Câu chuyện sử dụng VPN

Tôi thỉnh thoảng có nhu cầu sử dụng mạng VPN. Trong khi nhiều bạn dùng VPN để vượt qua bức tường chặn các trang web mà chính phủ không mong muốn thì mục đích dùng VPN của tôi lại nhằm phục vụ cho IoT, tạo đường truy cập các máy tính nhúng (BeagleBone, Raspberry Pi) từ xa qua Internet, phục vụ cho công việc.

Các máy tính nhúng của tôi hay được đặt trong một mạng LAN mà router của nó tôi không được can thiệp, nên không thể cấu hình port forward để truy cập trực tiếp từ ngoài Internet được.

No-VPN

Bằng cách thiết lập VPN, tôi sẽ có một mạng LAN ảo giữa laptop của tôi đang ở một quán nước dọc đường và máy tính nhúng đang đặt ở một căn phòng nào đó.


A forgotten GUI tool for flashing SD card and USB drives

Working in IoT or with embedded computer, you won't less than 1 time need to write an OS image file to a SD card (so that you can install new OS to your device later).

For the tool to write image file, many websites often recommend Etcher, which is an Electron-based app. For Windows and Mac, that is fine. But for Linux, it sounds ridiculous to recommend such a tool. Not only does Linux already have GNOME Disks, which is most of time pre-installed, but also is it native, and hence, being lighter, running faster, having visual look consistent with other applications.

Here is the photo of GNOME Disks writing image file to my SD card. The SD card appears with USB drive icon because I'm using a 3G USB dongle as card reader, after my laptop's built-in SD reader has been broken.

GNOME-Disks writing SD card



Nhu cầu về điện toán đám mây của một đơn vị ứng dụng IoT

Là một công ty cung cấp giải pháp tự động hóa ứng dụng IoT cho các trang trại, AgriConnect tự mình nghiên cứu, phát triển phần cứng, phần mềm để làm ra giải pháp đó (theo dõi và duy trì điều kiện môi trường sao cho phù hợp với cây trồng). AgriConnect không mua sản phẩm rồi bán lại, vì nhu cầu mỗi khách hàng rất khác nhau. Bằng cách tự mình làm chủ công nghệ, AgriConnect có thể nhanh chóng, linh động tùy biến sản phẩm của mình để đáp ứng vừa vặn nhu cầu của khách hàng.

Tuy nhiên, AgriConnect cũng không ôm đồm làm hết mọi thứ. Giống như xây nhà thì vẫn phải mua gạch, mua xi măng, đinh ốc, AgriConnect vẫn cần những thứ mà các đơn vị khác đã làm và cung cấp lại (như server, cảm biến, vv..). Nhiều công ty công nghệ lớn như Google, Amazon, IBM, Samsung làm riêng một mảng sản phẩm / dịch vụ IoT để cung cấp cho những đối tượng tương tự như AgriConnect. Dẫu vậy, với lối đi khác biệt của mình, AgriConnect nảy sinh những nhu cầu mà các công ty vừa kể không thể đáp ứng được.

Một số nhu cầu đó là:

  1. Bare metal ARM server. Chúng tôi cần dùng nó để biên dịch một số phần mềm thành binary chạy trên ARM. Ví dụ như, chúng tôi customize hệ điều hành cho BeagleBone, bỏ bớt những thành phần không cần thiết, cài sẵn một số phần mềm, cài sẵn một số cấu hình, tạo ra file image cuối cùng để nhanh chóng cài lên nhiều board.

Flash BeagleBone firmware

Download image here: https://rcn-ee.com/rootfs/

Example file to download: https://rcn-ee.com/rootfs/2018-02-09/flasher/BBB-eMMC-flasher-debian-9.3-console-armhf-2018-02-09-2gb.img.xz. We should get Debian one, over Ubuntu.

If the file name starts with BBB-eMMC-flasher, this image will automatically run the flasher tool when the BeagleBone boots from Micro SD card, we don't need to press the button near to the Micro SD slot to activate the flasher tool.

We should use bmap-tool, instead of dd, because the later is very slow.


Nâng cấp Debian cho BeagleBone Black

BeagleBone Black khi bán ra thường được cài sẵn Debian 7 (Wheezy). Đây là phiên bản quá cũ (phát hành 2013) nên các phần mềm đi theo nó thường không đáp ứng đủ nhu cầu. Ví dụ tại AgriConnect, tôi viết phần mềm để chạy trên BeagleBone, dùng ngôn ngữ Python, cần những feature của Python 3.5 trở lên. Thế nhưng trong repository của Debian 7 chỉ có Python 3.2. Việc cài Python từ source code thì hơi bất tiện vì quá trình biên dịch khá nặng trong khi sức mạnh CPU của BeagleBone thì có hạn. Bởi vậy, tốt hơn thì nên nâng cấp Debian để sử dụng phần mềm, thư viện mới hơn từ repo của nó. Ví dụ, Debian 8 (Jessie) thì có Python 3.4, Debian 9 (Stretch) thì có Python 3.5.

Để nâng cấp Debian thì tôi thường lấy image từ https://rcn-ee.com/rootfs/. Để ghi image ra thẻ nhớ thì tôi không dùng dd, mà dùng bmaptool để cho tốc độc cao hơn và biết quá trình ghi tới đâu.

Khi nâng cấp Debian thì có một điều cần lưu ý là nên nâng cấp từng bước, từ 7 lên 8, 8 lên 9, chứ không nên nhảy cóc từ 7 lên 9. Lí do là bị vướng bootloader và tính năng bật tắt cape của BeagleBone.

Hiện nay, trên https://rcn-ee.com/rootfs/ không còn image Debian 8 nữa. Tôi đã kịp giữ lại một bản sao ở đây: http://quan.hoabinh.vn/Downloads/BeagleBone/Debian-2016-04/.


My packages store for BeagleBone running Debian 9

I'm building IoT gateway based on BeagleBone Black at the startup AgriConnect, with Python as the primary programming language.

When the application grows complex, the board shows to be weak. We cannot find stronger board than BeagleBone, so the only option is to try to make our app run lighter. We try to adopt latest Python version, now is 3.6, to take advantage of optimization work in them. The latest Debian image for BeagleBone is stretch (Debian 9), which doesn't include Python 3.6 in its repository.

There are some backport packages of Python 3.6 for Debian 9, but only for amd64 arch. Fortunately they provide a build script. I can use it to build for armhf arch, which is in BeagleBone boards.

How to build for armhf? The board is weak, we should not run the build process directly on BeagleBone. It can take some days!