Arduino nâng cao, Chưa được phân loại, ESP8266, IOT

Arduino với JSON v6 (phần 1)

Xin chào các bạn, có khi nào các bạn gặp bế tắc trong việc truyền tải cũng như lưu trữ dữ liệu (đối tượng, các biến phức tạp…), các thông tin về việc config hệ thống chưa ạ. Nếu có thì đây sẽ là chuỗi bài viết dành cho bạn. JSON sẽ giải quyết tất cả những gì bạn đang gặp phải.
Chúng ta có thể đọc được nội dung của JSON bởi vì nó thể hiện dưới dạng text, nó có thể lưu được tất cả mọi thứ, hầu hết các ngôn ngữ lập trình đều hổ trợ nó.
Nhược điểm của nó so với cách lưu trữ thông thường (copy toàn bộ vùng nhớ của đối tượng theo từng byte vào bộ nhớ) là tốn bộ nhớ hơn vì nó chỉ sử dụng những ký tự “có thể hiển thị được” trong bảng ascii và nó có thêm các ký tự để phân tách các giá trị. Ngoài ra, JSON sẽ tốn tài nguyên hơn để xử lý các dữ liệu này. Nói về ưu điểm thì nó rất bá đạo, dữ liệu lưu trữ rất linh động, đa đạng. Các thao tác thêm, sửa, xóa từng phần tử cũng đơn giản.

 

 

Trong arduino thì JSON hiện nay đã có phiên bản v6 rồi nha các bạn, nó khác với những phiên bản trước, nếu muốn code vẫn chạy được với v6 thì các bạn phải map lại nhé.

Trong phần này, mình sẽ nói về JsonDocument (sau này mình ghi là JD cho gọn nhé), nó là kho chứa dữ liệu cho JSON. Có 2 kiểu JsonDocument là StaticJsonDocumentDynamicJsonDocumen ưu điểm của từng loại là static thì tốc độ thực thi nhanh nhưng bộ nhớ sẽ không tự mở rộng được (cố định khi khởi tạo) con Dynamic thì ngược lại. Theo mình thì chúng ta nên dùng Static để tránh các hậu quả về việc tràn bộ nhớ và trong bài này mình cũng chỉ dùng Static thôi nhé.

Các bạn phải cài thư viện ArduinoJson vào nhé, thao tác cài đặt mình sẽ không nói ở bài này đâu

Đây là cách tạo một JD, số 256 là kích thước chúng ta cấp cho nó.
Sau đây là những thao tác trên JD:

1: doc.memoryUsage(); Lệnh này sẽ trả về số byte đã được sử dụng trong JD. Chúng ta có thể dùng nó để ước lượng được bộ nhớ mà ta sẽ cấp lúc khởi tạo JD. Bạn cũng có thể ước lượng tại https://arduinojson.org/v6/assistant/

Tham số:

không.

Trả về:

số byte đã sử dụng.

Ví dụ:

Nó sẽ in ra số 16 trên monitor, nghĩa là doc đang dùng 16 byte, vẫn còn trống 184 byte.

2: doc.add(var); Lệnh này sẽ:

Thêm giá trị của var vào JD nếu JD hiện đang là mảng hoặc chưa có giá trị.

Không làm gì cả nếu JD không phải mảng.

Lứu ý: thông thường thì lệnh này sẽ copy nội dung vào doc, ngoại trừ const char* (vì hằng số thì sẽ không bị thay đổi khi chạy, vậy nên nó dùng địa chỉ của biến để trỏ tới dữ liệu để tiết kiệm dung lượng).

Tham số:

var: các kiểu số (int, char, float…), kiểu logic, các loại chuỗi, JsonArray, JsonObject, JsonVariant.

Trả về:

bool: True nếu thành công, False nếu thất bại (do không đủ bộ nhớ).

Ví dụ:

Kết quả:

Khi truyền vào một chuỗi thông thường (không phải chuỗi hằng) thì nó sẽ copy nội dung vào doc, chính thao tác này đã làm tốn bộ nhớ nên nhưng khi thêm s2 thì không còn đủ bộ nhớ nên nó trả về false.

