Config support for websockets.
This commit is contained in:
parent
9ea161f90e
commit
7316742cf4
@ -651,6 +651,15 @@
|
||||
<para>Not reloaded on reload signal.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>protocol</option> <replaceable>value</replaceable></term>
|
||||
<listitem>
|
||||
<para>Set the protocol to accept for this listener. Can
|
||||
be <option>mqtt</option>, the default, or
|
||||
<option>websockets</option> if available.</para>
|
||||
<para>Not reloaded on reload signal.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect2>
|
||||
<refsect2>
|
||||
|
@ -143,6 +143,10 @@
|
||||
# connections possible is around 1024.
|
||||
#max_connections -1
|
||||
|
||||
# Choose the protocol to use when listening.
|
||||
# This can be either mqtt or websockets.
|
||||
#protocol mqtt
|
||||
|
||||
# -----------------------------------------------------------------
|
||||
# Certificate based SSL/TLS support
|
||||
# -----------------------------------------------------------------
|
||||
@ -265,6 +269,10 @@
|
||||
# happens internally to the broker; the client will not see the prefix.
|
||||
#mount_point
|
||||
|
||||
# Choose the protocol to use when listening.
|
||||
# This can be either mqtt or websockets.
|
||||
#protocol mqtt
|
||||
|
||||
# -----------------------------------------------------------------
|
||||
# Certificate based SSL/TLS support
|
||||
# -----------------------------------------------------------------
|
||||
|
28
src/conf.c
28
src/conf.c
@ -177,6 +177,7 @@ void mqtt3_config_init(struct mqtt3_config *config)
|
||||
config->default_listener.socks = NULL;
|
||||
config->default_listener.sock_count = 0;
|
||||
config->default_listener.client_count = 0;
|
||||
config->default_listener.protocol = mp_mqtt;
|
||||
#ifdef WITH_TLS
|
||||
config->default_listener.tls_version = NULL;
|
||||
config->default_listener.cafile = NULL;
|
||||
@ -373,7 +374,8 @@ int mqtt3_config_parse_args(struct mqtt3_config *config, int argc, char *argv[])
|
||||
|| config->default_listener.host
|
||||
|| config->default_listener.port
|
||||
|| config->default_listener.max_connections != -1
|
||||
|| config->default_listener.mount_point){
|
||||
|| config->default_listener.mount_point
|
||||
|| config->default_listener.protocol != mp_mqtt){
|
||||
|
||||
config->listener_count++;
|
||||
config->listeners = _mosquitto_realloc(config->listeners, sizeof(struct _mqtt3_listener)*config->listener_count);
|
||||
@ -397,6 +399,7 @@ int mqtt3_config_parse_args(struct mqtt3_config *config, int argc, char *argv[])
|
||||
config->listeners[config->listener_count-1].mount_point = NULL;
|
||||
}
|
||||
config->listeners[config->listener_count-1].max_connections = config->default_listener.max_connections;
|
||||
config->listeners[config->listener_count-1].protocol = config->default_listener.protocol;
|
||||
config->listeners[config->listener_count-1].client_count = 0;
|
||||
config->listeners[config->listener_count-1].socks = NULL;
|
||||
config->listeners[config->listener_count-1].sock_count = 0;
|
||||
@ -1129,6 +1132,7 @@ int _config_read_file(struct mqtt3_config *config, bool reload, const char *file
|
||||
}
|
||||
cur_listener = &config->listeners[config->listener_count-1];
|
||||
memset(cur_listener, 0, sizeof(struct _mqtt3_listener));
|
||||
cur_listener->protocol = mp_mqtt;
|
||||
cur_listener->port = port_tmp;
|
||||
token = strtok_r(NULL, " ", &saveptr);
|
||||
if(token){
|
||||
@ -1375,6 +1379,28 @@ int _config_read_file(struct mqtt3_config *config, bool reload, const char *file
|
||||
return MOSQ_ERR_INVAL;
|
||||
}
|
||||
config->default_listener.port = port_tmp;
|
||||
}else if(!strcmp(token, "protocol")){
|
||||
token = strtok_r(NULL, " ", &saveptr);
|
||||
if(token){
|
||||
if(!strcmp(token, "mqtt")){
|
||||
cur_listener->protocol = mp_mqtt;
|
||||
/*
|
||||
}else if(!strcmp(token, "mqttsn")){
|
||||
cur_listener->protocol = mp_mqttsn;
|
||||
*/
|
||||
}else if(!strcmp(token, "websockets")){
|
||||
#ifdef WITH_WEBSOCKETS
|
||||
cur_listener->protocol = mp_websockets;
|
||||
#else
|
||||
_mosquitto_log_printf(NULL, MOSQ_LOG_WARNING, "Warning: Websockets support not available.");
|
||||
#endif
|
||||
}else{
|
||||
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid protocol value (%s).", token);
|
||||
return MOSQ_ERR_INVAL;
|
||||
}
|
||||
}else{
|
||||
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Empty protocol value in configuration.");
|
||||
}
|
||||
}else if(!strcmp(token, "psk_file")){
|
||||
#ifdef REAL_WITH_TLS_PSK
|
||||
if(reload){
|
||||
|
@ -259,26 +259,8 @@ int main(int argc, char *argv[])
|
||||
listener_max = -1;
|
||||
listensock_index = 0;
|
||||
for(i=0; i<config.listener_count; i++){
|
||||
if(mqtt3_socket_listen(&config.listeners[i])){
|
||||
_mosquitto_free(int_db.contexts);
|
||||
mqtt3_db_close(&int_db);
|
||||
if(config.pid_file){
|
||||
remove(config.pid_file);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
listensock_count += config.listeners[i].sock_count;
|
||||
listensock = _mosquitto_realloc(listensock, sizeof(int)*listensock_count);
|
||||
if(!listensock){
|
||||
_mosquitto_free(int_db.contexts);
|
||||
mqtt3_db_close(&int_db);
|
||||
if(config.pid_file){
|
||||
remove(config.pid_file);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
for(j=0; j<config.listeners[i].sock_count; j++){
|
||||
if(config.listeners[i].socks[j] == INVALID_SOCKET){
|
||||
if(config.listeners[i].protocol == mp_mqtt){
|
||||
if(mqtt3_socket_listen(&config.listeners[i])){
|
||||
_mosquitto_free(int_db.contexts);
|
||||
mqtt3_db_close(&int_db);
|
||||
if(config.pid_file){
|
||||
@ -286,11 +268,35 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
listensock[listensock_index] = config.listeners[i].socks[j];
|
||||
if(listensock[listensock_index] > listener_max){
|
||||
listener_max = listensock[listensock_index];
|
||||
listensock_count += config.listeners[i].sock_count;
|
||||
listensock = _mosquitto_realloc(listensock, sizeof(int)*listensock_count);
|
||||
if(!listensock){
|
||||
_mosquitto_free(int_db.contexts);
|
||||
mqtt3_db_close(&int_db);
|
||||
if(config.pid_file){
|
||||
remove(config.pid_file);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
listensock_index++;
|
||||
for(j=0; j<config.listeners[i].sock_count; j++){
|
||||
if(config.listeners[i].socks[j] == INVALID_SOCKET){
|
||||
_mosquitto_free(int_db.contexts);
|
||||
mqtt3_db_close(&int_db);
|
||||
if(config.pid_file){
|
||||
remove(config.pid_file);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
listensock[listensock_index] = config.listeners[i].socks[j];
|
||||
if(listensock[listensock_index] > listener_max){
|
||||
listener_max = listensock[listensock_index];
|
||||
}
|
||||
listensock_index++;
|
||||
}
|
||||
}else if(config.listeners[i].protocol == mp_websockets){
|
||||
#ifdef WITH_WEBSOCKETS
|
||||
config.listeners[i].ws_context = mosq_websockets_init(config.listeners[i].port);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,12 @@ Contributors:
|
||||
#define MQTT3_LOG_TOPIC 0x10
|
||||
#define MQTT3_LOG_ALL 0xFF
|
||||
|
||||
enum mosquitto_protocol {
|
||||
mp_mqtt,
|
||||
mp_mqttsn,
|
||||
mp_websockets
|
||||
};
|
||||
|
||||
typedef uint64_t dbid_t;
|
||||
|
||||
struct _mqtt3_listener {
|
||||
@ -50,6 +56,7 @@ struct _mqtt3_listener {
|
||||
int *socks;
|
||||
int sock_count;
|
||||
int client_count;
|
||||
enum mosquitto_protocol protocol;
|
||||
#ifdef WITH_TLS
|
||||
char *cafile;
|
||||
char *capath;
|
||||
@ -63,6 +70,9 @@ struct _mqtt3_listener {
|
||||
bool use_identity_as_username;
|
||||
char *tls_version;
|
||||
#endif
|
||||
#ifdef WITH_WEBSOCKETS
|
||||
struct libwebsocket_context *ws_context;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct mqtt3_config {
|
||||
|
Loading…
Reference in New Issue
Block a user