Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include "azure_c_shared_utility/xio.h"
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/wsio.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/tlsio.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/platform.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/http_proxy_io.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "iothubtransportmqtt_websockets.h"
XinZhangMS 0:f7f1f0d76dd6 11 #include "internal/iothubtransport_mqtt_common.h"
XinZhangMS 0:f7f1f0d76dd6 12
XinZhangMS 0:f7f1f0d76dd6 13 static XIO_HANDLE getWebSocketsIOTransport(const char* fully_qualified_name, const MQTT_TRANSPORT_PROXY_OPTIONS* mqtt_transport_proxy_options)
XinZhangMS 0:f7f1f0d76dd6 14 {
XinZhangMS 0:f7f1f0d76dd6 15 XIO_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 16 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_001: [ `getIoTransportProvider` shall obtain the WebSocket IO interface handle by calling `wsio_get_interface_description`. ]*/
XinZhangMS 0:f7f1f0d76dd6 17 const IO_INTERFACE_DESCRIPTION* io_interface_description = wsio_get_interface_description();
XinZhangMS 0:f7f1f0d76dd6 18 TLSIO_CONFIG tls_io_config;
XinZhangMS 0:f7f1f0d76dd6 19 HTTP_PROXY_IO_CONFIG http_proxy_io_config;
XinZhangMS 0:f7f1f0d76dd6 20
XinZhangMS 0:f7f1f0d76dd6 21 if (io_interface_description == NULL)
XinZhangMS 0:f7f1f0d76dd6 22 {
XinZhangMS 0:f7f1f0d76dd6 23 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_013: [ If `wsio_get_interface_description` returns NULL `getIoTransportProvider` shall return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 24 LogError("Failure constructing the provider interface");
XinZhangMS 0:f7f1f0d76dd6 25 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 26 }
XinZhangMS 0:f7f1f0d76dd6 27 else
XinZhangMS 0:f7f1f0d76dd6 28 {
XinZhangMS 0:f7f1f0d76dd6 29 WSIO_CONFIG ws_io_config;
XinZhangMS 0:f7f1f0d76dd6 30
XinZhangMS 0:f7f1f0d76dd6 31 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_003: [ - `hostname` shall be set to `fully_qualified_name`. ]*/
XinZhangMS 0:f7f1f0d76dd6 32 ws_io_config.hostname = fully_qualified_name;
XinZhangMS 0:f7f1f0d76dd6 33 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_004: [ - `port` shall be set to 443. ]*/
XinZhangMS 0:f7f1f0d76dd6 34 ws_io_config.port = 443;
XinZhangMS 0:f7f1f0d76dd6 35 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_005: [ - `protocol` shall be set to `MQTT`. ]*/
XinZhangMS 0:f7f1f0d76dd6 36 ws_io_config.protocol = "MQTT";
XinZhangMS 0:f7f1f0d76dd6 37 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_006: [ - `resource_name` shall be set to `/$iothub/websocket`. ]*/
XinZhangMS 0:f7f1f0d76dd6 38 ws_io_config.resource_name = "/$iothub/websocket";
XinZhangMS 0:f7f1f0d76dd6 39 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_007: [ - `underlying_io_interface` shall be set to the TLS IO interface description. ]*/
XinZhangMS 0:f7f1f0d76dd6 40 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_009: [ `getIoTransportProvider` shall obtain the TLS IO interface handle by calling `platform_get_default_tlsio`. ]*/
XinZhangMS 0:f7f1f0d76dd6 41 ws_io_config.underlying_io_interface = platform_get_default_tlsio();
XinZhangMS 0:f7f1f0d76dd6 42
XinZhangMS 0:f7f1f0d76dd6 43 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_029: [ If `platform_get_default_tlsio` returns NULL, NULL shall be set in the WebSocket IO parameters structure for the interface description and parameters. ]*/
XinZhangMS 0:f7f1f0d76dd6 44 if (ws_io_config.underlying_io_interface == NULL)
XinZhangMS 0:f7f1f0d76dd6 45 {
XinZhangMS 0:f7f1f0d76dd6 46 ws_io_config.underlying_io_parameters = NULL;
XinZhangMS 0:f7f1f0d76dd6 47 }
XinZhangMS 0:f7f1f0d76dd6 48 else
XinZhangMS 0:f7f1f0d76dd6 49 {
XinZhangMS 0:f7f1f0d76dd6 50 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_008: [ - `underlying_io_parameters` shall be set to the TLS IO arguments. ]*/
XinZhangMS 0:f7f1f0d76dd6 51 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_010: [ The TLS IO parameters shall be a TLSIO_CONFIG structure filled as below: ]*/
XinZhangMS 0:f7f1f0d76dd6 52 ws_io_config.underlying_io_parameters = &tls_io_config;
XinZhangMS 0:f7f1f0d76dd6 53
XinZhangMS 0:f7f1f0d76dd6 54 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_011: [ - `hostname` shall be set to `fully_qualified_name`. ]*/
XinZhangMS 0:f7f1f0d76dd6 55 tls_io_config.hostname = fully_qualified_name;
XinZhangMS 0:f7f1f0d76dd6 56 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_012: [ - `port` shall be set to 443. ]*/
XinZhangMS 0:f7f1f0d76dd6 57 tls_io_config.port = 443;
XinZhangMS 0:f7f1f0d76dd6 58
XinZhangMS 0:f7f1f0d76dd6 59 if (mqtt_transport_proxy_options != NULL)
XinZhangMS 0:f7f1f0d76dd6 60 {
XinZhangMS 0:f7f1f0d76dd6 61 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_015: [ - If `mqtt_transport_proxy_options` is not NULL, `underlying_io_interface` shall be set to the HTTP proxy IO interface description. ]*/
XinZhangMS 0:f7f1f0d76dd6 62 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_022: [ `getIoTransportProvider` shall obtain the HTTP proxy IO interface handle by calling `http_proxy_io_get_interface_description`. ]*/
XinZhangMS 0:f7f1f0d76dd6 63 tls_io_config.underlying_io_interface = http_proxy_io_get_interface_description();
XinZhangMS 0:f7f1f0d76dd6 64
XinZhangMS 0:f7f1f0d76dd6 65 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_028: [ If `http_proxy_io_get_interface_description` returns NULL, NULL shall be set in the TLS IO parameters structure for the interface description and parameters. ]*/
XinZhangMS 0:f7f1f0d76dd6 66 if (tls_io_config.underlying_io_interface == NULL)
XinZhangMS 0:f7f1f0d76dd6 67 {
XinZhangMS 0:f7f1f0d76dd6 68 tls_io_config.underlying_io_parameters = NULL;
XinZhangMS 0:f7f1f0d76dd6 69 }
XinZhangMS 0:f7f1f0d76dd6 70 else
XinZhangMS 0:f7f1f0d76dd6 71 {
XinZhangMS 0:f7f1f0d76dd6 72 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_016: [ - If `mqtt_transport_proxy_options` is not NULL `underlying_io_parameters` shall be set to the HTTP proxy IO arguments. ]*/
XinZhangMS 0:f7f1f0d76dd6 73 tls_io_config.underlying_io_parameters = &http_proxy_io_config;
XinZhangMS 0:f7f1f0d76dd6 74
XinZhangMS 0:f7f1f0d76dd6 75 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_023: [ The HTTP proxy IO arguments shall be an `HTTP_PROXY_IO_CONFIG` structure, filled as below: ]*/
XinZhangMS 0:f7f1f0d76dd6 76 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_026: [ - `proxy_hostname`, `proxy_port`, `username` and `password` shall be copied from the `mqtt_transport_proxy_options` argument. ]*/
XinZhangMS 0:f7f1f0d76dd6 77 http_proxy_io_config.proxy_hostname = mqtt_transport_proxy_options->host_address;
XinZhangMS 0:f7f1f0d76dd6 78 http_proxy_io_config.proxy_port = mqtt_transport_proxy_options->port;
XinZhangMS 0:f7f1f0d76dd6 79 http_proxy_io_config.username = mqtt_transport_proxy_options->username;
XinZhangMS 0:f7f1f0d76dd6 80 http_proxy_io_config.password = mqtt_transport_proxy_options->password;
XinZhangMS 0:f7f1f0d76dd6 81 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_024: [ - `hostname` shall be set to `fully_qualified_name`. ]*/
XinZhangMS 0:f7f1f0d76dd6 82 http_proxy_io_config.hostname = fully_qualified_name;
XinZhangMS 0:f7f1f0d76dd6 83 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_025: [ - `port` shall be set to 443. ]*/
XinZhangMS 0:f7f1f0d76dd6 84 http_proxy_io_config.port = 443;
XinZhangMS 0:f7f1f0d76dd6 85 }
XinZhangMS 0:f7f1f0d76dd6 86 }
XinZhangMS 0:f7f1f0d76dd6 87 else
XinZhangMS 0:f7f1f0d76dd6 88 {
XinZhangMS 0:f7f1f0d76dd6 89 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_013: [ - If `mqtt_transport_proxy_options` is NULL, `underlying_io_interface` shall be set to NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 90 tls_io_config.underlying_io_interface = NULL;
XinZhangMS 0:f7f1f0d76dd6 91 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_014: [ - If `mqtt_transport_proxy_options` is NULL `underlying_io_parameters` shall be set to NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 92 tls_io_config.underlying_io_parameters = NULL;
XinZhangMS 0:f7f1f0d76dd6 93 }
XinZhangMS 0:f7f1f0d76dd6 94 }
XinZhangMS 0:f7f1f0d76dd6 95
XinZhangMS 0:f7f1f0d76dd6 96 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_012: [ `getIoTransportProvider` shall return the `XIO_HANDLE` returned by `xio_create`. ] */
XinZhangMS 0:f7f1f0d76dd6 97 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_01_002: [ `getIoTransportProvider` shall call `xio_create` while passing the WebSocket IO interface description to it and the WebSocket configuration as a WSIO_CONFIG structure, filled as below ]*/
XinZhangMS 0:f7f1f0d76dd6 98 result = xio_create(io_interface_description, &ws_io_config);
XinZhangMS 0:f7f1f0d76dd6 99 }
XinZhangMS 0:f7f1f0d76dd6 100 return result;
XinZhangMS 0:f7f1f0d76dd6 101 }
XinZhangMS 0:f7f1f0d76dd6 102
XinZhangMS 0:f7f1f0d76dd6 103 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_001: [ IoTHubTransportMqtt_WS_Create shall create a TRANSPORT_LL_HANDLE by calling into the IoTHubMqttAbstract_Create function. ] */
XinZhangMS 0:f7f1f0d76dd6 104 static TRANSPORT_LL_HANDLE IoTHubTransportMqtt_WS_Create(const IOTHUBTRANSPORT_CONFIG* config)
XinZhangMS 0:f7f1f0d76dd6 105 {
XinZhangMS 0:f7f1f0d76dd6 106 return IoTHubTransport_MQTT_Common_Create(config, getWebSocketsIOTransport);
XinZhangMS 0:f7f1f0d76dd6 107 }
XinZhangMS 0:f7f1f0d76dd6 108
XinZhangMS 0:f7f1f0d76dd6 109 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_002: [ IoTHubTransportMqtt_WS_Destroy shall destroy the TRANSPORT_LL_HANDLE by calling into the IoTHubMqttAbstract_Destroy function. ] */
XinZhangMS 0:f7f1f0d76dd6 110 static void IoTHubTransportMqtt_WS_Destroy(TRANSPORT_LL_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 111 {
XinZhangMS 0:f7f1f0d76dd6 112 IoTHubTransport_MQTT_Common_Destroy(handle);
XinZhangMS 0:f7f1f0d76dd6 113 }
XinZhangMS 0:f7f1f0d76dd6 114
XinZhangMS 0:f7f1f0d76dd6 115 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_005: [ IoTHubTransportMqtt_WS_Subscribe shall subscribe the TRANSPORT_LL_HANDLE by calling into the IoTHubMqttAbstract_Subscribe function. ] */
XinZhangMS 0:f7f1f0d76dd6 116 static int IoTHubTransportMqtt_WS_Subscribe(IOTHUB_DEVICE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 117 {
XinZhangMS 0:f7f1f0d76dd6 118 return IoTHubTransport_MQTT_Common_Subscribe(handle);
XinZhangMS 0:f7f1f0d76dd6 119 }
XinZhangMS 0:f7f1f0d76dd6 120
XinZhangMS 0:f7f1f0d76dd6 121 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_006: [ IoTHubTransportMqtt_WS_Unsubscribe shall unsubscribe the TRANSPORT_LL_HANDLE by calling into the IoTHubMqttAbstract_Unsubscribe function. ] */
XinZhangMS 0:f7f1f0d76dd6 122 static void IoTHubTransportMqtt_WS_Unsubscribe(IOTHUB_DEVICE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 123 {
XinZhangMS 0:f7f1f0d76dd6 124 IoTHubTransport_MQTT_Common_Unsubscribe(handle);
XinZhangMS 0:f7f1f0d76dd6 125 }
XinZhangMS 0:f7f1f0d76dd6 126
XinZhangMS 0:f7f1f0d76dd6 127 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_015: [ IoTHubTransportMqtt_WS_Subscribe_DeviceMethod shall call into the IoTHubTransport_MQTT_Common_Subscribe_DeviceMethod function ] */
XinZhangMS 0:f7f1f0d76dd6 128 static int IoTHubTransportMqtt_WS_Subscribe_DeviceMethod(IOTHUB_DEVICE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 129 {
XinZhangMS 0:f7f1f0d76dd6 130 return IoTHubTransport_MQTT_Common_Subscribe_DeviceMethod(handle);
XinZhangMS 0:f7f1f0d76dd6 131 }
XinZhangMS 0:f7f1f0d76dd6 132
XinZhangMS 0:f7f1f0d76dd6 133 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_016: [ IoTHubTransportMqtt_WS_Unsubscribe_DeviceMethod shall call into the IoTHubTransport_MQTT_Common_Unsubscribe_DeviceMethod ] */
XinZhangMS 0:f7f1f0d76dd6 134 static void IoTHubTransportMqtt_WS_Unsubscribe_DeviceMethod(IOTHUB_DEVICE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 135 {
XinZhangMS 0:f7f1f0d76dd6 136 IoTHubTransport_MQTT_Common_Unsubscribe_DeviceMethod(handle);
XinZhangMS 0:f7f1f0d76dd6 137 }
XinZhangMS 0:f7f1f0d76dd6 138
XinZhangMS 0:f7f1f0d76dd6 139 static int IoTHubTransportMqtt_WS_DeviceMethod_Response(IOTHUB_DEVICE_HANDLE handle, METHOD_HANDLE methodId, const unsigned char* response, size_t response_size, int status_response)
XinZhangMS 0:f7f1f0d76dd6 140 {
XinZhangMS 0:f7f1f0d76dd6 141 return IoTHubTransport_MQTT_Common_DeviceMethod_Response(handle, methodId, response, response_size, status_response);
XinZhangMS 0:f7f1f0d76dd6 142 }
XinZhangMS 0:f7f1f0d76dd6 143
XinZhangMS 0:f7f1f0d76dd6 144 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_017: [ IoTHubTransportMqtt_WS_Subscribe_DeviceTwin shall call into the IoTHubTransport_MQTT_Common_Subscribe_DeviceTwin ] */
XinZhangMS 0:f7f1f0d76dd6 145 static int IoTHubTransportMqtt_WS_Subscribe_DeviceTwin(IOTHUB_DEVICE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 146 {
XinZhangMS 0:f7f1f0d76dd6 147 return IoTHubTransport_MQTT_Common_Subscribe_DeviceTwin(handle);
XinZhangMS 0:f7f1f0d76dd6 148 }
XinZhangMS 0:f7f1f0d76dd6 149
XinZhangMS 0:f7f1f0d76dd6 150 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_018: [ IoTHubTransportMqtt_WS_Unsubscribe_DeviceTwin shall call into the IoTHubTransport_MQTT_Common_Unsubscribe_DeviceTwin ] */
XinZhangMS 0:f7f1f0d76dd6 151 static void IoTHubTransportMqtt_WS_Unsubscribe_DeviceTwin(IOTHUB_DEVICE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 152 {
XinZhangMS 0:f7f1f0d76dd6 153 IoTHubTransport_MQTT_Common_Unsubscribe_DeviceTwin(handle);
XinZhangMS 0:f7f1f0d76dd6 154 }
XinZhangMS 0:f7f1f0d76dd6 155
XinZhangMS 0:f7f1f0d76dd6 156 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_014: [ IoTHubTransportMqtt_WS_ProcessItem shall call into the IoTHubTransport_MQTT_Common_DoWork function ] */
XinZhangMS 0:f7f1f0d76dd6 157 static IOTHUB_PROCESS_ITEM_RESULT IoTHubTransportMqtt_WS_ProcessItem(TRANSPORT_LL_HANDLE handle, IOTHUB_IDENTITY_TYPE item_type, IOTHUB_IDENTITY_INFO* iothub_item)
XinZhangMS 0:f7f1f0d76dd6 158 {
XinZhangMS 0:f7f1f0d76dd6 159 return IoTHubTransport_MQTT_Common_ProcessItem(handle, item_type, iothub_item);
XinZhangMS 0:f7f1f0d76dd6 160 }
XinZhangMS 0:f7f1f0d76dd6 161
XinZhangMS 0:f7f1f0d76dd6 162 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_007: [ IoTHubTransportMqtt_WS_DoWork shall call into the IoTHubMqttAbstract_DoWork function. ] */
XinZhangMS 0:f7f1f0d76dd6 163 static void IoTHubTransportMqtt_WS_DoWork(TRANSPORT_LL_HANDLE handle, IOTHUB_CLIENT_CORE_LL_HANDLE iotHubClientHandle)
XinZhangMS 0:f7f1f0d76dd6 164 {
XinZhangMS 0:f7f1f0d76dd6 165 IoTHubTransport_MQTT_Common_DoWork(handle, iotHubClientHandle);
XinZhangMS 0:f7f1f0d76dd6 166 }
XinZhangMS 0:f7f1f0d76dd6 167
XinZhangMS 0:f7f1f0d76dd6 168 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_008: [ IoTHubTransportMqtt_WS_GetSendStatus shall get the send status by calling into the IoTHubMqttAbstract_GetSendStatus function. ] */
XinZhangMS 0:f7f1f0d76dd6 169 static IOTHUB_CLIENT_RESULT IoTHubTransportMqtt_WS_GetSendStatus(IOTHUB_DEVICE_HANDLE handle, IOTHUB_CLIENT_STATUS *iotHubClientStatus)
XinZhangMS 0:f7f1f0d76dd6 170 {
XinZhangMS 0:f7f1f0d76dd6 171 return IoTHubTransport_MQTT_Common_GetSendStatus(handle, iotHubClientStatus);
XinZhangMS 0:f7f1f0d76dd6 172 }
XinZhangMS 0:f7f1f0d76dd6 173
XinZhangMS 0:f7f1f0d76dd6 174 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_009: [ IoTHubTransportMqtt_WS_SetOption shall set the options by calling into the IoTHubMqttAbstract_SetOption function. ] */
XinZhangMS 0:f7f1f0d76dd6 175 static IOTHUB_CLIENT_RESULT IoTHubTransportMqtt_WS_SetOption(TRANSPORT_LL_HANDLE handle, const char* option, const void* value)
XinZhangMS 0:f7f1f0d76dd6 176 {
XinZhangMS 0:f7f1f0d76dd6 177 return IoTHubTransport_MQTT_Common_SetOption(handle, option, value);
XinZhangMS 0:f7f1f0d76dd6 178 }
XinZhangMS 0:f7f1f0d76dd6 179
XinZhangMS 0:f7f1f0d76dd6 180 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_003: [ IoTHubTransportMqtt_WS_Register shall register the TRANSPORT_LL_HANDLE by calling into the IoTHubMqttAbstract_Register function. ]*/
XinZhangMS 0:f7f1f0d76dd6 181 static IOTHUB_DEVICE_HANDLE IoTHubTransportMqtt_WS_Register(TRANSPORT_LL_HANDLE handle, const IOTHUB_DEVICE_CONFIG* device, IOTHUB_CLIENT_CORE_LL_HANDLE iotHubClientHandle, PDLIST_ENTRY waitingToSend)
XinZhangMS 0:f7f1f0d76dd6 182 {
XinZhangMS 0:f7f1f0d76dd6 183 return IoTHubTransport_MQTT_Common_Register(handle, device, iotHubClientHandle, waitingToSend);
XinZhangMS 0:f7f1f0d76dd6 184 }
XinZhangMS 0:f7f1f0d76dd6 185
XinZhangMS 0:f7f1f0d76dd6 186 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_004: [ IoTHubTransportMqtt_WS_Unregister shall register the TRANSPORT_LL_HANDLE by calling into the IoTHubMqttAbstract_Unregister function. ] */
XinZhangMS 0:f7f1f0d76dd6 187 static void IoTHubTransportMqtt_WS_Unregister(IOTHUB_DEVICE_HANDLE deviceHandle)
XinZhangMS 0:f7f1f0d76dd6 188 {
XinZhangMS 0:f7f1f0d76dd6 189 IoTHubTransport_MQTT_Common_Unregister(deviceHandle);
XinZhangMS 0:f7f1f0d76dd6 190 }
XinZhangMS 0:f7f1f0d76dd6 191
XinZhangMS 0:f7f1f0d76dd6 192 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_010: [ IoTHubTransportMqtt_WS_GetHostname shall get the hostname by calling into the IoTHubMqttAbstract_GetHostname function. ] */
XinZhangMS 0:f7f1f0d76dd6 193 static STRING_HANDLE IoTHubTransportMqtt_WS_GetHostname(TRANSPORT_LL_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 194 {
XinZhangMS 0:f7f1f0d76dd6 195 return IoTHubTransport_MQTT_Common_GetHostname(handle);
XinZhangMS 0:f7f1f0d76dd6 196 }
XinZhangMS 0:f7f1f0d76dd6 197
XinZhangMS 0:f7f1f0d76dd6 198 static int IoTHubTransportMqtt_WS_SetRetryPolicy(TRANSPORT_LL_HANDLE handle, IOTHUB_CLIENT_RETRY_POLICY retryPolicy, size_t retryTimeoutLimitinSeconds)
XinZhangMS 0:f7f1f0d76dd6 199 {
XinZhangMS 0:f7f1f0d76dd6 200 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_25_012: [** IoTHubTransportMqtt_WS_SetRetryPolicy shall call into the IoTHubMqttAbstract_SetRetryPolicy function.]*/
XinZhangMS 0:f7f1f0d76dd6 201 return IoTHubTransport_MQTT_Common_SetRetryPolicy(handle, retryPolicy, retryTimeoutLimitinSeconds);
XinZhangMS 0:f7f1f0d76dd6 202 }
XinZhangMS 0:f7f1f0d76dd6 203
XinZhangMS 0:f7f1f0d76dd6 204 static IOTHUB_CLIENT_RESULT IoTHubTransportMqtt_WS_SendMessageDisposition(MESSAGE_CALLBACK_INFO* message_data, IOTHUBMESSAGE_DISPOSITION_RESULT disposition)
XinZhangMS 0:f7f1f0d76dd6 205 {
XinZhangMS 0:f7f1f0d76dd6 206 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_10_001: [IoTHubTransportMqtt_WS_SendMessageDisposition shall send the message disposition by calling into the IoTHubTransport_MQTT_Common_SendMessageDisposition()]*/
XinZhangMS 0:f7f1f0d76dd6 207 return IoTHubTransport_MQTT_Common_SendMessageDisposition(message_data, disposition);
XinZhangMS 0:f7f1f0d76dd6 208 }
XinZhangMS 0:f7f1f0d76dd6 209
XinZhangMS 0:f7f1f0d76dd6 210 static int IoTHubTransportMqtt_WS_Subscribe_InputQueue(IOTHUB_DEVICE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 211 {
XinZhangMS 0:f7f1f0d76dd6 212 (void)handle;
XinZhangMS 0:f7f1f0d76dd6 213 LogError("IoTHubTransportMqtt_WS_Subscribe_InputQueue not implemented\n");
XinZhangMS 0:f7f1f0d76dd6 214 return __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 215 }
XinZhangMS 0:f7f1f0d76dd6 216
XinZhangMS 0:f7f1f0d76dd6 217 static void IoTHubTransportMqtt_WS_Unsubscribe_InputQueue(IOTHUB_DEVICE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 218 {
XinZhangMS 0:f7f1f0d76dd6 219 LogError("IoTHubTransportMqtt_WS_Unsubscribe_InputQueue not implemented\n");
XinZhangMS 0:f7f1f0d76dd6 220 (void)handle;
XinZhangMS 0:f7f1f0d76dd6 221 }
XinZhangMS 0:f7f1f0d76dd6 222
XinZhangMS 0:f7f1f0d76dd6 223 /* Codes_SRS_IOTHUB_MQTT_WEBSOCKET_TRANSPORT_07_011: [ This function shall return a pointer to a structure of type TRANSPORT_PROVIDER having the following values for its fields:
XinZhangMS 0:f7f1f0d76dd6 224 IoTHubTransport_SendMessageDisposition = IoTHubTransport_WS_SendMessageDisposition
XinZhangMS 0:f7f1f0d76dd6 225 IoTHubTransport_Subscribe_DeviceMethod = IoTHubTransport_WS_Subscribe_DeviceMethod
XinZhangMS 0:f7f1f0d76dd6 226 IoTHubTransport_Unsubscribe_DeviceMethod IoTHubTransport_WS_Unsubscribe_DeviceMethod
XinZhangMS 0:f7f1f0d76dd6 227 IoTHubTransport_Subscribe_DeviceTwin IoTHubTransport_WS_Subscribe_DeviceTwin
XinZhangMS 0:f7f1f0d76dd6 228 IoTHubTransport_Unsubscribe_DeviceTwin IoTHubTransport_WS_Unsubscribe_DeviceTwin
XinZhangMS 0:f7f1f0d76dd6 229 IoTHubTransport_GetHostname = IoTHubTransportMqtt_WS_GetHostname
XinZhangMS 0:f7f1f0d76dd6 230 IoTHubTransport_Create = IoTHubTransportMqtt_WS_Create
XinZhangMS 0:f7f1f0d76dd6 231 IoTHubTransport_Destroy = IoTHubTransportMqtt_WS_Destroy
XinZhangMS 0:f7f1f0d76dd6 232 IoTHubTransport_Subscribe = IoTHubTransportMqtt_WS_Subscribe
XinZhangMS 0:f7f1f0d76dd6 233 IoTHubTransport_Unsubscribe = IoTHubTransportMqtt_WS_Unsubscribe
XinZhangMS 0:f7f1f0d76dd6 234 IoTHubTransport_DoWork = IoTHubTransportMqtt_WS_DoWork
XinZhangMS 0:f7f1f0d76dd6 235 IoTHubTransport_SetOption = IoTHubTransportMqtt_WS_SetOption ] */
XinZhangMS 0:f7f1f0d76dd6 236 static TRANSPORT_PROVIDER thisTransportProvider_WebSocketsOverTls = {
XinZhangMS 0:f7f1f0d76dd6 237 IoTHubTransportMqtt_WS_SendMessageDisposition,
XinZhangMS 0:f7f1f0d76dd6 238 IoTHubTransportMqtt_WS_Subscribe_DeviceMethod,
XinZhangMS 0:f7f1f0d76dd6 239 IoTHubTransportMqtt_WS_Unsubscribe_DeviceMethod,
XinZhangMS 0:f7f1f0d76dd6 240 IoTHubTransportMqtt_WS_DeviceMethod_Response,
XinZhangMS 0:f7f1f0d76dd6 241 IoTHubTransportMqtt_WS_Subscribe_DeviceTwin,
XinZhangMS 0:f7f1f0d76dd6 242 IoTHubTransportMqtt_WS_Unsubscribe_DeviceTwin,
XinZhangMS 0:f7f1f0d76dd6 243 IoTHubTransportMqtt_WS_ProcessItem,
XinZhangMS 0:f7f1f0d76dd6 244 IoTHubTransportMqtt_WS_GetHostname,
XinZhangMS 0:f7f1f0d76dd6 245 IoTHubTransportMqtt_WS_SetOption,
XinZhangMS 0:f7f1f0d76dd6 246 IoTHubTransportMqtt_WS_Create,
XinZhangMS 0:f7f1f0d76dd6 247 IoTHubTransportMqtt_WS_Destroy,
XinZhangMS 0:f7f1f0d76dd6 248 IoTHubTransportMqtt_WS_Register,
XinZhangMS 0:f7f1f0d76dd6 249 IoTHubTransportMqtt_WS_Unregister,
XinZhangMS 0:f7f1f0d76dd6 250 IoTHubTransportMqtt_WS_Subscribe,
XinZhangMS 0:f7f1f0d76dd6 251 IoTHubTransportMqtt_WS_Unsubscribe,
XinZhangMS 0:f7f1f0d76dd6 252 IoTHubTransportMqtt_WS_DoWork,
XinZhangMS 0:f7f1f0d76dd6 253 IoTHubTransportMqtt_WS_SetRetryPolicy,
XinZhangMS 0:f7f1f0d76dd6 254 IoTHubTransportMqtt_WS_GetSendStatus,
XinZhangMS 0:f7f1f0d76dd6 255 IoTHubTransportMqtt_WS_Subscribe_InputQueue,
XinZhangMS 0:f7f1f0d76dd6 256 IoTHubTransportMqtt_WS_Unsubscribe_InputQueue
XinZhangMS 0:f7f1f0d76dd6 257 };
XinZhangMS 0:f7f1f0d76dd6 258
XinZhangMS 0:f7f1f0d76dd6 259 const TRANSPORT_PROVIDER* MQTT_WebSocket_Protocol(void)
XinZhangMS 0:f7f1f0d76dd6 260 {
XinZhangMS 0:f7f1f0d76dd6 261 return &thisTransportProvider_WebSocketsOverTls;
XinZhangMS 0:f7f1f0d76dd6 262 }