Chuyển đổi mã RFID

Công cụ chuyển đổi giữa SGTIN-96 (RFID Hex) và Mã vạch (GTIN) + Số Serial. Tương thích với các loại đầu đọc RFID chuẩn như Zebra, Chainway, Impinj, Nextwaves. Dựa trên Tiêu chuẩn Dữ liệu thẻ GS1 EPC.

Bộ chuyển đổi RFID

Logic mã & Từng bước

// 1. Binary Conversion

src = bin(0x) // = "?"

// 2. Extract Fields (Bit Slice)

header = src[0:8] → "00110000""?" (?)
filter = src[8:11] → "..."?
partition = src[11:14] → "..."?

// 3. Determine Partition Rule (Partition ?)

rule = PARTITIONS[?]
// Company Bits: ?, Item Bits: ?

// 4. Extract Company & Item

company = src[14:14] → "..."?
itemRef = src[14:14] → "..."?
serial = src[14:96] → "..."?

Code cho lập trình viên

Đoạn code mẫu (Snippet) để tích hợp chuyển đổi SGTIN-96 vào ứng dụng

1// TypeScript / JavaScript SGTIN-96 Utils
2
3export const GS1_PARTITION_TABLE = [
4  { value: 0, partition: 0, companyPrefixBits: 40, itemReferenceBits: 4, companyDigits: 12, itemDigits: 1 },
5  { value: 1, partition: 1, companyPrefixBits: 37, itemReferenceBits: 7, companyDigits: 11, itemDigits: 2 },
6  { value: 2, partition: 2, companyPrefixBits: 34, itemReferenceBits: 10, companyDigits: 10, itemDigits: 3 },
7  { value: 3, partition: 3, companyPrefixBits: 30, itemReferenceBits: 14, companyDigits: 9, itemDigits: 4 },
8  { value: 4, partition: 4, companyPrefixBits: 27, itemReferenceBits: 17, companyDigits: 8, itemDigits: 5 },
9  { value: 5, partition: 5, companyPrefixBits: 24, itemReferenceBits: 20, companyDigits: 7, itemDigits: 6 },
10  { value: 6, partition: 6, companyPrefixBits: 20, itemReferenceBits: 24, companyDigits: 6, itemDigits: 7 },
11];
12
13export function encodeSgtin96(gtin: string, serial: string, filter: number) {
14  gtin = gtin.padStart(14, "0");
15  const p = GS1_PARTITION_TABLE.find(rule => {
16    const cp = parseInt(gtin.slice(1, 1 + rule.companyDigits));
17    const ir = parseInt(gtin[0] + gtin.slice(1 + rule.companyDigits, 13));
18    return cp < (1 << rule.companyPrefixBits) && ir < (1 << rule.itemReferenceBits);
19  });
20  if (!p) throw new Error("Invalid GTIN for SGTIN-96");
21
22  const cpVal = parseInt(gtin.slice(1, 1 + p.companyDigits));
23  const irVal = parseInt(gtin[0] + gtin.slice(1 + p.companyDigits, 13));
24  
25  let b = (0x30).toString(2).padStart(8,"0");
26  b += filter.toString(2).padStart(3,"0");
27  b += p.partition.toString(2).padStart(3,"0");
28  b += cpVal.toString(2).padStart(p.companyPrefixBits,"0");
29  b += irVal.toString(2).padStart(p.itemReferenceBits,"0");
30  b += parseInt(serial).toString(2).padStart(38,"0");
31  return binaryToHex(b);
32}
33
34export function decodeSgtin96(hex: string) {
35  const b = hexToBinary(hex);
36  const pVal = parseInt(b.substring(11, 14), 2);
37  const rule = GS1_PARTITION_TABLE.find(r => r.partition === pVal);
38  if (!rule) throw new Error("Invalid Partition");
39
40  const cp = parseInt(b.substring(14, 14 + rule.companyPrefixBits), 2);
41  const ir = parseInt(b.substring(14 + rule.companyPrefixBits, 14 + rule.companyPrefixBits + rule.itemReferenceBits), 2);
42  const serial = parseInt(b.substring(14 + rule.companyPrefixBits + rule.itemReferenceBits, 96), 2);
43
44  const cpStr = cp.toString().padStart(rule.companyDigits, "0");
45  const irStr = ir.toString().padStart(rule.itemDigits, "0");
46  const gtinCore = irStr[0] + cpStr + irStr.substring(1);
47
48  // Check digit calculation
49  let sum = 0;
50  for (let i = 0; i < 13; i++) {
51    sum += parseInt(gtinCore[i]) * (i % 2 === 0 ? 3 : 1);
52  }
53  const check = (10 - (sum % 10)) % 10;
54  
55  return {
56    gtin: gtinCore + check,
57    serial: serial.toString()
58  };
59}
60
61function binaryToHex(b: string) {
62  let hex = "";
63  for (let i = 0; i < b.length; i += 4) {
64    hex += parseInt(b.substring(i, i + 4), 2).toString(16).toUpperCase();
65  }
66  return hex;
67}
68
69function hexToBinary(h: string) {
70  let bin = "";
71  for (let i = 0; i < h.length; i++) {
72    bin += parseInt(h[i], 16).toString(2).padStart(4, "0");
73  }
74  return bin;
75}

