基於surging網絡組件多協議適配的平臺化發展

前言

               Surging 發展已經有快6年的時間,經過這些年的發展,功能框架也趨於成熟,但是針對於商業化需求還需要不斷的打磨,前段時間客戶找到我想升級成平臺化,針對他的需求我們討論了很久,他的一些需求想法還是非常先進的,針對於現在surging 還有很多需要研發打磨,後面因爲時間成本的關係我拒絕了他,我也打算後面慢慢的將surging升級爲平臺化以便支持物聯網,流媒體等業務場景,可以通過統一定義,統一管理來配置構建各種業務場景,而web網關,設備網關,流媒體網關等各種類型的網關可以通過配置添加刪除網絡協議組件,以便可以支持多種協議適配,設配管理和配置規則引擎等業務場景。 今天所要講的是以TCP組件爲範本如何進行優化構建成平臺化多協議適配。

構建TCP組件

 首先來看看如何創建配置啓動協議組件,以TCP協議組件爲例,以下代碼用於創建具有配置屬性的TCP網絡組件,並配置規則引擎腳本以解碼消息

  var config =new Dictionary<string, object>();
            config.Add("script", @"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();
                 }
             )");
            var network=  serviceProvider.ServiceProvoider.GetInstances<INetworkProvider<TcpServerProperties>>().CreateNetwork(new TcpServerProperties
           {
               ParserType = PayloadParserType.Script,
               PayloadType = PayloadType.String,
               Host = "127.0.0.1",
               Port = 322,
               ParserConfiguration = config
           });
            network.StartAsync();

以下代碼用於創建具有配置屬性的TCP網絡組件,並配置direct解碼消息

  var network1 = serviceProvider.ServiceProvoider.GetInstances<INetworkProvider<TcpServerProperties>>().CreateNetwork(new TcpServerProperties
            {
                ParserType = PayloadParserType.Direct,
                PayloadType = PayloadType.String,
                Host = "127.0.0.1",
                Port = 321 
            });
            network1.StartAsync();

還有兩種類型的payload parser:fixedlength和delimited,這裏就不依次說明了,直接通過添加更改ParserType屬性就能配置相關的parse

創建Tcp服務

 

 public class TcpService : TcpBehavior, ITcpService
    { 
        private readonly IDeviceProvider _deviceProvider;
        public TcpService(IDeviceProvider deviceProvider)
        {
            _deviceProvider = deviceProvider;
        }

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

        public override void DeviceStatusProcess(DeviceStatus status, string clientId, TcpServerProperties 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);
            buffer.Release();
            //  await Sender.SendAndFlushAsync("消息已接收",Encoding.GetEncoding("gb2312"));
            this.Parser.Close(); 
        }

    }

 

測試

規則引擎腳本解碼測試

 

 direct 解碼測試

 

 

總結

最近忙着對於rtsp 進行bug 的修復和測試, 這樣流媒體業務場景除了httpflv,rtmp 協議外,也能針對於rtsp協議的支持,協議之間互相也能進行轉發, 對於rtsp 完成後,surging 將轉繼續優化構建平臺化,年底也會陸續推出後臺系統,基於Node-Red 可視化數據流的服務規則引擎編排。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章