Skip to content

Commit 29625f5

Browse files
author
tedazhao
committed
fea: add mqtt over websocket; modify remote ssh; modify wslay event frame buf 4096 --> 512
1 parent baa3935 commit 29625f5

21 files changed

+876
-271
lines changed

CMakeLists.txt

+16-4
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ set(FEATURE_AUTH_MODE "KEY")
5555
# Whether access authentication uses TLS, certificate authentication must use TLS, key authentication can choose not to use TLS
5656
set(FEATURE_AUTH_WITH_NOTLS ON)
5757

58+
# 是否打开 WEBSOCKET MQTT 功能
59+
# Whether to turn on Master Switch for the websocket-mqtt
60+
set(FEATURE_WEBSOCKET_MQTT OFF)
61+
5862
# 是否打开多线程功能支持
5963
# Whether to turn on multi-threading support
6064
set(FEATURE_MULTITHREAD_ENABLED ON)
@@ -123,9 +127,10 @@ set(FEATURE_RESOURCE_SIGNAL_CHANNEL "MQTT")
123127
# Whether to use HTTPS for resource manage
124128
set(FEATURE_RESOURCE_USE_HTTPS ON)
125129

126-
# 是否打开远程登录 SSH 功能
130+
# 是否打开远程登录 WEBSOCKET SSH 功能
127131
# Whether to turn on Master Switch for the remote login ssh
128-
set(FEATURE_REMOTE_LOGIN_SSH ON)
132+
set(FEATURE_REMOTE_LOGIN_WEBSOCKET_SSH OFF)
133+
129134
######################CONFIG END######################################
130135

131136
# 设置CMAKE使用编译工具及编译选项
@@ -198,7 +203,8 @@ option(AT_TCP_ENABLED "Enable AT_TCP" ${FEATURE_AT_TCP_ENABLED})
198203
option(BROADCAST_ENABLED "Enable BROADCAST" ${FEATURE_BROADCAST_ENABLED})
199204
option(RRPC_ENABLED "Enable RRPC" ${FEATURE_RRPC_ENABLED})
200205
option(REMOTE_CONFIG_MQTT "Enable REMOTE_CONFIG_MQTT" ${FEATURE_REMOTE_CONFIG_MQTT_ENABLED})
201-
option(REMOTE_LOGIN_SSH "Enable REMOTE_LOGIN_SSH" ${FEATURE_REMOTE_LOGIN_SSH})
206+
option(REMOTE_LOGIN_WEBSOCKET_SSH "Enable REMOTE_LOGIN_WEBSOCKET_SSH" ${FEATURE_REMOTE_LOGIN_WEBSOCKET_SSH})
207+
option(WEBSOCKET_MQTT "Enable WEBSOCKET_MQTT" ${FEATURE_WEBSOCKET_MQTT})
202208

203209
if (${FEATURE_AUTH_WITH_NOTLS} STREQUAL "OFF")
204210
if (${FEATURE_OTA_USE_HTTPS} STREQUAL "ON")
@@ -220,6 +226,12 @@ else()
220226
option(AT_DEBUG "Enable AT_DEBUG" OFF)
221227
endif()
222228

