FirmwareBundleUploadProcedure.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using AwInitilizer.Model;
  7. using AwInitilizer.Assist;
  8. using System.Collections.Specialized;
  9. using System.Globalization;
  10. using System.Net;
  11. using System.Web;
  12. using System.IO;
  13. namespace AwInitilizer.Procedure
  14. {
  15. public class FirmwareBundleUploadProcedure : ProcedureBase
  16. {
  17. public FirmwareBundleUploadProcedure() : base()
  18. {
  19. Name = string.Format("Firmware Upload");
  20. Content = string.Format("Upload all Firemware");
  21. }
  22. internal override async Task<bool> Run()
  23. {
  24. //wait restart
  25. Logger.Print("Waiting restart..");
  26. bool response = false;
  27. int pollingCnt = 0;
  28. for (pollingCnt = 0; pollingCnt < 56; pollingCnt++)
  29. {
  30. await Task.Delay(TimeSpan.FromSeconds(15));
  31. response = await ChekCsuBootCompelete();
  32. if (response)
  33. break;
  34. }
  35. ReportLog.Add(string.Format("EVSE connet elapsed minute(s) : {0}, Expect:<14", pollingCnt * 0.25));
  36. //timeout
  37. if (pollingCnt >= 56)
  38. {
  39. Logger.Print("Wait restart timeout", isError: true);
  40. InfoLog += "Wait restart timeout\n";
  41. LogPair.Add($"UploadStartWait", "0");
  42. return false;
  43. }
  44. LogPair.Add($"UploadStartWait", "1");
  45. //upload firmware
  46. var updateList = UpdateData.FirmwareUpdateModels;
  47. //open all file stream
  48. //List<FileStream> firmwareFileStream = new List<FileStream>();
  49. List<UploadFile> UploadFileList = new List<UploadFile>();
  50. try
  51. {
  52. for(int modelIndex = 0;modelIndex < updateList.Count;modelIndex++) //foreach (var model in updateList)
  53. {
  54. var model = updateList[modelIndex];
  55. var stream = File.Open(model.FirmwareFileName, FileMode.Open);
  56. var uploadFile = new UploadFile()
  57. {
  58. Name = string.Format("files[]", modelIndex + 1),
  59. Filename = Path.GetFileName(model.FirmwareFileName),
  60. Stream = stream
  61. };
  62. UploadFileList.Add(uploadFile);
  63. }
  64. }
  65. catch (Exception e)
  66. {
  67. InfoLog += $"create file stream failed";
  68. LogPair.Add($"FirmwareUpload", "0");
  69. return false;
  70. }
  71. //upload
  72. try
  73. {
  74. var uploadResult = await UploadFiles(
  75. $"https://{ServerIpAddress}/upgrade_iso_action.php",
  76. files: UploadFileList,
  77. new NameValueCollection() {
  78. {"fw_tag","iso" }
  79. }
  80. );
  81. var responseStr = Encoding.ASCII.GetString(uploadResult).ToLower();
  82. InfoLog += $"get firmware update response {responseStr}\n";
  83. if (responseStr.Contains("file is uploaded"))
  84. return true;
  85. return false;
  86. }
  87. catch
  88. {
  89. InfoLog += $"file upload failed";
  90. LogPair.Add($"FirmwareUpload", "0");
  91. }
  92. LogPair.Add($"FirmwareUpload", "1");
  93. //release all
  94. foreach (var uploadFile in UploadFileList)
  95. {
  96. if(uploadFile!=null && uploadFile.Stream!=null)
  97. {
  98. uploadFile.Stream.Close();
  99. }
  100. }
  101. return true;
  102. }
  103. public async Task<byte[]> UploadFiles(string address, IEnumerable<UploadFile> files, NameValueCollection values)
  104. {
  105. var request = (HttpWebRequest)HttpWebRequest.Create(address);
  106. //request.Timeout = 10 * 1000;
  107. request.KeepAlive = true;
  108. request.Accept = "*/*";
  109. request.Method = "POST";
  110. request.Referer = address;
  111. request.Expect = "";
  112. var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
  113. request.ContentType = "multipart/form-data; boundary=" + boundary;
  114. boundary = "--" + boundary;
  115. string sendString = "";
  116. using (var requestStream = request.GetRequestStream())
  117. {
  118. // Write the values
  119. foreach (string name in values.Keys)
  120. {
  121. var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  122. requestStream.Write(buffer, 0, buffer.Length);
  123. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
  124. requestStream.Write(buffer, 0, buffer.Length);
  125. buffer = Encoding.ASCII.GetBytes(values[name] + Environment.NewLine);
  126. requestStream.Write(buffer, 0, buffer.Length);
  127. }
  128. // Write the files
  129. foreach (var file in files)
  130. {
  131. var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  132. requestStream.Write(buffer, 0, buffer.Length);
  133. buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine));
  134. requestStream.Write(buffer, 0, buffer.Length);
  135. var ctype = MimeMapping.GetMimeMapping(file.Filename);
  136. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", MimeMapping.GetMimeMapping(file.Filename), Environment.NewLine));
  137. requestStream.Write(buffer, 0, buffer.Length);
  138. file.Stream.CopyTo(requestStream);
  139. buffer = Encoding.ASCII.GetBytes(Environment.NewLine);
  140. requestStream.Write(buffer, 0, buffer.Length);
  141. }
  142. var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--");
  143. requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
  144. }
  145. using (var response = await request.GetResponseAsync())
  146. using (var responseStream = response.GetResponseStream())
  147. using (var stream = new MemoryStream())
  148. {
  149. responseStream.CopyTo(stream);
  150. return stream.ToArray();
  151. }
  152. }
  153. }
  154. }