陈嘉乐
2020-12-01 e08a444a9d7acea0cf39f50d22d29179f6a59292
HDL_ON/DAL/DriverLayer/Control_Udp.cs
File was renamed from HDL_ON/DriverLayer/Control_Udp_Bus.cs
@@ -1,17 +1,25 @@
using System;
using System.Collections.Generic;
using System.Text;
using HDL_ON.DAL.Net;
using HDL_ON.DriverLayer;
using HDL_ON.Entity;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Shared.Net;
namespace HDL_ON
namespace HDL_ON.DriverLayer
{
    public class Control_Udp_Bus
    public class Control_Udp
    {
        //public Control_Udp()
        //{
        //    MainPage.Log($"control bus udp 被创建,时间:{DateTime.Now}");
        //}
        /// <summary>
        /// 通讯端口
        /// </summary>
        public int port = 0;
        /// <summary>
        /// 控制失败次数
        /// </summary>
@@ -20,7 +28,7 @@
        /// <summary>
        /// 所有对一端口的控制都会放到这个集合里
        /// </summary>
        List<Control_Udp_Bus> controlList = new List<Control_Udp_Bus>(50);
        static List<Control_Udp> controlList = new List<Control_Udp>(50);
        public System.Net.IPEndPoint EndPoint
        {
@@ -40,11 +48,10 @@
        /// <summary>
        /// 发送数据,不需要等待回复
        /// ps:允许临时公开,仅供tv发送bus命令使用,后期需要更新到A协议数据格式控制
        /// </summary>
        public void ControlBytesSend(Command command, byte subnetID, byte deviceID, byte[] gatewayBytes, int sendCount = 3)
        {
            var control = new Control_Udp_Bus();
            var control = new Control_Udp();
            control.Send(new Target()
            {
                IPEndPoint =  EndPoint ,
@@ -86,13 +93,13 @@
            try
            {
                //账号没登录不回复
                if (MainPage.LoginUser == null || !MainPage.LoginUser.IsLogin)
                if ( UserInfo.Current == null || ! UserInfo.Current.IsLogin)
                {
                    return;
                }
                Control.ins.ChangeCommunicationMode(CommunicationMode.tcp_local_server);
                var sendStr = MainPage.LoginUser.accountString;
                Control.Ins.OpenTcpServer();
                var sendStr =  UserInfo.Current.AccountString;
                if (usefullBytes.Length == 0)
                {
                    SendRemark(sendStr);
@@ -127,14 +134,11 @@
        /// </summary>
        void SendRemark(string sendStr)
        {
            //if (System.Globalization.CultureInfo.InstalledUICulture.EnglishName.ToUpper().StartsWith("CZECH"))
            //    Encoding.GetEncoding(1250);
            byte[] sendBytes = new byte[20];
            byte[] b1 = Encoding.GetEncoding("gb2312").GetBytes(sendStr);
            Array.Copy(b1, 0, sendBytes, 0, 20 < b1.Length ? 20 : b1.Length);
            var control = new Control_Udp_Bus();
            var control = new Control_Udp();
            control.Send(new Target()
            {
                IPEndPoint = EndPoint,
@@ -156,11 +160,11 @@
                {
                    case FunctionType.Curtain:
                        byte curtainState = 0;
                        if (function.trait_on_off.value.ToString() == "on")
                        if (function.trait_on_off.curValue.ToString() == "on")
                        {
                            curtainState = 1;
                        }
                        else if (function.trait_on_off.value.ToString() == "off")
                        else if (function.trait_on_off.curValue.ToString() == "off")
                        {
                            curtainState = 2;
                        }
@@ -172,7 +176,7 @@
                        break;
                    case FunctionType.AC:
                        var aC = Newtonsoft.Json.JsonConvert.DeserializeObject<AC>(Newtonsoft.Json.JsonConvert.SerializeObject(function));//as AC;
                        ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0, aC.bus_Data.LoopID });
                        ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0, aC.bus_Data.LoopID });
                        ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 6, aC.curModeIndex, aC.bus_Data.LoopID });
                        ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 5, aC.curFanIndex, aC.bus_Data.LoopID });
                        byte modeKey = 4;
@@ -194,18 +198,18 @@
                                modeKey = 2;
                                break;
                        }
                        ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { modeKey, Convert.ToByte(aC.trait_temp.value), aC.bus_Data.LoopID });
                        ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { modeKey, Convert.ToByte(aC.trait_temp.curValue), aC.bus_Data.LoopID });
                        break;
                    case FunctionType.Relay:
                    case FunctionType.Dimmer:
                        byte brightness = 0;
                        if (function.trait_on_off.value.ToString() == "on")
                        if (function.trait_on_off.curValue.ToString() == "on")
                        {
                            var brightnessTrait = function.function.Find((obj) => obj.name == "brightness");
                            var brightnessTrait = function.function.Find((obj) => obj.key == "brightness");
                            if (brightnessTrait != null)
                            {
                                brightness = Convert.ToByte(brightnessTrait.value);
                                brightness = Convert.ToByte(brightnessTrait.curValue);
                            }
                        }
                        ControlBytesSend(Command.SetSingleLight, function.bus_Data.SubnetID, function.bus_Data.DeviceID,
@@ -220,10 +224,10 @@
                        break;
                    case FunctionType.FloorHeating:
                        var fh = Newtonsoft.Json.JsonConvert.DeserializeObject<FloorHeating>(Newtonsoft.Json.JsonConvert.SerializeObject(function));//as AC;
                        var fhModeTempTrait = function.function.Find((obj) => obj.name == "mode");
                        if (fhModeTempTrait.value_key.Count == 4)
                        var fhModeTempTrait = function.function.Find((obj) => obj.key == "mode");
                        if (fhModeTempTrait.value.Count == 4)
                        {
                            byte b1 = function.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0;
                            byte b1 = function.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0;
                            if (fh.workMode > 0)
                            {
                                b1 += (byte)(16 + fh.workMode);
@@ -233,7 +237,7 @@
                        break;
                    case FunctionType.Socket:
                        //var s = function as SwitchSocket;
                        ControlBytesSend(Command.SetSingleLight, function.bus_Data.SubnetID, function.bus_Data.DeviceID, new byte[] { function.bus_Data.LoopID, function.trait_on_off.value.ToString() == "on" ? (byte)100 : (byte)0 });
                        ControlBytesSend(Command.SetSingleLight, function.bus_Data.SubnetID, function.bus_Data.DeviceID, new byte[] { function.bus_Data.LoopID, function.trait_on_off.curValue.ToString() == "on" ? (byte)100 : (byte)0 });
                        break;
                }
            }
@@ -261,7 +265,7 @@
                            case FunctionType.RGB:
                                MainPage.Log($"rgb level : {light.brightness}");
                                byte b = 100;//开关操作依据on_off字段,实际开关值依据brightness,当on_off为打开,brightness不能为0
                                if (light.trait_on_off.value.ToString() == "off")
                                if (light.trait_on_off.curValue.ToString() == "off")
                                {
                                    b = 0;
                                }
@@ -279,7 +283,7 @@
                                break;
                            case FunctionType.Dimmer:
                                byte b1 = 100;
                                if (light.trait_on_off.value.ToString() == "off")
                                if (light.trait_on_off.curValue.ToString() == "off")
                                {
                                    b1 = 0;
                                }
@@ -294,7 +298,7 @@
                                //DimmerPage.UpdataStates(light);
                                break;
                            case FunctionType.Relay:
                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus_Data.LoopID, light.trait_on_off.value.ToString() == "on" ? (byte)100 : (byte)0, 0, 0 });
                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus_Data.LoopID, light.trait_on_off.curValue.ToString() == "on" ? (byte)100 : (byte)0, 0, 0 });
                                //RelayPage.UpdataState(light);
                                break;
                        }