Bầy giờ mình thử truyền vào chuỗi hằng nè:

Kết quả:

Với cùng một nội dung, nhưng bây giờ thì đã thành công rồi đấy. Các bạn thấy sự lợi hại chưa.

3: doc.as<T>(); Lệnh này sẽ ép kiểu doc thành T (T có thể là JsonArray, JsonObject, JsonVariant). Nếu kiểu mà doc đang lưu không phải là T thì nó sẽ trả về null.

Tham số:

không.

Trả về:

Kiểu T mà ta truyền vào (T có thể là JsonArray, JsonObject, JsonVariant).

Ví dụ:

Lúc này giá trị mà value trỏ tới là chuỗi “value”.

4: doc.to<T>(); Lệnh này sẽ ép kiểu doc thành T (T có thể là JsonArray, JsonObject, JsonVariant), nó sẽ xóa dữ liệu trong doc.

Tham số:

không.

Trả về:

Kiểu T mà ta truyền vào (T có thể là JsonArray, JsonObject, JsonVariant).

Ví dụ:

Lúc này giá trị mà value trỏ tới là chuỗi “” (chuỗi rỗng) bởi vì lệnh này đã xóa nội dung mà ta đã tạo rồi.

5: doc.clear(); Lệnh này sẽ giải phóng bộ nhớ của doc.

Tham số:

không.

Trả về:

không.

Ví dụ:

Lúc này giá trị mà value trỏ tới là chuỗi “” (chuỗi rỗng) bởi vì lệnh này đã giải phóng bộ nhớ.

6: doc.createNestedArray(key); Lệnh này sẽ tạo một mảng với từ khóa là key . Key có thể là c_str hoặc string.

Tham số:

key: các loại chuỗi.

Trả về:

JsonArray nếu thành công, null nếu thất bại (hết bộ nhớ).

Ví dụ:

Kết quả trên monitor:

Chúng ta chỉ thay đổi JsonArray ports, nhưng khi in ra doc thì lại có. Như vậy JsonArray ports vẫn thuộc doc.

7: doc.createNestedObject(key); Lệnh này sẽ tạo một object với từ khóa là key . Key có thể là c_str hoặc string.

Tham số:

key: các loại chuỗi.

Trả về:

JsonArray nếu thành công, null nếu thất bại (hết bộ nhớ).

Ví dụ: Các bạn có thể tham khảo ở mục trên nhé.

8: doc.getElement(int index); Lệnh này sẽ trả về giá trị của phần tử index, nếu index không hợp lệ, nó sẽ trả về null.

Tham số:

key: các loại chuỗi.

Trả về:

JsonVariant nếu thành công, null nếu thất bại (không tìm thấy).

Ví dụ:

Kết quả trên monitor:

 

9: doc.getMember(key); Lệnh này sẽ trả về giá trị của phần tử có từ khóa là key, nếu
key không hợp lệ, nó sẽ trả về null.

Tham số:

key: các loại chuỗi.

Trả về:

JsonVariant nếu thành công, null nếu thất bại (không tìm thấy).

Ví dụ: Các bạn có thể tham khảo ở mục trên nhé.

10: doc[key]; Lệnh này sẽ truy xuất đến phần tử có từ khóa là key để chúng ta có thể thêm, sửa, xóa.

Tham số:

key: các loại chuỗi hoặc số.

Trả về:

MemberProxy (là một kiểu tương tự như JsonVariant) nếu key là chuỗi, ElementProxy (cũng tương tự như JsonVariant) nếu key là số.

Ví dụ:

Kết quả trên monitor:

 

11: doc.isNull(); Lệnh này sẽ trả về true nến doc đang rỗng, false nếu có chứa gì đó.

 

Mình có tham khảo nội dung tại trang chủ: https://arduinojson.org

còn tiếp…

Được gắn thẻ , , , ,

Trả lời

Email của bạn sẽ không được hiển thị công khai.