Chuyển đến nội dung

Bắt đầu nhanh

Mục tiêu của trang: trong khoảng mười lăm phút, bạn nối được đầu đọc NRN và thấy mã EPC hiện lên console mỗi lần đưa thẻ vào vùng đọc. Cần một đầu đọc NRN, cáp nối máy tính và ít nhất một thẻ RFID; chưa có thiết bị thì đọc tích hợp vào phần mềm của bạn trước, phần code dựng được mà không cần đầu đọc thật. Mọi ví dụ dùng API công khai 1.0.0 của Nextwaves SDK.

Trước khi bắt đầu

  1. Cài driver CP210x trong thư mục driver/ của repository nếu đầu đọc dùng cầu USB-to-UART.
  2. Xác định serial port: /dev/ttyUSB0 trên Linux, /dev/tty.usbserial-* trên macOS, COM3 trên Windows.
  3. Trên Linux, thêm tài khoản vào group dialout, nếu không mở port sẽ báo lỗi quyền.
  4. Giữ nguyên thiết lập serial mặc định, 115200 baud, 8 data bit, 1 stop bit, không parity, không flow control: SDK đã dùng đúng các giá trị này, chỉ đổi khi tài liệu thiết bị của bạn yêu cầu khác.

Một phiên làm việc trông thế nào

Mọi ví dụ bên dưới, bất kể ngôn ngữ, đi qua đúng bốn bước:

Nhìn thấy khung này trước thì đọc code nào cũng nhận ra ngay từng đoạn đang làm gì.

Python

bash
pip install nrn-sdk
python
import logging
import time

from nrn import create_reader

reader = create_reader("/dev/ttyUSB0", baudrate=115200, log_level=logging.INFO)
reader.open()

try:
    reader.Connect_Reader_And_Initialize()
    print(reader.Query_Reader_Information())
    print(reader.query_rfid_ability())

    reader.configure_reader_power({1: 25}, persistence=False)

    def on_tag(tag):
        print(tag["epc"], tag["rssi"], tag["antenna_id"])

    reader.start_inventory_with_mode(antenna_mask=[1], callback=on_tag)
    time.sleep(5)
    reader.stop_inventory()
finally:
    reader.close()

start_inventory_with_mode nhận danh sách số ăng-ten đánh số từ 1 và tự chuyển thành antenna mask. Nó khởi động một background thread nhận dữ liệu từ đầu đọc và gọi on_tag cho mỗi lần đọc thẻ; stop_inventory dừng thread đó và ra lệnh dừng cho đầu đọc.

TypeScript và Web Serial

bash
npm install @nextwaves/nrn-sdk
ts
import { createNRNReader, NRNWebSerial, type TagData } from "@nextwaves/nrn-sdk";

if (!NRNWebSerial.isSupported()) {
  throw new Error("Trình duyệt này không hỗ trợ Web Serial API");
}

const reader = createNRNReader({ baudrate: 115200 });

// connect() mở hộp thoại chọn cổng của trình duyệt, phải chạy trong user gesture.
await reader.connect();

try {
  console.log(await reader.queryReaderInformation());

  await reader.startInventory([1], (tag: TagData) => {
    console.log(tag.epc, tag.rssi, tag.antenna_id);
  });

  // Receive loop tiếp tục gọi callback cho tới khi dừng.
} finally {
  await reader.stopInventory();
  await reader.disconnect();
}

Web Serial cần secure context, nghĩa là HTTPS hoặc localhost, một trình duyệt nhân Chromium, và một user gesture như cú bấm nút trước khi hộp thoại chọn cổng mở ra. startInventory tự gọi stopInventory trước, nên khởi động lại kiểm kê là an toàn.

Go

bash
go get github.com/Nextwaves-Industries/nextwaves-sdk/sdk/nation/go@v1.0.0
go
package main

import (
	"fmt"

	nrn "github.com/Nextwaves-Industries/nextwaves-sdk/sdk/nation/go"
)

func main() {
	reader, err := nrn.NewNRNReader("/dev/ttyUSB0", 115200)
	if err != nil {
		panic(err)
	}
	defer reader.Close()

	if err := reader.ConnectAndInitialize(); err != nil {
		panic(err)
	}

	info, err := reader.QueryReaderInformation()
	if err != nil {
		panic(err)
	}
	fmt.Println(info.SerialNumber, info.AppVersion)

	if err := reader.StartInventory(nrn.BuildAntennaMask([]int{1}), func(tag nrn.TagData) {
		fmt.Println(tag.EPC, tag.AntennaID)
	}); err != nil {
		panic(err)
	}

	_ = reader.StopInventory()
}

Để chạy kiểm kê liên tục trong một service dài hơi, dùng receive loop hoàn chỉnh cho Go ở phụ lục receive loop, copy vào dự án là chạy được.

Rust

toml
[dependencies]
nrn-sdk = "1.0.0"
rust
use nrn_sdk::NRNReader;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut reader = NRNReader::new("/dev/ttyUSB0", 115200)?;
    reader.connect_and_initialize()?;

    let info = reader.query_reader_information()?;
    println!("{} {}", info.serial_number, info.app_version);

    reader.start_inventory(0x0000_0001, |tag| println!("{}", tag.epc))?;
    reader.stop_inventory()?;
    Ok(())
}

Mẫu receive loop hoàn chỉnh cho Rust cũng nằm ở phụ lục receive loop.

C++

cmake
include(FetchContent)

FetchContent_Declare(
  nrn_sdk
  GIT_REPOSITORY https://github.com/Nextwaves-Industries/nextwaves-sdk.git
  GIT_TAG v1.0.0
  SOURCE_SUBDIR sdk/nation/cpp
)

FetchContent_MakeAvailable(nrn_sdk)

target_link_libraries(your_target PRIVATE nrn-sdk)
cpp
#include "nrn.hpp"

int main() {
    nrn::NRNReader reader("/dev/ttyUSB0", 115200);
    if (!reader.open()) {
        return 1;
    }

    reader.connect_and_initialize();
    auto info = reader.query_reader_information();

    reader.start_inventory(0x00000001, [] (const nrn::TagData& tag) {
        std::cout << tag.epc << std::endl;
    });

    std::this_thread::sleep_for(std::chrono::seconds(5));
    reader.stop_inventory();
    reader.close();
    return 0;
}

Yêu cầu C++17 và CMake 3.14 trở lên. Mẫu receive loop hoàn chỉnh cho C++ nằm ở phụ lục receive loop.

Khi lên thật thì theo trình tự này

Đoạn quickstart ở trên cố tình bỏ qua nhiều bước để bạn thấy thẻ nhanh nhất. Một tích hợp production đi đủ tám bước:

  1. Ghi lại model và phiên bản firmware của đầu đọc, giữ tài liệu firmware cùng dự án.
  2. Mở serial port và khởi tạo kết nối.
  3. Truy vấn danh tính và năng lực đầu đọc, ghi log cả hai ở mỗi phiên làm việc.
  4. Cấu hình antenna mask, công suất từng cổng, RF band và kênh được phép tại nơi lắp đặt.
  5. Đặt cửa sổ filter chống trùng theo nghiệp vụ, không theo tốc độ đọc tối đa.
  6. Bắt đầu kiểm kê và tự loại EPC trùng theo cửa sổ nghiệp vụ của bạn.
  7. Chuyển các lần đọc thô thành sự kiện nghiệp vụ phát lại được an toàn.
  8. Dừng kiểm kê, để SDK xử lý nốt dữ liệu còn chờ, rồi đóng serial port.

Đọc tiếp

Tài liệu vận hành Easy Inventory và tích hợp RFID