Xác nhận

Một số mã thông báo yêu cầu người nhận xác nhận. Trong trường hợp này, thiết bị nhận phải gửi thông tin xác nhận (ACK) hoặc xác nhận tiêu cực (NAK) trong vòng 1 giây kể từ khi nhận được thông báo.

Tên nhóm thông báo Giá trị
Xác nhận 0xFF
Tên mã xác nhận Giá trị
ACK 0x01
NAK 0x02

Bạn cần gửi xác nhận trực tiếp sau khi nhận được thư để người gửi có thể hành động phù hợp. Lời xác nhận phải chứa nhóm thông báo, mã và trạng thái hiện tại của thông báo mà đối tượng đang tham chiếu. Ví dụ: nếu Nhà cung cấp nhận được một thông báo chứa hành động đổ chuông (0x04010002013C), thì nhà cung cấp phải xác nhận hành động bằng cách gửi lại 0xFF0100040401013C khi:

  • 0xFF: Sự kiện ACK
  • 0x01: Mã ACK
  • 0x0004: Độ dài dữ liệu bổ sung
  • 0x0401: Nhóm và mã thông báo hành động
  • 0x013C: Trạng thái hiện tại của nhóm và mã thông báo hành động, đổ chuông bên phải và hết thời gian chờ 60 giây

Đối với NAK, lý do cũng phải được đưa vào dưới dạng byte đầu tiên của dữ liệu bổ sung. Các lý do bao gồm:

  • 0x00: Không được hỗ trợ
  • 0x01: Thiết bị bận
  • 0x02: Không được phép do trạng thái hiện tại
  • 0x03: Không được phép do mã xác thực thư không chính xác
  • 0x04: Hành động thừa trên thiết bị

Trong ví dụ trước, nếu vòng tròn được đặt là NAK (DoAK) do Nhà cung cấp đang bận thực hiện một nhiệm vụ khác, thì bạn nên đặt gói được trả về thành 0xFF02000401040100

  • 0xFF: Sự kiện ACK
  • 0x02: Mã NAK
  • 0x0004: Độ dài dữ liệu bổ sung
  • 0x01: Lý do NAK, Thiết bị bận
  • 0x0401: Nhóm và mã thông báo hành động
  • 0x00: Trạng thái hiện tại của nhóm thông báo và mã hành động, tất cả các thành phần ngừng đổ chuông

Ví dụ:

#define FP_MSG_ACK                                  0x01
#define FP_MSG_NAK                                  0x02
#define FP_MSG_GROUP_ACK                            0xFF


static void fp_msg_send_ack(uint8_t msgGroup, uint8_t msgCode)
{
    FP_MESSAGE_STREAM  req = {FP_MSG_GROUP_ACK, FP_MSG_ACK, 0, 2};

    req.data[0] = msgGroup;
    req.data[1] = msgCode;

   fp_send((uint8_t *)&req);
}

static void fp_msg_send_nak(uint8_t reason, uint8_t msgGroup, uint8_t msgCode)
{
//reason= 0x00: Not supported, 0x01: Device busy, or 0x02: Not allowed due to current state
    FP_MESSAGE_STREAM  req = {FP_MSG_GROUP_ACK, FP_MSG_NAK, 0, 3};

    req.data[0] = reason;
    req.data[1] = msgGroup;
    req.data[2] = msgCode;

   fp_send((uint8_t *)&req);
}