Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
MQTTnet
提交
262a4681
MQTTnet
项目概览
dotNET Platform
/
MQTTnet
11 个月 前同步成功
通知
0
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MQTTnet
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
262a4681
编写于
8月 03, 2022
作者:
C
Christian
浏览文件
操作
浏览文件
下载
差异文件
Merge branch '1291-access-client-status-in-client-disconnected-handler'
上级
ad546ada
29a9941d
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
241 addition
and
187 deletion
+241
-187
.github/workflows/ReleaseNotes.md
.github/workflows/ReleaseNotes.md
+1
-0
Source/MQTTnet/Server/Events/ApplicationMessageNotConsumedEventArgs.cs
...t/Server/Events/ApplicationMessageNotConsumedEventArgs.cs
+8
-2
Source/MQTTnet/Server/Events/ClientConnectedEventArgs.cs
Source/MQTTnet/Server/Events/ClientConnectedEventArgs.cs
+25
-10
Source/MQTTnet/Server/Events/ClientDisconnectedEventArgs.cs
Source/MQTTnet/Server/Events/ClientDisconnectedEventArgs.cs
+20
-6
Source/MQTTnet/Server/Events/ClientSubscribedTopicEventArgs.cs
...e/MQTTnet/Server/Events/ClientSubscribedTopicEventArgs.cs
+20
-7
Source/MQTTnet/Server/Events/ClientUnsubscribedTopicEventArgs.cs
...MQTTnet/Server/Events/ClientUnsubscribedTopicEventArgs.cs
+20
-7
Source/MQTTnet/Server/Events/InterceptingPacketEventArgs.cs
Source/MQTTnet/Server/Events/InterceptingPacketEventArgs.cs
+27
-12
Source/MQTTnet/Server/Events/InterceptingPublishEventArgs.cs
Source/MQTTnet/Server/Events/InterceptingPublishEventArgs.cs
+11
-3
Source/MQTTnet/Server/Events/InterceptingSubscriptionEventArgs.cs
...QTTnet/Server/Events/InterceptingSubscriptionEventArgs.cs
+16
-4
Source/MQTTnet/Server/Events/InterceptingUnsubscriptionEventArgs.cs
...Tnet/Server/Events/InterceptingUnsubscriptionEventArgs.cs
+12
-4
Source/MQTTnet/Server/Events/RetainedMessageChangedEventArgs.cs
.../MQTTnet/Server/Events/RetainedMessageChangedEventArgs.cs
+12
-5
Source/MQTTnet/Server/Events/SessionDeletedEventArgs.cs
Source/MQTTnet/Server/Events/SessionDeletedEventArgs.cs
+14
-2
Source/MQTTnet/Server/Internal/MqttClient.cs
Source/MQTTnet/Server/Internal/MqttClient.cs
+9
-31
Source/MQTTnet/Server/Internal/MqttClientSessionsManager.cs
Source/MQTTnet/Server/Internal/MqttClientSessionsManager.cs
+12
-32
Source/MQTTnet/Server/Internal/MqttClientSubscriptionsManager.cs
...MQTTnet/Server/Internal/MqttClientSubscriptionsManager.cs
+4
-27
Source/MQTTnet/Server/Internal/MqttRetainedMessagesManager.cs
...ce/MQTTnet/Server/Internal/MqttRetainedMessagesManager.cs
+1
-7
Source/MQTTnet/Server/MqttServer.cs
Source/MQTTnet/Server/MqttServer.cs
+29
-28
未找到文件。
.github/workflows/ReleaseNotes.md
浏览文件 @
262a4681
...
...
@@ -4,3 +4,4 @@
*
[Server] Added a new event (_ClientAcknowledgedPublishPacketAsync_) which is fired whenever a client acknowledges a PUBLISH packet (QoS 1 and 2, #487).
*
[Server] Exposed channel adapter (HTTP context etc.) in connection validation (#1125).
*
[Server] The event _InterceptingPublishAsync_ is now also called for injected application messages (#Jeanot-Zubler).
*
[Server] Exposed session items in multipe events (#1291).
Source/MQTTnet/Server/Events/ApplicationMessageNotConsumedEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -8,14 +8,20 @@ namespace MQTTnet.Server
{
public
sealed
class
ApplicationMessageNotConsumedEventArgs
:
EventArgs
{
public
ApplicationMessageNotConsumedEventArgs
(
MqttApplicationMessage
applicationMessage
,
string
senderId
)
{
ApplicationMessage
=
applicationMessage
??
throw
new
ArgumentNullException
(
nameof
(
applicationMessage
));
SenderId
=
senderId
;
}
/// <summary>
/// Gets the application message which was not consumed by any client.
/// </summary>
public
MqttApplicationMessage
ApplicationMessage
{
get
;
internal
set
;
}
public
MqttApplicationMessage
ApplicationMessage
{
get
;
}
/// <summary>
/// Gets the ID of the client which has sent the affected application message.
/// </summary>
public
string
SenderId
{
get
;
internal
set
;
}
public
string
SenderId
{
get
;
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/ClientConnectedEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -3,31 +3,46 @@
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections
;
using
MQTTnet.Formatter
;
namespace
MQTTnet.Server
{
public
sealed
class
ClientConnectedEventArgs
:
EventArgs
{
public
ClientConnectedEventArgs
(
string
clientId
,
string
userName
,
MqttProtocolVersion
protocolVersion
,
string
endpoint
,
IDictionary
sessionItems
)
{
ClientId
=
clientId
??
throw
new
ArgumentNullException
(
nameof
(
clientId
));
UserName
=
userName
;
ProtocolVersion
=
protocolVersion
;
Endpoint
=
endpoint
;
SessionItems
=
sessionItems
??
throw
new
ArgumentNullException
(
nameof
(
sessionItems
));
}
/// <summary>
/// Gets the client identifier of the connected client.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// </summary>
public
string
ClientId
{
get
;
}
/// <summary>
/// Gets the client identifier of the connected client.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// Gets the endpoint of the connected client.
/// </summary>
public
string
ClientId
{
get
;
internal
s
et
;
}
public
string
Endpoint
{
g
et
;
}
/// <summary>
///
Gets the user name of
the connected client.
///
Gets the protocol version which is used by
the connected client.
/// </summary>
public
string
UserName
{
get
;
internal
s
et
;
}
public
MqttProtocolVersion
ProtocolVersion
{
g
et
;
}
/// <summary>
///
Gets the protocol version which is used by the connected client
.
///
Gets or sets a key/value collection that can be used to share data within the scope of this session
.
/// </summary>
public
MqttProtocolVersion
ProtocolVersion
{
get
;
internal
s
et
;
}
public
IDictionary
SessionItems
{
g
et
;
}
/// <summary>
///
Gets the endpoint
of the connected client.
///
Gets the user name
of the connected client.
/// </summary>
public
string
Endpoint
{
get
;
internal
s
et
;
}
public
string
UserName
{
g
et
;
}
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/ClientDisconnectedEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -3,19 +3,33 @@
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections
;
namespace
MQTTnet.Server
{
public
sealed
class
ClientDisconnectedEventArgs
:
EventArgs
{
public
ClientDisconnectedEventArgs
(
string
clientId
,
MqttClientDisconnectType
disconnectType
,
string
endpoint
,
IDictionary
sessionItems
)
{
ClientId
=
clientId
??
throw
new
ArgumentNullException
(
nameof
(
clientId
));
DisconnectType
=
disconnectType
;
Endpoint
=
endpoint
;
SessionItems
=
sessionItems
??
throw
new
ArgumentNullException
(
nameof
(
sessionItems
));
}
/// <summary>
/// Gets the client identifier.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
///
Gets the client identifier.
///
Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// </summary>
public
string
ClientId
{
get
;
internal
set
;
}
public
string
ClientId
{
get
;
}
public
MqttClientDisconnectType
DisconnectType
{
get
;
}
public
MqttClientDisconnectType
DisconnectType
{
get
;
internal
s
et
;
}
public
string
Endpoint
{
g
et
;
}
public
string
Endpoint
{
get
;
internal
set
;
}
/// <summary>
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
/// </summary>
public
IDictionary
SessionItems
{
get
;
}
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/ClientSubscribedTopicEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -3,22 +3,35 @@
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections
;
using
MQTTnet.Packets
;
namespace
MQTTnet.Server
{
public
sealed
class
ClientSubscribedTopicEventArgs
:
EventArgs
{
public
ClientSubscribedTopicEventArgs
(
string
clientId
,
MqttTopicFilter
topicFilter
,
IDictionary
sessionItems
)
{
ClientId
=
clientId
??
throw
new
ArgumentNullException
(
nameof
(
clientId
));
TopicFilter
=
topicFilter
??
throw
new
ArgumentNullException
(
nameof
(
topicFilter
));
SessionItems
=
sessionItems
??
throw
new
ArgumentNullException
(
nameof
(
sessionItems
));
}
/// <summary>
/// Gets the client identifier.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// </summary>
public
string
ClientId
{
get
;
}
/// <summary>
/// Gets the client identifier.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
/// </summary>
public
string
ClientId
{
get
;
internal
s
et
;
}
public
IDictionary
SessionItems
{
g
et
;
}
/// <summary>
/// Gets the topic filter.
/// The topic filter can contain topics and wildcards.
///
Gets the topic filter.
///
The topic filter can contain topics and wildcards.
/// </summary>
public
MqttTopicFilter
TopicFilter
{
get
;
internal
set
;
}
public
MqttTopicFilter
TopicFilter
{
get
;
}
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/ClientUnsubscribedTopicEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -3,21 +3,34 @@
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections
;
namespace
MQTTnet.Server
{
public
sealed
class
ClientUnsubscribedTopicEventArgs
:
EventArgs
{
public
ClientUnsubscribedTopicEventArgs
(
string
clientId
,
string
topicFilter
,
IDictionary
sessionItems
)
{
ClientId
=
clientId
??
throw
new
ArgumentNullException
(
nameof
(
clientId
));
TopicFilter
=
topicFilter
??
throw
new
ArgumentNullException
(
nameof
(
topicFilter
));
SessionItems
=
sessionItems
??
throw
new
ArgumentNullException
(
nameof
(
sessionItems
));
}
/// <summary>
/// Gets the client identifier.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// </summary>
public
string
ClientId
{
get
;
}
/// <summary>
/// Gets the client identifier.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
/// </summary>
public
string
ClientId
{
get
;
internal
s
et
;
}
public
IDictionary
SessionItems
{
g
et
;
}
/// <summary>
/// Gets or sets the topic filter.
/// The topic filter can contain topics and wildcards.
///
Gets or sets the topic filter.
///
The topic filter can contain topics and wildcards.
/// </summary>
public
string
TopicFilter
{
get
;
internal
set
;
}
public
string
TopicFilter
{
get
;
}
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/InterceptingPacketEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections
;
using
System.Threading
;
using
MQTTnet.Packets
;
...
...
@@ -10,30 +11,44 @@ namespace MQTTnet.Server
{
public
sealed
class
InterceptingPacketEventArgs
:
EventArgs
{
public
InterceptingPacketEventArgs
(
CancellationToken
cancellationToken
,
string
clientId
,
string
endpoint
,
MqttPacket
packet
,
IDictionary
sessionItems
)
{
CancellationToken
=
cancellationToken
;
ClientId
=
clientId
??
throw
new
ArgumentNullException
(
nameof
(
clientId
));
Endpoint
=
endpoint
;
Packet
=
packet
??
throw
new
ArgumentNullException
(
nameof
(
packet
));
SessionItems
=
sessionItems
;
}
/// <summary>
/// Gets the client ID which has sent the packet or will receive the packet.
/// Gets the cancellation token from the connection managing thread.
/// Use this in further event processing.
/// </summary>
public
string
ClientId
{
get
;
internal
s
et
;
}
public
CancellationToken
CancellationToken
{
g
et
;
}
/// <summary>
///
Gets the endpoint of the sending or receiving clien
t.
///
Gets the client ID which has sent the packet or will receive the packe
t.
/// </summary>
public
string
Endpoint
{
get
;
internal
s
et
;
}
public
string
ClientId
{
g
et
;
}
/// <summary>
/// Gets or sets the MQTT packet which was received or will be sent.
/// Gets the endpoint of the sending or receiving client.
/// </summary>
public
string
Endpoint
{
get
;
}
/// <summary>
/// Gets or sets the MQTT packet which was received or will be sent.
/// </summary>
public
MqttPacket
Packet
{
get
;
set
;
}
/// <summary>
/// Gets or sets whether the packet should be processed or not.
///
Gets or sets whether the packet should be processed or not.
/// </summary>
public
bool
ProcessPacket
{
get
;
set
;
}
=
true
;
/// <summary>
/// Gets the cancellation token from the connection managing thread.
/// Use this in further event processing.
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
/// </summary>
public
CancellationToken
CancellationToken
{
get
;
internal
s
et
;
}
public
IDictionary
SessionItems
{
g
et
;
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/InterceptingPublishEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -10,18 +10,26 @@ namespace MQTTnet.Server
{
public
sealed
class
InterceptingPublishEventArgs
:
EventArgs
{
public
InterceptingPublishEventArgs
(
MqttApplicationMessage
applicationMessage
,
CancellationToken
cancellationToken
,
string
clientId
,
IDictionary
sessionItems
)
{
ApplicationMessage
=
applicationMessage
??
throw
new
ArgumentNullException
(
nameof
(
applicationMessage
));
CancellationToken
=
cancellationToken
;
ClientId
=
clientId
??
throw
new
ArgumentNullException
(
nameof
(
clientId
));
SessionItems
=
sessionItems
??
throw
new
ArgumentNullException
(
nameof
(
sessionItems
));
}
public
MqttApplicationMessage
ApplicationMessage
{
get
;
set
;
}
/// <summary>
/// Gets the cancellation token which can indicate that the client connection gets down.
/// </summary>
public
CancellationToken
CancellationToken
{
get
;
internal
set
;
}
public
CancellationToken
CancellationToken
{
get
;
}
/// <summary>
/// Gets the client identifier.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// </summary>
public
string
ClientId
{
get
;
internal
set
;
}
public
string
ClientId
{
get
;
}
public
bool
CloseConnection
{
get
;
set
;
}
...
...
@@ -38,6 +46,6 @@ namespace MQTTnet.Server
/// <summary>
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
/// </summary>
public
IDictionary
SessionItems
{
get
;
internal
set
;
}
public
IDictionary
SessionItems
{
get
;
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/InterceptingSubscriptionEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -12,16 +12,28 @@ namespace MQTTnet.Server
{
public
sealed
class
InterceptingSubscriptionEventArgs
:
EventArgs
{
public
InterceptingSubscriptionEventArgs
(
CancellationToken
cancellationToken
,
string
clientId
,
MqttSessionStatus
session
,
MqttTopicFilter
topicFilter
)
{
CancellationToken
=
cancellationToken
;
ClientId
=
clientId
;
Session
=
session
;
TopicFilter
=
topicFilter
;
}
/// <summary>
/// Gets the cancellation token which can indicate that the client connection gets down.
/// </summary>
public
CancellationToken
CancellationToken
{
get
;
internal
set
;
}
public
CancellationToken
CancellationToken
{
get
;
}
/// <summary>
/// Gets the client identifier.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// </summary>
public
string
ClientId
{
get
;
internal
set
;
}
public
string
ClientId
{
get
;
}
/// <summary>
/// Gets or sets whether the broker should close the client connection.
...
...
@@ -48,12 +60,12 @@ namespace MQTTnet.Server
/// <summary>
/// Gets the current client session.
/// </summary>
public
MqttSessionStatus
Session
{
get
;
internal
set
;
}
public
MqttSessionStatus
Session
{
get
;
}
/// <summary>
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
/// </summary>
public
IDictionary
SessionItems
{
get
;
internal
set
;
}
public
IDictionary
SessionItems
=>
Session
.
Items
;
/// <summary>
/// Gets or sets the topic filter.
...
...
Source/MQTTnet/Server/Events/InterceptingUnsubscriptionEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -10,16 +10,24 @@ namespace MQTTnet.Server
{
public
sealed
class
InterceptingUnsubscriptionEventArgs
:
EventArgs
{
public
InterceptingUnsubscriptionEventArgs
(
CancellationToken
cancellationToken
,
string
clientId
,
IDictionary
sessionItems
,
string
topic
)
{
CancellationToken
=
cancellationToken
;
ClientId
=
clientId
;
SessionItems
=
sessionItems
;
Topic
=
topic
;
}
/// <summary>
/// Gets the cancellation token which can indicate that the client connection gets down.
/// </summary>
public
CancellationToken
CancellationToken
{
get
;
internal
set
;
}
public
CancellationToken
CancellationToken
{
get
;
}
/// <summary>
/// Gets the client identifier.
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
/// </summary>
public
string
ClientId
{
get
;
internal
set
;
}
public
string
ClientId
{
get
;
}
/// <summary>
/// Gets or sets whether the broker should close the client connection.
...
...
@@ -41,7 +49,7 @@ namespace MQTTnet.Server
/// <summary>
/// Gets or sets a key/value collection that can be used to share data within the scope of this session.
/// </summary>
public
IDictionary
SessionItems
{
get
;
internal
set
;
}
public
IDictionary
SessionItems
{
get
;
}
/// <summary>
/// Gets or sets the MQTT topic.
...
...
@@ -50,6 +58,6 @@ namespace MQTTnet.Server
/// The topic consists of one or more topic levels. Each topic level is separated by a forward slash (topic level
/// separator).
/// </summary>
public
string
Topic
{
get
;
internal
set
;
}
public
string
Topic
{
get
;
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/RetainedMessageChangedEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -9,10 +9,17 @@ namespace MQTTnet.Server
{
public
sealed
class
RetainedMessageChangedEventArgs
:
EventArgs
{
public
string
ClientId
{
get
;
internal
set
;
}
public
MqttApplicationMessage
ChangedRetainedMessage
{
get
;
internal
set
;
}
public
List
<
MqttApplicationMessage
>
StoredRetainedMessages
{
get
;
internal
set
;
}
public
RetainedMessageChangedEventArgs
(
string
clientId
,
MqttApplicationMessage
changedRetainedMessage
,
List
<
MqttApplicationMessage
>
storedRetainedMessages
)
{
ClientId
=
clientId
??
throw
new
ArgumentNullException
(
nameof
(
clientId
));
ChangedRetainedMessage
=
changedRetainedMessage
??
throw
new
ArgumentNullException
(
nameof
(
changedRetainedMessage
));
StoredRetainedMessages
=
storedRetainedMessages
??
throw
new
ArgumentNullException
(
nameof
(
storedRetainedMessages
));
}
public
MqttApplicationMessage
ChangedRetainedMessage
{
get
;
}
public
string
ClientId
{
get
;
}
public
List
<
MqttApplicationMessage
>
StoredRetainedMessages
{
get
;
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Events/SessionDeletedEventArgs.cs
浏览文件 @
262a4681
...
...
@@ -3,14 +3,26 @@
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections
;
namespace
MQTTnet.Server
{
public
sealed
class
SessionDeletedEventArgs
:
EventArgs
{
public
SessionDeletedEventArgs
(
string
id
,
IDictionary
sessionItems
)
{
Id
=
id
??
throw
new
ArgumentNullException
(
nameof
(
id
));
SessionItems
=
sessionItems
??
throw
new
ArgumentNullException
(
nameof
(
sessionItems
));
}
/// <summary>
/// Gets the ID of the session.
/// </summary>
public
string
Id
{
get
;
}
/// <summary>
///
Gets the ID of the
session.
///
Gets or sets a key/value collection that can be used to share data within the scope of this
session.
/// </summary>
public
string
Id
{
get
;
internal
s
et
;
}
public
IDictionary
SessionItems
{
g
et
;
}
}
}
\ No newline at end of file
Source/MQTTnet/Server/Internal/MqttClient.cs
浏览文件 @
262a4681
...
...
@@ -170,7 +170,7 @@ namespace MQTTnet.Server
ClientId
=
Id
,
SessionItems
=
Session
.
Items
};
return
_eventContainer
.
ClientAcknowledgedPublishPacketEvent
.
TryInvokeAsync
(
eventArgs
,
_logger
);
}
...
...
@@ -180,7 +180,7 @@ namespace MQTTnet.Server
Task
HandleIncomingPubAckPacket
(
MqttPubAckPacket
pubAckPacket
)
{
var
acknowledgedPublishPacket
=
Session
.
AcknowledgePublishPacket
(
pubAckPacket
.
PacketIdentifier
);
if
(
acknowledgedPublishPacket
!=
null
)
{
return
ClientAcknowledgedPublishPacket
(
acknowledgedPublishPacket
,
pubAckPacket
);
...
...
@@ -192,7 +192,7 @@ namespace MQTTnet.Server
Task
HandleIncomingPubCompPacket
(
MqttPubCompPacket
pubCompPacket
)
{
var
acknowledgedPublishPacket
=
Session
.
AcknowledgePublishPacket
(
pubCompPacket
.
PacketIdentifier
);
if
(
acknowledgedPublishPacket
!=
null
)
{
return
ClientAcknowledgedPublishPacket
(
acknowledgedPublishPacket
,
pubCompPacket
);
...
...
@@ -212,16 +212,7 @@ namespace MQTTnet.Server
if
(
_eventContainer
.
InterceptingPublishEvent
.
HasHandlers
)
{
interceptingPublishEventArgs
=
new
InterceptingPublishEventArgs
{
ClientId
=
Id
,
ApplicationMessage
=
applicationMessage
,
SessionItems
=
Session
.
Items
,
ProcessPublish
=
true
,
CloseConnection
=
false
,
CancellationToken
=
cancellationToken
};
interceptingPublishEventArgs
=
new
InterceptingPublishEventArgs
(
applicationMessage
,
cancellationToken
,
Id
,
Session
.
Items
);
if
(
string
.
IsNullOrEmpty
(
interceptingPublishEventArgs
.
ApplicationMessage
.
Topic
))
{
// This can happen if a topic alias us used but the topic is
...
...
@@ -277,7 +268,7 @@ namespace MQTTnet.Server
async
Task
HandleIncomingPubRecPacket
(
MqttPubRecPacket
pubRecPacket
)
{
var
acknowledgedPublishPacket
=
Session
.
PeekAcknowledgePublishPacket
(
pubRecPacket
.
PacketIdentifier
);
if
(
acknowledgedPublishPacket
!=
null
)
{
await
ClientAcknowledgedPublishPacket
(
acknowledgedPublishPacket
,
pubRecPacket
).
ConfigureAwait
(
false
);
...
...
@@ -317,6 +308,7 @@ namespace MQTTnet.Server
}
}
async
Task
HandleIncomingUnsubscribePacket
(
MqttUnsubscribePacket
unsubscribePacket
,
CancellationToken
cancellationToken
)
{
var
unsubscribeResult
=
await
Session
.
SubscriptionsManager
.
Unsubscribe
(
unsubscribePacket
,
cancellationToken
).
ConfigureAwait
(
false
);
...
...
@@ -365,14 +357,7 @@ namespace MQTTnet.Server
return
packet
;
}
var
interceptingPacketEventArgs
=
new
InterceptingPacketEventArgs
{
ClientId
=
Id
,
Endpoint
=
Endpoint
,
Packet
=
packet
,
CancellationToken
=
cancellationToken
};
var
interceptingPacketEventArgs
=
new
InterceptingPacketEventArgs
(
cancellationToken
,
Id
,
Endpoint
,
packet
,
Session
.
Items
);
await
_eventContainer
.
InterceptingOutboundPacketEvent
.
InvokeAsync
(
interceptingPacketEventArgs
).
ConfigureAwait
(
false
);
if
(!
interceptingPacketEventArgs
.
ProcessPacket
||
packet
==
null
)
...
...
@@ -393,7 +378,7 @@ namespace MQTTnet.Server
while
(!
cancellationToken
.
IsCancellationRequested
)
{
await
Task
.
Yield
();
var
packet
=
await
ChannelAdapter
.
ReceivePacketAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
if
(
packet
==
null
)
{
...
...
@@ -404,14 +389,7 @@ namespace MQTTnet.Server
if
(
_eventContainer
.
InterceptingInboundPacketEvent
.
HasHandlers
)
{
var
interceptingPacketEventArgs
=
new
InterceptingPacketEventArgs
{
ClientId
=
Id
,
Endpoint
=
Endpoint
,
Packet
=
packet
,
CancellationToken
=
cancellationToken
};
var
interceptingPacketEventArgs
=
new
InterceptingPacketEventArgs
(
cancellationToken
,
Id
,
Endpoint
,
packet
,
Session
.
Items
);
await
_eventContainer
.
InterceptingInboundPacketEvent
.
InvokeAsync
(
interceptingPacketEventArgs
).
ConfigureAwait
(
false
);
packet
=
interceptingPacketEventArgs
.
Packet
;
processPacket
=
interceptingPacketEventArgs
.
ProcessPacket
;
...
...
Source/MQTTnet/Server/Internal/MqttClientSessionsManager.cs
浏览文件 @
262a4681
...
...
@@ -109,13 +109,9 @@ namespace MQTTnet.Server
try
{
if
(
_eventContainer
.
SessionDeletedEvent
.
HasHandlers
)
if
(
_eventContainer
.
SessionDeletedEvent
.
HasHandlers
&&
session
!=
null
)
{
var
eventArgs
=
new
SessionDeletedEventArgs
{
Id
=
session
?.
Id
};
var
eventArgs
=
new
SessionDeletedEventArgs
(
clientId
,
session
.
Items
);
await
_eventContainer
.
SessionDeletedEvent
.
TryInvokeAsync
(
eventArgs
,
_logger
).
ConfigureAwait
(
false
);
}
}
...
...
@@ -295,13 +291,12 @@ namespace MQTTnet.Server
if
(
_eventContainer
.
ClientConnectedEvent
.
HasHandlers
)
{
var
eventArgs
=
new
ClientConnectedEventArgs
{
ClientId
=
connectPacket
.
ClientId
,
UserName
=
connectPacket
.
Username
,
ProtocolVersion
=
channelAdapter
.
PacketFormatterAdapter
.
ProtocolVersion
,
Endpoint
=
channelAdapter
.
Endpoint
};
var
eventArgs
=
new
ClientConnectedEventArgs
(
connectPacket
.
ClientId
,
connectPacket
.
Username
,
channelAdapter
.
PacketFormatterAdapter
.
ProtocolVersion
,
channelAdapter
.
Endpoint
,
client
.
Session
.
Items
);
await
_eventContainer
.
ClientConnectedEvent
.
InvokeAsync
(
eventArgs
).
ConfigureAwait
(
false
);
}
...
...
@@ -340,12 +335,8 @@ namespace MQTTnet.Server
if
(
client
.
Id
!=
null
&&
!
client
.
IsTakenOver
&&
_eventContainer
.
ClientDisconnectedEvent
.
HasHandlers
)
{
var
eventArgs
=
new
ClientDisconnectedEventArgs
{
ClientId
=
client
.
Id
,
DisconnectType
=
client
.
IsCleanDisconnect
?
MqttClientDisconnectType
.
Clean
:
MqttClientDisconnectType
.
NotClean
,
Endpoint
=
endpoint
};
var
disconnectType
=
client
.
IsCleanDisconnect
?
MqttClientDisconnectType
.
Clean
:
MqttClientDisconnectType
.
NotClean
;
var
eventArgs
=
new
ClientDisconnectedEventArgs
(
client
.
Id
,
disconnectType
,
endpoint
,
client
.
Session
.
Items
);
await
_eventContainer
.
ClientDisconnectedEvent
.
InvokeAsync
(
eventArgs
).
ConfigureAwait
(
false
);
}
...
...
@@ -533,13 +524,7 @@ namespace MQTTnet.Server
if
(
_eventContainer
.
ClientConnectedEvent
.
HasHandlers
)
{
var
eventArgs
=
new
ClientDisconnectedEventArgs
{
ClientId
=
existing
.
Id
,
DisconnectType
=
MqttClientDisconnectType
.
Takeover
,
Endpoint
=
existing
.
Endpoint
};
var
eventArgs
=
new
ClientDisconnectedEventArgs
(
existing
.
Id
,
MqttClientDisconnectType
.
Takeover
,
existing
.
Endpoint
,
existing
.
Session
.
Items
);
await
_eventContainer
.
ClientDisconnectedEvent
.
InvokeAsync
(
eventArgs
).
ConfigureAwait
(
false
);
}
}
...
...
@@ -572,12 +557,7 @@ namespace MQTTnet.Server
return
;
}
var
eventArgs
=
new
ApplicationMessageNotConsumedEventArgs
{
ApplicationMessage
=
applicationMessage
,
SenderId
=
senderId
};
var
eventArgs
=
new
ApplicationMessageNotConsumedEventArgs
(
applicationMessage
,
senderId
);
await
_eventContainer
.
ApplicationMessageNotConsumedEvent
.
InvokeAsync
(
eventArgs
).
ConfigureAwait
(
false
);
}
...
...
Source/MQTTnet/Server/Internal/MqttClientSubscriptionsManager.cs
浏览文件 @
262a4681
...
...
@@ -217,12 +217,7 @@ namespace MQTTnet.Server
{
foreach
(
var
finalTopicFilter
in
finalTopicFilters
)
{
var
eventArgs
=
new
ClientSubscribedTopicEventArgs
{
ClientId
=
_session
.
Id
,
TopicFilter
=
finalTopicFilter
};
var
eventArgs
=
new
ClientSubscribedTopicEventArgs
(
_session
.
Id
,
finalTopicFilter
,
_session
.
Items
);
await
_eventContainer
.
ClientSubscribedTopicEvent
.
InvokeAsync
(
eventArgs
).
ConfigureAwait
(
false
);
}
}
...
...
@@ -312,12 +307,7 @@ namespace MQTTnet.Server
{
foreach
(
var
topicFilter
in
unsubscribePacket
.
TopicFilters
)
{
var
eventArgs
=
new
ClientUnsubscribedTopicEventArgs
{
ClientId
=
_session
.
Id
,
TopicFilter
=
topicFilter
};
var
eventArgs
=
new
ClientUnsubscribedTopicEventArgs
(
_session
.
Id
,
topicFilter
,
_session
.
Items
);
await
_eventContainer
.
ClientUnsubscribedTopicEvent
.
InvokeAsync
(
eventArgs
).
ConfigureAwait
(
false
);
}
}
...
...
@@ -472,14 +462,7 @@ namespace MQTTnet.Server
async
Task
<
InterceptingSubscriptionEventArgs
>
InterceptSubscribe
(
MqttTopicFilter
topicFilter
,
CancellationToken
cancellationToken
)
{
var
eventArgs
=
new
InterceptingSubscriptionEventArgs
{
ClientId
=
_session
.
Id
,
TopicFilter
=
topicFilter
,
SessionItems
=
_session
.
Items
,
Session
=
new
MqttSessionStatus
(
_session
),
CancellationToken
=
cancellationToken
};
var
eventArgs
=
new
InterceptingSubscriptionEventArgs
(
cancellationToken
,
_session
.
Id
,
new
MqttSessionStatus
(
_session
),
topicFilter
);
if
(
topicFilter
.
QualityOfServiceLevel
==
MqttQualityOfServiceLevel
.
AtMostOnce
)
{
...
...
@@ -508,13 +491,7 @@ namespace MQTTnet.Server
async
Task
<
InterceptingUnsubscriptionEventArgs
>
InterceptUnsubscribe
(
string
topicFilter
,
MqttSubscription
mqttSubscription
,
CancellationToken
cancellationToken
)
{
var
clientUnsubscribingTopicEventArgs
=
new
InterceptingUnsubscriptionEventArgs
{
ClientId
=
_session
.
Id
,
Topic
=
topicFilter
,
SessionItems
=
_session
.
Items
,
CancellationToken
=
cancellationToken
};
var
clientUnsubscribingTopicEventArgs
=
new
InterceptingUnsubscriptionEventArgs
(
cancellationToken
,
topicFilter
,
_session
.
Items
,
topicFilter
);
if
(
mqttSubscription
==
null
)
{
...
...
Source/MQTTnet/Server/Internal/MqttRetainedMessagesManager.cs
浏览文件 @
262a4681
...
...
@@ -105,13 +105,7 @@ namespace MQTTnet.Server
{
using
(
await
_storageAccessLock
.
WaitAsync
(
CancellationToken
.
None
).
ConfigureAwait
(
false
))
{
var
eventArgs
=
new
RetainedMessageChangedEventArgs
{
ClientId
=
clientId
,
ChangedRetainedMessage
=
applicationMessage
,
StoredRetainedMessages
=
messagesForSave
};
var
eventArgs
=
new
RetainedMessageChangedEventArgs
(
clientId
,
applicationMessage
,
messagesForSave
);
await
_eventContainer
.
RetainedMessageChangedEvent
.
InvokeAsync
(
eventArgs
).
ConfigureAwait
(
false
);
}
}
...
...
Source/MQTTnet/Server/MqttServer.cs
浏览文件 @
262a4681
...
...
@@ -24,15 +24,18 @@ namespace MQTTnet.Server
readonly
IDictionary
_sessionItems
=
new
ConcurrentDictionary
<
object
,
object
>();
readonly
ICollection
<
IMqttServerAdapter
>
_adapters
;
readonly
MqttClientSessionsManager
_clientSessionsManager
;
readonly
MqttServerEventContainer
_eventContainer
=
new
MqttServerEventContainer
();
readonly
MqttServerKeepAliveMonitor
_keepAliveMonitor
;
readonly
MqttNetSourceLogger
_logger
;
readonly
MqttServerOptions
_options
;
readonly
IMqttNetLogger
_rootLogger
;
readonly
MqttRetainedMessagesManager
_retainedMessagesManager
;
readonly
MqttServerKeepAliveMonitor
_keepAliveMonitor
;
readonly
MqttClientSessionsManager
_clientSessionsManager
;
readonly
IMqttNetLogger
_rootLogger
;
readonly
IDictionary
_sessionItems
=
new
ConcurrentDictionary
<
object
,
object
>();
CancellationTokenSource
_cancellationTokenSource
;
public
MqttServer
(
MqttServerOptions
options
,
IEnumerable
<
IMqttServerAdapter
>
adapters
,
IMqttNetLogger
logger
)
{
_options
=
options
??
throw
new
ArgumentNullException
(
nameof
(
options
));
...
...
@@ -58,18 +61,18 @@ namespace MQTTnet.Server
remove
=>
_eventContainer
.
ApplicationMessageNotConsumedEvent
.
RemoveHandler
(
value
);
}
public
event
Func
<
ClientConnectedEventArgs
,
Task
>
ClientConnectedAsync
{
add
=>
_eventContainer
.
ClientConnectedEvent
.
AddHandler
(
value
);
remove
=>
_eventContainer
.
ClientConnectedEvent
.
RemoveHandler
(
value
);
}
public
event
Func
<
ClientAcknowledgedPublishPacketEventArgs
,
Task
>
ClientAcknowledgedPublishPacketAsync
{
add
=>
_eventContainer
.
ClientAcknowledgedPublishPacketEvent
.
AddHandler
(
value
);
remove
=>
_eventContainer
.
ClientAcknowledgedPublishPacketEvent
.
RemoveHandler
(
value
);
}
public
event
Func
<
ClientConnectedEventArgs
,
Task
>
ClientConnectedAsync
{
add
=>
_eventContainer
.
ClientConnectedEvent
.
AddHandler
(
value
);
remove
=>
_eventContainer
.
ClientConnectedEvent
.
RemoveHandler
(
value
);
}
public
event
Func
<
ClientDisconnectedEventArgs
,
Task
>
ClientDisconnectedAsync
{
add
=>
_eventContainer
.
ClientDisconnectedEvent
.
AddHandler
(
value
);
...
...
@@ -167,7 +170,7 @@ namespace MQTTnet.Server
}
public
bool
IsStarted
=>
_cancellationTokenSource
!=
null
;
public
Task
DeleteRetainedMessagesAsync
()
{
ThrowIfNotStarted
();
...
...
@@ -183,10 +186,10 @@ namespace MQTTnet.Server
}
ThrowIfNotStarted
();
return
_clientSessionsManager
.
GetClient
(
id
).
StopAsync
(
reasonCode
);
}
public
Task
<
IList
<
MqttClientStatus
>>
GetClientsAsync
()
{
ThrowIfNotStarted
();
...
...
@@ -226,17 +229,15 @@ namespace MQTTnet.Server
var
processPublish
=
true
;
var
applicationMessage
=
injectedApplicationMessage
.
ApplicationMessage
;
if
(
_eventContainer
.
InterceptingPublishEvent
.
HasHandlers
)
{
var
interceptingPublishEventArgs
=
new
InterceptingPublishEventArgs
{
ApplicationMessage
=
applicationMessage
,
CancellationToken
=
_cancellationTokenSource
.
Token
,
ClientId
=
injectedApplicationMessage
.
SenderClientId
,
SessionItems
=
_sessionItems
};
var
interceptingPublishEventArgs
=
new
InterceptingPublishEventArgs
(
applicationMessage
,
_cancellationTokenSource
.
Token
,
injectedApplicationMessage
.
SenderClientId
,
_sessionItems
);
await
_eventContainer
.
InterceptingPublishEvent
.
InvokeAsync
(
interceptingPublishEventArgs
).
ConfigureAwait
(
false
);
applicationMessage
=
interceptingPublishEventArgs
.
ApplicationMessage
;
...
...
@@ -274,7 +275,7 @@ namespace MQTTnet.Server
}
await
_eventContainer
.
StartedEvent
.
InvokeAsync
(
EventArgs
.
Empty
).
ConfigureAwait
(
false
);
_logger
.
Info
(
"Started."
);
}
...
...
@@ -304,7 +305,7 @@ namespace MQTTnet.Server
}
await
_eventContainer
.
StoppedEvent
.
InvokeAsync
(
EventArgs
.
Empty
).
ConfigureAwait
(
false
);
_logger
.
Info
(
"Stopped."
);
}
...
...
@@ -348,7 +349,7 @@ namespace MQTTnet.Server
return
_clientSessionsManager
.
UnsubscribeAsync
(
clientId
,
topicFilters
);
}
public
Task
UpdateRetainedMessageAsync
(
MqttApplicationMessage
retainedMessage
)
{
if
(
retainedMessage
==
null
)
...
...
@@ -385,7 +386,7 @@ namespace MQTTnet.Server
void
ThrowIfNotStarted
()
{
ThrowIfDisposed
();
if
(
_cancellationTokenSource
==
null
)
{
throw
new
InvalidOperationException
(
"The MQTT server is not started."
);
...
...
@@ -395,7 +396,7 @@ namespace MQTTnet.Server
void
ThrowIfStarted
()
{
ThrowIfDisposed
();
if
(
_cancellationTokenSource
!=
null
)
{
throw
new
InvalidOperationException
(
"The MQTT server is already started."
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录