SecuredTwoWay-Esp8266-Client.ino 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. Secured Esp8266 Websockets Client
  3. This sketch:
  4. 1. Connects to a WiFi network
  5. 2. Connects to a Websockets server (using WSS)
  6. 3. Sends the websockets server a message ("Hello Server")
  7. 4. Sends the websocket server a "ping"
  8. 5. Prints all incoming messages while the connection is open
  9. NOTE:
  10. The sketch dosen't check or indicate about errors while connecting to
  11. WiFi or to the websockets server. For full example you might want
  12. to try the example named "Esp8266-Client" (And use the ssl methods).
  13. Hardware:
  14. For this sketch you only need an ESP8266 board.
  15. Created 15/02/2019
  16. By Gil Maimon
  17. https://github.com/gilmaimon/ArduinoWebsockets
  18. */
  19. #include <ArduinoWebsockets.h>
  20. #include <ESP8266WiFi.h>
  21. const char* ssid = "ssid"; //Enter SSID
  22. const char* password = "password"; //Enter Password
  23. const char* websockets_connection_string = "wss://echo.websocket.org/"; //Enter server adress
  24. /* NTP Time Servers */
  25. const char *ntp1 = "time.windows.com";
  26. const char *ntp2 = "pool.ntp.org";
  27. time_t now;
  28. // The hardcoded certificate authority for this example.
  29. // Don't use it on your own apps!!!!!
  30. const char ca_cert[] PROGMEM = R"EOF(
  31. -----BEGIN CERTIFICATE-----
  32. MIIC1TCCAb2gAwIBAgIJAMPt1Ms37+hLMA0GCSqGSIb3DQEBCwUAMCExCzAJBgNV
  33. BAYTAlVTMRIwEAYDVQQDDAkxMjcuMC4wLjMwHhcNMTgwMzE0MDQyMTU0WhcNMjkw
  34. NTMxMDQyMTU0WjAhMQswCQYDVQQGEwJVUzESMBAGA1UEAwwJMTI3LjAuMC4zMIIB
  35. IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxsa4qU/tlzN4YTcnn/I/ffsi
  36. jOPc8QRcwClKzasIZNFEye4uThl+LGZWFIFb8X8Dc+xmmBaWlPJbqtphgFKStpar
  37. DdduHSW1ud6Y1FVKxljo3UwCMrYm76Q/jNzXJvGs6Z1MDNsVZzGJaoqit2H2Hkvk
  38. y+7kk3YbEDlcyVsLOw0zCKL4cd2DSNDyhIZxWo2a8Qn5IdjWAYtsTnW6MvLk/ya4
  39. abNeRfSZwi+r37rqi9CIs++NpL5ynqkKKEMrbeLactWgHbWrZeaMyLpuUEL2GF+w
  40. MRaAwaj7ERwT5gFJRqYwj6bbfIdx5PC7h7ucbyp272MbrDa6WNBCMwQO222t4wID
  41. AQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCmXfrC42nW
  42. IpL3JDkB8YlB2QUvD9JdMp98xxo33+xE69Gov0e6984F1Gluao0p6sS7KF+q3YLS
  43. 4hjnzuGzF9GJMimIB7NMQ20yXKfKpmKJ7YugMaKTDWDhHn5679mKVbLSQxHCUMEe
  44. tEnMT93/UaDbWBjV6zu876q5vjPMYgDHODqO295ySaA71UkijaCn6UwKUT49286T
  45. V9ZtzgabNGHXfklHgUPWoShyze+G3g29I1BR0qABoJI63zaNu8ua42v5g1RldxsW
  46. X8yKI14mFOGxuvcygG8L2xxysW7Zq+9g+O7gW0Pm6RDYnUQmIwY83h1KFCtYCJdS
  47. 2PgozwkkUNyP
  48. -----END CERTIFICATE-----
  49. )EOF";
  50. // The client's private key which must be kept secret
  51. const char client_private_key[] PROGMEM = R"EOF(
  52. -----BEGIN RSA PRIVATE KEY-----
  53. MIIEowIBAAKCAQEAsRNVTvqP++YUh8NrbXwE83xVsDqcB3F76xcXNKFDERfVd2P/
  54. LvyDovCcoQtT0UCRgPcxRp894EuPH/Ru6Z2Lu85sV//i7ce27tc2WRFSfuhlRxHP
  55. LJWHxTl1CEfXp/owkECQ4MB3pw6Ekc16iTEPiezTG+T+mQ/BkiIwcIK6CMlpR9DI
  56. eYUTqv0f9NrUfAjdBrqlEO2gpgFvLFrkDEU2ntAIc4aPOP7yDOym/xzfy6TiG8Wo
  57. 7nlh6M97xTZGfbEPCH9rZDjo5istym1HzF5P+COq+OTSPscjFGXoi978o6hZwa7i
  58. zxorg4h5a5lGnshRu2Gl+Ybfa14OwnIrv/yCswIDAQABAoIBAHxwgbsHCriTcEoY
  59. Yx6F0VTrQ6ydA5mXfuYvS/eIfIE+pp1IgMScYEXZobjrJPQg1CA1l0NyFSHS97oV
  60. JPy34sMQxcLx6KABgeVHCMJ/EeJtnv7a3SUP0GIhhsVS95Lsl8RIG4hWub+EzFVK
  61. eZqAB9N9wr4Pp3wZPodbz37B38rb1QPyMFmQOLlHjKTOmoxsXhL2ot+R3+aLYSur
  62. oPO1kQo7/d0UAZoy8h9OQN4a2EXvawh4O2EvFGbc5X/yXwAdEQ4NPp9VZhkNIRkV
  63. +XZ3FcIqEVOploKtRF/tVBTz3g61/lFz21L9PMmV5y8tvSafr2SpJugGVmp2rrVQ
  64. VNyGlIECgYEA10JSI5gmeCU3zK6kvOfBp54hY/5dDrSUpjKkMxpmm7WZQ6Il/k7A
  65. hMcLeMzHiriT7WhRIXF8AOr2MoEkHkH3DhVNN4ccieVZx2SE5P5mVkItZGLrrpfU
  66. dysR/ARAI1HYegGUiKacZtf9SrRavU0m7fOVOiYwbFRhjyX+MyuteYkCgYEA0pbz
  67. 4ZosetScP68uZx1sGlTfkcqLl7i15DHk3gnj6jKlfhvC2MjeLMhNDtKeUAuY7rLQ
  68. guZ0CCghWAv0Glh5eYdfIiPhgqFfX4P5F3Om4zQHVPYj8xHfHG4ZP7dKQTndrO1Q
  69. fLdGDTQLVXabAUSp2YGrijC8J9idSW1pYClvF1sCgYEAjkDn41nzYkbGP1/Swnwu
  70. AEWCL4Czoro32jVxScxSrugt5wJLNWp508VukWBTJhugtq3Pn9hNaJXeKbYqVkyl
  71. pgrxwpZph7+nuxt0r5hnrO2C7eppcjIoWLB/7BorAKxf8REGReBFT7nBTBMwPBW2
  72. el4U6h6+tXh2GJG1Eb/1nnECgYAydVb0THOx7rWNkNUGggc/++why61M6kYy6j2T
  73. cj05BW+f2tkCBoctpcTI83BZb53yO8g4RS2yMqNirGKN2XspwmTqEjzbhv0KLt4F
  74. X4GyWOoU0nFksXiLIFpOaQWSwWG7KJWrfGJ9kWXR0Xxsfl5QLoDCuNCsn3t4d43T
  75. K7phlwKBgHDzF+50+/Wez3YHCy2a/HgSbHCpLQjkknvgwkOh1z7YitYBUm72HP8Z
  76. Ge6b4wEfNuBdlZll/y9BQQOZJLFvJTE5t51X9klrkGrOb+Ftwr7eI/H5xgcadI52
  77. tPYglR5fjuRF/wnt3oX9JlQ2RtSbs+3naXH8JoherHaqNn8UpH0t
  78. -----END RSA PRIVATE KEY-----
  79. )EOF";
  80. // The clint's public certificate which must be shared
  81. const char client_cert[] PROGMEM = R"EOF(
  82. -----BEGIN CERTIFICATE-----
  83. MIIDTzCCAjcCCQDPXvMRYOpeuDANBgkqhkiG9w0BAQsFADCBpjESMBAGA1UEAwwJ
  84. MTI3LjAuMC4xMQswCQYDVQQGEwJVUzElMCMGA1UECgwcTXkgT3duIENlcnRpZmlj
  85. YXRlIEF1dGhvcml0eTEUMBIGA1UECAwLQXJkdWlub0xhbmQxFTATBgNVBAcMDEFy
  86. ZHVpbm9WaWxsZTEVMBMGA1UECgwMRVNQODI2NlVzZXJzMRgwFgYDVQQLDA9FU1A4
  87. MjY2LUFyZHVpbm8wHhcNMTgwMzE0MDQwMDAwWhcNMjkwMjI0MDQwMDAwWjAsMRYw
  88. FAYDVQQKDA1NeSBTZXJ2ZXIgT3JnMRIwEAYDVQQDDAkxMjcuMC4wLjMwggEiMA0G
  89. CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCxE1VO+o/75hSHw2ttfATzfFWwOpwH
  90. cXvrFxc0oUMRF9V3Y/8u/IOi8JyhC1PRQJGA9zFGnz3gS48f9G7pnYu7zmxX/+Lt
  91. x7bu1zZZEVJ+6GVHEc8slYfFOXUIR9en+jCQQJDgwHenDoSRzXqJMQ+J7NMb5P6Z
  92. D8GSIjBwgroIyWlH0Mh5hROq/R/02tR8CN0GuqUQ7aCmAW8sWuQMRTae0Ahzho84
  93. /vIM7Kb/HN/LpOIbxajueWHoz3vFNkZ9sQ8If2tkOOjmKy3KbUfMXk/4I6r45NI+
  94. xyMUZeiL3vyjqFnBruLPGiuDiHlrmUaeyFG7YaX5ht9rXg7Cciu//IKzAgMBAAEw
  95. DQYJKoZIhvcNAQELBQADggEBAEnG+FNyNCOkBvzHiUpHHpScxZqM2f+XDcewJgeS
  96. L6HkYEDIZZDNnd5gduSvkHpdJtWgsvJ7dJZL40w7Ba5sxpZHPIgKJGl9hzMkG+aA
  97. z5GMkjys9h2xpQZx9KL3q7G6A+C0bll7ODZlwBtY07CFMykT4Mp2oMRrQKRucMSV
  98. AB1mKujLAnMRKJ3NM89RQJH4GYiRps9y/HvM5lh7EIK/J0/nEZeJxY5hJngskPKb
  99. oPPdmkR97kaQnll4KNsC3owVlHVU2fMftgYkgQLzyeWgzcNa39AF3B6JlcOzNyQY
  100. seoK24dHmt6tWmn/sbxX7Aa6TL/4mVlFoOgcaTJyVaY/BrY=
  101. -----END CERTIFICATE-----
  102. )EOF";
  103. using namespace websockets;
  104. void onMessageCallback(WebsocketsMessage message) {
  105. Serial.print("Got Message: ");
  106. Serial.println(message.data());
  107. }
  108. void onEventsCallback(WebsocketsEvent event, String data) {
  109. if(event == WebsocketsEvent::ConnectionOpened) {
  110. Serial.println("Connnection Opened");
  111. } else if(event == WebsocketsEvent::ConnectionClosed) {
  112. Serial.println("Connnection Closed");
  113. } else if(event == WebsocketsEvent::GotPing) {
  114. Serial.println("Got a Ping!");
  115. } else if(event == WebsocketsEvent::GotPong) {
  116. Serial.println("Got a Pong!");
  117. }
  118. }
  119. WebsocketsClient client;
  120. void setup() {
  121. Serial.begin(115200);
  122. // Connect to wifi
  123. WiFi.begin(ssid, password);
  124. Serial.println("Connecting to WiFi...");
  125. // Wait until we are connected to WiFi
  126. while(WiFi.status() != WL_CONNECTED) {
  127. Serial.print(".");
  128. delay(1000);
  129. }
  130. Serial.println("Successfully connected to WiFi, setting time... ");
  131. // We configure ESP8266's time, as we need it to validate the certificates
  132. configTime(2 * 3600, 1, ntp1, ntp2);
  133. while(now < 2 * 3600) {
  134. Serial.print(".");
  135. delay(500);
  136. now = time(nullptr);
  137. }
  138. Serial.println("");
  139. Serial.println("Time set, connecting to server...");
  140. // run callback when messages are received
  141. client.onMessage(onMessageCallback);
  142. // run callback when events are occuring
  143. client.onEvent(onEventsCallback);
  144. // Before connecting, set the ssl certificates and key of the server
  145. X509List cert(ca_cert);
  146. client.setTrustAnchors(&cert);
  147. X509List *serverCertList = new X509List(client_cert);
  148. PrivateKey *serverPrivKey = new PrivateKey(client_private_key);
  149. client.setClientRSACert(serverCertList, serverPrivKey);
  150. // Connect to server
  151. client.connect(websockets_connection_string);
  152. // Send a message
  153. client.send("Hello Server");
  154. // Send a ping
  155. client.ping();
  156. }
  157. void loop() {
  158. client.poll();
  159. }