123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- using Evcb.Domain.Model;
- using Evcb.Repository;
- using Evcb.Service;
- using SuperSocket.Common;
- using SuperWebSocket;
- using SuperWebSocket.SubProtocol;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace OCPPServer.Protocol
- {
- public class OCPPWSServer : WebSocketServer<ClientData>
- {
- /// <summary>
- /// 可允許連線Clinet數
- /// </summary>
- public int connectNum { get; set; }
- /// <summary>
- /// 是否限制連線Clinet數
- /// </summary>
- public bool beConnectLimit { get; set; }
- /// <summary>
- /// Initializes a new instance of the <see cref="WebSocketServer"/> class.
- /// </summary>
- /// <param name="subProtocols">The sub protocols.</param>
- public OCPPWSServer(IEnumerable<ISubProtocol<ClientData>> subProtocols)
- : base(subProtocols)
- {
- }
- /// <summary>
- /// Initializes a new instance of the <see cref="WebSocketServer"/> class.
- /// </summary>
- /// <param name="subProtocol">The sub protocol.</param>
- public OCPPWSServer(ISubProtocol<ClientData> subProtocol)
- : base(subProtocol)
- {
- }
- /// <summary>
- /// Initializes a new instance of the <see cref="WebSocketServer"/> class.
- /// </summary>
- public OCPPWSServer()
- : base(new List<ISubProtocol<ClientData>>())
- {
- }
- protected override bool ValidateHandshake(ClientData session, string origin)
- {
- //初始化ClientData
- session.InitialPileData();
- //確認電樁所送的電樁識別碼是否包含在request path中
- string[] words = session.Path.Split('/');
- using (var db = new PhihongDbContext())
- {
- if (this.beConnectLimit == true)
- {
- var connectPile = db.Machine.Where(c => c.Online == true).ToList();
- if (connectPile.Count >= this.connectNum)
- {
- byte[] m_SwitchResponse;
- var responseBuilder = new StringBuilder();
- responseBuilder.AppendWithCrCf("HTTP/1.1 403"); //403 Forbidden : 用戶端並無訪問權限,所以伺服器給予應有的回應。
- responseBuilder.AppendWithCrCf("Upgrade: WebSocket");
- responseBuilder.AppendWithCrCf("Connection: Upgrade");
- responseBuilder.AppendWithCrCf("Sec-WebSocket-Version: " + session.SecWebSocketVersion);
- responseBuilder.AppendWithCrCf();
- m_SwitchResponse = Encoding.UTF8.GetBytes(responseBuilder.ToString());
- session.SendRawData(m_SwitchResponse, 0, m_SwitchResponse.Length);
- return false;
- }
- }
- IUnitOfWork uow = new UnitOfWork(db);
- IMachineService machineSrv = new MachineService(uow);
- var machine = machineSrv.GetByCustomId(words.Last());
- if (machine == null)
- {
- byte[] m_SwitchResponse;
- var responseBuilder = new StringBuilder();
- responseBuilder.AppendWithCrCf("HTTP/1.1 404");
- responseBuilder.AppendWithCrCf("Upgrade: WebSocket");
- responseBuilder.AppendWithCrCf("Connection: Upgrade");
- responseBuilder.AppendWithCrCf("Sec-WebSocket-Version: " + session.SecWebSocketVersion);
- responseBuilder.AppendWithCrCf();
- m_SwitchResponse = Encoding.UTF8.GetBytes(responseBuilder.ToString());
- session.SendRawData(m_SwitchResponse, 0, m_SwitchResponse.Length);
- return false;
- //session.CloseWithHandshake(session.ProtocolProcessor.CloseStatusClode.NormalClosure, "This machine can't be recognized.");
- }
- session.MachineCustomIdTemp = words.Last();
- uow.Dispose();
- }
- //session.MachineCustomIdTemp = "RDTEST101";
- //確認電樁連線所送的SubProtocol是否被Server支援
- if (session.SecWebSocketProtocol.ToLower() != "ocpp1.6")
- {
- const string m_Magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
- const string SecWebSocketKey = "Sec-WebSocket-Key";
- const string ResponseHeadLine10 = "HTTP/1.1 101 Switching Protocols";
- const string Upgrade = "Upgrade";
- const string ResponseUpgradeLine = Upgrade + ": WebSocket";
- const string Connection = "Connection";
- const string ResponseConnectionLine = Connection + ": Upgrade";
- const string ResponseAcceptLine = "Sec-WebSocket-Accept: {0}";
- var responseBuilder = new StringBuilder();
- var secWebSocketKey = session.Items.GetValue<string>(SecWebSocketKey, string.Empty);
- if (string.IsNullOrEmpty(secWebSocketKey))
- {
- return false;
- }
- string secKeyAccept = string.Empty;
- try
- {
- secKeyAccept = Convert.ToBase64String(System.Security.Cryptography.SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(secWebSocketKey + m_Magic)));
- }
- catch (Exception)
- {
- return false;
- }
- responseBuilder.AppendWithCrCf(ResponseHeadLine10);
- responseBuilder.AppendWithCrCf(ResponseUpgradeLine);
- responseBuilder.AppendWithCrCf(ResponseConnectionLine);
- responseBuilder.AppendFormatWithCrCf(ResponseAcceptLine, secKeyAccept);
- responseBuilder.AppendWithCrCf();
- byte[] data = Encoding.UTF8.GetBytes(responseBuilder.ToString());
- session.SendRawData(data, 0, data.Length);
- session.CloseWithHandshake(session.ProtocolProcessor.CloseStatusClode.NormalClosure, "This SubProtocol can't be supported.");
- return false;
- }
- //session.m_ReceiveData += new ClientData.OCPPClientDataEventHandler<ClientData, String>(WSServer.ReceivedMessage);
- return true;
- }
- }
- }
|