229+
if(${FEATURE_WEBSOCKET_MQTT} STREQUAL "ON" OR ${FEATURE_REMOTE_LOGIN_WEBSOCKET_SSH} STREQUAL "ON")
230+
option(WEBSOCKET_CLIENT "Enable WEBSOCKET_CLIENT" "ON")
231+
else()
232+
option(WEBSOCKET_CLIENT "Enable WEBSOCKET_CLIENT" "OFF")
233+
endif()
234+
223235
configure_file (
224236
"${PROJECT_SOURCE_DIR}/tools/cmake_scripts/config.h.in"
225237
"${PROJECT_SOURCE_DIR}/include/config.h"
@@ -265,7 +277,7 @@ if(NOT DEFINED SAMPLE_ONLY)
265277
add_subdirectory(${PROJECT_SOURCE_DIR}/sdk_src)
266278
add_subdirectory(${PROJECT_SOURCE_DIR}/platform)
267279
add_subdirectory(${PROJECT_SOURCE_DIR}/external_libs/mbedtls)
268-
if(${FEATURE_REMOTE_LOGIN_SSH} STREQUAL "ON")
280+
if(${WEBSOCKET_CLIENT} STREQUAL "ON")
269281
add_subdirectory(${PROJECT_SOURCE_DIR}/external_libs/wslay)
270282
endif()
271283
endif()

external_libs/wslay/lib/wslay_event.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ struct wslay_event_context {
126126
/* The sum of message length in send_queue */
127127
size_t queued_msg_length;
128128
/* Buffer used for fragmented messages */
129-
uint8_t obuf[4096];
129+
uint8_t obuf[512];
130130
uint8_t *obuflimit;
131131
uint8_t *obufmark;
132132
/* payload length of frame currently being sent. */

external_libs/wslay/lib/wslay_frame.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ struct wslay_frame_opcode_memo {
4949
};
5050

5151
struct wslay_frame_context {
52-
uint8_t ibuf[4096];
52+
uint8_t ibuf[512];
5353
uint8_t * ibufmark;
5454
uint8_t * ibuflimit;
5555
struct wslay_frame_opcode_memo iom;

platform/tls/mbedtls/HAL_TLS_mbedtls.c

+14
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ extern "C" {
3131
#include "mbedtls/net_sockets.h"
3232
#include "mbedtls/ssl.h"
3333
#include "mbedtls/sha256.h"
34+
#include "mbedtls/debug.h"
3435

3536
#include "qcloud_iot_export_error.h"
3637
#include "qcloud_iot_export_log.h"
@@ -141,6 +142,15 @@ static void _free_mebedtls(TLSDataParams *pParams)
141142
HAL_Free(pParams);
142143
}
143144

145+
#if defined(MBEDTLS_DEBUG_C)
146+
#define DEBUG_LEVEL 0
147+
static void _ssl_debug(void *ctx, int level, const char *file, int line, const char *str)
148+
{
149+
Log_i("[mbedTLS]:[%s]:[%d]: %s\r\n", STRING_PTR_PRINT_SANITY_CHECK(file), line, STRING_PTR_PRINT_SANITY_CHECK(str));
150+
}
151+
152+
#endif
153+
144154
/**
145155
* @brief mbedtls SSL client init
146156
*
@@ -163,6 +173,10 @@ static int _mbedtls_client_init(TLSDataParams *pDataParams, TLSConnectParams *pC
163173
mbedtls_x509_crt_init(&(pDataParams->client_cert));
164174
mbedtls_pk_init(&(pDataParams->private_key));
165175

176+
#if defined(MBEDTLS_DEBUG_C)
177+
mbedtls_debug_set_threshold(DEBUG_LEVEL);
178+
mbedtls_ssl_conf_dbg(&pDataParams->ssl_conf, _ssl_debug, NULL);
179+
#endif
166180
mbedtls_entropy_init(&(pDataParams->entropy));
167181
// custom parameter is NULL for now
168182
if ((ret = mbedtls_ctr_drbg_seed(&(pDataParams->ctr_drbg), mbedtls_entropy_func, &(pDataParams->entropy), NULL,

samples/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ set(link_lib
1919
)
2020
endif()
2121

22-
if(REMOTE_LOGIN_SSH STREQUAL "ON")
22+
if(WEBSOCKET_CLIENT STREQUAL "ON")
2323
set(link_lib ${link_lib} wslay)
2424
endif()
2525

sdk_src/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ set(src_sdk ${src_utils})
77
if(${FEATURE_MQTT_COMM_ENABLED} STREQUAL "ON")
88
# mqtt
99
file(GLOB src_mqtt ${CMAKE_CURRENT_SOURCE_DIR}/protocol/mqtt/*.c)
10-
list(APPEND src_sdk ${src_mqtt})
10+
file(GLOB src_websocket ${CMAKE_CURRENT_SOURCE_DIR}/protocol/websocket/*.c)
11+
list(APPEND src_sdk ${src_mqtt} ${src_websocket})
1112

1213
# shadow
1314
if(${FEATURE_MQTT_DEVICE_SHADOW} STREQUAL "ON")

sdk_src/internal_inc/mqtt_client.h

+10-3
Original file line numberDiff line numberDiff line change
@@ -137,21 +137,28 @@ typedef struct {
137137

138138
uint8_t auto_connect_enable; // enable auto connection or not
139139

140-
#ifdef AUTH_WITH_NOTLS
140+
#if defined(AUTH_WITH_NOTLS) || (defined(WEBSOCKET_MQTT) && defined(AUTH_MODE_KEY))
141141
char *device_secret; // PSK
142142
int device_secret_len; // length of PSK
143+
#elif defined(WEBSOCKET_MQTT) && defined(AUTH_MODE_CERT)
144+
char *private_key_file_path; // device private key
143145
#endif
144-
145146
} MQTTConnectParams;
146147

147148
/**
148149
* default value of MQTT connect parameters structure
149150
*/
150-
#ifdef AUTH_WITH_NOTLS
151+
#if defined(AUTH_WITH_NOTLS) || (defined(WEBSOCKET_MQTT) && defined(AUTH_MODE_KEY))
151152
#define DEFAULT_MQTTCONNECT_PARAMS \
152153
{ \
153154
NULL, NULL, NULL, {0}, {'M', 'Q', 'T', 'C'}, 0, 4, 240, 1, 1, NULL, 0 \
154155
}
156+
#elif defined(WEBSOCKET_MQTT) && defined(AUTH_MODE_CERT)
157+
#define DEFAULT_MQTTCONNECT_PARAMS \
158+
{ \
159+
NULL, NULL, NULL, {0}, {'M', 'Q', 'T', 'C'}, 0, 4, 240, 1, 1, NULL \
160+
}
161+
155162
#else
156163
#define DEFAULT_MQTTCONNECT_PARAMS \
157164
{ \

sdk_src/internal_inc/network_interface.h

+17-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,13 @@ extern "C" {
2929
* Type of network interface
3030
*/
3131

32-
typedef enum { NETWORK_TCP = 0, NETWORK_UDP = 1, NETWORK_TLS = 2, NETWORK_DTLS = 3 } NETWORK_TYPE;
32+
typedef enum {
33+
NETWORK_TCP = 0,
34+
NETWORK_UDP = 1,
35+
NETWORK_TLS = 2,
36+
NETWORK_DTLS = 3,
37+
NETWORK_WS_MQTT = 4,
38+
} NETWORK_TYPE;
3339

3440
/**
3541
* @brief Define structure for network stack
@@ -121,6 +127,16 @@ int network_dtls_init(Network *pNetwork);
121127
#endif
122128
#endif
123129

130+
#ifdef WEBSOCKET_MQTT
131+
int network_websocket_mqtt_read(Network *pNetwork, unsigned char *data, size_t datalen, uint32_t timeout_ms,
132+
size_t *read_len);
133+
int network_websocket_mqtt_write(Network *pNetwork, unsigned char *data, size_t datalen, uint32_t timeout_ms,
134+
size_t *written_len);
135+
void network_websocket_mqtt_disconnect(Network *pNetwork);
136+
int network_websocket_mqtt_connect(Network *pNetwork);
137+
int network_websocket_mqtt_init(Network *pNetwork);
138+
#endif
139+
124140
#ifdef __cplusplus
125141
}
126142
#endif

sdk_src/internal_inc/qcloud_iot_ca.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,23 @@ extern "C" {
2222

2323
const char *iot_ca_get(void);
2424

25-
const char *iot_dynreg_https_ca_get();
25+
const char *iot_dynreg_https_ca_get(void);
2626

2727
const char *iot_https_ca_get(void);
2828

2929
const char *iot_wss_ssh_ca_get(void);
3030

31+
const char *iot_wss_mqtt_ca_get(void);
32+
3133
const char *iot_get_mqtt_domain(const char *region);
3234

35+
int iot_get_mqtt_port(void);
36+
3337
const char *iot_get_coap_domain(const char *region);
3438

3539
const char *iot_get_dyn_reg_domain(const char *region);
3640

37-
const char *iot_get_log_domain(const char *region);
41+
const char *iot_get_ws_ssh_domain(const char *region);
3842

3943
const char *iot_get_ssh_domain(const char *region);
4044

sdk_src/internal_inc/qcloud_iot_common.h

+16-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#define QCLOUD_IOT_DEVICE_SDK_APPID "21010406"
2121
#define QCLOUD_IOT_DEVICE_SDK_APPID_LEN (sizeof(QCLOUD_IOT_DEVICE_SDK_APPID) - 1)
2222

23+
#define QCLOUD_IOT_MQTT_DOMAIN_WITH_PREFIX 1
24+
2325
/* MQTT server domain */
2426
#define QCLOUD_IOT_MQTT_COAP_DIRECT_DOMAIN "iotcloud.tencentdevices.com"
2527
#define QCLOUD_IOT_MQTT_COAP_US_EAST_DOMAIN "us-east.iotcloud.tencentdevices.com"
@@ -31,6 +33,15 @@
3133

3234
#define COAP_SERVER_PORT 5684
3335

36+
/* WEBSOCKET MQTT server domain */
37+
#define QCLOUD_IOT_WEBSOCKET_MQTT_DIRECT_DOMAIN "ap-guangzhou.iothub.tencentdevices.com"//"console.iotprivate.tencentcs.com/iotwss"
38+
#define QCLOUD_IOT_WEBSOCKET_MQTT_US_EAST_DOMAIN "us-east.iothub.tencentdevices.com"
39+
#define QCLOUD_IOT_WEBSOCKET_MQTT_EUROPE_DOMAIN "europe.iothub.tencentdevices.com"
40+
#define QCLOUD_IOT_WEBSOCKET_MQTT_AP_BANGKOK_DOMAIN "ap-bangkok.iothub.tencentdevices.com"
41+
42+
#define QCLOUD_IOT_WEBSOCKET_MQTT_SERVER_PORT_TLS 443
43+
#define QCLOUD_IOT_WEBSOCKET_MQTT_SERVER_PORT_NOTLS 80
44+
3445
/* server domain for dynamic registering device */
3546
#define DYNREG_LOG_SERVER_URL "ap-guangzhou.gateway.tencentdevices.com"
3647
#define DYNREG_LOG_SERVER_US_EAST_URL "us-east.gateway.tencentdevices.com"
@@ -45,7 +56,11 @@
4556
#define UPLOAD_LOG_URI_PATH "/device/reportlog"
4657
#define LOG_UPLOAD_SERVER_PORT 80
4758

48-
#define REMOTE_WS_SSH_PATH "/ssh/device"
59+
#define REMOTE_LOGIN_WEBSOCKET_SSH_URL "ap-guangzhou.gateway.tencentdevices.com/ssh/device"
60+
#define REMOTE_LOGIN_WEBSOCKET_SSH_US_EAST_URL "us-east.gateway.tencentdevices.com/ssh/device"
61+
#define REMOTE_LOGIN_WEBSOCKET_SSH_EUROPE_URL "europe.gateway.tencentdevices.com/ssh/device"
62+
#define REMOTE_LOGIN_WEBSOCKET_SSH_AP_BANGKOK_URL "ap-bangkok.gateway.tencentdevices.com/ssh/device"
63+
4964
#define LOCAL_SSH_PORT 22
5065
#define LOCAL_SSH_IP "127.0.0.1"
5166

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Tencent is pleased to support the open source community by making IoT Hub available.
3+
* Copyright (C) 2018-2020 THL A29 Limited, a Tencent company. All rights reserved.
4+
5+
* Licensed under the MIT License (the "License"); you may not use this file except in
6+
* compliance with the License. You may obtain a copy of the License at
7+
* http://opensource.org/licenses/MIT
8+
9+
* Unless required by applicable law or agreed to in writing, software distributed under the License is
10+
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11+
* either express or implied. See the License for the specific language governing permissions and
12+
* limitations under the License.
13+
*
14+
*/
15+
16+
#ifndef UTILS_WEBSOCKET_CLIENT_H_
17+
#define UTILS_WEBSOCKET_CLIENT_H_
18+
19+
#ifdef __cplusplus
20+
extern "C" {
21+
#endif
22+
23+
typedef struct {
24+
void *userdata;
25+
void (*recv_data_err)(void *iotwsctx);
26+
void (*send_data_err)(void *iotwsctx);
27+
void (*proc_recv_msg_callback)(char *data, int datalen, void *iotwsctx);
28+
void * wslay_ctx;
29+
Network network_stack;
30+
} UtilsIotWSClientCtx;
31+
32+
int Utils_WSClient_connect(const char *protocol, UtilsIotWSClientCtx *ctx, const char *ws_custom_header);
33+
int Utils_WSClient_send(UtilsIotWSClientCtx *ctx, char *data, int data_len);
34+
int Utils_WSClient_recv(UtilsIotWSClientCtx *ctx);
35+
void Utils_WSClient_disconn(UtilsIotWSClientCtx *ctx);
36+
37+
#ifdef __cplusplus
38+
}
39+
#endif
40+
41+
#endif /* UTILS_WEBSOCKET_CLIENT_H_ */

sdk_src/network/network_interface.c

+12
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,18 @@ int network_init(Network *pNetwork)
9898
pNetwork->handle = 0;
9999
break;
100100
#endif
101+
#endif
102+
103+
#ifdef WEBSOCKET_MQTT
104+
case NETWORK_WS_MQTT:
105+
pNetwork->init = network_websocket_mqtt_init;
106+
pNetwork->connect = network_websocket_mqtt_connect;
107+
pNetwork->read = network_websocket_mqtt_read;
108+
pNetwork->write = network_websocket_mqtt_write;
109+
pNetwork->disconnect = network_websocket_mqtt_disconnect;
110+
pNetwork->is_connected = is_network_connected;
111+
pNetwork->handle = 0;
112+
break;
101113
#endif
102114
default:
103115
Log_e("unknown network type: %d", pNetwork->type);

0 commit comments

Comments
 (0)