XiaomiMqttClient_UploadFile.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. using Newtonsoft.Json;
  2. using System.Runtime.InteropServices;
  3. namespace MainForm.ClassFile.XiaomiAPI
  4. {
  5. /// <summary>
  6. /// 小米 MqttClient类 - API拓展方法
  7. /// ⾮结构化(图⽚/⾳频/视频/⽂本/压缩包)
  8. /// </summary>
  9. public partial class XiaomiMqttClient_Extend : XiaomiMqttClient
  10. {
  11. /// <summary>
  12. /// ⾮结构化- 事件Id
  13. /// </summary>
  14. private static string UploadFileId { get; set; } = "x5/file/upload/mqtt";
  15. /// <summary>
  16. /// ⾮结构化- 事件方法
  17. /// </summary>
  18. /// <param name="msg">事件数据;Json</param>
  19. /// <param name="dataId">自定义事件Id;如:guid</param>
  20. /// <returns></returns>
  21. public static UploadFileResponse Write_UploadFile(UploadFileRequest request, string dataId = "")
  22. {
  23. UploadFileResponse response = new UploadFileResponse();
  24. int result = 0;
  25. string msg = JsonConvert.SerializeObject(request);
  26. byte[] bytes = ToUTF8(msg);
  27. // 发送
  28. if (string.IsNullOrEmpty(dataId))
  29. result = Write(UploadFileId, bytes);
  30. else
  31. result = WriteWithDataId(UploadFileId, bytes, dataId);
  32. response.code = result;
  33. // ZS 未完
  34. return response;
  35. }
  36. #region 入参
  37. /// <summary>
  38. /// ⾮结构化- 参数2
  39. /// 注意事项:
  40. /// • 图⽚命名需要遵循⼩⽶标准,按照固定栏位排布,不同栏位存放的信息类别不同,不同栏位间使⽤
  41. /// 下划线‘_’进⾏分隔。若某个栏位没有值则使⽤占位符‘-’代替。同⼀个栏位内的多个字段间使⽤‘-’间隔。如下:
  42. /// [项⽬]_[⼯站]_[SN]_[物料 - 功能]_[测试时间]_[定位/检测/测量结果]_[是否原图-当前第⼏张-共⼏张]
  43. /// </summary>
  44. public class UploadFileRequest
  45. {
  46. /// <summary>
  47. /// ⽂件所属包
  48. /// ${file_category}/${file_type}/${项⽬号}/${⽣产阶段}/${运⾏模式}/${过站结果}/${装备编码}/${ sn}/${ pass_station_id}
  49. /// • 其中file_category的枚举值为:
  50. /// ◦ IMAGE
  51. /// ◦ TEXT
  52. /// • 若对应字段的值为空,则使⽤默认值UNKNOWN
  53. /// 注意:⾸位不能出现/,否则会出现路径错误问题。如:
  54. /// 正确⽰例IMAGE/IMAGE/N3/debug/online/PASS/MPA-0001/P320N000006B/382f55e9-c2bb
  55. /// 错误⽰例:/IMAGE/IMAGE/N3/debug/online/PASS/MPA-0001/P320N000006B/382f55e9-c2bb
  56. /// 对⽐之前的要求,改动点如下:
  57. /// • 在原有路径的基础上增加前缀:
  58. /// ◦ 图⽚对应的是:IMAGE/IMAGE/${项⽬}/${⽣产阶段}/${ 运⾏模式}
  59. /// ◦ ⽂本对应的是:TEXT/${file_type}/${ 项⽬}/${⽣产阶段}/${ 运⾏模式}
  60. /// • 在最后⼀个路径层级前,插⼊过站ID:pass_station_id
  61. /// </summary>
  62. public string bucket { get; set; } = string.Empty;
  63. /// <summary>
  64. /// ⽂件名
  65. /// 故障事件名称,同数据字典中的事件名称。
  66. /// </summary>
  67. public string name { get; set; } = string.Empty;
  68. /// <summary>
  69. /// ⽂件内容
  70. /// MultipartFile
  71. /// </summary>
  72. public string file { get; set; } = string.Empty;
  73. /// <summary>
  74. /// ⽂件唯⼀标识
  75. /// 随机⼀串uuid发给我们
  76. /// </summary>
  77. public string uuid { get; set; } = string.Empty;
  78. /// <summary>
  79. /// md5;传空
  80. /// </summary>
  81. public string md5 { get; set; } = string.Empty;
  82. /// <summary>
  83. /// 是否上云
  84. /// 是否上传云端,默认传true
  85. /// </summary>
  86. public bool uploadCloud { get; set; }
  87. /// <summary>
  88. /// 是否通知mqtt
  89. /// 默认传true
  90. /// </summary>
  91. public bool informMqtt { get; set; }
  92. /// <summary>
  93. /// 发送通知时的负载
  94. /// 必填
  95. /// </summary>
  96. public MqttPayload mqttPayload { get; set; } = new MqttPayload();
  97. }
  98. /// <summary>
  99. /// ⾮结构化- 参数 - mqttPayload透传的元数据
  100. /// 注意事项:
  101. /// • 图⽚命名需要遵循⼩⽶标准,按照固定栏位排布,不同栏位存放的信息类别不同,不同栏位间使⽤
  102. /// 下划线‘_’进⾏分隔。若某个栏位没有值则使⽤占位符‘-’代替。同⼀个栏位内的多个字段间使⽤‘-’间隔。如下:
  103. /// [项⽬]_[⼯站]_[SN]_[物料 - 功能]_[测试时间]_[定位/检测/测量结果]_[是否原图-当前第⼏张-共⼏张]
  104. /// </summary>
  105. public class MqttPayload
  106. {
  107. /// <summary>
  108. /// ⼯⼚Id
  109. /// 对应⼯⼚Id,同过站结果中⼯⼚Id
  110. /// </summary>
  111. public string factory { get; set; } = string.Empty;
  112. /// <summary>
  113. /// 项⽬号
  114. /// 对应当前⽣产的项⽬号,从加载的⼯程名称中获得(需确认加载⼯程项⽬是否第⼀栏为项⽬号信息)。
  115. /// 如M3-MB,取-前⾯ 第⼀个栏⽬的值,即M3。如获取不到或者为空,取默认值UNKNOWN
  116. /// </summary>
  117. public string project_name { get; set; } = string.Empty;
  118. /// <summary>
  119. /// ⽣产阶段
  120. /// 对应⽣产阶段,同配置参数中productMode
  121. /// </summary>
  122. public string product_mode { get; set; } = string.Empty;
  123. /// <summary>
  124. /// 线体
  125. /// 对应线体编码,同过站结果中线体编码
  126. /// </summary>
  127. public string line_no { get; set; } = string.Empty;
  128. /// <summary>
  129. /// ⼯站
  130. /// 传空,同过站结果⼯站字段。
  131. /// </summary>
  132. public string work_station_no { get; set; } = string.Empty;
  133. /// <summary>
  134. /// 装备
  135. /// 同device_code,即装备编码(同过站结果)
  136. /// </summary>
  137. public string equipment_no { get; set; } = string.Empty;
  138. /// <summary>
  139. /// ⼯位
  140. /// 对应⼯位Id,同MES中的stationId
  141. /// </summary>
  142. public string station_no { get; set; } = string.Empty;
  143. /// <summary>
  144. /// ⽂件ID
  145. /// 同上⾯uuid
  146. /// </summary>
  147. public string file_id { get; set; } = string.Empty;
  148. /// <summary>
  149. /// ⽂件名
  150. /// ⽂件名称
  151. /// </summary>
  152. public string file_name { get; set; } = string.Empty;
  153. /// <summary>
  154. /// 产品SN
  155. /// 产品码
  156. /// </summary>
  157. public string sn { get; set; } = string.Empty;
  158. /// <summary>
  159. /// ⽂件的⽣成时间
  160. /// </summary>
  161. public string opt_time { get; set; } = string.Empty;
  162. /// <summary>
  163. /// ⽂件类型
  164. /// 根据⽂件的不同⽽存在差异,需要沟通获取;
  165. /// • 图⽚:IMAGE
  166. /// • SPI过站明细:SPI_pass_station_item_data_txt
  167. /// • AOI过站明细:AOI_pass_station_item_data_txt
  168. /// • 贴⽚机过站明细:PCBM_pass_station_item_data_DAT
  169. /// • 钢⽹检查机过站明细:SMTM_pass_station_item_data_xlsx
  170. /// </summary>
  171. public string file_type { get; set; } = string.Empty;
  172. /// <summary>
  173. /// ⽂件类别
  174. /// • 图⽚:IMAGE
  175. /// • ⽂本:TEXT
  176. /// </summary>
  177. public string file_category { get; set; } = string.Empty;
  178. /// <summary>
  179. /// ⾃定义标签信息
  180. /// 业务⽅⾃定义的标签信息,没有可以不传。多个标签,可以⽤下划线间隔:xx_xx_xxx。AOI装备需要上传此字段,⽤于区分整版图和元器件的图⽚。
  181. /// 枚举值:
  182. /// • whole
  183. /// • part
  184. /// </summary>
  185. public string tag { get; set; } = string.Empty;
  186. /// <summary>
  187. /// 关联业务信息 - 过站结果id
  188. /// 该⾮结构化数据所关联的结构化数据的信息。需要做好转义处理。这⾥传递过站结果id(同MES那边的uuidInspection字段的值),
  189. /// 格式为:[{\"pass_station_id\":\"XXXXX\"}]。
  190. /// 如:"reference_info":"[{\"pass_station_id\":\"d092c4db-0d93-49c3-96b9-40caf8d7c812\"}]"
  191. /// </summary>
  192. public string reference_info { get; set; } = string.Empty;
  193. }
  194. #endregion 入参
  195. #region 出参
  196. /// <summary>
  197. /// ⾮结构化 - 返回值
  198. /// </summary>
  199. public class UploadFileResponse
  200. {
  201. /// <summary>
  202. /// 响应状态码
  203. /// 200:成功
  204. /// 400:参数错误
  205. /// 500:服务器内部错误
  206. /// </summary>
  207. public int code { get; set; }
  208. /// <summary>
  209. /// 响应信息
  210. /// 对当前响应结果做具体描述
  211. /// </summary>
  212. public string msg { get; set; } = string.Empty;
  213. /// <summary>
  214. /// 响应数据
  215. /// 上传结果,包含⽂件链接
  216. /// </summary>
  217. public UploadResult data { get; set; } = new UploadResult();
  218. }
  219. /// <summary>
  220. /// ⾮结构化 - 返回值 - 上传结果
  221. /// </summary>
  222. public class UploadResult
  223. {
  224. /// <summary>
  225. /// 获取⽂件的唯⼀标识符
  226. /// </summary>
  227. public string uuid { get; set; } = string.Empty;
  228. }
  229. #endregion 出参
  230. }
  231. }