CrabtreeOn,印度客户定制APP,迁移2.0平台版本
JLChen
2021-01-22 e9fe52b61589ec226fafbc3288d43faf32a8c4c2
2021-01-22 1.继续完善sid和oid生成方法
2个文件已修改
2055 ■■■■ 已修改文件
Crabtree/.vs/SmartHome/xs/UserPrefs.xml 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/HDL/Common/HDLLinkUtlis.cs 2034 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/.vs/SmartHome/xs/UserPrefs.xml
@@ -1,22 +1,35 @@
<Properties StartupConfiguration="{1D83BF28-BA88-4152-BA41-D7EFE90A5437}|Default">
  <MonoDevelop.Ide.ItemProperties.ON.Droid PreferredExecutionTarget="Android.Android_Accelerated_Oreo" />
  <MonoDevelop.Ide.Workbench>
  <MonoDevelop.Ide.Workbench ActiveDocument="SmartHome/HDL/Operation/MyEnum.cs">
    <Files>
      <File FileName="SmartHome/HDL/Common/HDLLinkUtlis.cs" Line="312" Column="36" />
      <File FileName="SmartHome/UI/SimpleControl/CommonPage.cs" />
      <File FileName="SmartHome/HDL/Operation/Device/Common.cs" />
      <File FileName="SmartHome/UI/SimpleControl/Phone/Guide/GuideAddGateway.cs" />
      <File FileName="SmartHome/HDL/Operation/Device/ABase.cs" />
      <File FileName="SmartHome/HDL/Operation/MyEnum.cs" Line="76" Column="9" />
    </Files>
    <Pads>
      <Pad Id="ProjectPad">
        <State name="__root__">
          <Node name="SmartHome" expanded="True" selected="True">
          <Node name="SmartHome" expanded="True">
            <Node name="ON.Droid" expanded="True" />
            <Node name="ON.Ios" expanded="True" />
            <Node name="Shared" expanded="True">
              <Node name="HDL" expanded="True">
                <Node name="Common" expanded="True" />
                <Node name="Operation" expanded="True">
                  <Node name="Device" expanded="True" />
                  <Node name="MyEnum.cs" selected="True" />
                </Node>
              </Node>
              <Node name="IO" expanded="True" />
              <Node name="UI" expanded="True">
                <Node name="SimpleControl" expanded="True">
                  <Node name="Phone" expanded="True">
                    <Node name="AC" expanded="True" />
                    <Node name="Guide" expanded="True" />
                    <Node name="Register" expanded="True" />
                  </Node>
                </Node>
              </Node>
@@ -34,8 +47,8 @@
    <String>IosService/IosService.csproj</String>
    <String>DroidService/DroidService.csproj</String>
  </DisabledProjects>
  <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|iPhoneSimulator" />
  <MonoDevelop.Ide.ItemProperties.ON.Ios PreferredExecutionTarget="MonoDevelop.IPhone.IPhoneSimulatorTarget.08FD445C-3EE8-4ED2-BF28-B42ADD0DA92C" />
  <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|iPhone" />
  <MonoDevelop.Ide.ItemProperties.ON.Ios PreferredExecutionTarget="MonoDevelop.IPhone.IPhoneDeviceTarget.00008030-00014C392121802E" />
  <MonoDevelop.Ide.DebuggingService.Breakpoints>
    <BreakpointStore />
  </MonoDevelop.Ide.DebuggingService.Breakpoints>
