JLChen
2021-09-23 d68d94ae29987d123c5c4e207ee65c713052348c
2021-09-23 1.增加本地加密通信
7个文件已修改
163 ■■■■ 已修改文件
.vs/HDL_APP_Project/xs/UserPrefs.xml 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/DriverLayer/Control.cs 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/DriverLayer/Control_TcpServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/DriverLayer/Control_Udp.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/HttpUtil.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Device/DeviceModule.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/ResponseEntity/RegionInfoRes.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HDL_APP_Project/xs/UserPrefs.xml
@@ -1,17 +1,39 @@
<Properties StartupConfiguration="{D998E133-F0DD-4760-BE3C-461632F54DA4}|Default">
  <MonoDevelop.Ide.ItemProperties.HDL-ON__iOS PreferredExecutionTarget="MonoDevelop.IPhone.IPhoneDeviceTarget.00008030-00014C392121802E" />
  <MonoDevelop.Ide.Workbench ActiveDocument="HDL-ON_iOS/AppDelegate.cs">
  <MonoDevelop.Ide.Workbench ActiveDocument="HDL_ON/Entity/Device/DeviceModule.cs">
    <Files>
      <File FileName="HDL_ON/UI/UI2/1-HomePage/MessageCenterPage.cs" Line="346" Column="5" />
      <File FileName="HDL-ON_iOS/Info.plist" />
      <File FileName="HDL-ON_iOS/AppDelegate.cs" Line="303" Column="1" />
      <File FileName="HDL_ON/DAL/DriverLayer/Control.cs" Line="856" Column="58" />
      <File FileName="HDL_ON/DAL/DriverLayer/Control_TcpServer.cs" Line="102" Column="56" />
      <File FileName="HDL_ON/Entity/Device/DeviceModule.cs" Line="49" Column="21" />
    </Files>
    <Pads>
      <Pad Id="ProjectPad">
        <State name="__root__">
          <Node name="HDL_APP_Project" expanded="True">
            <Node name="HDL-ON_iOS" expanded="True">
              <Node name="AppDelegate.cs" selected="True" />
            <Node name="HDL_ON" expanded="True">
              <Node name="DAL" expanded="True">
                <Node name="DriverLayer" expanded="True" />
                <Node name="Mqtt" expanded="True" />
                <Node name="Server" expanded="True" />
              </Node>
              <Node name="Entity" expanded="True">
                <Node name="Device" expanded="True">
                  <Node name="DeviceModule.cs" selected="True" />
                </Node>
                <Node name="ResponseEntity" expanded="True" />
              </Node>
              <Node name="UI" expanded="True">
                <Node name="BindingResidence" expanded="True" />
                <Node name="UI0-Public" expanded="True" />
                <Node name="UI2" expanded="True">
                  <Node name="3-Intelligence" expanded="True">
                    <Node name="Automation" expanded="True" />
                  </Node>
                  <Node name="4-PersonalCenter" expanded="True">
                    <Node name="PirDevice" expanded="True" />
                  </Node>
                </Node>
              </Node>
            </Node>
          </Node>
        </State>
HDL_ON/DAL/DriverLayer/Control.cs
@@ -63,7 +63,19 @@
        /// 是否搜索本地网关成功
        /// </summary>
        public bool IsSearchLocalGatewaySuccessful = false;
        /// <summary>
        /// 是否本地加密,目前只对A网关有用
        /// </summary>
        public bool IsLocalEncrypt;
        /// <summary>
        /// 判断是否本地加密并且加密key不为空
        /// </summary>
        public bool IsLocalEncryptAndGetAesKey {
            get {
                return IsLocalEncrypt && (!string.IsNullOrEmpty(DB_ResidenceData.Instance.CurrentRegion.localSecret));
            }
        }
        bool _GatewayOnline_Local = false;
        /// <summary>
        /// 网关在线-局域网