@@ -305,11 +309,11 @@
                        {
                            case FunctionType.Curtain:
                                byte b1 = 0;
                                if (curtain.trait_on_off.value.ToString() == "stop")
                                if (curtain.trait_on_off.curValue.ToString() == "stop")
                                {
                                    b1 = 0;
                                }
                                else if (curtain.trait_on_off.value.ToString() == "on")
                                else if (curtain.trait_on_off.curValue.ToString() == "on")
                                {
                                    b1 = 1;
                                }
@@ -323,7 +327,7 @@
                            case FunctionType.RollingShutter:
                                //if (commandDictionary.Count > 0)
                                //{
                                if (curtain.trait_on_off.value.ToString() == "stop")
                                if (curtain.trait_on_off.curValue.ToString() == "stop")
                                {
                                    ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { curtain.bus_Data.LoopID, 0 });
                                }
@@ -356,14 +360,14 @@
                        {
                            case FunctionType.AC:
                                var aC = function as AC;
                                ControlBytesSend(Command.SetACMode, subnetId, deviceId, new byte[] { aC.bus_Data.LoopID, (byte)aC.curTempType, 32, 32, 32, 32, 32, 0, aC.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0, aC.curModeIndex, aC.curFanIndex, Convert.ToByte(aC.trait_temp.value), 0 });
                                ControlBytesSend(Command.SetACMode, subnetId, deviceId, new byte[] { aC.bus_Data.LoopID, (byte)aC.curTempType, 32, 32, 32, 32, 32, 0, aC.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0, aC.curModeIndex, aC.curFanIndex, Convert.ToByte(aC.trait_temp.curValue), 0 });
                                //ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.on_off == "on" ? (byte)1 : (byte)0, aC.bus_Data.LoopID });
                                foreach (var dic in commandDictionary)
                                {
                                    switch (dic.Key)
                                    {
                                        case "on_off":
                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0, aC.bus_Data.LoopID });
                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0, aC.bus_Data.LoopID });
                                            break;
                                        case "mode":
                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 6, aC.curModeIndex, aC.bus_Data.LoopID });
