Podziękowania
Niektóre kody wiadomości wymagają potwierdzenia przez odbiorcę. W takim przypadku odbiorca w ciągu 1 sekundy od otrzymania wiadomości powinien wysłać potwierdzenie (ACK) lub potwierdzenie negatywnego (NAK).
Nazwa grupy wiadomości | Wartość |
---|---|
Potwierdzenie | 0xFF |
Nazwa kodu potwierdzenia | Wartość |
---|---|
POTWIERDŹ | 0x01 |
NAK | 0x02 |
Potwierdzenia należy wysyłać bezpośrednio po otrzymaniu wiadomości, aby nadawca mógł podjąć odpowiednie działania. Potwierdzenie powinno zawierać grupę wiadomości, kod i bieżący stan wiadomości, do której się odnosi. Jeśli na przykład Dostawca otrzyma wiadomość zawierającą działanie kontaktowe (0x04010002013C
), powinien potwierdzić akcję, wysyłając odpowiedź 0xFF0100040401013C
, gdy:
- 0xFF: akcja ACK
- 0x01: Kod ACK
- 0x0004: dodatkowa długość danych
- 0x0401: kod i grupa wiadomości dotyczących działania
- 0x013C: bieżący stan grupy wiadomości z zachowaniem kodu, dzwonek w prawo i 60 sekund bezczynności
W przypadku NAK należy podać również powód jako pierwszy bajt dodatkowych danych. Możliwe przyczyny:
- 0x00: nieobsługiwane
- 0x01: Urządzenie jest zajęte
- 0x02: Niedozwolone ze względu na bieżący stan
- 0x03: Niedozwolone z powodu nieprawidłowego kodu uwierzytelniania wiadomości
- 0x04: Zbędne działanie urządzenia
W poprzednim przykładzie, jeśli pierścień miał być ustawiony jako NAK, ponieważ dostawca był zajęty innym zadaniem, zwrócony pakiet powinien być ustawiony na 0xFF02000401040100
, gdzie
- 0xFF: akcja ACK
- 0x02: kod NAK
- 0x0004: dodatkowa długość danych
- 0x01: Przyczyna NAK, urządzenie zajęte
- 0x0401: kod i grupa wiadomości dotyczących działania
- 0x00: bieżący stan grupy wiadomości i kodu,
Przykład
#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);
}