Crabtree/SmartHome/HDL/Common/HDLLinkUtlis.cs
@@ -1,562 +1,1566 @@
//using System;
//using System.Collections.Generic;
//using Shared;
using System;
using System.Collections.Generic;
using Shared;
//namespace SmartHome
//{
//    /// <summary>
//    /// HDLLink协议 工具类
//    /// </summary>
//    public class HDLLinkUtlis
//    {
//        #region ■ Current___________________________
//        /// <summary>
//        /// 通用方法
//        /// </summary>
//        private static HDLLinkUtlis m_Current = null;
//        /// <summary>
//        /// 通用方法
//        /// </summary>
//        public static HDLLinkUtlis Current {
//            get {
//                if (m_Current == null) {
//                    m_Current = new HDLLinkUtlis ();
//                }
//                return m_Current;
//            }
//        }
//        #endregion
namespace SmartHome
{
    /// <summary>
    /// HDLLink协议 工具类
    /// </summary>
    public class HDLLinkUtlis
    {
        #region ■ Current___________________________
        /// <summary>
        /// 通用方法
        /// </summary>
        private static HDLLinkUtlis m_Current = null;
        /// <summary>
        /// 通用方法
        /// </summary>
        public static HDLLinkUtlis Current {
            get {
                if (m_Current == null) {
                    m_Current = new HDLLinkUtlis ();
                }
                return m_Current;
            }
        }
        #endregion
//        /// <summary>
//        /// 将在线设备转换成sid + 属性列表
//        /// </summary>
//        /// <param name="onlineDevices"></param>
//        /// <returns></returns>
//        public List<Sid> ConvertToSidListToIotCloud (string sOid, Common onlineDevice)
//        {
//            List<Sid> tmpResult = new List<Sid> ();
//            try {
//                if (onlineDevice.bytSimpleParam == null || onlineDevice.bytSimpleParam.Length == 0) {
//                    string sSimpleList = DeviceTypeList.GetSimpleFunctionListFromPublicModeGroup (onlineDevice.DeviceType);
//                    #region
//                    string [] ArayStr = sSimpleList.Trim ().Split (new char [] { ' ' });
//                    List<byte> ArayTmp = new List<byte> ();
//                    for (int i = 0; i < ArayStr.Length; i++) {
//                        if (ArayStr [i] != null && ArayStr [i] != "" && ArayStr [i].Trim () != "") {
//                            ArayTmp.Add (Convert.ToByte (ArayStr [i], 16));
//                        }
//                    }
//                    onlineDevice.bytSimpleParam = ArayTmp.ToArray ();
//                    #endregion
//                }
//                if (onlineDevice.bytSimpleParam != null && onlineDevice.bytSimpleParam.Length > 0) {
//                    for (int intI = 0; intI < onlineDevice.bytSimpleParam.Length / 3; intI++) {
//                        byte BigType = onlineDevice.bytSimpleParam [0 + intI * 3];
//                        byte SmallType = onlineDevice.bytSimpleParam [1 + intI * 3];
//                        int Count = onlineDevice.bytSimpleParam [2 + intI * 3];
//                        if (Count > 0) {
//                            for (int j = 1; j <= Count; j++) {
//                                Sid tmpSid = new Sid ();
//                                tmpSid.sid = HDLSysPF.FormingNewSid (onlineDevice.Type, sOid, j, false, BigType, SmallType);
//                                tmpSid.oid = sOid;
        /// <summary>
        /// 将在线设备转换成sid + 属性列表
        /// </summary>
        /// <param name="moduleCommon">模块设备</param>
        /// <returns></returns>
        public List<Sid> ConvertToSidListToIotCloud (string sOid, Common moduleCommon)
        {
            List<Sid> tmpResult = new List<Sid> ();
            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;
//                                try {
//                                    tmpSid.name = onlineDevice.myEasyDesignChannelRemark [intI] [j - 1];
//                                } catch (Exception ex) {
//                                    tmpSid.name = "";
//                                }
//                                if (tmpSid.name == null || tmpSid.name == "" || tmpSid.name == "Unread") {
//                                    tmpSid.name = onlineDevice.Remark + CsConst.mstrINIDefault.IniReadValue ("public", "00000", "") + " " + j.Tostring ();
//                                    if (onlineDevice.Remark == "") {
//                                        tmpSid.name = onlineDevice.strDescription + CsConst.mstrINIDefault.IniReadValue ("public", "00000", "") + " " + j.Tostring ();
//                                    }
//                                }
//                                GateWay.sidObject tmp = HDLSysPF.UpdateSidAttributesToDeviceList (onlineDevice, tmpSid.name, sOid, j, BigType, SmallType, true);
//                                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;
//                //throw;
//            }
//        }
                                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;
            }
        }
//        /// <summary>
//        ///
//        /// </summary>
//        /// <param name="homeId"></param>
//        /// <param name="onlineDevices"></param>
//        /// <param name="gatewayId"></param>
//        /// <param name="currentProject"></param>
//        public void ConvertOidListToIotStruct (string homeId, List<Common> onlineDevices, string gatewayId, ref IotCloud currentProject)
//        {
//            try {
//                //step 1 ;抓换类型
//                Sids functionList = currentProject.functions;
//                List<Sid> tmpFunction = new List<Sid> ();
        /// <summary>
        /// 处理本地数据,转换生成Oid和Sid列表
        /// </summary>
        /// <param name="homeId"></param>
        /// <param name="onlineDevices"></param>
        /// <param name="gatewayId"></param>
        /// <param name="currentProject"></param>
        public void ConvertOidListToIotStruct (string homeId, string gatewayId, List<Common> moduleCommonList, ref IotCloud currentProject)
        {
            try {
                //step 1 转换类型
                Sids functionList = new Sids();
                List<Sid> tmpFunction = new List<Sid> ();
//                //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;
                //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;
//                //上传功能列表
//                #region
//                //if (functionList == null)
//                //{
//                functionList = new Sids ();
//                functionList.devices = new List<Sid> ();
//                functionList.devices = tmpFunction;
//                //}
//                functionList.homeId = homeId;
//                functionList.gatewayId = gatewayId;
//                currentProject.modules = tmp;
//                currentProject.functions = functionList;
//                #endregion
//            } catch (Exception ex) {
//                //MessageBox.Show (ex.Tostring ());
//                //throw;
//            }
//        }
                functionList.devices = new List<Sid> ();
                functionList.homeId = homeId;
                functionList.gatewayId = gatewayId;
                if (tmpFunction != null) {
                    functionList.devices = tmpFunction;
                }
                currentProject.modules = mOidList;
                currentProject.functions = functionList;
//        /// <summary>
//        ///
//        /// </summary>
//        /// <param name="homeId"></param>
//        /// <param name="onlineDevices"></param>
//        /// <param name="gatewayId"></param>
//        /// <param name="currentProject"></param>
//        public void ConvertOidListToIotStruct (string homeId, List<Common> onlineDevices, string gatewayId, ref IotCloud currentProject)
//        {
//            try {
//                //step 1 转换类型
//                Sids functionList = currentProject.functions;
//                List<Sid> tmpFunction = new List<Sid> ();
            } catch (Exception ex) {
                //MessageBox.Show (ex.Tostring ());
                //throw;
            }
        }
//                //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;
        /// <summary>
        /// 转换类型在线设备列表转OID列表 只在上传或者下载时使用
        /// </summary>
        /// <param name="onlineDevices"></param>
        /// <returns></returns>
        public Oids ConvertToOidListToIotCloud (List<Common> moduleCommonList, ref List<Sid> functionLists)
        {
            Oids tmpResult = new Oids ();
            try {
                tmpResult.devices = new List<Oid> ();
                //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);
//                //上传功能列表
//                #region
//                //if (functionList == null)
//                //{
//                functionList = new Sids ();
//                functionList.devices = new List<Sid> ();
//                functionList.devices = tmpFunction;
//                //}
//                functionList.homeId = homeId;
//                functionList.gatewayId = gatewayId;
//                currentProject.modules = tmp;
//                currentProject.functions = functionList;
//                #endregion
                    functionLists.AddRange (ConvertToSidListToIotCloud (tmpOid.oid, tmp));
                }
                return tmpResult;
            } catch (Exception ex) {
                return tmpResult;
                //throw;
            }
        }