Nguyên lý hoạt động

Hiểu về SGTIN & GTIN

Trực quan hóa mối quan hệ giữa mã vạch vật lý của bạn và mã sản phẩm điện tử (EPC).

Sơ đồ hiển thị kết nối giữa Mã vạch (GTIN) và SGTIN-96 URI

SGTIN-96 là chuỗi nhị phân 96-bit được chia thành 6 phần:

HDR
FLT
PRT
COMPANY
ITEM
SERIAL (38)

Phân tích chi tiết (Từng bit)

Header (8 bit)Bits 0-8 (8)
00110000

Tiền tố chuẩn (00110000) định danh đây là mã SGTIN-96.

Filter (3 bit)Bits 8-11 (3)
...

Loại đối tượng (ví dụ: 1 = Hàng bán lẻ). Xem bảng tham khảo bên dưới.

Partition (3 bit)Bits 11-14 (3)
...

Partition X nghĩa là: Mã Công Ty chiếm Y bit, Mã Sản Phẩm chiếm Z bit.

Company PrefixBits 14-0 (0)
...

Mã doanh nghiệp duy nhất do GS1 cấp.

Item ReferenceBits 0-0 (0)
...

Mã sản phẩm cụ thể của bạn.

Số Serial (38 bit)Bits 0-96 (38)
...

Số định danh duy nhất cho từng sản phẩm vật lý cụ thể.

Logic Mã Hóa (Từng bước)

  1. Bước 1: Xác định giá trị header nhị phân. Giá trị header cho SGTIN-96 là “00110000.”
  2. Bước 2: Chọn Giá trị Partition dựa trên số chữ số trong Tiền tố Công ty.
  3. Bước 3: Chuyển đổi Filter, Partition, Tiền tố Công ty, Tham chiếu Mặt hàng và Số Serial sang nhị phân.
  4. Bước 4: Nối các giá trị Header, Filter, Partition, Tiền tố Công ty, Tham chiếu Mặt hàng và Số Serial để tạo thành EPC Nhị phân.

Hướng dẫn Tham khảo SGTIN-96

FGiá trị Filter (3 bit)

Giá trịMô tả
0
Tất cả các loại khác (All Others)
Dùng cho các mục không thuộc danh mục khác. Hiếm khi sử dụng trong bán lẻ thông thường.
1
Mặt hàng bán lẻ (POS Trade Item)
Đơn vị tiêu dùng tiêu chuẩn bán tại điểm bán hàng (POS). Ví dụ: Một chai dầu gội.
2
Thùng hàng vận chuyển (Full Case)
Đơn vị vận chuyển tiêu chuẩn chứa nhiều mặt hàng. Ví dụ: Thùng carton chứa 12 chai dầu gội. Quan trọng cho logistics để phân biệt 'một thùng' và 'một cái'.
3
Dự phòng (Reserved)
Dành riêng cho sử dụng trong tương lai.
4
Nhóm mặt hàng bên trong (Inner Pack)
Nhóm nhỏ hơn thùng đầy đủ, thường để trưng bày hoặc xử lý. Ví dụ: Lốc 3 chai được bọc màng co bên trong thùng chính.
5
Dự phòng (Reserved)
Dành riêng cho sử dụng trong tương lai.
6
Đơn vị tải (Unit Load)
Đơn vị logistics lớn, thường là một pallet chứa nhiều thùng hàng.
7
Thành phần bên trong (Component)
Một bộ phận cụ thể bên trong đơn vị tiêu dùng. Ví dụ: Nắp pin bên trong đồ chơi.

PBảng Partition (3 bit)

Giá trị
Mã Công Ty
(Bit / Số)
Mã Sản Phẩm
(Bit / Số)
040 / 124 / 1
137 / 117 / 2
234 / 1010 / 3
330 / 914 / 4
427 / 817 / 5
524 / 720 / 6
620 / 624 / 7

Câu hỏi thường gặp về SGTIN-96