Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
jobily
IoTSharp
提交
4098d587
I
IoTSharp
项目概览
jobily
/
IoTSharp
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
IoTSharp
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
4098d587
编写于
1月 30, 2019
作者:
麦壳饼
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add built-in mqtt broker and mqtt client
上级
ce13ecc1
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
210 addition
and
90 deletion
+210
-90
IoTSharp.Hub/AppSettings.cs
IoTSharp.Hub/AppSettings.cs
+29
-0
IoTSharp.Hub/Extensions/IoTSharpExtension.cs
IoTSharp.Hub/Extensions/IoTSharpExtension.cs
+14
-66
IoTSharp.Hub/Extensions/MqttExtension.cs
IoTSharp.Hub/Extensions/MqttExtension.cs
+145
-0
IoTSharp.Hub/IoTSharp.Hub.csproj
IoTSharp.Hub/IoTSharp.Hub.csproj
+6
-5
IoTSharp.Hub/Startup.cs
IoTSharp.Hub/Startup.cs
+15
-19
IoTSharp.Hub/appsettings.json
IoTSharp.Hub/appsettings.json
+1
-0
未找到文件。
IoTSharp.Hub/AppSettings.cs
浏览文件 @
4098d587
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Security.Authentication
;
using
System.Threading.Tasks
;
namespace
IoTSharp.Hub
...
...
@@ -11,5 +12,33 @@ namespace IoTSharp.Hub
public
string
JwtKey
{
get
;
set
;
}
public
string
JwtExpireDays
{
get
;
set
;
}
public
string
JwtIssuer
{
get
;
set
;
}
/// <summary>
/// Broker settings
/// </summary>
public
MqttBrokerSetting
MqttBroker
{
get
;
set
;
}
/// <summary>
/// mqtt client settings
/// </summary>
public
MqttClientSetting
MqttClient
{
get
;
set
;
}
}
public
class
MqttClientSetting
{
/// <summary>
/// built-in or IP、HostName
/// </summary>
public
string
MqttBroker
{
get
;
set
;
}
=
"built-in"
;
public
string
UserName
{
get
;
set
;
}
=
"root"
;
public
string
Password
{
get
;
set
;
}
=
"kissme"
;
public
int
Port
{
get
;
set
;
}
=
1883
;
}
public
class
MqttBrokerSetting
{
public
int
Port
{
get
;
set
;
}
=
1883
;
public
int
TlsPort
{
get
;
set
;
}
=
8883
;
public
bool
EnableTls
{
get
;
set
;
}
=
false
;
public
string
Certificate
{
get
;
set
;
}
public
SslProtocols
SslProtocol
{
get
;
set
;
}
=
SslProtocols
.
None
;
}
}
IoTSharp.Hub/Extensions/IoTSharpExtension.cs
浏览文件 @
4098d587
...
...
@@ -23,63 +23,23 @@ namespace IoTSharp.Hub
case
"mssql"
:
services
.
AddEntityFrameworkSqlServer
();
services
.
AddDbContext
<
ApplicationDbContext
>(
options
=>
options
.
UseSqlServer
(
_ConnectionString
),
ServiceLifetime
.
Transient
);
#if WithHealthChecks
services
.
AddHealthChecks
().
AddSqlServer
(
_ConnectionString
,
name
:
"database"
).
AddMQTTChatHealthChecks
();
#endif
break
;
case
"npgsql"
:
services
.
AddEntityFrameworkNpgsql
();
services
.
AddDbContext
<
ApplicationDbContext
>(
options
=>
options
.
UseNpgsql
(
_ConnectionString
),
ServiceLifetime
.
Transient
);
#if WithHealthChecks
services
.
AddHealthChecks
().
AddNpgSql
(
_ConnectionString
,
name
:
"database"
).
AddMQTTChatHealthChecks
();
#endif
break
;
case
"memory"
:
services
.
AddEntityFrameworkInMemoryDatabase
();
services
.
AddDbContext
<
ApplicationDbContext
>(
options
=>
options
.
UseInMemoryDatabase
(
nameof
(
ApplicationDbContext
)),
ServiceLifetime
.
Transient
);
#if WithHealthChecks
services
.
AddHealthChecks
().
AddMQTTChatHealthChecks
();
#endif
break
;
case
"sqlite"
:
default
:
services
.
AddEntityFrameworkSqlite
();
services
.
AddDbContext
<
ApplicationDbContext
>(
options
=>
options
.
UseSqlite
(
_ConnectionString
),
ServiceLifetime
.
Transient
);
#if WithHealthChecks
services
.
AddHealthChecks
().
AddSqlite
(
_ConnectionString
,
name
:
"database"
).
AddMQTTChatHealthChecks
();
#endif
break
;
}
#if WithHealthChecks
services
.
AddHealthChecksUI
();
#endif
}
#if WithHealthChecks
internal
static
void
UseIotSharpHealthChecks
(
this
IApplicationBuilder
app
)
{
app
.
UseHealthChecksUI
();
app
.
UseHealthChecks
(
"/health"
,
new
HealthCheckOptions
()
{
Predicate
=
_
=>
true
,
ResponseWriter
=
UIResponseWriter
.
WriteHealthCheckUIResponse
});
}
private
static
void
AddMQTTChatHealthChecks
(
this
IHealthChecksBuilder
builder
)
{
builder
.
AddPrivateMemoryHealthCheck
(
1024
*
1024
*
1024
,
"privatememory"
)
.
AddDiskStorageHealthCheck
(
setup
=>
{
DriveInfo
.
GetDrives
().
ToList
().
ForEach
(
di
=>
{
setup
.
AddDrive
(
di
.
Name
,
1024
);
});
});
}
#endif
private
static
string
GetFullPathName
(
string
filename
)
{
FileInfo
fi
=
new
FileInfo
(
System
.
IO
.
Path
.
Combine
(
...
...
@@ -89,36 +49,24 @@ namespace IoTSharp.Hub
return
fi
.
FullName
;
}
public
static
void
UseMqttLo
gger
(
this
IApplicationBuilder
app
)
internal
static
void
UseSwa
gger
(
this
IApplicationBuilder
app
)
{
var
mqttNetLogger
=
app
.
ApplicationServices
.
GetService
<
IMqttNetLogger
>();
var
_loggerFactory
=
app
.
ApplicationServices
.
GetService
<
ILoggerFactory
>();
var
logger
=
_loggerFactory
.
CreateLogger
<
IMqttNetLogger
>();
mqttNetLogger
.
LogMessagePublished
+=
(
object
sender
,
MqttNetLogMessagePublishedEventArgs
e
)
=>
app
.
UseSwaggerUi3
();
app
.
UseSwagger
(
config
=>
config
.
PostProcess
=
(
document
,
request
)
=>
{
var
message
=
$"ID:
{
e
.
TraceMessage
.
LogId
}
,ThreadId:
{
e
.
TraceMessage
.
ThreadId
}
,Source:
{
e
.
TraceMessage
.
Source
}
,Timestamp:
{
e
.
TraceMessage
.
Timestamp
}
,Message:
{
e
.
TraceMessage
.
Message
}
"
;
switch
(
e
.
TraceMessage
.
Level
)
if
(
request
.
Headers
.
ContainsKey
(
"X-External-Host"
))
{
case
MqttNetLogLevel
.
Verbose
:
logger
.
LogTrace
(
e
.
TraceMessage
.
Exception
,
message
);
break
;
case
MqttNetLogLevel
.
Info
:
logger
.
LogInformation
(
e
.
TraceMessage
.
Exception
,
message
);
break
;
case
MqttNetLogLevel
.
Warning
:
logger
.
LogWarning
(
e
.
TraceMessage
.
Exception
,
message
);
break
;
case
MqttNetLogLevel
.
Error
:
logger
.
LogError
(
e
.
TraceMessage
.
Exception
,
message
);
break
;
default
:
break
;
// Change document server settings to public
document
.
Host
=
request
.
Headers
[
"X-External-Host"
].
First
();
document
.
BasePath
=
request
.
Headers
[
"X-External-Path"
].
First
();
}
};
});
app
.
UseSwaggerUi3
(
config
=>
config
.
TransformToExternalPath
=
(
internalUiRoute
,
request
)
=>
{
// The header X-External-Path is set in the nginx.conf file
var
externalPath
=
request
.
Headers
.
ContainsKey
(
"X-External-Path"
)
?
request
.
Headers
[
"X-External-Path"
].
First
()
:
""
;
return
externalPath
+
internalUiRoute
;
});
}
}
}
\ No newline at end of file
IoTSharp.Hub/Extensions/MqttExtension.cs
0 → 100644
浏览文件 @
4098d587
using
Microsoft.Extensions.Logging
;
using
MQTTnet.Client
;
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Threading.Tasks
;
using
Microsoft.Extensions.DependencyInjection
;
using
Microsoft.AspNetCore.Builder
;
using
MQTTnet.AspNetCore
;
using
MQTTnet.Diagnostics
;
namespace
IoTSharp.Hub
{
public
static
class
MqttExtension
{
public
static
void
AddMqttClient
(
this
IServiceCollection
services
,
MqttClientSetting
setting
)
{
if
(
setting
==
null
)
setting
=
new
MqttClientSetting
();
services
.
AddSingleton
(
options
=>
new
MQTTnet
.
MqttFactory
().
CreateMqttClient
());
services
.
AddTransient
(
options
=>
new
MqttClientOptionsBuilder
()
.
WithClientId
(
"buind-in"
)
.
WithTcpServer
((
setting
.
MqttBroker
==
"built-in"
||
string
.
IsNullOrEmpty
(
setting
.
MqttBroker
))
?
"127.0.0.1"
:
setting
.
MqttBroker
,
setting
.
Port
)
.
WithCredentials
(
setting
.
UserName
,
setting
.
Password
)
.
WithCleanSession
()
.
Build
());
}
public
static
void
UseIoTSharpMqttClient
(
this
IApplicationBuilder
app
)
{
var
_logger
=
app
.
ApplicationServices
.
GetService
<
ILoggerFactory
>().
CreateLogger
<
MqttClient
>();
var
mqtt
=
app
.
ApplicationServices
.
GetService
<
IMqttClient
>();
var
clientOptions
=
app
.
ApplicationServices
.
GetService
<
IMqttClientOptions
>();
mqtt
.
ApplicationMessageReceived
+=
(
sender
,
e
)
=>
{
_logger
.
LogInformation
(
$"Received :
{
e
.
ApplicationMessage
.
Topic
}
"
);
};
mqtt
.
Connected
+=
(
sender
,
e
)
=>
{
_logger
.
LogInformation
(
$"CONNECTED IsSessionPresent:
{
e
.
IsSessionPresent
}
"
);
};
mqtt
.
Disconnected
+=
async
(
s
,
e
)
=>
{
_logger
.
LogInformation
(
$"DISCONNECTED FROM SERVER ClientWasConnected:
{
e
.
ClientWasConnected
}
, Exception=
{
e
.
Exception
.
Message
}
"
);
await
Task
.
Delay
(
TimeSpan
.
FromSeconds
(
5
));
try
{
await
mqtt
.
ConnectAsync
(
clientOptions
);
_logger
.
LogInformation
(
"RECONNECT AGAIN"
);
}
catch
(
Exception
exception
)
{
_logger
.
LogError
(
"CONNECTING FAILED"
,
exception
);
}
};
try
{
Task
.
Run
(()
=>
{
mqtt
.
ConnectAsync
(
clientOptions
);
_logger
.
LogInformation
(
"CONNECTED"
);
});
}
catch
(
Exception
exception
)
{
_logger
.
LogError
(
"CONNECTING FAILED"
,
exception
);
}
}
public
static
void
AddIoTSharpMqttServer
(
this
IServiceCollection
services
,
MqttBrokerSetting
setting
)
{
services
.
AddMqttTcpServerAdapter
();
services
.
AddHostedMqttServer
(
options
=>
{
var
broker
=
setting
;
if
(
broker
==
null
)
broker
=
new
MqttBrokerSetting
();
options
.
WithDefaultEndpointPort
(
broker
.
Port
).
WithDefaultEndpointBoundIPAddress
(
System
.
Net
.
IPAddress
.
Parse
(
"127.0.0.1"
)).
WithDefaultEndpoint
();
if
(
broker
.
EnableTls
)
{
options
.
WithEncryptedEndpoint
();
options
.
WithEncryptedEndpointPort
(
broker
.
TlsPort
);
if
(
System
.
IO
.
File
.
Exists
(
broker
.
Certificate
))
{
options
.
WithEncryptionCertificate
(
System
.
IO
.
File
.
ReadAllBytes
(
broker
.
Certificate
)).
WithEncryptionSslProtocol
(
broker
.
SslProtocol
);
}
}
else
{
options
.
WithoutEncryptedEndpoint
();
}
options
.
WithConnectionValidator
(
action
=>
{
action
.
ReturnCode
=
MQTTnet
.
Protocol
.
MqttConnectReturnCode
.
ConnectionAccepted
;
});
options
.
Build
();
});
services
.
AddMqttConnectionHandler
();
services
.
AddMqttWebSocketServerAdapter
();
}
public
static
void
UseIotSharpMqttServer
(
this
IApplicationBuilder
app
)
{
app
.
UseMqttEndpoint
();
app
.
UseMqttServer
(
server
=>
{
server
.
ClientConnected
+=
(
sender
,
e
)
=>
{
};
server
.
Started
+=
(
sender
,
e
)
=>
{
};
server
.
Stopped
+=
(
sender
,
e
)
=>
{
};
server
.
ApplicationMessageReceived
+=
(
sender
,
e
)
=>
{
};
server
.
ClientSubscribedTopic
+=
(
sender
,
e
)
=>
{
};
server
.
ClientUnsubscribedTopic
+=
(
sender
,
e
)
=>
{
};
});
var
mqttNetLogger
=
app
.
ApplicationServices
.
GetService
<
IMqttNetLogger
>();
var
_loggerFactory
=
app
.
ApplicationServices
.
GetService
<
ILoggerFactory
>();
var
logger
=
_loggerFactory
.
CreateLogger
<
IMqttNetLogger
>();
mqttNetLogger
.
LogMessagePublished
+=
(
object
sender
,
MqttNetLogMessagePublishedEventArgs
e
)
=>
{
var
message
=
$"ID:
{
e
.
TraceMessage
.
LogId
}
,ThreadId:
{
e
.
TraceMessage
.
ThreadId
}
,Source:
{
e
.
TraceMessage
.
Source
}
,Timestamp:
{
e
.
TraceMessage
.
Timestamp
}
,Message:
{
e
.
TraceMessage
.
Message
}
"
;
switch
(
e
.
TraceMessage
.
Level
)
{
case
MqttNetLogLevel
.
Verbose
:
logger
.
LogTrace
(
e
.
TraceMessage
.
Exception
,
message
);
break
;
case
MqttNetLogLevel
.
Info
:
logger
.
LogInformation
(
e
.
TraceMessage
.
Exception
,
message
);
break
;
case
MqttNetLogLevel
.
Warning
:
logger
.
LogWarning
(
e
.
TraceMessage
.
Exception
,
message
);
break
;
case
MqttNetLogLevel
.
Error
:
logger
.
LogError
(
e
.
TraceMessage
.
Exception
,
message
);
break
;
default
:
break
;
}
};
}
}
}
IoTSharp.Hub/IoTSharp.Hub.csproj
浏览文件 @
4098d587
...
...
@@ -25,10 +25,6 @@
<None Remove="Migrations\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AspNetCore.HealthChecks.NpgSql" Version="2.2.0" />
<PackageReference Include="AspNetCore.HealthChecks.System" Version="2.2.1" />
<PackageReference Include="AspNetCore.HealthChecks.UI" Version="2.2.10" />
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="2.2.2" />
<PackageReference Include="IoTSharp.X509Extensions" Version="1.3.3" />
<PackageReference Include="LiteDB" Version="4.1.4" />
<PackageReference Include="Microsoft.AspNetCore.App" />
...
...
@@ -44,10 +40,15 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.1" />
<PackageReference Include="MQTTnet" Version="2.8.5" />
<PackageReference Include="MQTTnet.AspNetCore" Version="2.8.5" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.2.0" />
<PackageReference Include="NSwag.AspNetCore" Version="12.0.13" />
<PackageReference Include="QuartzHostedService" Version="0.0.4" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.5.1" />
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties appsettings_1Development_1json__JSONSchema="http://json.schemastore.org/bungee-plugin" /></VisualStudio></ProjectExtensions>
<ProjectExtensions>
<VisualStudio>
<UserProperties appsettings_1Development_1json__JSONSchema="http://json.schemastore.org/bungee-plugin" />
</VisualStudio>
</ProjectExtensions>
</Project>
\ No newline at end of file
IoTSharp.Hub/Startup.cs
浏览文件 @
4098d587
...
...
@@ -10,12 +10,15 @@ using Microsoft.AspNetCore.Mvc;
using
Microsoft.Extensions.Configuration
;
using
Microsoft.Extensions.DependencyInjection
;
using
Microsoft.Extensions.Logging
;
using
MQTTnet.AspNetCore
;
using
MQTTnet.Client
;
using
NSwag.AspNetCore
;
using
System
;
using
System.IdentityModel.Tokens.Jwt
;
using
System.Linq
;
using
System.Reflection
;
using
System.Text
;
using
System.Threading.Tasks
;
namespace
IoTSharp.Hub
{
...
...
@@ -68,8 +71,14 @@ namespace IoTSharp.Hub
});
services
.
AddTransient
<
ApplicationDBInitializer
>();
services
.
AddMvc
().
SetCompatibilityVersion
(
CompatibilityVersion
.
Version_2_2
);
services
.
AddIoTSharpMqttServer
(
AppSettings
.
MqttBroker
);
services
.
AddMqttClient
(
AppSettings
.
MqttClient
);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public
void
Configure
(
IApplicationBuilder
app
,
IHostingEnvironment
env
)
{
...
...
@@ -91,30 +100,17 @@ namespace IoTSharp.Hub
app
.
UseStaticFiles
();
app
.
UseHttpsRedirection
();
app
.
UseStaticFiles
();
app
.
UseSwagger
();
app
.
UseIoTSharpMqttClient
();
app
.
UseIotSharpMqttServer
();
app
.
UseForwardedHeaders
(
new
ForwardedHeadersOptions
{
ForwardedHeaders
=
ForwardedHeaders
.
XForwardedFor
|
ForwardedHeaders
.
XForwardedProto
});
app
.
UseSwaggerUi3
();
app
.
UseSwagger
(
config
=>
config
.
PostProcess
=
(
document
,
request
)
=>
{
if
(
request
.
Headers
.
ContainsKey
(
"X-External-Host"
))
{
// Change document server settings to public
document
.
Host
=
request
.
Headers
[
"X-External-Host"
].
First
();
document
.
BasePath
=
request
.
Headers
[
"X-External-Path"
].
First
();
}
});
app
.
UseSwaggerUi3
(
config
=>
config
.
TransformToExternalPath
=
(
internalUiRoute
,
request
)
=>
{
// The header X-External-Path is set in the nginx.conf file
var
externalPath
=
request
.
Headers
.
ContainsKey
(
"X-External-Path"
)
?
request
.
Headers
[
"X-External-Path"
].
First
()
:
""
;
return
externalPath
+
internalUiRoute
;
});
#if WithHealthChecks
app
.
UseIotSharpHealthChecks
();
#endif
}
}
}
\ No newline at end of file
IoTSharp.Hub/appsettings.json
浏览文件 @
4098d587
...
...
@@ -12,4 +12,5 @@
"JwtExpireDays"
:
1
,
"JwtIssuer"
:
"IoTSharp.Hub"
,
"AllowedHosts"
:
"*"
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录