//            } catch (Exception ex) {
//                //MessageBox.Show (ex.Tostring ());
//                //throw;
//            }
//        }
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="homeId"></param>
        ///// <param name="onlineDevices"></param>
        ///// <param name="gatewayId"></param>
        ///// <param name="currentProject"></param>
        //public void ConvertOidListToIotStruct (string homeId, List<Common> onlineDevices, string gatewayId, ref IotCloud currentProject)
        //{
        //    try {
        //        //step 1 转换类型
        //        Sids functionList = currentProject.functions;
        //        List<Sid> tmpFunction = new List<Sid> ();
//        /// <summary>
//        /// 生成设备Oid
//        /// </summary>
//        /// <param name="iDeviceType"></param>
//        /// <returns></returns>
//        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
        //        //step 2 转换类型
        //        Oids tmp = ConvertToOidListToIotCloud (onlineDevices, ref tmpFunction);
        //        if (currentProject.modules == null || currentProject.modules.devices == null || currentProject.modules.devices.Count == 0) currentProject.modules = tmp;
//                //3.生成产品类别
//                var productType = GetProductType (deviceType);
//                sOid = sOidBeginsWith + sTimeSpan + productType;
        //        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;
//                return sOid;
//            } catch {
//                return sOid;
//            }
//        }
        //        //上传功能列表
        //        #region
        //        //if (functionList == null)
        //        //{
        //        functionList = new Sids ();
        //        functionList.devices = new List<Sid> ();
        //        functionList.devices = tmpFunction;
        //        //}
        //        functionList.homeId = homeId;
        //        functionList.gatewayId = gatewayId;
        //        currentProject.modules = tmp;
        //        currentProject.functions = functionList;
        //        #endregion