@@ -391,7 +395,7 @@
                                                    modeKey = 2;
                                                    break;
                                            }
                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { modeKey, Convert.ToByte(aC.trait_temp.value), aC.bus_Data.LoopID });
                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { modeKey, Convert.ToByte(aC.trait_temp.curValue), aC.bus_Data.LoopID });
                                            break;
                                        default:
                                            MainPage.Log($"功能未支持 : {dic.Key}");
@@ -404,7 +408,7 @@
                                var fh = function as FloorHeating;
                                if (fh.modeTemp.Count == 4)
                                {
                                    byte b1 = fh.trait_on_off.value.ToString() == "on" ? (byte)1 : (byte)0;
                                    byte b1 = fh.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0;
                                    if (fh.workMode > 0)
                                    {
                                        b1 += (byte)(16 + fh.workMode);
@@ -414,7 +418,7 @@
                                        var dicTempString = "";
                                        commandDictionary.TryGetValue("temp", out dicTempString);
                                        var dicTemp = Convert.ToByte(dicTempString);
                                        switch (fh.trait_mode.value)
                                        switch (fh.trait_mode.curValue)
                                        {
                                            case "day":
                                                fh.modeTemp["day"] = dicTemp;
@@ -440,7 +444,7 @@
                        {
                            case FunctionType.Fan:
                                var fan = function as Fan;
                                if (fan.trait_on_off.value.ToString() == "on")
                                if (fan.trait_on_off.curValue.ToString() == "on")
                                {
                                    ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { fan.bus_Data.LoopID, (byte)fan.openLevel });
                                }
@@ -455,7 +459,7 @@
                        {
                            case FunctionType.Socket:
                                var s = function as SwitchSocket;
                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { s.bus_Data.LoopID, s.trait_on_off.value.ToString() == "on" ? (byte)100 : (byte)0 });
                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { s.bus_Data.LoopID, s.trait_on_off.curValue.ToString() == "on" ? (byte)100 : (byte)0 });
                                break;
                        }
                        break;
@@ -575,7 +579,6 @@
                    }
                }
                //System.MainPage.WriteLog ("++++++++"+controlList.Count.ToString ());
            }
            controlList.Add(this);
        }
