Procedura wysyłania pakietu przez Websocket w C++ z wykorzystaniem biblioteki lws.

  1. Musimy wygenerować sztuczne wywołanie zdarzenia LWS WRITEABLE (głównego przerwania LWS). To zdarzenie skonstruowano specjalnie w tym celu
  2. Zapamiętujemy uchwyt WSI z poprzednich wywołań przerwania np. w zmiennej globalnej (deklarowanej przed callback_minimal() )
    1
    struct lws *globalWsi = NULL; //web socket instance

    ,
    a następnie wewnątrz callback tuż przed switch():

    1
    globalWsi = wsi;
  3. 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.
  4. 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
    21
    case 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.
  5. 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