基於surging的木舟IOT平臺如何添加網路組件

来源:https://www.cnblogs.com/fanliang11/p/18384041
-Advertisement-
Play Games

先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...


  一 、 概述

          為了彌補代碼的遺失,木舟IOT平臺正在加班加點進行研發,後面不只是針對於IOT設備接入上報,告警,視頻管理,組態數據可視化大屏,後面還會有快速搭建微服務平臺,利用surging.cli工具根據資料庫表生成微服務,中間服務,能讓程式員快速完成BOSS交給的任務,從而在這個內捲的社會能占有一席之地。這些都是沒有完成任務的空話,現在發此篇的目的是作者有能力開發出優秀的IOT平臺,先介紹一個比較突出的功能,就是可以基於共用或者獨立配置添加網路組件, 下麵來介紹一下如何添加網路組件。

 

    一鍵運行打包成品下載:https://pan.baidu.com/s/1MVsjKtVYpUonauAz9ZXtPg?pwd=1q2g

    測試用戶:fanly

    測試密碼:123456

      為了讓大家節約時間,能儘快運行產品看到效果,上面有 一鍵運行打包成品可以進行下載測試運行。

  二、如何測試運行

以下是目錄結構,

IDE:consul 註冊中心

kayak.client: 網關

kayak.server:微服務

apache-skywalking-apm:skywalking鏈路跟蹤

 以上是目錄結構,大家不需要一個個運行,只需要打開運行startup.bat,如果需要測試skywalking ,只需要apache-skywalking-apm\bin\startup.bat  文件就可以了,以下是運行的界面

三、如何添加組件

1.添加http服務組件,

打開平臺界面,然後點擊設備接入->網路組件,然後可以看到如下界面

 再點擊新增組件或者編輯組件,完成後註意啟動狀態是關閉狀態,此時並不能對於該組件功能進行訪問調用,只有把啟動狀態打開,才能訪問調用

 以上是http服務組件,啟動完成後,如果設置了webservice和swagger,你可以訪問webservice和swagger,看是否可以訪問

 

2.添加/編輯Tcp服務組件

當添加/編輯Tcp組件時,設置Host:127.0.0.1 ,port:248並且還有解析方式選項,選項裡面有不處理,固定長度,分隔符,自定義腳本,下麵我們就來看自定義腳本

 添加腳本如下:

parser.Fixed(4).Handler(
                  function(buffer){
                    var buf = BytesUtils.Slice(buffer,1,4);
                    parser.Fixed(buffer.ReadableBytes).Result(buf);
             }).Handler(
                    function(buffer){parser.Fixed(8).Result(buffer);}
            ).Handler(function(buffer){
                    parser.Result('處理完成','gb2312').Complete();
                 }
             )

而基於TCP服務代碼如下,需要繼承於TcpBehavior

    internal class TcpDeviceDataService : TcpBehavior, ITcpDeviceDataService
    {
        private readonly IDeviceProvider _deviceProvider;
        public TcpDeviceDataService(IDeviceProvider deviceProvider)
        {
            _deviceProvider = deviceProvider;
        }

        public override void Load(string clientId, NetworkProperties tcpServerProperties)
        {
            var deviceStatus = _deviceProvider.IsConnected(clientId);
            this.Parser.HandlePayload().Subscribe(async buffer => await ParserBuffer(buffer));
        }

        public override void DeviceStatusProcess(DeviceStatus status, string clientId, NetworkProperties tcpServerProperties)
        {
            //throw new NotImplementedException();
        }

        public async Task ParserBuffer(IByteBuffer buffer)
        {
            List<string> result = new List<string>();
            while (buffer.ReadableBytes > 0)
            {
                result.Add(buffer.ReadString(this.Parser.GetNextFixedRecordLength(),
                    Encoding.GetEncoding("gb2312")));
            }

            // var str= buffer.ReadString(buffer.ReadableBytes, Encoding.UTF8);

            var byteBuffer = Unpooled.Buffer();
            byteBuffer.WriteString("\r\n", Encoding.UTF8);
            byteBuffer.WriteString("處理完成", Encoding.GetEncoding("gb2312"));
            await Sender.SendAndFlushAsync(byteBuffer); 
            //  await Sender.SendAndFlushAsync("消息已接收",Encoding.GetEncoding("gb2312"));
            this.Parser.Close();
        }

        public Task<bool> ChangeDeviceStage(string deviceId)
        {
            throw new NotImplementedException();
        }
    }

用測試Tcp調試工具結果如下

 

3.添加/編輯UDP服務組件

當添加/編輯UDP組件時, 設置Host:127.0.0.1 ,port:267 並且可以是否開啟組播

 而基於udp服務代碼如下,需要繼承於UdpBehavior

  internal class UdpDeviceDataService : UdpBehavior, IUdpDeviceDataService
  {
      public Task<bool> ChangeDeviceStage(string deviceId)
      {
          throw new NotImplementedException();
      }

      public override async Task Dispatch(IEnumerable<byte> bytes)
      {
          await Sender.SendAndFlushAsync("\r\n", Encoding.UTF8);
          await Sender.SendAndFlushAsync("處理完成", Encoding.GetEncoding("gb2312"));
      }
  }