//        /// <summary>
//        /// 获取产品类别
//        //产品类别 1byte
//        //编号   描述
//        //01    调光器
//        //02    继电器
//        //03    干接点模块
//        //04    传感器
//        //05    面板
//        //06    RCU
//        //07    网关
//        //08    红外发射
//        //09    Android屏
//        //10    场景
//        //11    音乐播放器
//        //12    232/485转换器
//        //21    自动化
//        //22    安防防区
//        //14    窗帘模块
//        //15    HVAC
//        //16    地热模块
//        /// </summary>
//        /// <param name="deviceType"></param>
//        /// <returns></returns>
//        public string GetProductType (DeviceType deviceType)
//        {
//            string productType = "";
//            switch (deviceType) {
//            case DeviceType.LightDimming:
//                productType = "01";//01    调光器
//                break;
//            case DeviceType.LightSwitch:
//                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;
//            }
        //    } catch (Exception ex) {
        //        //MessageBox.Show (ex.Tostring ());
        //        //throw;
        //    }
        //}
//            return productType;
//        }
        /// <summary>
        /// 生成设备Oid
        /// </summary>
        /// <param name="iDeviceType"></param>
        /// <returns></returns>
        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;
//        /// <summary>
//        /// 获取生成物理模型参数
                return sOid;
            } catch {
                return sOid;
            }
        }
//        /// </summary>
//        /// <param name="deviceType"></param>
//        /// <returns></returns>
//        public string GetPhysicalModelType (DeviceType deviceType)
//        {
//            string productType = "";
//            switch (deviceType) {
//            case DeviceType.LightDimming:
//                productType = "0101";
//                break;
//            }
        /// <summary>
        /// 获取产品类别
        /// 产品类别目前没有规范的文档,没有确定的标准
        /// 暂时和buspro软件规则一致
        ///
        ///文档规则,但是不是正确的版本
        //产品类别 1byte
        //编号   描述
        //01    调光器
        //02    继电器
        //03    干接点模块
        //04    传感器
        //05    面板
        //06    RCU
        //07    网关
        //08    红外发射
        //09    Android屏
        //10    场景
        //11    音乐播放器
        //12    232/485转换器
        //21    自动化
        //22    安防防区
        //14    窗帘模块
        //15    HVAC
        //16    地热模块
        /// </summary>
        /// <param name="deviceType"></param>
        /// <returns></returns>
        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;
//        }
            return productType;
        }
//        /// <summary>
//        /// 生成功能设备Sid
//        /// </summary>
//        /// <param name="iDeviceType"></param>
//        /// <param name="sOid"></param>
//        /// <param name="iChnId"></param>
//        /// <param name="isUseE548ReturnBigSmallType"></param>
//        /// <param name="BigType"></param>
//        /// <param name="SmallType"></param>
//        /// <returns></returns>
//        public string FormingNewSid (int iDeviceType, string sOid, int iChnId, bool isUseE548ReturnBigSmallType, byte BigType, byte SmallType)
//        {
//            if (sOid == null || sOid == "") return "";
//            try {
//                string sSid = "";
//                if (DimmerDeviceTypeList.HDLDimmerDeviceTypeList.Contains (iDeviceType)) {
//                    if (DimmerDeviceTypeList.DALIDimmerDeviceTypeLists.Contains (iDeviceType)) {
//                        BigType = 1;
//                        SmallType = 7;
//                        sSid += "0203";
//                    } else {
//                        sSid += "0202";
//                    }
//                } else if (RelayDeviceTypeList.HDLRelayDeviceTypeList.Contains (iDeviceType)) {
//                    sSid += "0201";
//                } else if (CurtainDeviceType.HDLCurtainModuleDeviceType.Contains (iDeviceType)) {
        /// <summary>
        /// 获取生成物理模型参数
        /// 2021-01-22 目前物模还不完善
        /// </summary>
        /// <param name="deviceType"></param>
        /// <returns></returns>
        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;
            }
