Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 9

Protocol Buffers - giao thức truyền nhận data

1. Giới thiệu

Protocol Buffer là một platform được phát triển bởi google được sử dụng để serialize
data thành dạng byte stream, giúp cho việc truyền nhận dữ liệu trở nên đơn giản, linh
hoạt, nhanh hơn và giải quyết được vấn đề khi 2 object thực hiện truyền - nhận dữ liệu
được viết bằng ngôn ngữ khác nhau

Do đặc điểm là “nhẹ” và nhanh của dữ liệu được serialize bởi protobuf, vì vậy protobuf
sẽ đặc biệt thích hợp trong các ứng dụng data real-time hoặc trao đổi dữ liệu trực tiếp

Tham khảo thêm: https://developers.google.com/protocol-buffers/docs/overview

2. Cách hoạt động


Protobuf định nghĩa object dưới dạng struct (message) với định dạng .proto. File này
sau đó sẽ được dùng để compile sang các ngôn ngữ tương ứng. Do đó, object này có
thể được sử dụng bởi các ngôn ngữ khác nhau.
VD: để nhận dữ liệu từ các
cảm biến chỉ cần tạo file
sensor.proto với cấu trúc rất
đơn giản như hình bên

trong đó:

- message: theo cấu trúc


struct, khi build thành file .py,
mỗi message sẽ tương ứng
với 1 class có các variable
được đánh số thứ tự

- optional: không yêu cầu bắt


buộc phải có data

- có thể thay thế optional


bằng repeated (khi muốn sử
dụng mảng 32 bit), hoặc
bằng required (khi muốn bắt buộc việc sử dụng field sensor phải chứa data)

- kiểu dữ liệu float trong .proto cũng có sự tương ứng với các ngôn ngữ khác (xem hình
dưới)
3. Tại sao lại chọn protobuf

- Việc lập trình trên STM32 sử dụng ngôn ngữ C, trong khi với Raspberry Pi dùng python
sẽ thuận tiện hơn

=> cần chọn giao thức có hỗ trợ chuyển đổi dễ dàng giữa các ngôn ngữ

- Để giao tiếp các thiết bị với nhau qua Uart, I2c … cần đồng bộ cấu trúc dữ liệu.

=> để đảm bảo thiết bị giao tiếp nhận được data của nhau, chúng ta phải nghĩ ra phương
pháp thêm byte gọi là header và có thể cần byte end để xác định đâu là data.

- Đối với ứng dụng sử dụng dữ liệu khác nhau khai báo kiểu int, char, chuỗi,.. việc nhận
sẽ vất vả hơn rất nhiều và dễ gặp lỗi, bởi trong quá trình truyền nhận thiếu byte hoặc sai
byte do nhiễu môi trường.
=> do đó phải thêm các byte “check” để kiểm tra xem chuỗi nhận được có lỗi hay không.

- Khi thêm bớt, thay đổi dữ liệu (VD: thêm sensor, actuator) khiến khung truyền gửi nhận
bị thay đổi khi đó chúng ta cần sửa code để đồng bộ giao tiếp.

=> Đối với sự thay đổi nhỏ thôi cũng khiến cả việc sửa code mất thêm nhiều thời gian.

Chọn protobuf sẽ giải quyết được các vấn đề đó do có các ưu điểm:

● Kiểm tra báo lỗi nếu khung dữ liệu nhận sai.

● Buffer giao tiếp gọn nhẹ (nhỏ nhất bằng độ dài của data).

● Buffer đồng bộ vì vậy có thể giao tiếp các thiết bị cho nhau.

● Linh hoạt khi thêm hay bớt data (chỉ cần sửa file .proto)

4. Cách build file thư viện từ .proto file

Đối với ngôn ngữ C protobuf không được google phát triển nhưng ta có thể dùng Nanopb
thay thế, cách dùng giống ngôn ngữ C++ protobuf. Nanopb là thư viện ANSI-C dùng cho
việc đóng gói và giải mã như protobuf nhưng thích hợp với thiết bị có bộ nhớ hạn chế
như vi điều khiển 32 bit.

Tham khảo thêm về nanopb: https://jpa.kapsi.fi/nanopb/docs/index.html

Download tại: https://github.com/nanopb/nanopb

Dưới đây sẽ trình bày cách build file trên Ubuntu

Sau khi tải về và giải nén, ta cần tạo file cơ sở .proto, ở đây sẽ dùng luôn sensor.proto
trong ví dụ phía trên

Cách làm với cmd_actuator.proto cũng tương tự, chỉ việc thay tên

4.1. cách tạo file sensor_pb2.py trong protobuf cho pi

Để tạo file.py ta dùng generator_proto để tạo từ file cơ sở sensor.proto

- B1: copy file sensor.proto vào folder ../nanopb/generator/proto vừa tải


- B2: tại đây, mở Makefile và thêm sensor_pb2.py ở dòng all rồi save

(sensor_pb2.py là file mới được tạo ra ở dạng python)

- B3: mở terminal, truy cập vào đường dẫn ../nanopb/generator/proto và gõ make,

file sensor_pb2.py được tạo thành nằm ngay trong thư mục chứa file sensor.proto
4.2. cách tạo file sensor.pb.c và sensor.pb.h cho STM32

Cần tạo file sensor.pb từ file cơ sở sensor.proto trước, sau đó dùng generator để tạo
file.pb.c và file.pb.h

- B1: copy file sensor.proto vào folder ../nanopb/generator vừa tải


- B2: mở terminal, gõ protoc -osensor.pb sensor.proto để tạo file sensor.pb

- B3: tiếp tục trong terminal, gõ python3 nanopb_generator.py sensor.pb


Như vậy là ta đã thực hiện build xong các file cần thiết cho Pi và STM32

Chi tiết các file xem ở mục:

STM32: ../SmartAgriBox/Arduino/SmartAgriBox_Sensor/src

Pi: ../workspace/KDTeamlot/device

5. cách sử dụng

You might also like