測試結果如下:

4.添加/編輯WebSocket服務組件

當添加/編輯WebSocket組件時, 設置Host:127.0.0.1 ,port:55

  而基於websocket服務代碼如下,需要繼承於WSBehavior

internal class WSDeviceDataService : WSBehavior, IWSDeviceDataService
{
    protected override void OnMessage(MessageEventArgs e)
    {
        this.Client.Value.SendTo($"send:{e.Data},\r\n reply:hello,welcome to you!",ID);
    }

    protected override void OnOpen()
    {
     
    }
}

測試結果如下:

5.添加/編輯UDP服務組件

當添加/編輯WebSocket組件時, 設置Host:127.0.0.1 ,port:345

 添加greet.proto文件,腳本如下:

syntax = "proto3";
 
package Greet;
 
service Greeter {
  // Sends a greeting
  rpc ChangeDeviceStage (DeviceRequest) returns (DeviceReply) {}
}
 
message DeviceRequest {
  string deviceId = 1;
}
 
message  DeviceReply {
 bool message = 1;
}

然後再創建GreeterBehavior,繼承Greeter.GreeterBase, IServiceBehavior,代碼如下

public partial class GreeterBehavior : Greeter.GreeterBase, IServiceBehavior
{
    private ServerReceivedDelegate received;
    public event ServerReceivedDelegate Received
    {
        add
        {
            if (value == null)
            {
                received += value;
            }
        }
        remove
        {
            received -= value;
        }
    }

    public string MessageId { get; } = Guid.NewGuid().ToString("N");
    public async Task Write(object result, int statusCode = 200, string exceptionMessage = "")
    {
        if (received == null)
            return;
        var message = new TransportMessage(MessageId, new ReactiveResultMessage
        {
            ExceptionMessage = exceptionMessage,
            StatusCode = statusCode,
            Result = result

        });
        await received(message);
    }

    public T CreateProxy<T>(string key) where T : class
    {
        return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>(key);
    }

    public object CreateProxy(Type type)
    {
        return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy(type);
    }

    public object CreateProxy(string key, Type type)
    {
        return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy(key, type);
    }

    public T CreateProxy<T>() where T : class
    {
        return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>();
    }

    public T GetService<T>(string key) where T : class
    {
        if (ServiceLocator.Current.IsRegisteredWithKey<T>(key))
            return ServiceLocator.GetService<T>(key);
        else
            return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>(key);
    }

    public T GetService<T>() where T : class
    {
        if (ServiceLocator.Current.IsRegistered<T>())
            return ServiceLocator.GetService<T>();
        else
            return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>();

    }

    public object GetService(Type type)
    {
        if (ServiceLocator.Current.IsRegistered(type))
            return ServiceLocator.GetService(type);
        else
            return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy(type);
    }

    public object GetService(string key, Type type)
    {
        if (ServiceLocator.Current.IsRegisteredWithKey(key, type))
            return ServiceLocator.GetService(key, type);
        else
            return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy(key, type);

    } 
    public void Publish(IntegrationEvent @event)
    {
        GetService<IEventBus>().Publish(@event);
    }

}

 而基於grpc服務代碼如下,需要繼承於剛剛創建的GreeterBehavior

    public class GrpcDeviceDataService : GreeterBehavior, IGrpcDeviceDataService
    {
        public override Task<DeviceReply> ChangeDeviceStage(DeviceRequest request, ServerCallContext context)
        {
            return Task.FromResult(new DeviceReply
            {
                Message = true
            }) ;
        }
    }

以下是測試結果:

 6.添加/編輯MQTT服務組件

當添加/編輯MQTT組件時, 設置Host:127.0.0.1 ,port:425

   而基於mqtt服務代碼如下,需要繼承於MqttBehavior

 public class MQTTDeviceDataService : MqttBehavior, IMQTTDeviceDataService
 {
     public override async Task<bool> Authorized(string username, string password)
     {
         bool result = false;
         if (username == "admin" && password == "123456")
             result = true;
         return await Task.FromResult(result);
     }

     public async Task<bool> IsOnline(string deviceId)
     {
         return await base.GetDeviceIsOnine(deviceId);
     }

     public async Task Publish(string deviceId, WillMessage message)
     {
         var willMessage = new MqttWillMessage
         {
             WillMessage = message.Message,
             Qos = message.Qos,
             Topic = message.Topic,
             WillRetain = message.WillRetain
         };
         await Publish(deviceId, willMessage);
         await RemotePublish(deviceId, willMessage);
     }
 }

以下是測試結果:

三、總結

   木舟IOT平臺會在github開源社區版本,可以自由更改代碼,用於商業項目,但不能自營平臺,如低代碼平臺,IOT平臺等,如有違反,後果自負,還有最好不要更改命名空間,然後跟公司說是自己研發的,如果知道後,我在博客全網通報此人,以前surging相關的事件就算了,就當沒發生過。,如果碰到困難,比較緊急的話,可以聯繫作者,加群:744677125


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...