六、服務端實現
6.1 概述
本章所說的服務端,是“儀器-工控機-服務器-客戶端”架構中的服務端,並不實現採集功能(採集功能已在前面的章節講述)。我們要實現的服務端是有高實時性的,當數據發生改變時,迅速地推送給客戶端。同時,客戶端上的反控操作,能快速地反映到儀器上。
MQTT是實現此類服務端較好的技術選擇。以“設備名.因子名”爲主題,當採集到變化的數據時,發佈相應主題。客戶端根據當前顯示需要,訂閱相關的主題。同時,工控機訂閱一個專門的反控主題,任何客戶端的反控操作都發布該主題。
6.2 服務端技術實現
使用MQTTnet開發MQTT服務器,同時支持TCP模式和WebSocket模式。爲了支持WebSocket,必須建立一個ASP.NET Core項目,然後修改Program.cs爲:
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
private static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(o =>
{
o.ListenAnyIP(9022, l => l.UseMqtt());//TCP
o.ListenAnyIP(9021);//WebSocket
})
.UseStartup<Startup>()
.Build();
修改Startup.cs爲:
public void ConfigureServices(IServiceCollection services)
{
services
.AddHostedMqttServer(mqttServer => mqttServer.WithoutDefaultEndpoint())
.AddMqttConnectionHandler()
.AddConnections();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapMqtt("/mqtt");
});
app.UseMqttServer(server =>
{
//處理MQTT消息
});
}
對MQTT服務器來說,工控機和網頁客戶端都是客戶端,如下圖所示:
由於存在反控,工控機分別訂閱了不同的反控主題。而對客戶端來說,它是一個整體的展現,並不太關心什麼數據來自哪個工控機。所以,在反控時,服務端需要對反控命令進行分發。
6.3 客戶端技術實現
客戶端使用mqtt.js實現功能,通過WebSocket的方式連接服務端。所有因子的主題爲一個保留主題,基本客戶端剛連接就可以收到最新的因子列表。它再通過這個列表訂閱相關的因子主題,得到因子的最新數值。
下面,我們模擬了一個從儀器到工控機,到服務端,再到客戶端的場景。
8臺虛擬Modbus設備,約700個因子:
模擬兩臺工控機,每臺採集4臺儀器:
模擬MQTT服務端:
模擬Web客戶端: