Commit 607853e29a49b0fb89d0247f9e3c07c23ff25197

Authored by Adam Honse
Committed by Moritz Wirger
1 parent 74194aad

Add connect and disconnect functions

Showing 1 changed file with 116 additions and 31 deletions
src/EntertainmentMode.cpp
... ... @@ -103,49 +103,134 @@ EntertainmentMode::EntertainmentMode(Bridge& bridge, Group& group):bridge(bridge
103 103 | Parse certificate |
104 104 \*-------------------------------------------------*/
105 105 ret = mbedtls_x509_crt_parse(&cacert, (const unsigned char*)mbedtls_test_cas_pem, mbedtls_test_cas_pem_len);
  106 +}
106 107  
  108 +bool EntertainmentMode::Connect()
  109 +{
107 110 /*-------------------------------------------------*\
108   - | Connect to the Hue bridge UDP server |
  111 + | Signal the bridge to start streaming |
  112 + | If successful, connect to the UDP port |
109 113 \*-------------------------------------------------*/
110   - ret = mbedtls_net_connect(&server_fd, bridge.getBridgeIP().c_str(), "2100", MBEDTLS_NET_PROTO_UDP);
  114 + if(bridge.StartStreaming(std::to_string(group.getId())))
  115 + {
  116 + /*-------------------------------------------------*\
  117 + | Connect to the Hue bridge UDP server |
  118 + \*-------------------------------------------------*/
  119 + int ret = mbedtls_net_connect(&server_fd, bridge.getBridgeIP().c_str(), "2100", MBEDTLS_NET_PROTO_UDP);
  120 +
  121 + /*-------------------------------------------------*\
  122 + | If connecting failed, close and return false |
  123 + \*-------------------------------------------------*/
  124 + if(ret != 0)
  125 + {
  126 + mbedtls_ssl_close_notify(&ssl);
  127 + bridge.StopStreaming(std::to_string(group.getId()));
  128 + return false;
  129 + }
111 130  
112   - /*-------------------------------------------------*\
113   - | Configure defaults |
114   - \*-------------------------------------------------*/
115   - ret = mbedtls_ssl_config_defaults(
116   - &conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_DATAGRAM, MBEDTLS_SSL_PRESET_DEFAULT);
  131 + /*-------------------------------------------------*\
  132 + | Configure defaults |
  133 + \*-------------------------------------------------*/
  134 + ret = mbedtls_ssl_config_defaults(
  135 + &conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_DATAGRAM, MBEDTLS_SSL_PRESET_DEFAULT);
117 136  
118   - mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
119   - mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
120   - mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
  137 + /*-------------------------------------------------*\
  138 + | If configuring failed, close and return false |
  139 + \*-------------------------------------------------*/
  140 + if(ret != 0)
  141 + {
  142 + mbedtls_ssl_close_notify(&ssl);
  143 + bridge.StopStreaming(std::to_string(group.getId()));
  144 + return false;
  145 + }
121 146  
122   - /*-------------------------------------------------*\
123   - | Convert client key to binary array |
124   - \*-------------------------------------------------*/
125   - std::vector<char> psk_binary = HexToBytes(bridge.getClientKey());
  147 + mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
  148 + mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL);
  149 + mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
  150 +
  151 + /*-------------------------------------------------*\
  152 + | Convert client key to binary array |
  153 + \*-------------------------------------------------*/
  154 + std::vector<char> psk_binary = HexToBytes(bridge.getClientKey());
  155 +
  156 + /*-------------------------------------------------*\
  157 + | Configure SSL pre-shared key and identity |
  158 + | PSK - binary array from client key |
  159 + | Identity - username (ASCII) |
  160 + \*-------------------------------------------------*/
  161 + ret = mbedtls_ssl_conf_psk(&conf, (const unsigned char*)&psk_binary[0], psk_binary.size(),
  162 + (const unsigned char*)bridge.getUsername().c_str(), bridge.getUsername().length());
  163 +
  164 + /*-------------------------------------------------*\
  165 + | If configuring failed, close and return false |
  166 + \*-------------------------------------------------*/
  167 + if(ret != 0)
  168 + {
  169 + mbedtls_ssl_close_notify(&ssl);
  170 + bridge.StopStreaming(std::to_string(group.getId()));
  171 + return false;
  172 + }
126 173  
127   - /*-------------------------------------------------*\
128   - | Configure SSL pre-shared key and identity |
129   - | PSK - binary array from client key |
130   - | Identity - username (ASCII) |
131   - \*-------------------------------------------------*/
132   - ret = mbedtls_ssl_conf_psk(&conf, (const unsigned char*)&psk_binary[0], psk_binary.size(),
133   - (const unsigned char*)bridge.getUsername().c_str(), bridge.getUsername().length());
  174 + /*-------------------------------------------------*\
  175 + | Set up the SSL |
  176 + \*-------------------------------------------------*/
  177 + ret = mbedtls_ssl_setup(&ssl, &conf);
134 178  
135   - /*-------------------------------------------------*\
136   - | Set up the SSL |
137   - \*-------------------------------------------------*/
138   - ret = mbedtls_ssl_setup(&ssl, &conf);
  179 + /*-------------------------------------------------*\
  180 + | If setup failed, close and return false |
  181 + \*-------------------------------------------------*/
  182 + if(ret != 0)
  183 + {
  184 + mbedtls_ssl_close_notify(&ssl);
  185 + bridge.StopStreaming(std::to_string(group.getId()));
  186 + return false;
  187 + }
  188 +
  189 + ret = mbedtls_ssl_set_hostname(&ssl, "localhost");
139 190  
140   - ret = mbedtls_ssl_set_hostname(&ssl, "localhost");
  191 + /*-------------------------------------------------*\
  192 + | If set hostname failed, close and return false |
  193 + \*-------------------------------------------------*/
  194 + if(ret != 0)
  195 + {
  196 + mbedtls_ssl_close_notify(&ssl);
  197 + bridge.StopStreaming(std::to_string(group.getId()));
  198 + return false;
  199 + }
141 200  
142   - mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, mbedtls_net_recv_timeout);
143   - mbedtls_ssl_set_timer_cb(&ssl, &timer, mbedtls_timing_set_delay, mbedtls_timing_get_delay);
  201 + mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, mbedtls_net_recv_timeout);
  202 + mbedtls_ssl_set_timer_cb(&ssl, &timer, mbedtls_timing_set_delay, mbedtls_timing_get_delay);
  203 +
  204 + /*-------------------------------------------------*\
  205 + | Handshake |
  206 + \*-------------------------------------------------*/
  207 + do
  208 + {
  209 + ret = mbedtls_ssl_handshake(&ssl);
  210 + } while (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE);
  211 +
  212 + /*-------------------------------------------------*\
  213 + | If set hostname failed, close and return false |
  214 + \*-------------------------------------------------*/
  215 + if(ret != 0)
  216 + {
  217 + mbedtls_ssl_close_notify(&ssl);
  218 + bridge.StopStreaming(std::to_string(group.getId()));
  219 + return false;
  220 + }
144 221  
145   - do
  222 + return true;
  223 + }
  224 + else
146 225 {
147   - ret = mbedtls_ssl_handshake(&ssl);
148   - } while (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE);
  226 + return false;
  227 + }
  228 +}
  229 +
  230 +bool EntertainmentMode::Disconnect()
  231 +{
  232 + mbedtls_ssl_close_notify(&ssl);
  233 + return bridge.StopStreaming(std::to_string(group.getId()));
149 234 }
150 235  
151 236 bool EntertainmentMode::SetColorRGB(uint8_t light_index, uint8_t red, uint8_t green, uint8_t blue)
... ...