Procedura wysyłania pakietu przez Websocket w C++ z wykorzystaniem biblioteki lws.
- Musimy wygenerować sztuczne wywołanie zdarzenia LWS WRITEABLE (głównego przerwania LWS). To zdarzenie skonstruowano specjalnie w tym celu
- Zapamiętujemy uchwyt WSI z poprzednich wywołań przerwania np. w zmiennej globalnej (deklarowanej przed callback_minimal() )
1struct lws *globalWsi = NULL; //web socket instance
,
a następnie wewnątrz callback tuż przed switch():1globalWsi = wsi; - Przekazujemy dane do wysłania (np. przez inną zmienną globalną), w przykładzie to: bool writeableRfid (czy jest coś do wysłania?) oraz string writeableRfidData (dane do wysłania) – obie zmienne globalne ustawia inny wątek.
- w callback_minimal -> switch() -> case LWS_CALLBACK_SERVER_WRITEABLE: dodajemy obsługę naszych nowych zmiennych do wysłania np.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21case LWS_CALLBACK_SERVER_WRITEABLE: // = 11
if (writeableRfid) //FX: jest Rfid do wysłania do Cordovy, globalna zmienna
{
odp = "RFID " + writeableRfidData; //skopiowanie klucza RFID z wątku odczytującego RFID z Pythona
vhd->amsg.len = odp.length(); //len; //tu tworzymy odpowiedź??
/* notice we over-allocate by LWS_PRE */
vhd->amsg.payload = malloc(LWS_PRE + odp.length() );//len); //tu rezerwujemy pamięć odpowiedzi?
if (!vhd->amsg.payload) {
lwsl_user("OOM: dropping\n");
break;
}
memcpy((char *)vhd->amsg.payload + LWS_PRE, (const char *)odp.c_str(), odp.length());
//^FX zamiana na c_str ze string
vhd->current++;
//oczekiwanie na kolejnego Rfid:
writeableRfid = false;
}
if (!vhd->amsg.payload)
break;
////// Tu dalsza część po staremu z tego CASE. -
w innym wątku wywołujemy WRITEABLE dla LWS:
1
2
3
4//tu gromadzimy w bufferRFID dane do wysłania
writeableRfidData = bufferRFID; //zmienna globalna do wysłania przez WebSocket
writeableRfid = true; // zmienna globalna -> jest RFID do wysłania do Cordovy!
lws_callback_on_writable(globalWsi); //żądanie uruchomienia żądania WRITEABLE na serwerze