前言
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 視覺化資料流的服務規則引擎編排。