Xác nhận

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

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

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

  • 0xFF: Sự kiện ACK
  • 0x01: Mã ACK
  • 0x0004: Độ dài dữ liệu bổ sung
  • 0x0401: Nhóm thông báo hành động và mã
  • 0x013C: Trạng thái hiện tại của nhóm thông báo hành động và mã, đổ chuông bên phải và 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: Thao tác thừa trên thiết bị

Trong ví dụ trước, nếu chiếc nhẫn ban đầu là NAK do Trình cung cấp đang bận với một tác vụ khác, gói trả về phải được đặt thành 0xFF02000401040100 trong đó

  • 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 thông báo hành động và mã
  • 0x00: Trạng thái hiện tại của nhóm thông báo hành động và mã, tất 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);
}