Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
iothub_client/src/iothubtransportmqtt_websockets.c@0:f7f1f0d76dd6, 2018-08-23 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |