using System; using System.Collections.Generic; using Shared; namespace SmartHome { /// /// HDLLink协议 工具类 /// public class HDLLinkUtlis { #region ■ Current___________________________ /// /// 通用方法 /// private static HDLLinkUtlis m_Current = null; /// /// 通用方法 /// public static HDLLinkUtlis Current { get { if (m_Current == null) { m_Current = new HDLLinkUtlis (); } return m_Current; } } #endregion /// /// 将在线设备转换成sid + 属性列表 /// /// 模块设备 /// public List ConvertToSidListToIotCloud (string sOid, Common moduleCommon) { List tmpResult = new List (); try { if (moduleCommon != null && moduleCommon.LoopCount > 0) { for (int intI = 0; intI < moduleCommon.LoopCount; intI++) { //byte BigType = moduleCommon.bytSimpleParam [0 + intI * 3]; //byte SmallType = moduleCommon.bytSimpleParam [1 + intI * 3]; int Count = moduleCommon.LoopCount; if (Count > 0) { for (int j = 1; j <= Count; j++) { //模块里面的单个回路 Common deviceCommon = new Common (); Sid tmpSid = new Sid (); tmpSid.sid = FormingNewSid (sOid, deviceCommon); tmpSid.oid = sOid; tmpSid.name = deviceCommon.Name; SidObject tmp = UpdateSidAttributesToDeviceList (deviceCommon, sOid); tmpSid.attributes = tmp.attributes;//UpdateSidAttributesToDeviceList(onlineDevice.DeviceType, sOid, j, BigType, SmallType, ref spk); tmpSid.spk = tmp.spk; tmpResult.Add (tmpSid); } } } } return tmpResult; } catch (Exception) { return tmpResult; } } /// /// 处理本地数据,转换生成Oid和Sid列表 /// /// /// /// /// public void ConvertOidListToIotStruct (string homeId, string gatewayId, List moduleCommonList, ref IotCloud currentProject) { try { //step 1 转换类型 Sids functionList = new Sids(); List tmpFunction = new List (); //step 2 转换类型 Oids mOidList = ConvertToOidListToIotCloud (moduleCommonList, ref tmpFunction); if (currentProject.modules == null || currentProject.modules.devices == null || currentProject.modules.devices.Count == 0) { currentProject.modules = mOidList; } else { foreach (Oid tmpModule in mOidList.devices) { Oid tmpFind = currentProject.modules.devices.Find (P => P.mac.Equals (tmpModule.mac)); if (tmpFind == null) currentProject.modules.devices.Add (tmpModule); } } mOidList.homeId = homeId; functionList.devices = new List (); functionList.homeId = homeId; functionList.gatewayId = gatewayId; if (tmpFunction != null) { functionList.devices = tmpFunction; } currentProject.modules = mOidList; currentProject.functions = functionList; } catch (Exception ex) { //MessageBox.Show (ex.Tostring ()); //throw; } } /// /// 转换类型在线设备列表转OID列表 只在上传或者下载时使用 /// /// /// public Oids ConvertToOidListToIotCloud (List moduleCommonList, ref List functionLists) { Oids tmpResult = new Oids (); try { tmpResult.devices = new List (); //HDLSysPF.IniDeviceChannelRemark (); //整理全部设备备注到缓存列表 foreach (Common tmp in moduleCommonList) { Oid tmpOid = new Oid (); tmpOid.protocolType = "bus"; tmpOid.device_name = tmp.Name; tmpOid.oid = FormingNewOid (tmp.Type); tmpOid.addresses = string.Format ("{0}{1}", tmp.SubnetID.ToString ("X2"), tmp.DeviceID.ToString ("X2")); tmpOid.device_model = tmp.Type.ToString (); tmpOid.fw_version = ""; tmpOid.deviceType = tmp.Type.ToString (); tmpOid.hw_info = ""; tmpOid.mac = tmp.MAC; tmpResult.devices.Add (tmpOid); functionLists.AddRange (ConvertToSidListToIotCloud (tmpOid.oid, tmp)); } return tmpResult; } catch (Exception ex) { return tmpResult; //throw; } } ///// ///// ///// ///// ///// ///// ///// //public void ConvertOidListToIotStruct (string homeId, List onlineDevices, string gatewayId, ref IotCloud currentProject) //{ // try { // //step 1 转换类型 // Sids functionList = currentProject.functions; // List tmpFunction = new List (); // //step 2 转换类型 // Oids tmp = ConvertToOidListToIotCloud (onlineDevices, ref tmpFunction); // if (currentProject.modules == null || currentProject.modules.devices == null || currentProject.modules.devices.Count == 0) currentProject.modules = tmp; // else { // foreach (Oid tmpModule in tmp.devices) { // Oid tmpFind = currentProject.modules.devices.Find (P => P.mac.Equals (tmpModule.mac)); // if (tmpFind == null) currentProject.modules.devices.Add (tmpModule); // } // } // tmp.homeId = homeId; // //上传功能列表 // #region // //if (functionList == null) // //{ // functionList = new Sids (); // functionList.devices = new List (); // functionList.devices = tmpFunction; // //} // functionList.homeId = homeId; // functionList.gatewayId = gatewayId; // currentProject.modules = tmp; // currentProject.functions = functionList; // #endregion // } catch (Exception ex) { // //MessageBox.Show (ex.Tostring ()); // //throw; // } //} /// /// 生成设备Oid /// /// /// public string FormingNewOid (DeviceType deviceType) { string sOid = ""; try { //1.生成 厂商 + 通讯方式 string sOidBeginsWith = "000101";//厂商 + 通讯方式 //2.生成产品时间戳 long sTimeSp = ConvertDateTimeLong (); //以2020年1月1日算出的时间戳0.1s为单位 string sTimeSpan = ""; ConvertIntToByteArray (sTimeSp, ref sTimeSpan); if (sTimeSpan.Length != 8) return sOid; //延迟10ms //3.生成产品类别 var productType = GetProductType (deviceType); sOid = sOidBeginsWith + sTimeSpan + productType; return sOid; } catch { return sOid; } } /// /// 获取产品类别 /// 产品类别目前没有规范的文档,没有确定的标准 /// 暂时和buspro软件规则一致 /// ///文档规则,但是不是正确的版本 //产品类别 1byte //编号 描述 //01 调光器 //02 继电器 //03 干接点模块 //04 传感器 //05 面板 //06 RCU //07 网关 //08 红外发射 //09 Android屏 //10 场景 //11 音乐播放器 //12 232/485转换器 //21 自动化 //22 安防防区 //14 窗帘模块 //15 HVAC //16 地热模块 /// /// /// public string GetProductType (DeviceType deviceType) { string productType = ""; switch (deviceType) { case DeviceType.LightDimming: case DeviceType.LightCCT: case DeviceType.LightDALI: case DeviceType.LightRGB: case DeviceType.LightRGBW: case DeviceType.LightLogic: case DeviceType.LightRGBandCCT: case DeviceType.DMX48: productType = "01";//01 调光器 break; case DeviceType.LightSwitch: case DeviceType.LightEnergySwitch: case DeviceType.LightEnergySocket: case DeviceType.LightSwitchSocket: case DeviceType.LightMixSwitch: productType = "02";//02 继电器类 break; case DeviceType.CurtainModel: case DeviceType.CurtainRoller: case DeviceType.CurtainTrietex: productType = "03";//03 遮阳类(窗帘) break; case DeviceType.SensorWindSpeed: productType = "04";//04 传感器) break; case DeviceType.OnePortWirelessFR: case DeviceType.OnePortBus: case DeviceType.RCU: case DeviceType.SuperWireless: case DeviceType.OnePortMqttFR: productType = "07";//07 网关类 break; case DeviceType.ACPanel: case DeviceType.ACDevice: case DeviceType.ACInfrared: case DeviceType.ACCoolmaster: case DeviceType.CustomAC: case DeviceType.HVAC: case DeviceType.FoolHeat: case DeviceType.FoolHeatPanel: productType = "12";//12 恒温器(空调、地热) break; case DeviceType.MusicModel: case DeviceType.MusicPanel: case DeviceType.MusicA31: productType = "0B"; break; default: productType = "00"; break; } return productType; } /// /// 获取生成物理模型参数 /// 2021-01-22 目前物模还不完善 /// /// /// public string GetPhysicalModelType (DeviceType deviceType) { string productType = ""; switch (deviceType) { case DeviceType.LightEnergySwitch: productType = "0101"; break; case DeviceType.LightEnergySocket: case DeviceType.LightSwitchSocket: productType = "0102"; break; case DeviceType.LightSwitch: case DeviceType.LightMixSwitch: productType = "0201"; break; case DeviceType.LightDimming: productType = "0202"; break; case DeviceType.LightCCT: case DeviceType.LightDALI: productType = "0203"; break; case DeviceType.LightRGB: case DeviceType.LightRGBW: case DeviceType.LightLogic: case DeviceType.LightRGBandCCT: case DeviceType.DMX48: productType = "0204"; break; //窗帘 case DeviceType.CurtainModel: productType = "0301"; break; case DeviceType.CurtainTrietex: productType = "0303"; break; case DeviceType.CurtainRoller: productType = "0304"; break; case DeviceType.ACPanel: case DeviceType.ACDevice: case DeviceType.ACInfrared: case DeviceType.ACCoolmaster: case DeviceType.CustomAC: case DeviceType.HVAC: productType = "0701"; break; case DeviceType.FoolHeat: case DeviceType.FoolHeatPanel: productType = "0801"; break; case DeviceType.MusicModel: case DeviceType.MusicPanel: case DeviceType.MusicA31: productType = "0901"; break; case DeviceType.FanModule: productType = "1001"; break; default: productType = ((int)deviceType).ToString ("X4"); break; } return productType; } /// /// 生成功能设备Sid /// /// /// /// /// /// /// /// public string FormingNewSid (string sOid, Common loopCommon) { if (sOid == null || sOid == "") return ""; try { //物模型类+通道号+大小类别 string sSid = ""; //1.物模型类 string mPhysicalModelType = GetPhysicalModelType (loopCommon.Type); //2.通道号 string loopIDStr = loopCommon.LoopID.ToString ("X4"); //3.大小类别 string bigMinStr = loopCommon.BigClass.ToString ("X2") + loopCommon.MinClass.ToString ("X2"); //4.拼接 sSid = sOid + mPhysicalModelType + loopIDStr + bigMinStr; return sSid; } catch { return ""; } } /// /// 生成SPK属性 /// /// /// /// /// /// /// /// /// public SidObject UpdateSidAttributesToDeviceList (Common loopCommon, string sOid) { SidObject tmp = new SidObject (); try { string sSid = FormingNewSid (sOid, loopCommon); tmp.oid = sOid; tmp.sid = sSid; tmp.name = loopCommon.Name; tmp.attributes = new List (); tmp.omodel = loopCommon.Type.ToString (); //继电器开关类 if (loopCommon.Type == DeviceType.LightSwitch || loopCommon.Type == DeviceType.LightEnergySwitch || loopCommon.Type == DeviceType.LightEnergySocket || loopCommon.Type == DeviceType.LightSwitchSocket || loopCommon.Type == DeviceType.LightMixSwitch) { tmp.spk = "light.switch"; #region on_off Function tempFunction = new Function (); tempFunction.key = "on_off"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("on"); tempFunction.value.Add ("off"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion } else if (loopCommon.Type == DeviceType.LightDimming || loopCommon.Type == DeviceType.LightCCT || loopCommon.Type == DeviceType.LightDALI) { //调光类 tmp.spk = "light.dimming"; #region on_off Function tempFunction = new Function (); tempFunction.key = "on_off"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("on"); tempFunction.value.Add ("off"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region brightness Function tempFunction1 = new Function (); tempFunction1.key = "brightness"; tempFunction1.data_type = "integer"; tempFunction1.value = new List (); tempFunction1.max = 100; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion #region fade_time Function tempFunction3 = new Function (); tempFunction3.key = "fade_time"; tempFunction3.data_type = "integer"; tempFunction3.value = new List (); //tempFunction1.value.Add("percent"); //for (int iPercent = 0; iPercent <= 100; iPercent++) //{ // tempFunction1.value.Add(iPercent.ToString()); //} tempFunction3.max = 100; tempFunction3.min = 0; tmp.attributes.Add (tempFunction3); #endregion if (loopCommon.Type == DeviceType.LightCCT || loopCommon.Type == DeviceType.LightDALI)//色温类别 { tmp.spk = "light.cct"; #region cct Function tempFunction2 = new Function (); tempFunction2.key = "cct"; tempFunction2.data_type = "integer"; tempFunction2.value = new List (); //tempFunction2.value.Add("warm light "); //tempFunction2.value.Add("cold light "); tempFunction2.max = 65535; tempFunction2.min = 0; tmp.attributes.Add (tempFunction2); #endregion } } else if (loopCommon.Type == DeviceType.LightRGB || loopCommon.Type == DeviceType.LightRGBW || loopCommon.Type == DeviceType.LightLogic || loopCommon.Type == DeviceType.LightRGBandCCT || loopCommon.Type == DeviceType.DMX48) { tmp.spk = "light.rgb"; #region on_off Function tempFunction = new Function (); tempFunction.key = "on_off"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("on"); tempFunction.value.Add ("off"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region brightness Function tempFunction2 = new Function (); tempFunction2.key = "brightness"; tempFunction2.data_type = "integer"; tempFunction2.value = new List (); tempFunction2.max = 100; tempFunction2.min = 0; tmp.attributes.Add (tempFunction2); #endregion if (loopCommon.Type == DeviceType.LightRGBW) { tmp.spk = "light.rgbw"; #region color Function tempFunction3 = new Function (); tempFunction3.key = "rgb"; tempFunction3.data_type = "integer"; tempFunction3.value = new List (); //tempFunction2.value.Add("red"); //tempFunction2.value.Add("green"); //tempFunction2.value.Add("blue"); tempFunction3.max = 255; tempFunction3.min = 0; tmp.attributes.Add (tempFunction3); #endregion } else { #region color Function tempFunction3 = new Function (); tempFunction3.key = "rgb"; tempFunction3.data_type = "integer"; tempFunction3.value = new List (); tempFunction3.min = 0; tmp.attributes.Add (tempFunction3); #endregion } if (loopCommon.Type == DeviceType.LightRGBandCCT) { #region CCT Function tempFunctionCCT = new Function (); tempFunctionCCT.key = "cct"; tempFunctionCCT.data_type = "integer"; tempFunctionCCT.value = new List (); //tempFunction2.value.Add("red"); //tempFunction2.value.Add("green"); //tempFunction2.value.Add("blue"); tempFunctionCCT.max = 65535; tempFunctionCCT.min = 0; tmp.attributes.Add (tempFunctionCCT); #endregion } } else if (loopCommon.Type == DeviceType.CurtainModel || loopCommon.Type == DeviceType.CurtainRoller || loopCommon.Type == DeviceType.CurtainTrietex) { tmp.spk = "curtain.switch"; #region on_off Function tempFunction = new Function (); tempFunction.key = "on_off"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("on"); tempFunction.value.Add ("off"); tempFunction.value.Add ("stop"); tempFunction.max = 2; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion if (loopCommon.Type == DeviceType.CurtainRoller || loopCommon.Type == DeviceType.CurtainTrietex)//所有卷帘控制器 { tmp.spk = "curtain.trietex"; #region openlevel Function tempFunction1 = new Function (); tempFunction1.key = "percent"; tempFunction1.data_type = "integer"; tempFunction1.value = new List (); //tempFunction1.value.Add("percent"); tempFunction1.max = 100; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion } } else if (loopCommon.Type == DeviceType.ACPanel || loopCommon.Type == DeviceType.ACDevice || loopCommon.Type == DeviceType.ACInfrared || loopCommon.Type == DeviceType.ACCoolmaster || loopCommon.Type == DeviceType.CustomAC || loopCommon.Type == DeviceType.HVAC) { //空调类 tmp.spk = "ac.standard"; #region on_off Function tempFunction = new Function (); tempFunction.key = "on_off"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("on"); tempFunction.value.Add ("off"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region mode Function tempFunction1 = new Function (); tempFunction1.key = "mode"; tempFunction1.data_type = "integer"; tempFunction1.value = new List (); tempFunction1.value.Add ("cool"); tempFunction1.value.Add ("heat"); tempFunction1.value.Add ("fan"); tempFunction1.value.Add ("auto"); tempFunction1.value.Add ("dry"); tempFunction1.max = 4; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion #region fan Function tempFunction2 = new Function (); tempFunction2.key = "fan"; tempFunction2.data_type = "integer"; tempFunction2.value = new List (); tempFunction2.value.Add ("high"); tempFunction2.value.Add ("medium"); tempFunction2.value.Add ("low"); tempFunction2.value.Add ("auto"); tempFunction2.max = 3; tempFunction2.min = 0; tmp.attributes.Add (tempFunction2); #endregion #region temp Function tempFunction3 = new Function (); tempFunction3.key = "set_temp"; //2020 08 11 hvac 温度控制 1°-> int 0.5°->float //if (HVACModuleDeviceTypeList.HDLHVACwithAcControlHighPrecision.Contains(DevOnLineTmp.DeviceType)) //{ //20201224 设置温度数据类型统一float 伟南后续ai+数据类型网关处理 tempFunction3.data_type = "float"; //} //else //{ // tempFunction3.data_type = "integer"; //} tempFunction3.value = new List (); tempFunction3.max = 30; tempFunction3.min = 16; tmp.attributes.Add (tempFunction3); #endregion #region temp_step Function tempFunction5 = new Function (); tempFunction5.key = "set_temp_step"; tempFunction5.data_type = "string"; tempFunction5.value = new List (); tempFunction5.value.Add ("up"); tempFunction5.value.Add ("down"); tempFunction5.max = 1; tempFunction5.min = 0; tmp.attributes.Add (tempFunction5); #endregion #region room_temp Function tempFunction6 = new Function (); tempFunction6.key = "room_temp"; tempFunction6.data_type = "float"; tempFunction6.value = new List (); tempFunction6.max = 50; tempFunction6.min = -50; tmp.attributes.Add (tempFunction6); #endregion #region swing Function tempFunction4 = new Function (); tempFunction4.key = "swing"; tempFunction4.data_type = "string"; tempFunction4.value = new List (); tempFunction4.value.Add ("up_down"); //tempFunction4.value.Add("down"); tempFunction4.value.Add ("left_right"); //tempFunction4.value.Add("right"); tempFunction4.value.Add ("stop"); tempFunction4.max = 3; tempFunction4.min = 0; tmp.attributes.Add (tempFunction4); #endregion #region lock #endregion } else if (loopCommon.Type == DeviceType.FoolHeat || loopCommon.Type == DeviceType.FoolHeatPanel) { tmp.spk = "floorHeat.standard"; #region on_off Function tempFunction = new Function (); tempFunction.key = "on_off"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("on"); tempFunction.value.Add ("off"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region mode Function tempFunction1 = new Function (); tempFunction1.key = "mode"; tempFunction1.data_type = "string"; tempFunction1.value = new List (); tempFunction1.value.Add ("day"); tempFunction1.value.Add ("night"); tempFunction1.value.Add ("away"); tempFunction1.value.Add ("normal"); tempFunction1.value.Add ("timer"); tempFunction1.max = 4; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion #region temp Function tempFunction3 = new Function (); tempFunction3.key = "set_temp"; tempFunction3.data_type = "float"; tempFunction3.value = new List (); //tempFunction3.value.Add("up"); //tempFunction3.value.Add("down"); //tempFunction3.value.Add("value"); tempFunction3.max = 35; tempFunction3.min = 0; tmp.attributes.Add (tempFunction3); #endregion #region temp Function tempFunction4 = new Function (); tempFunction4.key = "set_temp_step"; tempFunction4.data_type = "string"; tempFunction4.value = new List (); tempFunction4.value.Add ("up"); tempFunction4.value.Add ("down"); tempFunction4.max = 1; tempFunction4.min = 0; tmp.attributes.Add (tempFunction4); #endregion #region room_temp Function tempFunction5 = new Function (); tempFunction5.key = "room_temp"; tempFunction5.data_type = "float"; tempFunction5.value = new List (); tempFunction5.max = 50; tempFunction5.min = -50; tmp.attributes.Add (tempFunction5); #endregion #region lock #endregion } else if (loopCommon.Type == DeviceType.MusicA31 || loopCommon.Type == DeviceType.MusicModel || loopCommon.Type == DeviceType.MusicPanel) { tmp.spk = "music.standard"; // on_off volume song_step audio list_channel mode song_num special_song volume_level #region on_off Function tempFunction = new Function (); tempFunction.key = "on_off"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("play"); tempFunction.value.Add ("pause"); //tempFunction.value.Add("play"); //tempFunction.value.Add("stop"); //tempFunction.value.Add("pause"); //play stop pause tempFunction.max = 2; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region volume Function tempFunction1 = new Function (); tempFunction1.key = "volume"; tempFunction1.data_type = "integer"; tempFunction1.value = new List (); //tempFunction1.value.Add("percent"); tempFunction1.max = 100; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion #region volume_step Function tempFunction9 = new Function (); tempFunction9.key = "volume_step"; tempFunction9.data_type = "string"; tempFunction9.value = new List (); tempFunction9.value.Add ("up"); tempFunction9.value.Add ("down"); tempFunction9.max = 1; tempFunction9.min = 0; tmp.attributes.Add (tempFunction9); #endregion #region volume_level Function tempFunction10 = new Function (); tempFunction10.key = "volume_level"; tempFunction10.data_type = "integer"; tempFunction10.value = new List (); //tempFunction1.value.Add("percent"); tempFunction10.max = 10; tempFunction10.min = 0; tmp.attributes.Add (tempFunction10); #endregion #region volume_level_step Function tempFunction11 = new Function (); tempFunction11.key = "volume_level_step"; tempFunction11.data_type = "string"; tempFunction11.value = new List (); tempFunction11.value.Add ("up"); tempFunction11.value.Add ("down"); tempFunction11.max = 1; tempFunction11.min = 0; tmp.attributes.Add (tempFunction11); #endregion #region treble Function tempFunction14 = new Function (); tempFunction14.key = "treble"; tempFunction14.data_type = "integer"; tempFunction14.max = 10; tempFunction14.min = -10; tmp.attributes.Add (tempFunction14); #endregion #region treble_step Function tempFunction12 = new Function (); tempFunction12.key = "treble_step"; tempFunction12.data_type = "string"; tempFunction12.value = new List (); tempFunction12.value.Add ("up"); tempFunction12.value.Add ("down"); tempFunction12.max = 1; tempFunction12.min = 0; tmp.attributes.Add (tempFunction12); #endregion #region bass Function tempFunction15 = new Function (); tempFunction15.key = "bass"; tempFunction15.data_type = "integer"; tempFunction15.max = 10; tempFunction15.min = -10; tmp.attributes.Add (tempFunction15); #endregion #region bass_step Function tempFunction13 = new Function (); tempFunction13.key = "bass_step"; tempFunction13.data_type = "string"; tempFunction13.value = new List (); tempFunction13.value.Add ("up"); tempFunction13.value.Add ("down"); tempFunction13.max = 1; tempFunction13.min = 0; tmp.attributes.Add (tempFunction13); #endregion #region mode Function tempFunction5 = new Function (); tempFunction5.key = "mode"; tempFunction5.data_type = "string"; tempFunction5.value = new List (); //singel/single_circle/order/all //single/single_cycle/order/list_cycle/random tempFunction5.value.Add ("single"); tempFunction5.value.Add ("single_cycle"); tempFunction5.value.Add ("order"); tempFunction5.value.Add ("list_cycle"); tempFunction5.value.Add ("random"); tempFunction5.max = 3; tempFunction5.min = 0; tmp.attributes.Add (tempFunction5); #endregion #region source //1 = SD, 2 = External Input, 3 = FTP, 4 = Radio //sdcard/external_input/ftp/radio Function tempFunction3 = new Function (); tempFunction3.key = "source"; tempFunction3.data_type = "string"; tempFunction3.value = new List (); tempFunction3.value.Add ("sdcard"); tempFunction3.value.Add ("audio_in"); tempFunction3.value.Add ("ftp"); tempFunction3.value.Add ("radio"); tempFunction3.value.Add ("bluetooth"); tempFunction3.max = 3; tempFunction3.min = 0; tmp.attributes.Add (tempFunction3); #endregion #region song_step Function tempFunction2 = new Function (); tempFunction2.key = "song_step"; tempFunction2.data_type = "string"; tempFunction2.value = new List (); tempFunction2.value.Add ("up"); tempFunction2.value.Add ("down"); tempFunction2.max = 1; tempFunction2.min = 0; tmp.attributes.Add (tempFunction2); #endregion #region bass Function tempFunction16 = new Function (); tempFunction16.key = "playlist_name"; tempFunction16.data_type = "string"; tmp.attributes.Add (tempFunction16); #endregion #region bass Function tempFunction17 = new Function (); tempFunction17.key = "song_name"; tempFunction17.data_type = "string"; tmp.attributes.Add (tempFunction17); #endregion #region bass Function tempFunction19 = new Function (); tempFunction19.key = "song_time"; tempFunction19.data_type = "string"; tmp.attributes.Add (tempFunction19); #endregion #region bass Function tempFunction20 = new Function (); tempFunction20.key = "playing_time"; tempFunction20.data_type = "string"; tmp.attributes.Add (tempFunction20); #endregion } else if (loopCommon.BigClass == 5) { //传感器 if (loopCommon.Type == DeviceType.SensorMobileDetection) { tmp.spk = "sensor.pir"; #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region status Function tempFunction1 = new Function (); tempFunction1.key = "status"; tempFunction1.data_type = "string"; tempFunction1.value = new List (); tempFunction1.value.Add ("true"); tempFunction1.value.Add ("false"); tempFunction1.max = 1; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion #region sensitivity Function tempFunction2 = new Function (); tempFunction2.key = "sensitivity"; tempFunction2.data_type = "integer"; tempFunction2.max = 100; tempFunction2.min = 0; tmp.attributes.Add (tempFunction2); #endregion }else if (loopCommon.Type == DeviceType.SensorTemperature) { tmp.spk = "sensor.temperature"; #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region temp Function tempFunction1 = new Function (); tempFunction1.key = "value"; //2020 12 22 tempFunction1.data_type = "float"; tempFunction1.max = 50; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion #region type Function tempFunction2 = new Function (); tempFunction2.key = "type"; tempFunction2.data_type = "string"; tempFunction2.value = new List (); tempFunction2.value.Add ("C"); tempFunction2.value.Add ("F"); tempFunction2.max = 1; tempFunction2.min = 0; tmp.attributes.Add (tempFunction2); #endregion //#region precision //Function tempFunction3 = new GateWay.Function(); //tempFunction3.key = "precision"; //tempFunction3.data_type = "string"; //tempFunction3.value = new List(); //tempFunction3.value.Add("0.01"); //tempFunction3.value.Add("0.1"); //tempFunction3.value.Add("100"); //tempFunction3.max = 2; //tempFunction3.min = 0; //tmp.attributes.Add(tempFunction3); //#endregion }else if (loopCommon.Type == DeviceType.SensorIllumination) { tmp.spk = "sensor.light"; #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region lux Function tempFunction1 = new Function (); tempFunction1.key = "value"; //2020 12 22 tempFunction1.data_type = "integer"; tmp.attributes.Add (tempFunction1); #endregion #region error_value Function tempFunction2 = new Function (); tempFunction2.key = "error_value"; tempFunction2.data_type = "integer"; tmp.attributes.Add (tempFunction2); #endregion #region precision Function tempFunction3 = new Function (); tempFunction3.key = "precision"; tempFunction3.data_type = "string"; tempFunction3.value = new List (); tempFunction3.value.Add ("0.01"); tempFunction3.value.Add ("0.1"); tempFunction3.value.Add ("100"); tempFunction3.max = 2; tempFunction3.min = 0; tmp.attributes.Add (tempFunction3); #endregion } else if (loopCommon.Type == DeviceType.SensorPM25) { tmp.spk = "sensor.pm25"; #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region value Function tempFunction1 = new Function (); tempFunction1.key = "value"; tempFunction1.data_type = "integer"; tmp.attributes.Add (tempFunction1); #endregion #region error_value Function tempFunction2 = new Function (); tempFunction2.key = "error_value"; tempFunction2.data_type = "integer"; tmp.attributes.Add (tempFunction2); #endregion #region precision Function tempFunction3 = new Function (); tempFunction3.key = "precision"; tempFunction3.data_type = "string"; tempFunction3.value = new List (); tempFunction3.value.Add ("0.01"); tempFunction3.value.Add ("0.1"); tempFunction3.value.Add ("100"); tempFunction3.max = 2; tempFunction3.min = 0; tmp.attributes.Add (tempFunction3); #endregion }else if (loopCommon.Type == DeviceType.SensorHumidity) { tmp.spk = "sensor.humidity"; #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region value Function tempFunction1 = new Function (); tempFunction1.key = "value"; tempFunction1.data_type = "float"; tempFunction1.max = 10000; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion }else if (loopCommon.Type == DeviceType.SensorTVOC) { tmp.spk = "sensor.tvoc"; #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region value Function tempFunction1 = new Function (); tempFunction1.key = "value"; tempFunction1.data_type = "integer"; tempFunction1.max = 10000; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion }else if (loopCommon.Type == DeviceType.SensorCO2) { tmp.spk = "sensor.co2"; #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region value Function tempFunction1 = new Function (); tempFunction1.key = "value"; tempFunction1.data_type = "integer"; tempFunction1.max = 10000; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion }else if (loopCommon.Type == DeviceType.Sensor) { tmp.spk = "dryContact.standard"; #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region status Function tempFunction1 = new Function (); tempFunction1.key = "status"; tempFunction1.data_type = "string"; tempFunction1.value = new List (); tempFunction1.value.Add ("on"); tempFunction1.value.Add ("off"); tempFunction1.max = 1; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion } else { #region on_off Function tempFunction = new Function (); tempFunction.key = "enable"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("true"); tempFunction.value.Add ("false"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion #region value Function tempFunction1 = new Function (); tempFunction1.key = "value"; tempFunction1.data_type = "integer"; tempFunction1.max = 10000; tempFunction1.min = 0; tmp.attributes.Add (tempFunction1); #endregion } } else { #region on_off Function tempFunction = new Function (); tempFunction.key = "on_off"; tempFunction.data_type = "string"; tempFunction.value = new List (); tempFunction.value.Add ("on"); tempFunction.value.Add ("off"); tempFunction.max = 1; tempFunction.min = 0; tmp.attributes.Add (tempFunction); #endregion } } catch { } return tmp; } //#region 判断类型 ///// ///// 继电器类别 ///// ///// ///// //public bool IsHDLRelayDeviceType (DeviceType deviceType) //{ // return false; //} ///// ///// 调光器类别 ///// ///// ///// //public bool IsHDLDimmerDeviceType (DeviceType deviceType) //{ // return false; //} ///// ///// 遮阳类别(窗帘、卷帘、开合帘) ///// ///// ///// //public bool IsHDLCurtainDeviceType (DeviceType deviceType) //{ // return deviceType == DeviceType.CurtainModel // || deviceType == DeviceType.CurtainRoller // || deviceType == DeviceType.CurtainTrietex; //} ///// ///// 传感器类别 ///// ///// ///// //public bool IsHDLSensorDeviceType (DeviceType deviceType) //{ // return false; //} ///// ///// 网关类别 ///// ///// ///// //public bool IsHDLGatewayDeviceType (DeviceType deviceType) //{ // return false; //} ///// ///// 空调 ///// ///// ///// //public bool IsHDLACDeviceType (DeviceType deviceType) //{ // return false; //} //#endregion #region 生成4位byte 时间戳 private long LastTime = 0; /// /// DateTime时间格式转换为13位带毫秒的Unix时间戳 /// /// DateTime时间格式 /// Unix时间戳格式 public long ConvertDateTimeLong () { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime (new System.DateTime (2020, 1, 1)); long l = (long)(Math.Round ((DateTime.Now - startTime).TotalSeconds, 1) * 10); if (l <= LastTime) l = LastTime + 1; LastTime = l; return l; } /// /// /// /// /// /// public bool ConvertIntToByteArray (long m, ref string strTmp) { strTmp = "00000000"; byte [] arry = new byte [4]; arry [0] = (byte)(m & 0xFF); arry [1] = (byte)((m & 0xFF00) >> 8); arry [2] = (byte)((m & 0xFF0000) >> 16); arry [3] = (byte)((m & 0xFF000000) >> 24); strTmp = arry [0].ToString ("X2") + arry [1].ToString ("X2") + arry [2].ToString ("X2") + arry [3].ToString ("X2"); return true; } #endregion } [Serializable] public class BaseCloudFeedback { public int code { get; set; } public string timestamp { get; set; } public bool isSuccess { get; set; } public string message { get; set; } } [Serializable] public class Sids { public string homeId { get; set; } public string gatewayId { get; set; } public List devices { get; set; } } [Serializable] public class Oids { public string homeId { get; set; } public string gatewayId { get; set; } public List devices { get; set; } } [Serializable] public class Oid { public string protocolType { get; set; } public string device_name { get; set; } public string oid { get; set; } public string addresses { get; set; } public string device_model { get; set; } public string fw_version { get; set; } public string hw_info { get; set; } public string mac { get; set; } public string deviceType { get; set; } } [Serializable] public class Sid { public string sid { get; set; } public string name { get; set; } public string [] uids { get; set; } public string spk { get; set; } public string oid { get; set; } //设备模块地址 public string omodel { get; set; } //型号 public List attributes { get; set; } //属性列表 } [Serializable] public class Function { //public string name { get; set; } public string key { get; set; } public List value { get; set; } public int max { get; set; } public int min { get; set; } public string data_type { get; set; } } [Serializable] public class SidObject : Sid { } [Serializable] public class IotCloud { public Oids modules { get; set; } //设备列表 public Sids functions { get; set; } //功能列表 } ///// ///// 上传Oid列表 ///// //[Serializable] //public class UploadOids //{ // public string homeId { get; set; } //住宅ID // public Oids devices { get; set; } //设备列表 //} ///// ///// 上传Sid列表 ///// //[Serializable] //public class UploadSids //{ // public string homeId { get; set; } //住宅ID // public string gatewayId { get; set; } //网关ID // public Sids devices { get; set; } //设备列表 //} } //sid组成部分: //sid //来源 厂商代码 通讯方式 产品时间戳 产品类别 物模型类 通道号 大小类别 //1byte 1byte 1byte 4byte 1byte 2byte 2byte 2byte //oid组成部分: //来源 厂商代码 通讯方式 产品时间戳 产品类别 //1byte 1 byte 1 byte 4 byte 1byte //其中各部分代码列表: //来源 1byte 编号 描述 // 00 默认原生态系统数据 // 01 网关或者其他A设备 // 02 调试软件 // 03 APP应用程序 // 04 第三方网关或者平台 //厂商代码 1byte 编号 描述 // 01 HDL // 02 //通讯方式 1byte 编号 描述 // 01 HDL Bus // 02 Zigbee // 03 KNX // 04 Z-Wave //产品时间戳 4bytes 以2020年1月1日算出的时间戳0.1s为单位 //产品类别 1byte 编号 描述 // 01 调光器 // 02 继电器 // 03 干接点模块 // 04 传感器 // 05 面板 // 06 RCU // 07 网关 // 08 红外发射 // 09 Android屏 // 10 场景 // 11 音乐播放器 // 12 232/485转换器 // 21 自动化 // 22 安防防区 // 14 窗帘模块 // 15 HVAC // 16 地热模块 //物模型类型 2bytes 编号 描述 // 01 开关类 01 开关 // 02 插座 // 03 // 02 照明 01 开关 // 02 调光 // 03 色温(CCT) // 04 RGB // 03 遮阳 01 窗帘控制器 // 02 百叶窗 // 03 开合帘 // 04 卷帘 // 05  推窗器 // 06  投影幕 // 04 面板 01 按键面板 // 05 传感器 01 移动探测 // 02 温度传感器 // 03 湿度传感器 // 04 照度传感器 // 05 TVOC // 06 PM2.5 // 07 CO2 // 08 毫米波传感器 // 09 // 10 // 11 烟雾传感器 // 25 干接点 // 07 恒温器 01 空调 // 02 风扇 // 03 毛细空调 // 08 地热 01 地热模块 // 09 背景音乐 01 音乐播放器 // 02 Sonos // 10 场景 01 场景 // 02 电影场景 // 19 新风 01 新风 //13 能源 01 电表 // 02 水表 // 03 燃气 // 16 电器 01 风扇 // 02 TV // 20 安防 01 安防 // 21 自动化 01 自动化 //大类别 1bytes (预留) //小类别 1byte (预留)