@@ -628,7 +631,6 @@
            allDone.WaitOne();
        }
        /// <summary>
        /// 让当前线程继续执行
        /// </summary>
@@ -638,8 +640,7 @@
            Packet.HaveSendCount = 4;
        }
        //数据重发处理
        //数据发送处理
        void managerSendCount(object o)
        {
            add();
@@ -650,7 +651,7 @@
                new System.Threading.Thread(() =>
                {
                    System.Threading.Thread.Sleep(1000);
                    UdpSocket._BusSocket.Start();
                    UdpSocket._BusSocket.Start(6000);
                    controlLostCount = 0;
                })
                { IsBackground = true }.Start();
@@ -688,8 +689,11 @@
        /// 当前数据包
        /// </summary>
        Packet Packet;
        private void ini(Target target)
        /// <summary>
        /// 记录发送数据包
        /// </summary>
        /// <param name="target"></param>
        private void signPacket(Target target)
        {
            this.SendFlag = string.Format("{0},{1},{2},", target.SubnetID, target.DeviceID, (int)target.Command + 1);
@@ -709,196 +713,27 @@
                case Command.ReadLightAllLoopBrightness:
                    this.SendFlag += "";
                    break;
                //case Command.YIPanelDeviceInof:
                //    for (int i = 0; i < 4; i++)
                //    {
                //        this.sendFlag += string.Format("{0}", target.AddData[i]);
                //    }
                //    break;
                //case Command.ReadDoorLockSceneObj:
                //    this.SendFlag += string.Format("{0},{1},{2},{3},{4}", target.AddData[0], target.AddData[1], target.AddData[2], target.AddData[3], target.AddData[4]);
                //    break;
                //case Command.ReadDoorLockClock:
                //case Command.CreatConnection:
                //    this.SendFlag += string.Format("{0}", target.AddData[0]);
                //    break;
                //case Command.ReadDoorLockUseRemark:
                //case Command.ReadSensorPushMessage:
                //case Command.SetSensorPushMessage:
                //case Command.SetSensorScence:
                //case Command.ReadAnalog:
                //    this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]);
                //    break;
                //case Command.ReadSensorScence:
                //    this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]);
                //    break;
                //case Command.SendRemoteInfoToServer:
                //    for (int i = 40; i < 48; i++)
                //    {
                //        this.sendFlag += string.Format("{0}", target.AddData[i]);
                //    }
                //    break;
                //case Command.SetCommonSwitch:
                //case Command.InfraredChannelControl:
                //case Command.ReadFoolHeat:
                //case Command.SetFoolHeat:
                //case Command.Serverx_FH_CMD:
                //case Command.SetArm:
                //case Command.ReadArm:
                //case Command.ReadSensorHistory:
                //case Command.SetSensorAutomationTargetLevelEnable:
                //case Command.ReadSensorAutomationLevelTargetEnable:
                //    this.SendFlag += string.Format("{0}", target.AddData[0]);
                //    break;
                //case Command.ReadDeviceModul:
                //case Command.ReadSecurityStatus:
                //case Command.ReadHornTargetState:
                case Command.ReadGateway:
                    this.SendFlag = string.Format("{0},{1}", target.AddData[0], target.AddData[1]);
                    break;
                //case Command.SetScene:
                //case Command.SetSeries:
                //case Command.SetHotelCurtain:
                //case Command.ReadAnalogValue:
                //case Command.SetSensorPushValues:
                //case Command.ReadSensorPushValues:
                //    this.SendFlag += string.Format("{0},{1}", target.AddData[0], target.AddData[1]);
                //    break;
                ////case Command.ReadOnePortWirelessFROtherInfo:
                //case Command.UpdataRemake:
                //case Command.WriteManageWirelessNet:
                //case Command.UpdataLightDimmingTheLargestLevel:
                //case Command.UpdataLightDimmingMaximumOrMinimum:
                //case Command.ReadGateWayModelInfo:
                //case Command.ReadGatewayServerIP:
                //case Command.SetGateWayModelInfo:
                //case Command.SetGateWayModelInternetInfo:
                //case Command.ReadDeviceMac:
                //case Command.SetDeviceSubnetID:
                //case Command.PositioningEquipment:
                //case Command.PositioningPanel:
                //case Command.CheckConfigSuccess:
                //case Command.GotoConfigMode:
                //case Command.ReadACPanel:
                //case Command.SetACPanel:
                //case Command.ReadTerrestriaHeatRemark:
                //case Command.UpdateGatewayIp:
                //case Command.ReadWirelessPanelMode:
                //case Command.ReadDrycontactMode:
                //case Command.ReadACFloorHeatingSettingEquipment:
                //case Command.SetACFloorHeatingSettingEquipment:
                //case Command.Read43FloorHeatingSettingEquipment:
                //case Command.Set43FloorHeatingSettingEquipment:
                //case Command.READ_AIR_ALL_Parameter:
                //case Command.Set_AIR_ALL_Parameter:
                //case Command.ReadFloorHeatProbe:
                //case Command.ControlMusicModel:
                //case Command.ReadButtonKeyEnable:
                //case Command.UpdateEquipmentLoopRemake:
                //case Command.SetGateway:
                //case Command.ReadMusicPanelSetting:
                //case Command.ReadMusicPanelEnable:
                //case Command.SetMusicPanelEnable:
                //case Command.SetMusicPanelSetting:
                //case Command.ReadGatewayProgrammingMode:
                //case Command.RED_HSFH_TOTAL:
                //case Command.RED_HSFH_INFORMATION:
                //case Command.RED_HSRM_TOTAL:
                //case Command.RED_HSRM_INFORMATION:
                //case Command.CLEAR_SYSTEM_HISTORY:
                //case Command.SetSensorTargetRemark:
                //case Command.ReadSensorAutomationEnableList:
                //case Command.SetSensorAutomationEnableList:
                //case Command.SetSensorAutomationListID:
                //case Command.ReadSensorAutomationListID:
                //case Command.SetSensorAutomationName:
                //case Command.ReadSensorAutomationName:
                //case Command.Set_Floor_Heat_State:
                //case Command.Read_Floor_Heat_State:
                //case Command.Read_Air_Condition_Set:
                //case Command.UpdateHornLoopRemake:
                //case Command.ReadHornLoopCount:
                //case Command.ReadPanelTempType:
                //    this.SendFlag += "";
                //    break;
                //case Command.ControlMusicModel2:
                //    for (int i = 1; i < target.AddData.Length; i++)
                //    {
                //        if (target.AddData[i + 1] == 0x0D)
                //        {
                //            break;
                //        }
                //        this.sendFlag += string.Format("{0},", target.AddData[i]);
                //    }
                //    break;
                //case Command.Remote3th:
                //    this.SendFlag = string.Format("{0},", (int)target.Command + 1);
                //    break;
                case Command.ReadDeviceLoopInfo:
                    if (target.AddData[0] == 1)//特殊处理灯光类,DMX模块每一个回路不固定小类,根据具体设置来回复
                        this.sendFlag += string.Format("{0},{1}", target.AddData[0], target.AddData[2]);
                    else
                        this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]);
                    break;
                //case Command.SetDeviceLoopInfo:
                //case Command.InfraredControl:
                //case Command.SetSecurityByPass:
                //case Command.SetSensorAutomationDateTimeCycle:
                //case Command.ReadSensorAutomationDateTimeCycle:
                //    this.sendFlag += string.Format("{0},{1},{2}", target.AddData[0], target.AddData[1], target.AddData[2]);
                //    break;
                //case Command.ReadWirelessPanelButtonKey:
                //case Command.WriteWirelessPanelButtonKey:
                //case Command.ReadDryContactStatus:
                //case Command.SetCurtainModelStutas:
                //case Command.DownloadInfrared:
                //case Command.UpLoadInfrared:
                case Command.InstructionPanelKey:
                case Command.ReadInstructionPanelKey:
                    //case Command.ReadSensorTargetRemark:
                    //case Command.SetHornTargetState:
                    this.sendFlag += string.Format("{0},{1}", target.AddData[0], target.AddData[1]);
                    break;
                //case Command.AssignedAddress:
                //case Command.UpdataCurtainModelRunTime:
                //case Command.ReadCurtainStatus:
                //case Command.ReadPanleTemp:
                //case Command.FreshAirRead:
                //case Command.FreshAirControl:
                //case Command.Set_Air_State_New:
                //case Command.ReadHornTargetEnable:
                //case Command.SetHornTargetEnable:
                //case Command.ReadHornLoopAlarm:
                //case Command.SetHornPush:
                //case Command.ReadHornPush:
                //case Command.ReadHornHistory:
                //case Command.ReadHornLoopsStatus:
                //    this.sendFlag += string.Format("{0}", target.AddData[0]);
                //    break;
                //case Command.RemoteFirst:
                //    for (int i = 0; i < 28; i++)
                //    {
                //        this.sendFlag += string.Format("{0}", target.AddData[i]);
                //    }
                //    break;
                //case Command.RemoteSecoud:
                //    for (int i = 0; i < 7; i++)
                //    {
                //        this.sendFlag += string.Format("{0}", target.AddData[i]);
                //    }
                //    break;
                default:
                    //return;
                    break;
            }
            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(managerSendCount));
            thread.IsBackground = true;
            thread.Start(Packet);
        }
        /// <summary>
        /// 发送Bus数据,发送了不需要等待
        /// 发送数据
        /// </summary>
        /// <param name="target">发送对象</param>
        /// <param name="sendCount">重发次数</param>