//                    if (CurtainDeviceType.NormalMotorCurtainDeviceType.Contains (iDeviceType) || (iDeviceType == 9700)) //所有开合帘 //0 2020 05 24创明开合帘
//                    {
//                        sSid += "0303";
//                    } else if (CurtainDeviceType.RollerCurtainDeviceType.Contains (iDeviceType)
//                      || (iDeviceType == 9701))//所有 卷帘控制器
//                      {
//                        sSid += "0304";
//                    } else {
//                        sSid += "0301";
//                    }
//                } else if (HVACModuleDeviceTypeList.HDLHVACModuleDeviceTypeLists.Contains (iDeviceType)) {
//                    sSid += "0401";
//                } else if (Eightin1DeviceTypeList.HDL8in1DeviceType.Contains (iDeviceType)
//                      || Sevenin1DeviceTypeList.HDL7in1DeviceType.Contains (iDeviceType)
//                      || HaikeSensorDeviceTypeList.HaikeSensorDeviceType.Contains (iDeviceType)
//                      || Twelvein1DeviceTypeList.HDL12in1DeviceType.Contains (iDeviceType)
//                      || Rs232DeviceTypeList.HDLRs232DeviceType.Contains (iDeviceType)) {
//                    if (BigType == 19 && SmallType == 0) {
//                        sSid += "1301";
//                    } else if (BigType == 5 && SmallType == 0) {
//                        sSid += "0519";
//                    } else {
//                        sSid += BigType.Tostring ("X2") + SmallType.Tostring ("X2");
//                    }
//                } else if (FloorheatingDeviceTypeList.HDLFloorHeatingDeviceType.Contains (iDeviceType)) {
//                    sSid += "0402";
//                } else if (DMXDeviceTypeList.HDLDMXDeviceTypeList.Contains (iDeviceType)) {
//                    sSid += "0204";
//                } else if (DimmerDeviceTypeList.DALIDimmerDeviceTypeLists.Contains (iDeviceType)) {
//                    sSid += "0203";
//                } else if (AudioDeviceTypeList.AudioBoxDeviceTypeList.Contains (iDeviceType)) {
//                    sSid += "0901";
//                }
//                string sTmpWithE548 = sSid;
//                sSid = sOid + sSid + iChnId.Tostring ("X4");
//                if (isUseE548ReturnBigSmallType) {
//                    sSid += BigType.Tostring ("X2") + SmallType.Tostring ("X2");
//                } else {
//                    sSid += sTmpWithE548;
//                }
            return productType;
        }
//                return sSid;
//            } catch {
//                return "";
//            }
//        }
//        private long LastTime = 0;
//        /// <summary>
//        /// DateTime时间格式转换为13位带毫秒的Unix时间戳
//        /// </summary>
//        /// <param name="time"> DateTime时间格式</param>
//        /// <returns>Unix时间戳格式</returns>
//        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;
//        }
//    }
//    [Serializable]
//    public class Sids : BaseCloudFeedback
//    {
//        public string homeId { get; set; }
//        public string gatewayId { get; set; }
//        public List<Sid> devices { get; set; }
//    }
//    [Serializable]
//    public class BaseCloudFeedback
//    {
//        public int code { get; set; }
//        public string timestamp { get; set; }
//        public bool isSuccess { get; set; }
//        public string message { get; set; }
//    }
        /// <summary>
        /// 生成功能设备Sid
        /// </summary>
        /// <param name="iDeviceType"></param>
        /// <param name="sOid"></param>
        /// <param name="iChnId"></param>
        /// <param name="isUseE548ReturnBigSmallType"></param>
        /// <param name="BigType"></param>
        /// <param name="SmallType"></param>
        /// <returns></returns>
        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 "";
            }
        }