@@ -689,15 +701,45 @@
        /// <summary>
        /// 转换发送数据
        /// </summary>
        public byte[] ConvertSendBodyData(string topic, string bodyDataString)
        /// <param name="topic">主题</param>
        /// <param name="bodyDataString">body内容数据</param>
        /// <param name="isEncryption">是否要对body加密</param>
        /// <returns></returns>
        public byte[] ConvertSendBodyData(string topic, string bodyDataString, bool isEncryption = true)
        {
            string topicString = "Topic:" + topic + "\r\n";
            byte[] bodyBytes = Encoding.ASCII.GetBytes(bodyDataString);
            string lengthString = "Length:" + bodyBytes.Length.ToString() + "\r\n" + "\r\n";
            //string topicString = "Topic:" + topic + "\r\n";
            //byte[] bodyBytes = Encoding.ASCII.GetBytes(bodyDataString);
            //string lengthString = "Length:" + bodyBytes.Length.ToString() + "\r\n" + "\r\n";
            string sendDataString = topicString + lengthString + bodyDataString;
            byte[] sendDataBytes = Encoding.ASCII.GetBytes(sendDataString);
            MainPage.Log($"转换HDL-Link数据\r\n{sendDataString}\r\n");
            //string sendDataString = topicString + lengthString + bodyDataString;
            //byte[] sendDataBytes = Encoding.ASCII.GetBytes(sendDataString);
            //MainPage.Log($"转换HDL-Link数据\r\n{sendDataString}\r\n");
            //***************************************************************
            //2021-09-23 增加本地通信加密处理
            //1.拼接头
            string topicString = "Topic:" + topic + "\r\n";
            //2.Body字符串转为byte数组
            byte[] bodyBytes = Encoding.ASCII.GetBytes(bodyDataString);
            //判断是否需加密Body数据
            if (isEncryption && IsLocalEncryptAndGetAesKey)
            {
                bodyBytes = Securitys.EncryptionService.AesEncryptPayload(bodyBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret);
                //bodyDataString = Encoding.UTF8.GetString(bodyBytes);
                //MainPage.Log($"转换HDL-Link数据 加密key:" + DB_ResidenceData.Instance.CurrentRegion.localSecret);
            }
            //3.拼接body的Length长度数据
            string lengthString = "Length:" + bodyBytes.Length.ToString() + "\r\n" + "\r\n";
            string topicAndLengthString = topicString + lengthString;
            byte[] topicAndLengthBytes = Encoding.ASCII.GetBytes(topicAndLengthString);
            //4.拼接合并 Topic 和 body的byte数组数据
            byte[] sendDataBytes = new byte[topicAndLengthBytes.Length + bodyBytes.Length];
            topicAndLengthBytes.CopyTo(sendDataBytes, 0);
            bodyBytes.CopyTo(sendDataBytes, topicAndLengthBytes.Length);
            //var sendDataString = Encoding.UTF8.GetString(sendDataBytes);
            //MainPage.Log($"转换HDL-Link数据\r\n{sendDataString}\r\n");
            //***************************************************************
            return sendDataBytes;
        }
@@ -708,15 +750,19 @@
        public void ConvertReceiveData(byte[] receiveBytes)
        {
            var reString = Encoding.UTF8.GetString(receiveBytes);
            AnalysisReceiveData(reString);
            AnalysisReceiveData(reString, receiveBytes);
        }
        /// <summary>
        /// 转换接收到的数据
        /// </summary>
        /// <param name="receiveString">转String后的数据</param>
        /// <param name="originalReceiveBytes"原始Bytes数据</param>
        /// <returns></returns>
        public LocalCommunicationData AnalysisReceiveData(string receiveString)
        public LocalCommunicationData AnalysisReceiveData(string receiveString, byte[] originalReceiveBytes)
        {
            LocalCommunicationData receiveObj = new LocalCommunicationData();
            MainPage.Log($"局域网信息: \r\n{receiveString}");
            var res = receiveString.Split("\r\n\r\n");
@@ -738,8 +784,7 @@
                    }
                }
                MainPage.Log($"局域网信息: {receiveObj.Topic}  : 内容: {res[1]}");
                //MainPage.Log($"局域网信息: {receiveObj.Topic}  : 内容: {res[1]}");
                //验证有效数据长度
                //if (res[1].Length != receiveObj.Length)