@@ -909,7 +744,11 @@
                Packet = new Packet(target.SendBytes, target.IPEndPoint);
                Packet.HaveSendCount = 3 - sendCount;
                ini(target);
                signPacket(target);
                System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(managerSendCount));
                thread.IsBackground = true;
                thread.Start(Packet);
                if (isWait)
                {
@@ -925,28 +764,40 @@
        /// <summary>
        /// 读取网关IP
        /// </summary>
        public void ReadGatewayIP()
        public void SearchLocalGateway()
        {
            try
            {
                var sendJob = new JObject {
                                            {"type","device" },{"from_oid","020101" },{"to_oid",null },{"time_stamp","46A3B99F" },{"command","search"}
                                        };
                var SearchGateway = JsonConvert.SerializeObject(sendJob);
                var SearchGatewayPayload = Encoding.ASCII.GetBytes(SearchGateway);
                Packet = new Packet(SearchGatewayPayload, new System.Net.IPEndPoint(System.Net.IPAddress.Parse("239.0.168.188"), 8585));
                var sendJob = new JObject { { "id", Control.Ins.msg_id.ToString() }, { "time_stamp", (DateTime.Now.Ticks / 100000).ToString() } };
                var bodyString = JsonConvert.SerializeObject(sendJob);
                var sendBytes = Control.Ins.ConvertSendBodyData(CommunicationTopic.SearchLoaclGateway, bodyString);
                //组播发送
                Packet = new Packet(sendBytes, new System.Net.IPEndPoint(System.Net.IPAddress.Parse("239.0.168.188"), 8585));
                Packet.HaveSendCount = 4;//ps:没有重发,后期有时间可以增加重发判断
                System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(managerSendCount));
                thread.IsBackground = true;
                thread.Start(Packet);
                wait();
                //wait();不需要等待
            }
            catch (Exception ex)
            {
                MainPage.Log($"Send bus data error {ex.Message}");
            }
        }
        /// <summary>
        /// 本地udp控制A协议网关
        /// </summary>
        public void SendLocalHdlLinkData(byte[] sendBytes)
        {
            Packet = new Packet(sendBytes, new System.Net.IPEndPoint(System.Net.IPAddress.Parse(Control.Ins.reportIp), 8585));
            Packet.HaveSendCount = 4;//ps:没有重发,后期有时间可以增加重发判断
            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(managerSendCount));
            thread.IsBackground = true;
            thread.Start(Packet);
            //wait();不需要等待
            MainPage.Log($"发送Hdl-Link数据,IP:{Control.Ins.reportIp}:8585");
        }
    }