//    [Serializable]
//    public class Oids : BaseCloudFeedback
//    {
//        public string homeId { get; set; }
//        public string gatewayId { get; set; }
//        public List<Oid> devices { get; set; }
//    }
        /// <summary>
        /// 生成SPK属性
        /// </summary>
        /// <param name="loopCommon"></param>
        /// <param name="iChnRemark"></param>
        /// <param name="sOid"></param>
        /// <param name="iChnId"></param>
        /// <param name="BigType"></param>
        /// <param name="SmallType"></param>
        /// <param name="isUseE548ReturnBigSmallType"></param>
        /// <returns></returns>
        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<Function> ();
                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<string> ();
                    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<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    #endregion
//    [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; }
                    #region brightness
                    Function tempFunction1 = new Function ();
                    tempFunction1.key = "brightness";
                    tempFunction1.data_type = "integer";
                    tempFunction1.value = new List<string> ();
//        public string fw_version { get; set; }
//        public string hw_info { get; set; }
//        public string mac { get; set; }
//        public string deviceType { get; set; }
//    }
                    tempFunction1.max = 100;
                    tempFunction1.min = 0;
                    tmp.attributes.Add (tempFunction1);
                    #endregion
//    [Serializable]
//    public class Sid
//    {
//        public string sid { get; set; }
//        public string name { get; set; }
//        public string [] uids { get; set; }
//        public string spk { get; set; }
                    #region fade_time
                    Function tempFunction3 = new Function ();
                    tempFunction3.key = "fade_time";
                    tempFunction3.data_type = "integer";
                    tempFunction3.value = new List<string> ();
                    //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
//        public string oid { get; set; }  //设备模块地址
//        public string omodel { get; set; }    //型号
//        public List<Function> attributes { get; set; } //属性列表
//    }
                    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<string> ();
                        //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<string> ();
                    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<string> ();
                    tempFunction2.max = 100;
                    tempFunction2.min = 0;
                    tmp.attributes.Add (tempFunction2);
                    #endregion
//    [Serializable]
//    public class Function
//    {
//        //public string name { get; set; }
//        public string key { get; set; }
//        public List<string> value { get; set; }
//        public int max { get; set; }
//        public int min { get; set; }
//        public string data_type { get; set; }
//    }
//}
                    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<string> ();
                        //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<string> ();
                        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<string> ();
                        //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<string> ();
                    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<string> ();
                        //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<string> ();
                    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<string> ();
                    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<string> ();
                    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<string> ();
                    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<string> ();
                    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<string> ();
                    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<string> ();
                    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
////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    第三方网关或者平台
                    #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<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    #endregion
////厂商代码    1byte    编号    描述
////        01    HDL
////        02
                    #region mode
                    Function tempFunction1 = new Function ();
                    tempFunction1.key = "mode";
                    tempFunction1.data_type = "string";
                    tempFunction1.value = new List<string> ();
                    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
////通讯方式    1byte    编号    描述
////        01    HDL Bus
////        02    Zigbee
////        03    KNX
////        04    Z-Wave
                    #region temp
                    Function tempFunction3 = new Function ();
                    tempFunction3.key = "set_temp";
                    tempFunction3.data_type = "float";
                    tempFunction3.value = new List<string> ();
                    //tempFunction3.value.Add("up");
                    //tempFunction3.value.Add("down");
                    //tempFunction3.value.Add("value");
                    tempFunction3.max = 35;
                    tempFunction3.min = 0;
                    tmp.attributes.Add (tempFunction3);
                    #endregion
////产品时间戳    4bytes    以2020年1月1日算出的时间戳0.1s为单位
                    #region temp
                    Function tempFunction4 = new Function ();
                    tempFunction4.key = "set_temp_step";
                    tempFunction4.data_type = "string";
                    tempFunction4.value = new List<string> ();
                    tempFunction4.value.Add ("up");
                    tempFunction4.value.Add ("down");
                    tempFunction4.max = 1;
                    tempFunction4.min = 0;
                    tmp.attributes.Add (tempFunction4);
                    #endregion