@@ -748,6 +793,40 @@
                //    return receiveObj;
                //}
                receiveObj.BodyDataString = res[1];
                //2021-09-23 过滤不需要解密的主题 目前搜索网关主题不加密
                if (receiveObj.Topic != CommunicationTopic.SearchLoaclGatewayReply)
                {
                    //判断当前网关是否开启了本地加密
                    if (IsLocalEncryptAndGetAesKey)
                    {
                        MainPage.Log($"局域网信息 开始解密");
                        if (originalReceiveBytes != null)
                        {
                            //拿到原始Bytes数据去解密
                            byte[] topicBytes = Encoding.UTF8.GetBytes(res[0]);
                            byte[] bodyBytes = new byte[receiveObj.Length];
                            Array.Copy(originalReceiveBytes, topicBytes.Length + 4, bodyBytes, 0, receiveObj.Length);
                            byte[] receiveBytes = Securitys.EncryptionService.AesDecryptPayload(bodyBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret);
                            var revString = Encoding.UTF8.GetString(receiveBytes);
                            receiveObj.BodyDataString = revString;
                            MainPage.Log($"局域网信息: 解密后:" + receiveObj.BodyDataString);
                        }
                        else
                        {
                            //目前不拿原始Bytes数据 解密不了
                            //byte[] receiveBytes = Encoding.UTF8.GetBytes(res[1]);
                            //MainPage.Log($"局域网信息 receiveBytes {receiveBytes.Length}");
                            //receiveBytes = Securitys.EncryptionService.AesDecryptPayload(receiveBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret);
                            //MainPage.Log($"局域网信息 解密后:receiveBytes {receiveBytes.Length}");
                            //var revString = Encoding.UTF8.GetString(receiveBytes);
                            //receiveObj.BodyDataString = revString;
                            //MainPage.Log($"局域网信息: 解密后:" + receiveObj.BodyDataString);
                        }
                    }
                }
                if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply || receiveObj.Topic == CommunicationTopic.GatewayBroadcast)
                {
@@ -772,7 +851,10 @@
                        {
                            Ins.GatewayId = device.device_mac;
                        }
                        reportIp = device.ip_address;//主播地址也能控制设备//"239.0.168.188";//
                        reportIp = device.ip_address;//主播地址也能控制设备//"239.0.168.188";//
                        //2021-09-23 新增获取当前网关是否本地加密
                        Ins.IsLocalEncrypt = device.isLocalEncrypt;
                        //MainPage.Log("网关本地加密状态:" + device.local_encrypt.ToString());
                    }
                }
                else if (receiveObj.Topic == CommunicationTopic.ct.ReadStatus + "_reply" ||
HDL_ON/DAL/DriverLayer/Control_TcpServer.cs
@@ -182,7 +182,7 @@
        void AnalysisTcpData(Socket socket, string tcpBodyDataString)
        {
            MainPage.Log($"0001 tcpDataString:\r\n {tcpBodyDataString}");
            var tcpDataObj = Control.Ins.AnalysisReceiveData(tcpBodyDataString);
            var tcpDataObj = Control.Ins.AnalysisReceiveData(tcpBodyDataString, null);
            if (tcpDataObj.BodyDataString == null)
            {
                return;
HDL_ON/DAL/DriverLayer/Control_Udp.cs
@@ -1128,7 +1128,7 @@
                var sendJob = new JObject { { "id", Control.Ins.msg_id.ToString() }, { "time_stamp", Utlis.GetTimestamp ()} };
                var bodyString = JsonConvert.SerializeObject(sendJob);
                
                var sendBytes = Control.Ins.ConvertSendBodyData(CommunicationTopic.SearchLoaclGateway, bodyString);
                var sendBytes = Control.Ins.ConvertSendBodyData(CommunicationTopic.SearchLoaclGateway, bodyString, false);
                //组播发送
                packet = new Packet(sendBytes, new System.Net.IPEndPoint(System.Net.IPAddress.Parse("239.0.168.188"), 8585));
                packet.HaveSendCount = 4;
HDL_ON/DAL/Server/HttpUtil.cs
@@ -17,8 +17,8 @@
        /// 固定域名,正式环境
        /// 公共域名就近解析
        /// </summary>
        //public const string GlobalRequestHttpsHost = "https://nearest.hdlcontrol.com";
        public const string GlobalRequestHttpsHost = "https://test-gz.hdlcontrol.com";//mmmm
        public const string GlobalRequestHttpsHost = "https://nearest.hdlcontrol.com";
        //public const string GlobalRequestHttpsHost = "https://test-gz.hdlcontrol.com";//mmmm
        /// <summary>
        /// RegionMark
        /// </summary>
HDL_ON/Entity/Device/DeviceModule.cs
@@ -40,5 +40,14 @@
        /// 区分是bus设备,还是knx设备
        /// </summary>
        public string driver_code = "";
        /// <summary>
        /// 是否主网关
        /// </summary>
        public bool master;
        /// <summary>
        /// 是否开启了本地加密
        /// 2021-09-23 注意:为了兼容控制以前不加密网关要用这个新的字段,不能用local_encrypt,因为发现以前部分固件已经有这个标记并且回复true,但实际上通信还没加密的
        /// </summary>
        public bool isLocalEncrypt;
    }
}
HDL_ON/Entity/ResponseEntity/RegionInfoRes.cs
@@ -122,6 +122,10 @@
        /// 调试权限是否打开
        /// </summary>
        public bool debugPerm;
        /// <summary>
        /// 网关本地通信加密Key,同一个住宅 密钥创建后就不变
        /// </summary>
        public string localSecret;
    }
}