浏览代码

1、GetKeys方法不适合GetAcasKey,因为返回的参数过多,另立方法。
2、新增ACASKey Tool串口接口及Http接口。

sat23 3 年之前
父节点
当前提交
d49b3524f9

+ 47 - 29
SCBC Factory Tools/Business/CommonMethod.cs

@@ -817,35 +817,6 @@ namespace MOKA_Factory_Tools
                         }
                         break;
                     }
-                case "ACAS_KEY": // ACAS Key;
-                    {
-                        item.URL = url + "/getAcasKey.do?";
-                        item.Postdata = "type=" + keytype + "&sn=" + sn;
-                        if (sn.Trim().Length > 0)
-                            item.Postdata += "&order=" + order;
-                        HttpResult result = http.GetHtml(item);
-                        if (result.StatusCode == System.Net.HttpStatusCode.OK)
-                        {
-                            Log.WriteGetKeyLog("\r\nGet ACAS key:\r\n" + item.URL + "\r\n" + item.Postdata + "\r\n" + result.Html);
-                            if (Xmlconfig.GetOthersKeyXml(result.Html, "response", "acasKey", out code, out desc, out key, out md5))
-                            {
-
-                            }
-                            else
-                            {
-                                error = desc;
-                                ReportErrormsg("Fail to parse ACAS key", error + "\r\n" + item.URL + "\r\n" + item.Postdata + "\r\n" + result.Html, sqliteConn);
-                                return false;
-                            }
-                        }
-                        else
-                        {
-                            error = result.StatusDescription;
-                            ReportErrormsg("Fail to get ACAS key", error + "\r\n" + item.URL + "\r\n" + item.Postdata + "\r\n" + result.Html, sqliteConn);
-                            return false;
-                        }
-                        break;
-                    }
             }
             return true;
         }
@@ -902,6 +873,53 @@ namespace MOKA_Factory_Tools
             return true;
         }
 
+        public static bool GetAcasKey(string url, string keymessage, string sn, string keytype, SQLiteConnection sqliteConn, string order, out string key, out string md5, out string key2, out string md52, out string error)
+        {
+            string code;
+            string desc;
+            error = "";
+            key = "";
+            md5 = "";
+            key2 = "";
+            md52 = "";
+            HttpHelper http = new HttpHelper();
+            HttpItem item = new HttpItem()
+            {
+                Encoding = Encoding.Default,
+                Method = "post",
+                ContentType = "application/x-www-form-urlencoded",
+                KeepAlive = false
+            };
+
+            item.URL = url + "/getAcasKey.do?";
+            item.Postdata = "type=" + keytype + "&sn=" + sn;
+            if (sn.Trim().Length > 0)
+                item.Postdata += "&order=" + order;
+            HttpResult result = http.GetHtml(item);
+            if (result.StatusCode == System.Net.HttpStatusCode.OK)
+            {
+                Log.WriteGetKeyLog("\r\nGet ACAS key:\r\n" + item.URL + "\r\n" + item.Postdata + "\r\n" + result.Html);
+                if (Xmlconfig.Get2KeyInfoFromXml(result.Html, "acasKey_data", "acasKey_tool", out code, out desc, out key, out md5, out key2, out md52))
+                {
+
+                }
+                else
+                {
+                    error = desc;
+                    ReportErrormsg("Fail to parse ACAS key", error + "\r\n" + item.URL + "\r\n" + item.Postdata + "\r\n" + result.Html, sqliteConn);
+                    return false;
+                }
+            }
+            else
+            {
+                error = result.StatusDescription;
+                ReportErrormsg("Fail to get ACAS key", error + "\r\n" + item.URL + "\r\n" + item.Postdata + "\r\n" + result.Html, sqliteConn);
+                return false;
+            }
+
+            return false;
+        }
+
         /// <summary>
         /// 异常上报
         /// </summary>

+ 71 - 0
SCBC Factory Tools/Http/Xmlconfig.cs

@@ -164,6 +164,77 @@ public class Xmlconfig
         }
     }
 
