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 (预留)