using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Shared.SimpleControl;
namespace Shared
{
public class Control
{
public System.DateTime LatestDateTime = System.DateTime.Now;
///
/// 所有微信对一端口的控制都会放到这个集合里
///
private static System.Collections.Generic.List controlList = new List (50);
///
/// 发送数据,等待有反馈
///
/// The bytes send has return.
public static byte [] ControlBytesSendHasReturn (Command command, byte subnetID, byte deviceID, byte [] gatewayBytes)
{
if (command == Command.ReadDeviceLoopInfo || command == Command.ReadDeviceModul)
CommonPage.LocalPhoneFindDevice = true;
if (command == Command.ReadGateway || command == Command.ReadGatewayProgrammingMode || command == Command.SetGateway) {
CommonPage.FindGateway = true;
CommonPage.LocalPhoneFindDevice = true;
}
Control control = new Control () { };
control.Send (new Target () {
IPEndPoint = CommonPage.EndPoint,
Command = command,
SubnetID = subnetID,
DeviceID = deviceID,
AddData = gatewayBytes,
}, SendCount.Three, true);
CommonPage.FindGateway = false;
return control.UsefulBytes;
}
///
/// 发送数据,不需要等待回复
///
public static void ControlBytesSend (Command command, byte subnetID, byte deviceID, byte [] gatewayBytes, SendCount sendCount = SendCount.Three, System.Net.IPEndPoint ipEndpoint = null)
{
if (command == Command.ReadDeviceLoopInfo || command == Command.ReadDeviceModul)
CommonPage.LocalPhoneFindDevice = true;
if (command == Command.ReadGateway || command == Command.ReadGatewayProgrammingMode
|| command == Command.SetGateway) {
CommonPage.FindGateway = true;
CommonPage.LocalPhoneFindDevice = true;
}
Control control = new Control () { };
control.Send (new Target () {
IPEndPoint = ipEndpoint == null ? CommonPage.EndPoint : ipEndpoint,//new System.Net.IPEndPoint (System.Net.IPAddress.Parse (new Net.NetWiFi ().BroadcastIpAddress.ToString ()), 6000),
Command = command,
SubnetID = subnetID,
DeviceID = deviceID,
AddData = gatewayBytes,
}, sendCount, false);
CommonPage.FindGateway = false;
System.Console.WriteLine (command.ToString () + "::" + CommonPage.EndPoint.ToString ());
}
///
/// 处理接收回来的数据
///
/// 源子网号
/// 源设备号
/// 操作码
/// 有用的数据
/// 源网络套接字
public static void ManagerReceive (byte subnetID, byte deviceID, Command command, byte targetSubnetID, byte targetDeviceID, byte [] usefulBytes, System.Net.EndPoint remoteEndPoint)
{
try {
string receiveFlag = string.Format ("{0},{1},{2},", subnetID, deviceID, (int)command);
switch ((Command)command) {
case Command.YIPanelDeviceInofACK:
for (int i = 0; i < 4; i++) {
receiveFlag += string.Format ("{0}", usefulBytes [i]);
}
break;
case Command.ReadDoorLockSceneObjACK:
receiveFlag += string.Format ("{0},{1},{2},{3},{4}", usefulBytes [0], usefulBytes [1], usefulBytes [2], usefulBytes [3], usefulBytes [4]);
break;
case Command.ReadDoorLockClockACK:
case Command.CreatConnectionACK:
receiveFlag += string.Format ("{0}", usefulBytes [0]);
break;
//门锁,BroadcastDoorLockStateAndAlarm
//广播门锁状态和报警,
case Command.BroadcastDoorLockStateAndAlarm://广播门锁状态和报警
receiveFlag += string.Format ("{0},{1}", usefulBytes [0], usefulBytes [1]);
break;
case Command.ReadDoorLockUseRemarkACK:
case Command.ReadSensorPushMessageACK:
case Command.SetSensorPushMessageACK:
case Command.ReadSensorScenceACK:
case Command.ReadAnalogACK:
receiveFlag += string.Format ("{0},{1},{2}", usefulBytes [0], usefulBytes [1], usefulBytes [2]);
break;
case Command.SetSensorScenceACK:
receiveFlag += string.Format ("{0},{1},{2}", usefulBytes [1], usefulBytes [2], usefulBytes [3]);
break;
case Command.SendRemoteInfoToServerACK:
for (int i = 1; i < 9; i++) {
receiveFlag += string.Format ("{0}", usefulBytes [i]);
}
break;
case Command.BroadcastDryContactStatus://由干接点广播出来的数据,程序不做回复。
receiveFlag += string.Format ("{0}", usefulBytes [0]);
break;
case Command.SetSceneACK:
receiveFlag += string.Format ("{0},{1}", usefulBytes [0], usefulBytes [1]);
break;
case Command.SetSeriesACK:
receiveFlag += string.Format ("{0},{1}", usefulBytes [0], usefulBytes [1]);
break;
case Command.UpdataCurtainModelStutasACK:
case Command.SetHotelCurtainACK:
case Command.DownloadInfraredACK:
case Command.SetSensorPushValuesACK:
case Command.ReadSensorPushValuesACK:
receiveFlag += string.Format ("{0},{1}", usefulBytes [0], usefulBytes [1]);
break;
case Command.ReadLightEquipmentAllLoopBrightnessACK:
break;
case Command.ReadLightSingleLoopBrightnessACK:
receiveFlag += string.Format ("{0}", usefulBytes [0]);
break;
case Command.SetSingleLightACK:
receiveFlag += string.Format ("{0},{1}", usefulBytes [0], usefulBytes [2]);
break;
case Command.UpLoadInfraredACK:
receiveFlag += string.Format ("{0},{1}", usefulBytes [0], usefulBytes [1]);
break;
case Command.SetCommonACK:
case Command.InfraredChannelControlACK:
case Command.ReadACModeACK:
case Command.SetACModeACK:
case Command.Serverx_FH_CMD_ACK:
case Command.ReadSensorHistoryACK:
case Command.SetSensorAutomationTargetLevelEnableACK:
case Command.ReadSensorAutomationLevelTargetEnableACK:
receiveFlag += string.Format ("{0}", usefulBytes [0]);
break;
case Command.ReadFoolHeatACK:
case Command.SetFoolHeatACK:
case Command.SetArmACK:
case Command.ReadArmACK:
receiveFlag += string.Format ("{0}", usefulBytes [0]);
break;
case Command.ReadDeviceModulACK:
case Command.ReadGatewayACK:
case Command.ReadSecurityStatusACK:
receiveFlag = string.Format ("{0},{1}", usefulBytes [0], usefulBytes [1]);
break;
case Command.UpdataLightDimmingTheLargestLevelACK:
case Command.UpdataLightDimmingMaximumOrMinimumACK:
case Command.WriteManageWirelessNetACK:
//**********新增mqtt上位机协议 2020-03-04**********
case Command.ReadGateWayURLACK:
case Command.SetGateWayURLACK:
case Command.ReadGateWayClientIDUsernamePasswordACK:
case Command.SetGateWayClientIDUsernamePasswordACK:
case Command.ReadGateWayAESEncryptionACK:
case Command.SetGateWayAESEncryptionACK:
case Command.ReadGateWayTopicACK:
case Command.SetGateWayTopicACK:
case Command.ReadGateWayAdminInfoACK:
case Command.SetGateWayAdminInfoACK:
case Command.ReadGateWayLocalEncryptionACK:
case Command.SetReadGateWayLocalEncryptionACK:
case Command.Read_APP_Data_STORE_1D5C_CMD:
case Command.Write_APP_Data_STORE_1D5E_CMD:
//************************************
case Command.ReadGateWayModelInfoACK:
case Command.ReadGatewayServerIPACK:
case Command.SetGateWayModelInfoACK:
case Command.SetGateWayModelInternetInfoACK:
case Command.ReadDeviceMacACK:
case Command.SetDeviceSubnetIDACK:
case Command.PositioningEquipmentACK:
case Command.PositioningPanelACK:
case Command.GotoConfigModeACK:
case Command.CheckConfigSuccessACK:
case Command.SetACPanelACK:
case Command.ReadACPanelACK:
case Command.ReadTerrestriaHeatRemarkACK:
case Command.UpdateGatewayIpACK:
case Command.ReadWirelessPanelModeACK:
case Command.ReadDrycontactModeACK:
case Command.ReadACFloorHeatingSettingEquipmentACK:
case Command.SetACFloorHeatingSettingEquipmentACK:
case Command.Read43FloorHeatingSettingEquipmentACK:
case Command.Set43FloorHeatingSettingEquipmentACK:
case Command.READ_AIR_ALL_Parameter_ack:
case Command.Set_AIR_ALL_Parameter_ack:
case Command.ReadFloorHeatProbeACK:
case Command.ReadButtonKeyEnableACK:
case Command.UpdateLightDimmingLoopRemakeACK:
case Command.ReadMusicPanelSettingACK:
case Command.ReadMusicPanelEnableACK:
case Command.SetMusicPanelEnableACK:
case Command.SetMusicPanelSettingACK:
case Command.SetGatewayACK:
case Command.ReadGatewayProgrammingModeACK:
case Command.RED_HSFH_TOTAL_ACK:
case Command.RED_HSFH_INFORMATION_ACK:
case Command.RED_HSRM_TOTAL_ACK:
case Command.RED_HSRM_INFORMATION_ACK:
case Command.CLEAR_SYSTEM_HISTORY_ACK:
case Command.SetSensorTargetRemarkACK:
case Command.ReadSensorAutomationEnableListACK:
case Command.SetSensorAutomationEnableListACK:
case Command.SetSensorAutomationListIDACK:
case Command.ReadSensorAutomationListIDACK:
case Command.ReadSensorAutomationNameACK:
case Command.SetSensorAutomationNameACK:
case Command.Set_Floor_Heat_State_ack:
case Command.Read_Floor_Heat_State_ack:
case Command.Read_Air_Condition_Set_ack:
case Command.HornAlarmBroadcast:
case Command.ReadHornLoopCountACK:
case Command.UpdateHornLoopRemakeACK:
case Command.ReadPanelTempTypeACK:
receiveFlag += "";
break;
case Command.ControlMusicModel1ACK:
receiveFlag += "";
break;
case Command.ControlMusicModel2ACK:
for (int i = 1; i < usefulBytes.Length; i++) {
if (usefulBytes [i + 1] == 44) {
break;
}
receiveFlag += string.Format ("{0},", usefulBytes [i]);
}
break;
case Command.Remote3thACK:
receiveFlag = string.Format ("{0},", (int)command);
break;
case Command.ReadDeviceLoopInfoACK:
if (usefulBytes [0] == 1) {
receiveFlag += string.Format ("{0},{1}", usefulBytes [0], usefulBytes [2]); ;
} else
receiveFlag += string.Format ("{0},{1},{2}", usefulBytes [0], usefulBytes [1], usefulBytes [2]);
break;
case Command.SetDeviceLoopInfoACK:
case Command.InfraredControlACK:
case Command.SetLogicLoopColorACK:
case Command.SetSecurityByPassACK:
case Command.SetSensorAutomationDateTimeCycleACK:
case Command.ReadSensorAutomationDateTimeCycleACK:
receiveFlag += string.Format ("{0},{1},{2}", usefulBytes [0], usefulBytes [1], usefulBytes [2]);
break;
case Command.UpdataRemakeACK:
break;
case Command.ReadWirelessPanelButtonKeyACK:
case Command.WriteWirelessPanelButtonKeyACK:
case Command.ReadDryContactStatusACK:
case Command.InstructionPanelKeyACK:
case Command.ReadInstructionPanelKeyACK:
case Command.ReadAnalogValueACK:
case Command.ReadSensorTargetRemarkACK:
case Command.SetHornTargetStateACK:
case Command.ReadHornTargetStateACK:
receiveFlag += string.Format ("{0},{1}", usefulBytes [0], usefulBytes [1]);
break;
case Command.AssignedAddressACK:
case Command.UpdataCurtainModelRunTimeACK:
case Command.ReadCurtainStutasACK:
case Command.ReadLogicLoopColorACK:
case Command.ReadPanleTempACK:
case Command.FreshAirReadACK:
case Command.FreshAirControlACK:
case Command.Set_Air_State_New_ack:
case Command.ReadHornHistoryACK:
case Command.ReadHornLoopsStatusACK:
case Command.ReadHornPushACK:
case Command.SetHornPushACK:
case Command.ReadHornLoopAlarmACK:
case Command.SetHornTargetEnableACK:
case Command.ReadHornTargetEnableACK:
receiveFlag += string.Format ("{0}", usefulBytes [0]);
break;
case Command.RemoteFirstACK:
for (int i = 1; i < 1 + 28; i++) {
receiveFlag += string.Format ("{0}", usefulBytes [i]);
}
break;
case Command.RemoteSecoudACK:
for (int i = 0; i < 7; i++) {
receiveFlag += string.Format ("{0}", usefulBytes [i]);
}
break;
default:
break;
}
//System.Console.WriteLine ("接收到数据:" + receiveFlag);
for (int i = 0; i < controlList.Count; i++) {
try {
var control = controlList [i];
if (control.SendFlag == receiveFlag) {
control.LatestDateTime = System.DateTime.Now;
control.UsefulBytes = usefulBytes;//
control.run ();
}
} catch {
}
}
} catch (Exception ex) {
Console.WriteLine ("ManagerReceive抛出异常:" + ex.ToString ());
}
}
///
/// 添加到内存数组里面
///
void add ()
{
///
/// 达到50条数据后就清理一下
///
if (50 < controlList.Count) {
lock (controlList) {
for (int i = 0; i < controlList.Count;) {
if (controlList [i] == null || 3 <= controlList [i].Packet.HaveSendCount) {
controlList.RemoveAt (i);
} else {
i++;
}
}
}
//System.Console.WriteLine ("++++++++"+controlList.Count.ToString ());
}
controlList.Add (this);
}
//当前数据的关键数据
string sendFlag = string.Empty;
protected string SendFlag {
get {
return sendFlag;
}
set {
sendFlag = value;
usefulBytes = null;
}
}
private byte [] usefulBytes;
///
/// 获取回来的有用信息,如果获取回来的数据为null,就会抛出异常信息
///
public byte [] UsefulBytes {
get {
if (null == usefulBytes) {
// throw new Exception("不好意思,网络不稳定或者远程设备不在线,请稍候再试!");
}
return this.usefulBytes;
}
set {
usefulBytes = value;
}
}
//发送数据了之后当前线程等待或者运行的信号
System.Threading.ManualResetEvent allDone = new System.Threading.ManualResetEvent (false);
///
/// 发送了数据后,线程就是等待状态,直到接收到反馈或者超时后退出
///
void wait ()
{
allDone.Reset ();
allDone.WaitOne ();
}
///
/// 让当前线程继续执行
///
void run ()
{
allDone.Set ();
Packet.HaveSendCount = 4;
}
//数据重发处理
void managerSendCount (object o)
{
add ();
if (Shared.SimpleControl.CommonPage.IsRemote && !isLocal) {
System.Console.WriteLine ("远程发送数据:" + SendFlag);
SmartHome.MqttCommon.MqttRemoteSend (Packet.Bytes);
Packet.FlagDateTime = DateTime.Now;
Packet.HaveSendCount--;
//这里是重发两次
while (Packet.HaveSendCount < 3) {
if (Packet.FlagDateTime.AddMilliseconds (1000).Ticks <= System.DateTime.Now.Ticks) {
SmartHome.MqttCommon.MqttRemoteSend (Packet.Bytes);
System.Console.WriteLine ("重发远程发送数据:" + SendFlag);
Packet.FlagDateTime = DateTime.Now;
Packet.HaveSendCount++;
}
System.Threading.Thread.Sleep (100);
}
allDone.Set ();
} else {
try {
System.Console.WriteLine ("发送数据:" + SendFlag);
BusSocket.AsyncBeginSend (Packet);
Packet.HaveSendCount--;
//这里是重发两次
while (Packet.HaveSendCount < 3) {
if (Packet.FlagDateTime.AddMilliseconds (1000).Ticks <= System.DateTime.Now.Ticks) {
System.Console.WriteLine ("重发数据:" + SendFlag);
BusSocket.AsyncBeginSend (Packet);
}
System.Threading.Thread.Sleep (100);
}
} catch (Exception ex) {
Console.WriteLine ("managerSendCount:" + ex.ToString ());
} finally {
allDone.Set ();
}
}
}
///
/// 当前数据包
///
Packet Packet;
private void ini (Target target, bool send = true)
{
this.SendFlag = string.Format ("{0},{1},{2},", target.SubnetID, target.DeviceID, (int)target.Command + 1);
switch (target.Command) {
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.ReadACMode:
case Command.SetACMode:
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:
case Command.ReadLightSingleLoopBrightness:
this.SendFlag += string.Format ("{0}", target.AddData [0]);
break;
case Command.ReadDeviceModul:
case Command.ReadGateway:
case Command.ReadSecurityStatus:
case Command.ReadHornTargetState:
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.SetLogicLoopColor:
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.UpdataCurtainModelStutas:
case Command.SetSingleLight:
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.ReadLogicLoopColor:
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;
}
if (send) {
System.Threading.Thread thread = new System.Threading.Thread (new System.Threading.ParameterizedThreadStart (managerSendCount));
thread.IsBackground = true;
thread.Start (Packet);
}
}
///
/// 发送Bus数据,发送了不需要等待
///
/// 发送对象
/// 重发次数
public void Send (Target target, SendCount sendCount, bool isWait,bool needLocal = false)
{
isLocal = needLocal;
Packet = new Packet (target.SendBytes, target.IPEndPoint);
Packet.HaveSendCount = 3 - (int)sendCount;
ini (target);
if (isWait) {
this.wait ();
}
}
bool isLocal = false;
}
}