+    /// <summary>
+    /// 解析并获取返回2个key的xml.
+    /// </summary>
+    /// <returns></returns>
+    public static bool Get2KeyInfoFromXml(string str, string key1, string key2, out string code, out string desc, out string value1, out string md51, out string value2, out string md52)
+    {
+        md51 = "";
+        md52 = "";
+        code = "";
+        value1 = "";
+        value2 = "";
+        try
+        {
+            XmlDocument xml = new XmlDocument();
+            xml.LoadXml(str);
+            code = xml.SelectSingleNode("response").Attributes.GetNamedItem("code").InnerText;
+            desc = xml.SelectSingleNode("response").Attributes.GetNamedItem("desc").InnerText;
+            if (code == "200")
+            {
+                value1 = xml.SelectSingleNode("response//" + key1).Attributes.GetNamedItem("value").InnerText;
+                if (xml.SelectSingleNode("response//" + key1).Attributes.GetNamedItem("md5value") != null)
+                    md51 = xml.SelectSingleNode("response//" + key1).Attributes.GetNamedItem("md5value").InnerText;
+
+                bool bCRC321 = false;
+                string CRC321 = "";
+                if (xml.SelectSingleNode("response//" + key1).Attributes.GetNamedItem("crc32") != null)
+                {
+                    bCRC321 = true;
+                    CRC321 = xml.SelectSingleNode("response//" + key1).Attributes.GetNamedItem("crc32").InnerText;
+                }
+
+                value2 = xml.SelectSingleNode("response//" + key2).Attributes.GetNamedItem("value").InnerText;
+                if (xml.SelectSingleNode("response//" + key2).Attributes.GetNamedItem("md5value") != null)
+                    md52 = xml.SelectSingleNode("response//" + key2).Attributes.GetNamedItem("md5value").InnerText;
+
+                bool bCRC322 = false;
+                string CRC322 = "";
+                if (xml.SelectSingleNode("response//" + key2).Attributes.GetNamedItem("crc32") != null)
+                {
+                    bCRC322 = true;
+                    CRC322 = xml.SelectSingleNode("response//" + key2).Attributes.GetNamedItem("crc32").InnerText;
+                }
+
+                if (bCRC321)
+                { 
+                    if (CrcUtils.CRC32(value1) != Convert.ToUInt32(CRC321, 16))
+                    {
+                        desc = "CRC32 error";
+                        return false;
+                    } 
+                }
+
+                if (bCRC322)
+                {
+                    if (CrcUtils.CRC32(value2) != Convert.ToUInt32(CRC322, 16))
+                    {
+                        desc = "CRC32 error";
+                        return false;
+                    }
+                }
+            }
+
+            return true;
+        }
+        catch (Exception ex)
+        {
+            desc = ex.Message;
+            return false;
+        }
+    }
+
     public static bool GetWidevineAndAttestationKeyXml(string str, 
         string node, 
         out string code, 

+ 65 - 5
SCBC Factory Tools/IO/SerialCMD.cs

@@ -2399,7 +2399,7 @@ namespace MOKA_Factory_Tools
         /// <param name="error"></param>
         /// <param name="waitTime"></param>
         /// <returns>注意返回值为:md5xxxxx</returns>
-        public static bool ReadACASKey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
+        public static bool ReadACASKeyData(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
         {
             if (Sendcmd(Comport, new byte[] { 0xAA }, new byte[] { 0xFC }, new byte[] { 0x03, 0x08 }, true, false, out result, out data, out error, waitTime))
             {
@@ -2410,14 +2410,14 @@ namespace MOKA_Factory_Tools
                 }
                 else
                 {
-                    error = "返回ACAS KEY错误!";
+                    error = "返回ACAS KEY DATA错误!";
                 }
             }
 
             return false;
         }
 
-        public static bool CheckACASKey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
+        public static bool CheckACASKeyData(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
         {
             if (Sendcmd(Comport, new byte[] { 0xAA }, new byte[] { 0xFC }, new byte[] { 0x01, 0x08 }, true, false, out result, out data, out error, waitTime))
             {
@@ -2427,7 +2427,7 @@ namespace MOKA_Factory_Tools
                 }
                 else
                 {
-                    error = "检验ACAS KEY错误,应为0x02 0x08 0x01";
+                    error = "检验ACAS KEY DATA错误,应为0x02 0x08 0x01";
                 }
             }
 
@@ -2444,11 +2444,71 @@ namespace MOKA_Factory_Tools
         /// <param name="error"></param>
         /// <param name="waitTime"></param>
         /// <returns></returns>
-        public static bool SetACASKey(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
+        public static bool SetACASKeyData(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
         {
             return Sendcmd(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x08 }, param, false, false, out result, out data, out error, waitTime);
         }
 
+        /// <summary>
+        /// 读取ACAS Key
+        /// </summary>
+        /// <param name="Comport"></param>
+        /// <param name="result"></param>
+        /// <param name="data"></param>
+        /// <param name="error"></param>
+        /// <param name="waitTime"></param>
+        /// <returns>注意返回值为:md5xxxxx</returns>
+        public static bool ReadACASKeyTool(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
+        {
+            if (Sendcmd(Comport, new byte[] { 0xAA }, new byte[] { 0xFC }, new byte[] { 0x03, 0x0A }, true, false, out result, out data, out error, waitTime))
+            {
+                if (data[0] == 0x04 && data[0] == 0x0A)
+                {
+                    data = data.Skip(2).Take(data.Length - 2).ToArray();
+                    return true;
+                }
+                else
+                {
+                    error = "返回ACAS KEY TOOL 错误!";
+                }
+            }
+
+            return false;
+        }
+
+        public static bool CheckACASKeyTool(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
+        {
+            if (Sendcmd(Comport, new byte[] { 0xAA }, new byte[] { 0xFC }, new byte[] { 0x01, 0x0A }, true, false, out result, out data, out error, waitTime))
+            {
+                if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x0A && data[1] == 0x01)
+                {
+                    return true;
+                }
+                else
+                {
+                    error = "检验ACAS KEY TOOL 错误,应为0x02 0x0A 0x01";
+                }
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// 设置ACAS Key
+        /// </summary>
+        /// <param name="Comport"></param>
+        /// <param name="param"></param>
+        /// <param name="result"></param>
+        /// <param name="data"></param>
+        /// <param name="error"></param>
+        /// <param name="waitTime"></param>
+        /// <returns></returns>
+        public static bool SetACASKeyTool(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
+        {
+            return Sendcmd(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x0A }, param, false, false, out result, out data, out error, waitTime);
+        }
+
+
         /// <summary>
         /// 通讯逻辑
         /// </summary>

+ 4 - 2
SCBC Factory Tools/Models/StructList.cs

@@ -209,8 +209,10 @@ namespace MOKA_Factory_Tools
         public string YouTube_KEY { get; set; }
         public string EDIDPid { get; set; }
         public string EDIDModelName { get; set; }
-        public string ACASKey { get; set; }
-        public string ACASKeyMd5 { get; set; }
+        public string ACASKey_Data { get; set; }
+        public string ACASKey_Tool { get; set; }
+        public string ACASKey_DataMd5 { get; set; }
+        public string ACASKey_ToolMd5 { get; set; }
     }
 
     public class FireTVKey

+ 78 - 19
SCBC Factory Tools/Views/OperationPanel.cs

@@ -797,7 +797,8 @@ namespace MOKA_Factory_Tools
                         keyInfo.Playready = jObject["playready"].Value<string>();
                         keyInfo.Hashkey = jObject["hash"].Value<string>();
                         keyInfo.YouTube_KEY = jObject["youtubekey"].Value<string>();
-                        keyInfo.ACASKey = jObject["acaskey"].Value<string>();
+                        keyInfo.ACASKey_Data = jObject["acaskey_data"].Value<string>();
+                        keyInfo.ACASKey_Tool = jObject["acaskey_tool"].Value<string>();
 
                         WriteDID.Checked = (keyInfo.DID.Length > 0 && m_writedid.Text != LResource.Skip);
                         if (WriteDID.Checked)
@@ -856,9 +857,9 @@ namespace MOKA_Factory_Tools
                         WriteYouTube.Checked = (keyInfo.YouTube_KEY.Length > 0 && m_writeYouTube.Text != LResource.Skip);
                         if (WriteYouTube.Checked)
                             Log.WriteGetKeyLog("\r\nLocal DB YouTube_KEY=" + keyInfo.YouTube_KEY);
-                        WriteACASKey.Checked = (keyInfo.ACASKey.Length > 0 && m_writeACASKey.Text != LResource.Skip);
+                        WriteACASKey.Checked = (keyInfo.ACASKey_Data.Length > 0 && m_writeACASKey.Text != LResource.Skip);
                         if (WriteACASKey.Checked)
-                            Log.WriteGetKeyLog("\r\nLocal DB ACAS_KEY=" + keyInfo.ACASKey);
+                            Log.WriteGetKeyLog("\r\nLocal DB ACAS_KEY=" + keyInfo.ACASKey_Data);
                         WriteDSN.Checked = midListNow.keytype == null ? false : midListNow.keytype.ContainsKey("DSN") && m_writeDSN.Text != LResource.Skip;
                         WritePSN.Checked = FunctionSettingNow.BarcodeWrite;
 
@@ -1994,8 +1995,8 @@ namespace MOKA_Factory_Tools
                 {
                     if (GetLocalKeyCount.GetLocalHexKeys(orderNow, "ACAS_KEY", FunctionSettingNow.localACASKeySize, out FileStream Stream, out BinaryReader Reader, out string acaskey, out AcasKeypath, out error, errorDBNow, ref localmidList, SN))
                     {
-                        keyInfo.ACASKey = acaskey;
-                        Log.WriteGetKeyLog("\r\nLocal ACASKey=" + keyInfo.ACASKey);
+                        keyInfo.ACASKey_Data = acaskey;
+                        Log.WriteGetKeyLog("\r\nLocal ACASKey=" + keyInfo.ACASKey_Data);
                         if (Stream != null && Reader != null)
                         {
                             keypath.Add(AcasKeypath);
@@ -2290,11 +2291,16 @@ namespace MOKA_Factory_Tools
                 }
                 if (WriteACASKey.Checked)
                 {
-                    if (CommonMethod.GetKeys(midListNow.host, "ACAS_KEY", SN, midListNow.keytype["ACAS_KEY"], errorDBNow, out string acaskey, out error, orderNow, out string md5))
+                    if (CommonMethod.GetAcasKey(midListNow.host, "ACAS_KEY", SN, midListNow.keytype["ACAS_KEY"], errorDBNow, orderNow, out string acaskey_data, out string acaskey_datamd5, out string acaskey_tool, out string acaskey_toolmd5, out error))
                     {
-                        keyInfo.ACASKey = acaskey;
-                        keyInfo.ACASKeyMd5 = md5;
-                        Log.WriteGetKeyLog("\r\nACAS_KEY=" + keyInfo.ACASKey + "\r\nACAS_KEY_MD5=" + keyInfo.ACASKeyMd5);
+                        keyInfo.ACASKey_Data = acaskey_data;
+                        keyInfo.ACASKey_DataMd5 = acaskey_datamd5;
+
+                        keyInfo.ACASKey_Tool = acaskey_tool;
+                        keyInfo.ACASKey_ToolMd5 = acaskey_toolmd5;
+
+                        Log.WriteGetKeyLog("\r\nACAS_KEY_DATA=" + keyInfo.ACASKey_Data + "\r\nACAS_KEY_MD5=" + keyInfo.ACASKey_DataMd5);
+                        Log.WriteGetKeyLog("\r\nACAS_KEY_TOOL=" + keyInfo.ACASKey_Tool + "\r\nACAS_KEY_TOOLMD5=" + keyInfo.ACASKey_ToolMd5);
                     }
                     else
                     {
@@ -3812,18 +3818,71 @@ namespace MOKA_Factory_Tools
             // ACAS Key抄写;
             if (WriteACASKey.Checked)
             {
-                byte[] ACASKeyData = SerialInit.HexToByte(keyInfo.ACASKey);
+                // 1.acas key抄写前,必须先抄写playreadkey;
+                // 2.将tool先抄写再抄写data;
                 Log.WriteInfoLog("Write ACAC Key...");
-                if (SerialCMD.SetACASKey(TVPort, ACASKeyData, out result, out data, out error, SerailDelay))
+                byte[] ACASKeyTool = SerialInit.HexToByte(keyInfo.ACASKey_Tool);
+                if (SerialCMD.SetACASKeyTool(TVPort, ACASKeyTool, out result, out data, out error, SerailDelay))
+                {
+                    SetsuccessStatus(m_writeACASKey);
+                    keycontent += "acas_tool=" + keyInfo.ACASKey_Tool+ "&";
+                    Log.WriteInfoLog("Check ACAS Key Tool...");
+                    if (writeCheckNow.ACASKeyCheckcheck ? SerialCMD.CheckACASKeyTool(TVPort, out result, out data, out error, SerailDelay) : true)
+                    {
+                        SetsuccessStatus(m_checkACASKey);
+                        Log.WriteInfoLog("Read ACAS Key Tool...");
+                        if (readCheckNow.ACASIDReadcheck ? SerialCMD.ReadACASKeyTool(TVPort, out result, out data, out error, SerailDelay) : true)
+                        {
+                            if (readCheckNow.ACASIDReadcheck)
+                            {
+                                if (CommonMethod.CompareMD5(ACASKeyTool, data))
+                                {
+                                    SetsuccessStatus(m_readACASKey);
+                                }
+                                else
+                                {
+                                    SetfailStatus(m_readACASKey);
+                                    Log.WriteErrorLog(SN + "   contrast ACAS Key Tool fail");
+                                    MessageBox.Show(LResource.ContrastACASKeyError);
+                                    goto end;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            SetfailStatus(m_readACASKey);
+                            Log.WriteErrorLog(SN + "   read ACAS Key Tool fail");
+                            MessageBox.Show(LResource.ReadACASKeyError);
+                            goto end;
+                        }
+                    }
+                    else
+                    {
+                        SetfailStatus(m_checkACASKey);
+                        Log.WriteErrorLog(SN + "   Check ACAS Key Tool fail");
+                        MessageBox.Show(LResource.WriteACASKeyError);
+                        goto end;
+                    }
+                }
+                else
+                {
+                    SetfailStatus(m_writeACASKey);
+                    Log.WriteErrorLog(SN + "   Write ACAS Key Tool fail");
+                    MessageBox.Show(LResource.WriteACASKeyError);
+                    goto end;
+                }
+
+                byte[] ACASKeyData = SerialInit.HexToByte(keyInfo.ACASKey_Data);
+                if (SerialCMD.SetACASKeyData(TVPort, ACASKeyData, out result, out data, out error, SerailDelay))
                 {
                     SetsuccessStatus(m_writeACASKey);
-                    keycontent += "ACACKeyMd5=" + keyInfo.ACASKeyMd5 + "&";
-                    Log.WriteInfoLog("Check ACAS Key...");
-                    if (writeCheckNow.ACASKeyCheckcheck ? SerialCMD.CheckACASKey(TVPort, out result, out data, out error, SerailDelay) : true)
+                    keycontent += "acas_data=" + keyInfo.ACASKey_Data + "&";
+                    Log.WriteInfoLog("Check ACAS Key Data...");
+                    if (writeCheckNow.ACASKeyCheckcheck ? SerialCMD.CheckACASKeyData(TVPort, out result, out data, out error, SerailDelay) : true)
                     {
                         SetsuccessStatus(m_checkACASKey);
-                        Log.WriteInfoLog("Read ACAS Key...");
-                        if (readCheckNow.ACASIDReadcheck ? SerialCMD.ReadACASKey(TVPort, out result, out data, out error, SerailDelay) : true)
+                        Log.WriteInfoLog("Read ACAS Key Data...");
+                        if (readCheckNow.ACASIDReadcheck ? SerialCMD.ReadACASKeyData(TVPort, out result, out data, out error, SerailDelay) : true)
                         {
                             if (readCheckNow.ACASIDReadcheck)
                             {
@@ -3834,7 +3893,7 @@ namespace MOKA_Factory_Tools
                                 else
                                 {
                                     SetfailStatus(m_readACASKey);
-                                    Log.WriteErrorLog(SN + "   contrast ACAS Key fail");
+                                    Log.WriteErrorLog(SN + "   contrast ACAS Key Data fail");
                                     MessageBox.Show(LResource.ContrastACASKeyError);
                                     goto end;
                                 }
@@ -3851,7 +3910,7 @@ namespace MOKA_Factory_Tools
                     else
                     {
                         SetfailStatus(m_checkACASKey);
-                        Log.WriteErrorLog(SN + "   Check ACAS Key fail");
+                        Log.WriteErrorLog(SN + "   Check ACAS Key Data fail");
                         MessageBox.Show(LResource.WriteACASKeyError);
                         goto end;
                     }
@@ -3859,7 +3918,7 @@ namespace MOKA_Factory_Tools
                 else
                 {
                     SetfailStatus(m_writeACASKey);
-                    Log.WriteErrorLog(SN + "   Write ACAS Key fail");
+                    Log.WriteErrorLog(SN + "   Write ACAS Key Data fail");
                     MessageBox.Show(LResource.WriteACASKeyError);
                     goto end;
                 }