using System;
|
using System.Net.Sockets;
|
using System.Net;
|
using Newtonsoft.Json.Linq;
|
|
namespace HDL_ON
|
{
|
public class UdpSocket
|
{
|
static UdpSocket _busSocket;
|
public static UdpSocket _BusSocket
|
{
|
get
|
{
|
if(_busSocket == null)
|
{
|
_busSocket = new UdpSocket();
|
}
|
return _busSocket;
|
}
|
}
|
|
/// <summary>
|
/// 监听端口
|
/// </summary>
|
public int port
|
{
|
get
|
{
|
if (MainPage.LoginUser != null && Entity.DB_ResidenceData.residenceData != null)
|
{
|
return Entity.DB_ResidenceData.residenceData.GatewayType == 0 ? 6000 : 8585;
|
}
|
return 6000;
|
}
|
}
|
|
//本地Socket
|
private Socket busSocket;
|
|
/// <summary>
|
/// 启动Socket接收和发送功能
|
/// </summary>
|
public void Start ()
|
{
|
if (IsRunning || port == 0) {
|
return;
|
}
|
|
busSocket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
|
busSocket.EnableBroadcast = true;
|
try {
|
busSocket.Bind (new IPEndPoint (IPAddress.Any, port));
|
|
busSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.0.168.188")));
|
}
|
catch{
|
busSocket = null;
|
return;
|
}
|
|
asyncBeginReceive ();
|
|
MainPage.Log ($"udp port : {port}");
|
}
|
|
/// <summary>
|
/// 停止Socket
|
/// </summary>
|
public void Stop()
|
{
|
if (!IsRunning)
|
{
|
return;
|
}
|
try
|
{
|
busSocket.Close();
|
}
|
catch { }
|
busSocket = null;
|
MainPage.Log("Socket关闭");
|
}
|
|
/// <summary>
|
/// 当前的Socket是否运行
|
/// </summary>
|
public bool IsRunning
|
{
|
get
|
{
|
return null == busSocket ? false : true;
|
}
|
}
|
|
/// <summary>
|
/// 开始异步接收数据
|
/// </summary>
|
private void asyncBeginReceive()
|
{
|
if (!IsRunning)
|
{
|
return;
|
}
|
|
try {
|
Packet packet = new Packet ();
|
busSocket.BeginReceiveFrom (packet.Bytes, 0, packet.Bytes.Length, SocketFlags.None, ref packet.RemoteEndPoint, new AsyncCallback (asyncEndReceive), packet);
|
}
|
catch (Exception e) {
|
System.Threading.Thread.Sleep (1);
|
asyncBeginReceive ();
|
Console.WriteLine($"asyncBeginReceive {e.Message}");
|
}
|
}
|
|
/// <summary>
|
/// 异步接收数据结束
|
/// </summary>
|
/// <param name="iar"></param>
|
private void asyncEndReceive(IAsyncResult iar)
|
{
|
if (!IsRunning)
|
{
|
return;
|
}
|
|
try
|
{
|
asyncBeginReceive();
|
Packet packet = (Packet)iar.AsyncState;
|
int len = busSocket.EndReceiveFrom(iar, ref packet.RemoteEndPoint);
|
|
byte[] bytes = packet.Bytes;
|
packet.Bytes = new byte[len];
|
Array.Copy(bytes, 0, packet.Bytes, 0, packet.Bytes.Length);
|
|
//mqtt连接数据读取 A协议网络设备信息读取回复 处理
|
if (((IPEndPoint)packet.RemoteEndPoint).Port == 8585)
|
{
|
var reString = System.Text.Encoding.UTF8.GetString(bytes);
|
var jt = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(reString);
|
JToken jtc = null;
|
jt.TryGetValue("command", out jtc);
|
if (jtc != null && jtc.ToString() == "search_response")
|
{
|
JToken jto = null;
|
jt.TryGetValue("objects", out jto);
|
if (jto != null)
|
{
|
var jt2 = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(jto.ToString());
|
JToken model_id = null;
|
jt2.TryGetValue("model_id", out model_id);
|
if (model_id != null)
|
{
|
if (model_id.ToString() == "")//Bus网关
|
{
|
var revIp = jt2.GetValue("ip_address").ToString();
|
var revMac = jt2.GetValue("device_mac").ToString();
|
var revName = jt2.GetValue("device_name").ToString();
|
//if (revIp == Entity.DB_ResidenceData.residenceData.residenceGatewayMAC)
|
{
|
DriverLayer.Control.ins.reportIp = revIp;
|
DriverLayer.Control.ins.ChangeCommunicationMode(DriverLayer.CommunicationMode.tcp_local_client);
|
}
|
}
|
else if (model_id.ToString() == "4")//声必可语音面板
|
{
|
|
}
|
}
|
}
|
}
|
}
|
else if(((IPEndPoint)packet.RemoteEndPoint).Port == 6000)//处理bus 6000端口的数据
|
{
|
packet.Manager();
|
}
|
}
|
catch (Exception ex)
|
{
|
MainPage.Log($"异步接收数据结束 {ex.Message},{((Packet)iar.AsyncState).Bytes}");
|
}
|
}
|
|
/// <summary>
|
/// 异步发送数据
|
/// </summary>
|
/// <param name="tempPacket"></param>
|
public void AsyncBeginSend(Packet tempPacket)
|
{
|
try
|
{
|
if (!IsRunning)
|
{
|
tempPacket.HaveSendCount++;
|
return;
|
}
|
tempPacket.FlagDateTime = System.DateTime.Now;
|
tempPacket.HaveSendCount++;
|
busSocket.BeginSendTo(tempPacket.Bytes, 0, tempPacket.Bytes.Length, SocketFlags.None, tempPacket.RemoteEndPoint, new AsyncCallback(asyncEndSend), tempPacket);
|
}
|
catch (Exception ex)
|
{
|
MainPage.Log($"AsyncBeginSend error {ex.Message}");
|
}
|
}
|
|
/// <summary>
|
/// 异步发送数据结束
|
/// </summary>
|
/// <param name="iar"></param>
|
private void asyncEndSend(IAsyncResult iar)
|
{
|
Packet tempUDPPacketBuffer = (Packet)iar.AsyncState;
|
try
|
{
|
int bytesSent = busSocket.EndSendTo(iar);
|
}
|
catch {
|
|
}
|
}
|
}
|
}
|