////产品类别    1byte    编号    描述
////        01    调光器
////        02    继电器
////        03    干接点模块
////        04    传感器
////        05    面板
////        06    RCU
////        07    网关
////        08    红外发射
////        09    Android屏
////        10    场景
////        11    音乐播放器
////        12    232/485转换器
////        21    自动化
////        22    安防防区
////        14    窗帘模块
////        15    HVAC
////        16    地热模块
                    #region room_temp
                    Function tempFunction5 = new Function ();
                    tempFunction5.key = "room_temp";
                    tempFunction5.data_type = "float";
                    tempFunction5.value = new List<string> ();
                    tempFunction5.max = 50;
                    tempFunction5.min = -50;
                    tmp.attributes.Add (tempFunction5);
                    #endregion
////物模型类型    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    新风
                    #region lock
////13    能源    01    电表
////                02    水表
////                03    燃气
////        16    电器    01    风扇
////                02    TV
////        20    安防    01    安防
////        21    自动化    01    自动化
////大类别    1bytes    (预留)
////小类别    1byte    (预留)
                    #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<string> ();
                    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<string> ();
                    //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<string> ();
                    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<string> ();
                    //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<string> ();
                    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<string> ();
                    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<string> ();
                    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<string> ();
                    //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<string> ();
                    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<string> ();
                    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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string>();
                        //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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                        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<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    #endregion
                }
            } catch { }
            return tmp;
        }
        //#region 判断类型
        ///// <summary>
        ///// 继电器类别
        ///// </summary>
        ///// <param name="deviceType"></param>
        ///// <returns></returns>
        //public bool IsHDLRelayDeviceType (DeviceType deviceType)
        //{
        //    return false;
        //}
        ///// <summary>
        ///// 调光器类别
        ///// </summary>
        ///// <param name="deviceType"></param>
        ///// <returns></returns>
        //public bool IsHDLDimmerDeviceType (DeviceType deviceType)
        //{
        //    return false;
        //}
        ///// <summary>
        ///// 遮阳类别(窗帘、卷帘、开合帘)
        ///// </summary>
        ///// <param name="deviceType"></param>
        ///// <returns></returns>
        //public bool IsHDLCurtainDeviceType (DeviceType deviceType)
        //{
        //    return deviceType == DeviceType.CurtainModel
        //            || deviceType == DeviceType.CurtainRoller
        //            || deviceType == DeviceType.CurtainTrietex;
        //}
        ///// <summary>
        ///// 传感器类别
        ///// </summary>
        ///// <param name="deviceType"></param>
        ///// <returns></returns>
        //public bool IsHDLSensorDeviceType (DeviceType deviceType)
        //{
        //    return false;
        //}
        ///// <summary>
        ///// 网关类别
        ///// </summary>
        ///// <param name="deviceType"></param>
        ///// <returns></returns>
        //public bool IsHDLGatewayDeviceType (DeviceType deviceType)
        //{
        //    return false;
        //}
        ///// <summary>
        ///// 空调
        ///// </summary>
        ///// <param name="deviceType"></param>
        ///// <returns></returns>
        //public bool IsHDLACDeviceType (DeviceType deviceType)
        //{
        //    return false;
        //}
        //#endregion
        #region 生成4位byte 时间戳
        private long LastTime = 0;
        /// <summary>
        /// DateTime时间格式转换为13位带毫秒的Unix时间戳
        /// </summary>
        /// <param name="time"> DateTime时间格式</param>
        /// <returns>Unix时间戳格式</returns>
        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;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="m"></param>
        /// <param name="strTmp"></param>
        /// <returns></returns>
        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<Sid> devices { get; set; }
    }
    [Serializable]
    public class Oids
    {
        public string homeId { get; set; }
        public string gatewayId { get; set; }
        public List<Oid> 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<Function> attributes { get; set; } //属性列表
    }
    [Serializable]
    public class Function
    {
        //public string name { get; set; }
        public string key { get; set; }
        public List<string> 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; } //功能列表
    }
    ///// <summary>
    ///// 上传Oid列表
    ///// </summary>
    //[Serializable]
    //public class UploadOids
    //{
    //    public string homeId { get; set; } //住宅ID
    //    public Oids devices { get; set; } //设备列表
    //}
    ///// <summary>
    ///// 上传Sid列表
    ///// </summary>
    //[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    (预留)