SerialCMD.cs 118 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO.Ports;
  6. using CrcTest;
  7. using System.Collections;
  8. using System.Threading;
  9. using SXLibrary;
  10. using System.Diagnostics;
  11. using System.Web.UI.WebControls;
  12. using System.ComponentModel;
  13. using CCWin.Win32.Com;
  14. namespace MOKA_Factory_Tools
  15. {
  16. class SerialCMD
  17. {
  18. #region 串口重试机制;
  19. public static bool EnableRetry { get; set; } = false;
  20. public static int RetryCount { get; set; } = 3;
  21. #endregion
  22. /// <summary>
  23. /// 串口指令读超时值,单位毫秒;
  24. /// 默认:3000ms
  25. /// </summary>
  26. public static int ReadTimeout { get; set; } = 3000;
  27. /// <summary>
  28. /// 串口完成一次指令的Write、Read后,下一条指令等待多久开始执行(即执行完当前指令后,等待多久函数才返回);
  29. /// 单位:毫秒,默认200毫秒
  30. /// </summary>
  31. public static int NextCommandWaitTime { get; set; } = 100;
  32. public static int SerialTimeout { get; set; }
  33. static byte[] ACKhead = new byte[5] { 0xAB, 0x05, 0x0A, 0xDF, 0x4E };//命令可执行数据返回
  34. static byte[] ACKhead2 = new byte[5] { 0xAB, 0x05, 0x0E, 0x9F, 0xCA };//命令错误或无法识别数据返回
  35. static byte[] ACKhead3 = new byte[5] { 0xAB, 0x05, 0x0F, 0x8F, 0xEB };//CRC16校验错误返回
  36. /// <summary>
  37. /// 进工厂
  38. /// </summary>
  39. /// <param name="Comport"></param>
  40. /// <param name="result"></param>
  41. /// <param name="error"></param>
  42. /// <returns></returns>
  43. public static bool EnterFactory(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  44. {
  45. return Sendcmd(Comport, new byte[] { 0xAA }, new byte[] { 0x10 }, new byte[] { 0x01 },false,false, out result, out data,out error, waitTime);
  46. }
  47. /// <summary>
  48. /// 退工厂
  49. /// </summary>
  50. /// <param name="Comport"></param>
  51. /// <param name="result"></param>
  52. /// <param name="data"></param>
  53. /// <param name="error"></param>
  54. /// <returns></returns>
  55. public static bool LeaveFactory(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  56. {
  57. return Sendcmd(Comport, new byte[] { 0xAA }, new byte[] { 0x10 }, new byte[] { 0x00 }, false, false, out result, out data,out error, waitTime);
  58. }
  59. /// <summary>
  60. /// 白平衡初始化
  61. /// </summary>
  62. /// <param name="Comport"></param>
  63. /// <param name="result"></param>
  64. /// <param name="data"></param>
  65. /// <param name="error"></param>
  66. /// <returns></returns>
  67. public static bool WBInit(SerialPort Comport, out byte[] result, out byte[]data,out string error,int waitTime)
  68. {
  69. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x16 }, new byte[] { 0x02 }, false, false, out result,out data, out error, waitTime);
  70. }
  71. //get keys
  72. /// <summary>
  73. /// 查询PID
  74. /// </summary>
  75. /// <param name="Comport"></param>
  76. /// <param name="result"></param>
  77. /// <param name="data"></param>
  78. /// <param name="error"></param>
  79. /// <returns></returns>
  80. public static bool GetProjectID(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime, bool WriteEDID=false)
  81. {
  82. if (!WriteEDID) Thread.Sleep(3000);
  83. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x84 }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime);
  84. }
  85. /// <summary>
  86. /// 获取软件版本
  87. /// </summary>
  88. /// <param name="Comport"></param>
  89. /// <param name="result"></param>
  90. /// <param name="data"></param>
  91. /// <param name="error"></param>
  92. /// <returns></returns>
  93. public static bool GetSoftVersion(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  94. {
  95. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x57 }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime);
  96. }
  97. /// <summary>
  98. /// 获取Device ID
  99. /// </summary>
  100. /// <param name="Comport"></param>
  101. /// <param name="result"></param>
  102. /// <param name="data"></param>
  103. /// <param name="error"></param>
  104. /// <returns></returns>
  105. public static bool GetDeviceId(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  106. {
  107. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x01 }, true, false, out result, out data, out error, waitTime))
  108. {
  109. if (data[0] == 0x01)
  110. {
  111. data=data.Skip(1).Take(data.Length - 1).ToArray();
  112. return true;
  113. }
  114. else
  115. {
  116. error = "返回did类型错误,应为01";
  117. return false;
  118. }
  119. }
  120. else
  121. return false;
  122. }
  123. /// <summary>
  124. /// 获取Client Type
  125. /// </summary>
  126. /// <param name="Comport"></param>
  127. /// <param name="result"></param>
  128. /// <param name="data"></param>
  129. /// <param name="error"></param>
  130. /// <returns></returns>
  131. public static bool GetClientType(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  132. {
  133. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x8C }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime);
  134. }
  135. /// <summary>
  136. /// 获取Mac
  137. /// </summary>
  138. /// <param name="Comport"></param>
  139. /// <param name="result"></param>
  140. /// <param name="data"></param>
  141. /// <param name="error"></param>
  142. /// <returns></returns>
  143. public static bool GetMAC(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  144. {
  145. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  146. {
  147. if (data[0] == 0x00)
  148. {
  149. data = data.Skip(1).Take(data.Length - 1).ToArray();
  150. return true;
  151. }
  152. else
  153. {
  154. error = "返回MAC类型错误,应为00";
  155. return false;
  156. }
  157. }
  158. else
  159. return false;
  160. }
  161. /// <summary>
  162. /// 获取HDCP
  163. /// </summary>
  164. /// <param name="Comport"></param>
  165. /// <param name="result"></param>
  166. /// <param name="data"></param>
  167. /// <param name="error"></param>
  168. /// <returns></returns>
  169. public static bool GetHDCPKey(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  170. {
  171. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEE }, new byte[] { 0x00 }, true, true, out result, out data, out error, waitTime);
  172. }
  173. /// <summary>
  174. /// 获取HDCP2.2
  175. /// </summary>
  176. /// <param name="Comport"></param>
  177. /// <param name="result"></param>
  178. /// <param name="data"></param>
  179. /// <param name="error"></param>
  180. /// <returns></returns>
  181. public static bool GetHDCPKey22(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  182. {
  183. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xE7 }, new byte[] { 0x00 }, true, true, out result, out data, out error,waitTime);
  184. }
  185. /// <summary>
  186. /// 获取WiDi
  187. /// </summary>
  188. /// <param name="Comport"></param>
  189. /// <param name="result"></param>
  190. /// <param name="data"></param>
  191. /// <param name="error"></param>
  192. /// <returns></returns>
  193. public static bool GetWidi(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  194. {
  195. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xE7 }, new byte[] { 0x00 }, true, true, out result, out data, out error, waitTime);
  196. }
  197. /// <summary>
  198. /// 获取ESN
  199. /// </summary>
  200. /// <param name="Comport"></param>
  201. /// <param name="result"></param>
  202. /// <param name="data"></param>
  203. /// <param name="error"></param>
  204. /// <returns></returns>
  205. public static bool GetNetflixESN(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime, bool FEFlag=false)
  206. {
  207. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x06 }, true, FEFlag, out result, out data, out error, waitTime))
  208. {
  209. if (data[0] == 0x06)
  210. {
  211. data = data.Skip(1).Take(data.Length - 1).ToArray();
  212. return true;
  213. }
  214. else
  215. {
  216. error = "返回NetflixESN类型错误,应为06";
  217. return false;
  218. }
  219. }
  220. else
  221. return false;
  222. }
  223. /// <summary>
  224. /// 获取Widevine
  225. /// </summary>
  226. /// <param name="Comport"></param>
  227. /// <param name="result"></param>
  228. /// <param name="data"></param>
  229. /// <param name="error"></param>
  230. /// <returns></returns>
  231. public static bool GetWidevine(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  232. {
  233. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEC }, new byte[] { 0x00 }, true, true, out result, out data, out error, waitTime))
  234. {
  235. if (data[0] == 0x00)
  236. {
  237. data = data.Skip(1).Take(data.Length - 1).ToArray();
  238. return true;
  239. }
  240. else
  241. {
  242. error = "返回Widevine类型错误,应为00";
  243. return false;
  244. }
  245. }
  246. else
  247. return false;
  248. }
  249. /// <summary>
  250. /// 获取Ci
  251. /// </summary>
  252. /// <param name="Comport"></param>
  253. /// <param name="result"></param>
  254. /// <param name="data"></param>
  255. /// <param name="error"></param>
  256. /// <returns></returns>
  257. public static bool GetCiKey(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  258. {
  259. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEC }, new byte[] { 0x01 }, true, true, out result, out data, out error, waitTime))
  260. {
  261. if (data[0] == 0x01)
  262. {
  263. data = data.Skip(1).Take(data.Length - 1).ToArray();
  264. return true;
  265. }
  266. else
  267. {
  268. error = "返回CiKey类型错误,应为01";
  269. return false;
  270. }
  271. }
  272. else
  273. return false;
  274. }
  275. /// <summary>
  276. /// 获取ECP
  277. /// </summary>
  278. /// <param name="Comport"></param>
  279. /// <param name="result"></param>
  280. /// <param name="data"></param>
  281. /// <param name="error"></param>
  282. /// <returns></returns>
  283. public static bool GetECP(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  284. {
  285. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEC }, new byte[] { 0x0C }, true, true, out result, out data, out error, waitTime))
  286. {
  287. if (data[0] == 0x0C)
  288. {
  289. data = data.Skip(1).Take(data.Length - 1).ToArray();
  290. return true;
  291. }
  292. else
  293. {
  294. error = "返回ECP类型错误,应为01";
  295. return false;
  296. }
  297. }
  298. else
  299. return false;
  300. }
  301. /// <summary>
  302. /// 获取MGK
  303. /// </summary>
  304. /// <param name="Comport"></param>
  305. /// <param name="result"></param>
  306. /// <param name="data"></param>
  307. /// <param name="error"></param>
  308. /// <returns></returns>
  309. public static bool GetMGKKey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  310. {
  311. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x06 }, true, true, out result, out data, out error, waitTime))
  312. {
  313. if (data[0] == 0x06)
  314. {
  315. data = data.Skip(1).Take(data.Length - 1).ToArray();
  316. return true;
  317. }
  318. else
  319. {
  320. error = "返回MGKKey类型错误,应为06";
  321. return false;
  322. }
  323. }
  324. else
  325. return false;
  326. }
  327. /// <summary>
  328. /// 获取OSD语言
  329. /// </summary>
  330. /// <param name="Comport"></param>
  331. /// <param name="result"></param>
  332. /// <param name="data"></param>
  333. /// <param name="error"></param>
  334. /// <returns></returns>
  335. public static bool GetOSDLanguage(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  336. {
  337. if(SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x97 }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  338. {
  339. if (data[0] == 0x00)
  340. {
  341. data = data.Skip(1).Take(data.Length - 1).ToArray();
  342. return true;
  343. }
  344. else
  345. {
  346. error = "返回OSD language类型错误,应为00";
  347. return false;
  348. }
  349. }
  350. else
  351. return false;
  352. }
  353. /// <summary>
  354. /// 获取出货语言
  355. /// </summary>
  356. /// <param name="Comport"></param>
  357. /// <param name="result"></param>
  358. /// <param name="data"></param>
  359. /// <param name="error"></param>
  360. /// <returns></returns>
  361. public static bool GetShopLanguage(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  362. {
  363. if(SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x97 }, new byte[] { 0x01 }, true, false, out result, out data, out error, waitTime))
  364. {
  365. {
  366. if (data[0] == 0x01)
  367. {
  368. data = data.Skip(1).Take(data.Length - 1).ToArray();
  369. return true;
  370. }
  371. else
  372. {
  373. error = "返回SHOP language类型错误,应为01";
  374. return false;
  375. }
  376. }
  377. }
  378. else
  379. return false;
  380. }
  381. /// <summary>
  382. /// 获取当前信源
  383. /// </summary>
  384. /// <param name="Comport"></param>
  385. /// <param name="result"></param>
  386. /// <param name="data"></param>
  387. /// <param name="error"></param>
  388. /// <returns></returns>
  389. public static bool GetChannel(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  390. {
  391. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x97 }, new byte[] { 0x13 }, true, false, out result, out data, out error, waitTime);
  392. }
  393. //Set keys
  394. /// <summary>
  395. /// 写入Pid
  396. /// </summary>
  397. /// <param name="Comport"></param>
  398. /// <param name="param"></param>
  399. /// <param name="result"></param>
  400. /// <param name="data"></param>
  401. /// <param name="error"></param>
  402. /// <returns></returns>
  403. public static bool SetProjectId(SerialPort Comport, byte[] param,out byte[] result, out byte[] data, out string error,int waitTime)
  404. {
  405. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x70 }, param, false, false, out result, out data, out error, waitTime);
  406. }
  407. /// <summary>
  408. /// 写入Device ID
  409. /// </summary>
  410. /// <param name="Comport"></param>
  411. /// <param name="param"></param>
  412. /// <param name="result"></param>
  413. /// <param name="data"></param>
  414. /// <param name="error"></param>
  415. /// <returns></returns>
  416. public static bool SetDeviceID(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  417. {
  418. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xB2 }, param, false, false, out result, out data, out error, waitTime);
  419. }
  420. /// <summary>
  421. /// 写入Mac
  422. /// </summary>
  423. /// <param name="Comport"></param>
  424. /// <param name="param"></param>
  425. /// <param name="result"></param>
  426. /// <param name="data"></param>
  427. /// <param name="error"></param>
  428. /// <returns></returns>
  429. public static bool SetMAC(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  430. {
  431. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xB3 }, param, false, false, out result, out data, out error, waitTime);
  432. }
  433. /// <summary>
  434. /// 写入HDCP
  435. /// </summary>
  436. /// <param name="Comport"></param>
  437. /// <param name="param"></param>
  438. /// <param name="result"></param>
  439. /// <param name="data"></param>
  440. /// <param name="error"></param>
  441. /// <returns></returns>
  442. public static bool SetHDCPKey(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  443. {
  444. return SendcmdEx(Comport, new byte[] { 0xAA,0xFE }, new byte[] { 0x86 }, param, false, false, out result, out data, out error, waitTime);
  445. }
  446. /// <summary>
  447. /// 写入HDCP22
  448. /// </summary>
  449. /// <param name="Comport"></param>
  450. /// <param name="param"></param>
  451. /// <param name="result"></param>
  452. /// <param name="data"></param>
  453. /// <param name="error"></param>
  454. /// <returns></returns>
  455. public static bool SetHDCPKey22(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  456. {
  457. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xE4 }, param, false, false, out result, out data, out error, waitTime);
  458. }
  459. /// <summary>
  460. /// 写入ESN
  461. /// </summary>
  462. /// <param name="Comport"></param>
  463. /// <param name="param"></param>
  464. /// <param name="result"></param>
  465. /// <param name="data"></param>
  466. /// <param name="error"></param>
  467. /// <returns></returns>
  468. public static bool SetNetflixESN(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  469. {
  470. return SendcmdEx(Comport, param.Length > 255 ? new byte[] { 0xAA,0xFE } : new byte[] { 0xAA }, new byte[] { 0x99,0x00 }, param, false, false, out result, out data, out error, waitTime);
  471. }
  472. /// <summary>
  473. /// 写入Widi
  474. /// </summary>
  475. /// <param name="Comport"></param>
  476. /// <param name="param"></param>
  477. ///
  478. ///
  479. /// <param name="result"></param>
  480. /// <param name="data"></param>
  481. /// <param name="error"></param>
  482. /// <returns></returns>
  483. public static bool SetWidi(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  484. {
  485. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xE4 }, param, false, false, out result, out data, out error, waitTime);
  486. }
  487. /// <summary>
  488. /// 写入Widevine
  489. /// </summary>
  490. /// <param name="Comport"></param>
  491. /// <param name="param"></param>
  492. /// <param name="result"></param>
  493. /// <param name="data"></param>
  494. /// <param name="error"></param>
  495. /// <returns></returns>
  496. public static bool SetWidevine(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  497. {
  498. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xE9,0x00 }, param, false, false, out result, out data, out error, waitTime);
  499. }
  500. /// <summary>
  501. /// 写入Ci
  502. /// </summary>
  503. /// <param name="Comport"></param>
  504. /// <param name="param"></param>
  505. /// <param name="result"></param>
  506. /// <param name="data"></param>
  507. /// <param name="error"></param>
  508. /// <returns></returns>
  509. public static bool SetCiKey(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  510. {
  511. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xE9, 0x01 }, param, false, false, out result, out data, out error, waitTime);
  512. }
  513. /// <summary>
  514. /// 写入ECP
  515. /// </summary>
  516. /// <param name="Comport"></param>
  517. /// <param name="param"></param>
  518. /// <param name="result"></param>
  519. /// <param name="data"></param>
  520. /// <param name="error"></param>
  521. /// <returns></returns>
  522. public static bool SetECP(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  523. {
  524. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xE9, 0x0C }, param, false, false, out result, out data, out error, waitTime);
  525. }
  526. /// <summary>
  527. /// 写入MGK
  528. /// </summary>
  529. /// <param name="Comport"></param>
  530. /// <param name="param"></param>
  531. /// <param name="result"></param>
  532. /// <param name="data"></param>
  533. /// <param name="error"></param>
  534. /// <returns></returns>
  535. public static bool SetMGKKey(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  536. {
  537. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0x99, 0x00 }, param, false, false, out result, out data, out error, waitTime);
  538. }
  539. //check keys
  540. /// <summary>
  541. /// 校验Mac
  542. /// </summary>
  543. /// <param name="Comport"></param>
  544. /// <param name="result"></param>
  545. /// <param name="data"></param>
  546. /// <param name="error"></param>
  547. /// <returns></returns>
  548. public static bool CheckMAC(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  549. {
  550. if(SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xB4 }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  551. {
  552. if (data.Length == 1 && (data[0] == 0x01 || data[0] == 0x03 || data[0] == 0x05 || data[0] == 0x07))
  553. {
  554. /*
  555. 0x00:All data hadn't beeninstalled
  556. 0x01:MAC address successful
  557. 0x02:Device ID successful
  558. 0x03:Mac and device ID had been installed
  559. 0x04:User ID successful
  560. 0x05:Mac and user ID had been installed
  561. 0x06:User ID and device ID had been installed
  562. 0x07:All data had been installed
  563. */
  564. return true;
  565. }
  566. else
  567. {
  568. error = "Mac haven't been installed";
  569. return false;
  570. }
  571. }
  572. else
  573. return false;
  574. }
  575. /// <summary>
  576. /// 校验Device ID
  577. /// </summary>
  578. /// <param name="Comport"></param>
  579. /// <param name="result"></param>
  580. /// <param name="data"></param>
  581. /// <param name="error"></param>
  582. /// <returns></returns>
  583. public static bool CheckDeviceId(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  584. {
  585. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xB4 }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  586. {
  587. if (data.Length == 1 && (data[0] == 0x02 || data[0] == 0x03 || data[0] == 0x06 || data[0] == 0x07))
  588. {
  589. /*
  590. 0x00:All data hadn't beeninstalled
  591. 0x01:MAC address successful
  592. 0x02:Device ID successful
  593. 0x03:Mac and device ID had been installed
  594. 0x04:User ID successful
  595. 0x05:Mac and user ID had been installed
  596. 0x06:User ID and device ID had been installed
  597. 0x07:All data had been installed
  598. */
  599. return true;
  600. }
  601. else
  602. {
  603. error = "Diveice ID haven't been installed";
  604. return false;
  605. }
  606. }
  607. else
  608. return false;
  609. }
  610. /// <summary>
  611. /// 校验HDCP
  612. /// </summary>
  613. /// <param name="Comport"></param>
  614. /// <param name="result"></param>
  615. /// <param name="data"></param>
  616. /// <param name="error"></param>
  617. /// <returns></returns>
  618. public static bool CheckHDCP(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  619. {
  620. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x87 }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  621. {
  622. if (data.Length == 1 && data[0] == 0x01)
  623. return true;
  624. else
  625. {
  626. error = "HDCP KEY check fail,return status shoule be 0x01";
  627. return false;
  628. }
  629. }
  630. else
  631. return false;
  632. }
  633. /// <summary>
  634. /// 校验ESN
  635. /// </summary>
  636. /// <param name="Comport"></param>
  637. /// <param name="result"></param>
  638. /// <param name="data"></param>
  639. /// <param name="error"></param>
  640. /// <returns></returns>
  641. public static bool CheckNetflixESN(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  642. {
  643. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  644. {
  645. if (data.Length == 2 && data[0] == 0x00 && data[1] == 0x01)
  646. return true;
  647. else
  648. {
  649. error = "ESN return status fail,should be 0x00,0x01";
  650. return false;
  651. }
  652. }
  653. else
  654. return false;
  655. }
  656. /// <summary>
  657. /// 校验Widi
  658. /// </summary>
  659. /// <param name="Comport"></param>
  660. /// <param name="result"></param>
  661. /// <param name="data"></param>
  662. /// <param name="error"></param>
  663. /// <returns></returns>
  664. public static bool CheckWidi(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  665. {
  666. if( SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xE5 }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  667. {
  668. if (data.Length == 1 && data[0] == 0x01)
  669. return true;
  670. else
  671. {
  672. error = "WiDi KEY check fail,return status shoule be 0x01";
  673. return false;
  674. }
  675. }
  676. else
  677. return false;
  678. }
  679. /// <summary>
  680. /// 校验Widevine
  681. /// </summary>
  682. /// <param name="Comport"></param>
  683. /// <param name="result"></param>
  684. /// <param name="data"></param>
  685. /// <param name="error"></param>
  686. /// <returns></returns>
  687. public static bool CheckWidevine(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  688. {
  689. if( SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEA }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  690. {
  691. if (data.Length == 2 && data[0] == 0x00 && data[1] == 0x01)
  692. return true;
  693. else
  694. {
  695. error = "Widevine return status fail,should be 0x00,0x01";
  696. return false;
  697. }
  698. }
  699. else
  700. return false;
  701. }
  702. /// <summary>
  703. /// 校验Ci
  704. /// </summary>
  705. /// <param name="Comport"></param>
  706. /// <param name="result"></param>
  707. /// <param name="data"></param>
  708. /// <param name="error"></param>
  709. /// <returns></returns>
  710. public static bool CheckCikey(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  711. {
  712. if( SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEA }, new byte[] { 0x01 }, true, false, out result, out data, out error, waitTime))
  713. {
  714. if (data.Length == 2 && data[0] == 0x01 && data[1] == 0x01)
  715. return true;
  716. else
  717. {
  718. error = "Ci return status fail,should be 0x01,0x01";
  719. return false;
  720. }
  721. }
  722. else
  723. return false;
  724. }
  725. /// <summary>
  726. /// 校验ECP
  727. /// </summary>
  728. /// <param name="Comport"></param>
  729. /// <param name="result"></param>
  730. /// <param name="data"></param>
  731. /// <param name="error"></param>
  732. /// <returns></returns>
  733. public static bool CheckECP(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  734. {
  735. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEA }, new byte[] { 0x0C }, true, false, out result, out data, out error, waitTime))
  736. {
  737. if (data.Length == 2 && data[0] == 0x0C && data[1] == 0x01)
  738. return true;
  739. else
  740. {
  741. error = "ECP return status fail,should be 0x01,0x01";
  742. return false;
  743. }
  744. }
  745. else
  746. return false;
  747. }
  748. /// <summary>
  749. /// 校验MGK
  750. /// </summary>
  751. /// <param name="Comport"></param>
  752. /// <param name="result"></param>
  753. /// <param name="data"></param>
  754. /// <param name="error"></param>
  755. /// <returns></returns>
  756. public static bool CheckMGKkey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  757. {
  758. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  759. {
  760. if (data.Length == 2 && data[0] == 0x00 && data[1] == 0x01)
  761. return true;
  762. else
  763. {
  764. error = "MGK return status fail,should be 0x00,0x01";
  765. return false;
  766. }
  767. }
  768. else
  769. return false;
  770. }
  771. /// <summary>
  772. /// 校验HDCP22
  773. /// </summary>
  774. /// <param name="Comport"></param>
  775. /// <param name="result"></param>
  776. /// <param name="data"></param>
  777. /// <param name="error"></param>
  778. /// <returns></returns>
  779. public static bool CheckHDCP22(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  780. {
  781. if( SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xE5 }, new byte[] { 0x00 }, true, false, out result, out data, out error, waitTime))
  782. {
  783. if (data.Length == 1 && data[0] == 0x01)
  784. return true;
  785. else
  786. {
  787. error = "HDCP22 KEY check fail,return status shoule be 0x01";
  788. return false;
  789. }
  790. }
  791. else
  792. return false;
  793. }
  794. /// <summary>
  795. /// 开老化
  796. /// </summary>
  797. /// <param name="Comport"></param>
  798. /// <param name="result"></param>
  799. /// <param name="data"></param>
  800. /// <param name="error"></param>
  801. /// <returns></returns>
  802. public static bool StartWarmUpMode(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  803. {
  804. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x13 }, new byte[] { 0x01 }, false, false, out result, out data, out error, waitTime);
  805. }
  806. /// <summary>
  807. /// 关老化
  808. /// </summary>
  809. /// <param name="Comport"></param>
  810. /// <param name="result"></param>
  811. /// <param name="data"></param>
  812. /// <param name="error"></param>
  813. /// <returns></returns>
  814. public static bool StopWarmUpMode(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  815. {
  816. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x13 }, new byte[] { 0x00 }, false, false, out result, out data, out error, waitTime);
  817. }
  818. //set something
  819. /// <summary>
  820. /// 设置OSD语言
  821. /// </summary>
  822. /// <param name="Comport"></param>
  823. /// <param name="param"></param>
  824. /// <param name="result"></param>
  825. /// <param name="data"></param>
  826. /// <param name="error"></param>
  827. /// <returns></returns>
  828. public static bool SetOSDLanguage(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  829. {
  830. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x96, 0x00 }, param, false, false, out result, out data, out error, waitTime);
  831. }
  832. /// <summary>
  833. /// 设置出厂语言
  834. /// </summary>
  835. /// <param name="Comport"></param>
  836. /// <param name="param"></param>
  837. /// <param name="result"></param>
  838. /// <param name="data"></param>
  839. /// <param name="error"></param>
  840. /// <returns></returns>
  841. public static bool SetShopLanguage(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  842. {
  843. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x96, 0x01 }, param, false, false, out result, out data, out error, waitTime);
  844. }
  845. /// <summary>
  846. /// 预置频道
  847. /// </summary>
  848. /// <param name="Comport"></param>
  849. /// <param name="param"></param>
  850. /// <param name="result"></param>
  851. /// <param name="data"></param>
  852. /// <param name="error"></param>
  853. /// <returns></returns>
  854. public static bool SetChannel(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  855. {
  856. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x15 }, param, false, false, out result, out data, out error, waitTime);
  857. }
  858. /// <summary>
  859. /// 设置标准色温RGB值
  860. /// </summary>
  861. /// <param name="Comport"></param>
  862. /// <param name="param"></param>
  863. /// <param name="result"></param>
  864. /// <param name="data"></param>
  865. /// <param name="error"></param>
  866. /// <returns></returns>
  867. public static bool SetWBNormal(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  868. {
  869. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x4D ,0x04 ,0x01 ,0x01 }, param, false, false, out result, out data, out error, waitTime);
  870. }
  871. /// <summary>
  872. /// 设置冷色温RGB值
  873. /// </summary>
  874. /// <param name="Comport"></param>
  875. /// <param name="param"></param>
  876. /// <param name="result"></param>
  877. /// <param name="data"></param>
  878. /// <param name="error"></param>
  879. /// <returns></returns>
  880. public static bool SetWBCool(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  881. {
  882. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x4D, 0x04, 0x02, 0x01 }, param, false, false, out result, out data, out error, waitTime);
  883. }
  884. /// <summary>
  885. /// 设置暖色温RGB值
  886. /// </summary>
  887. /// <param name="Comport"></param>
  888. /// <param name="param"></param>
  889. /// <param name="result"></param>
  890. /// <param name="data"></param>
  891. /// <param name="error"></param>
  892. /// <returns></returns>
  893. public static bool SetWBWarm(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  894. {
  895. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x4D, 0x04, 0x03, 0x01 }, param, false, false, out result, out data, out error, waitTime);
  896. }
  897. /// <summary>
  898. /// SCBC ROKU 项目品牌服务信息抄写
  899. /// </summary>
  900. /// <param name="Comport"></param>
  901. /// <param name="param"></param>
  902. /// <param name="result"></param>
  903. /// <param name="data"></param>
  904. /// <param name="error"></param>
  905. /// <returns></returns>
  906. public static bool SetROKUBrand(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  907. {
  908. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x11 }, param, false, false, out result, out data, out error, waitTime);
  909. }
  910. /// <summary>
  911. /// SCBC ROKU 项目区域服务信息抄写
  912. /// </summary>
  913. /// <param name="Comport"></param>
  914. /// <param name="param"></param>
  915. /// <param name="result"></param>
  916. /// <param name="data"></param>
  917. /// <param name="error"></param>
  918. /// <returns></returns>
  919. public static bool SetROKURegion(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  920. {
  921. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x12 }, param, false, false, out result, out data, out error, waitTime);
  922. }
  923. /// <summary>
  924. /// SCBC ROKU 项目服务网站服务信息抄写
  925. /// </summary>
  926. /// <param name="Comport"></param>
  927. /// <param name="param"></param>
  928. /// <param name="result"></param>
  929. /// <param name="data"></param>
  930. /// <param name="error"></param>
  931. /// <returns></returns>
  932. public static bool SetROKUSupportURL(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  933. {
  934. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x13 }, param, false, false, out result, out data, out error, waitTime);
  935. }
  936. /// <summary>
  937. /// SCBC ROKU 项目服务电话服务信息抄写
  938. /// </summary>
  939. /// <param name="Comport"></param>
  940. /// <param name="param"></param>
  941. /// <param name="result"></param>
  942. /// <param name="data"></param>
  943. /// <param name="error"></param>
  944. /// <returns></returns>
  945. public static bool SetROKUSupportPhone(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  946. {
  947. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x14 }, param, false, false, out result, out data, out error, waitTime);
  948. }
  949. /// <summary>
  950. /// SCBC ROKU 项目服务生产日期信息抄写
  951. /// </summary>
  952. /// <param name="Comport"></param>
  953. /// <param name="param"></param>
  954. /// <param name="result"></param>
  955. /// <param name="data"></param>
  956. /// <param name="error"></param>
  957. /// <returns></returns>
  958. public static bool SetROKUProductionDate(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error,int waitTime)
  959. {
  960. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x15 }, param, false, false, out result, out data, out error, waitTime);
  961. }
  962. /// <summary>
  963. /// SCBC ROKU 项目遥控器类型信息抄写
  964. /// </summary>
  965. /// <param name="Comport"></param>
  966. /// <param name="param"></param>
  967. /// <param name="result"></param>
  968. /// <param name="data"></param>
  969. /// <param name="error"></param>
  970. /// <returns></returns>
  971. public static bool SetROKURemoteType(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  972. {
  973. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x19 }, param, false, false, out result, out data, out error, waitTime);
  974. }
  975. /// <summary>
  976. /// SCBC ROKU 项目品牌服务信息抄写状态查询
  977. /// </summary>
  978. /// <param name="Comport"></param>
  979. /// <param name="result"></param>
  980. /// <param name="data"></param>
  981. /// <param name="error"></param>
  982. /// <returns></returns>
  983. public static bool CheckROKUBrand(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  984. {
  985. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x0B }, true, false, out result, out data, out error, waitTime))
  986. {
  987. if (data.Length == 2 && data[0] == 0x0B && data[1] == 0x01)
  988. return true;
  989. else
  990. {
  991. error = "ROKU Brand check fail,return status shoule be 0x0B ,0x01";
  992. return false;
  993. }
  994. }
  995. else
  996. return false;
  997. }
  998. /// <summary>
  999. /// SCBC ROKU 项目服务网址服务信息抄写状态查询
  1000. /// </summary>
  1001. /// <param name="Comport"></param>
  1002. /// <param name="result"></param>
  1003. /// <param name="data"></param>
  1004. /// <param name="error"></param>
  1005. /// <returns></returns>
  1006. public static bool CheckROKUSupportURL(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1007. {
  1008. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x0D }, true, false, out result, out data, out error, waitTime))
  1009. {
  1010. if (data.Length == 2 && data[0] == 0x0D && data[1] == 0x01)
  1011. return true;
  1012. else
  1013. {
  1014. error = "ROKU Support URL check fail,return status shoule be 0x0D ,0x01";
  1015. return false;
  1016. }
  1017. }
  1018. else
  1019. return false;
  1020. }
  1021. /// <summary>
  1022. /// SCBC ROKU 项目区域服务信息抄写状态查询
  1023. /// </summary>
  1024. /// <param name="Comport"></param>
  1025. /// <param name="result"></param>
  1026. /// <param name="data"></param>
  1027. /// <param name="error"></param>
  1028. /// <returns></returns>
  1029. public static bool CheckROKURegion(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1030. {
  1031. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x0C }, true, false, out result, out data, out error, waitTime))
  1032. {
  1033. if (data.Length == 2 && data[0] == 0x0C && data[1] == 0x01)
  1034. return true;
  1035. else
  1036. {
  1037. error = "ROKU Region check fail,return status shoule be 0x0C ,0x01";
  1038. return false;
  1039. }
  1040. }
  1041. else
  1042. return false;
  1043. }
  1044. /// <summary>
  1045. /// SCBC ROKU 项目服务电话服务信息抄写状态查询
  1046. /// </summary>
  1047. /// <param name="Comport"></param>
  1048. /// <param name="result"></param>
  1049. /// <param name="data"></param>
  1050. /// <param name="error"></param>
  1051. /// <returns></returns>
  1052. public static bool CheckROKUSupportPhone(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1053. {
  1054. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x0E }, true, false, out result, out data, out error, waitTime))
  1055. {
  1056. if (data.Length == 2 && data[0] == 0x0E && data[1] == 0x01)
  1057. return true;
  1058. else
  1059. {
  1060. error = "ROKU Support Phone check fail,return status shoule be 0x0E ,0x01";
  1061. return false;
  1062. }
  1063. }
  1064. else
  1065. return false;
  1066. }
  1067. /// <summary>
  1068. /// SCBC ROKU 项目生产日期服务信息抄写状态查询
  1069. /// </summary>
  1070. /// <param name="Comport"></param>
  1071. /// <param name="result"></param>
  1072. /// <param name="data"></param>
  1073. /// <param name="error"></param>
  1074. /// <returns></returns>
  1075. public static bool CheckROKUProductionDate(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1076. {
  1077. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x0F }, true, false, out result, out data, out error, waitTime))
  1078. {
  1079. if (data.Length == 2 && data[0] == 0x0F && data[1] == 0x01)
  1080. return true;
  1081. else
  1082. {
  1083. error = "Production Date check fail,return status shoule be 0x0F ,0x01";
  1084. return false;
  1085. }
  1086. }
  1087. else
  1088. return false;
  1089. }
  1090. /// <summary>
  1091. /// SCBC ROKU 项目遥控器信息抄写状态查询
  1092. /// </summary>
  1093. /// <param name="Comport"></param>
  1094. /// <param name="result"></param>
  1095. /// <param name="data"></param>
  1096. /// <param name="error"></param>
  1097. /// <returns></returns>
  1098. public static bool CheckROKURemoteType(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1099. {
  1100. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x13 }, true, false, out result, out data, out error, waitTime))
  1101. {
  1102. if (data.Length == 2 && data[0] == 0x13 && data[1] == 0x01)
  1103. return true;
  1104. else
  1105. {
  1106. error = "Remote type check fail,return status shoule be 0x13 ,0x01";
  1107. return false;
  1108. }
  1109. }
  1110. else
  1111. return false;
  1112. }
  1113. /// <summary>
  1114. /// 获取SCBC ROKU 项目品牌服务信息
  1115. /// </summary>
  1116. /// <param name="Comport"></param>
  1117. /// <param name="result"></param>
  1118. /// <param name="data"></param>
  1119. /// <param name="error"></param>
  1120. /// <returns></returns>
  1121. public static bool GetROKUBrand(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1122. {
  1123. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x10 }, true, false, out result, out data, out error, waitTime))
  1124. {
  1125. if (data[0] == 0x10)
  1126. {
  1127. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1128. return true;
  1129. }
  1130. else
  1131. {
  1132. error = "返回brand类型错误,应为10";
  1133. return false;
  1134. }
  1135. }
  1136. else
  1137. return false;
  1138. }
  1139. /// <summary>
  1140. /// 获取SCBC ROKU 项目区域服务信息
  1141. /// </summary>
  1142. /// <param name="Comport"></param>
  1143. /// <param name="result"></param>
  1144. /// <param name="data"></param>
  1145. /// <param name="error"></param>
  1146. /// <returns></returns>
  1147. public static bool GetROKURegion(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1148. {
  1149. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x11 }, true, false, out result, out data, out error, waitTime))
  1150. {
  1151. if (data[0] == 0x11)
  1152. {
  1153. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1154. return true;
  1155. }
  1156. else
  1157. {
  1158. error = "返回Region类型错误,应为11";
  1159. return false;
  1160. }
  1161. }
  1162. else
  1163. return false;
  1164. }
  1165. /// <summary>
  1166. /// 获取SCBC ROKU 项目服务网址服务信息
  1167. /// </summary>
  1168. /// <param name="Comport"></param>
  1169. /// <param name="result"></param>
  1170. /// <param name="data"></param>
  1171. /// <param name="error"></param>
  1172. /// <returns></returns>
  1173. public static bool GetROKUSupportURL(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1174. {
  1175. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x12 }, true, false, out result, out data, out error, waitTime))
  1176. {
  1177. if (data[0] == 0x12)
  1178. {
  1179. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1180. return true;
  1181. }
  1182. else
  1183. {
  1184. error = "返回Support URL类型错误,应为12";
  1185. return false;
  1186. }
  1187. }
  1188. else
  1189. return false;
  1190. }
  1191. /// <summary>
  1192. /// 获取SCBC ROKU 项目服务网址服务信息
  1193. /// </summary>
  1194. /// <param name="Comport"></param>
  1195. /// <param name="result"></param>
  1196. /// <param name="data"></param>
  1197. /// <param name="error"></param>
  1198. /// <returns></returns>
  1199. public static bool GetROKUSupportPhone(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1200. {
  1201. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x13 }, true, false, out result, out data, out error, waitTime))
  1202. {
  1203. if (data[0] == 0x13)
  1204. {
  1205. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1206. return true;
  1207. }
  1208. else
  1209. {
  1210. error = "返回Support Phone类型错误,应为13";
  1211. return false;
  1212. }
  1213. }
  1214. else
  1215. return false;
  1216. }
  1217. /// <summary>
  1218. /// 获取SCBC ROKU 项目服务网址服务信息
  1219. /// </summary>
  1220. /// <param name="Comport"></param>
  1221. /// <param name="result"></param>
  1222. /// <param name="data"></param>
  1223. /// <param name="error"></param>
  1224. /// <returns></returns>
  1225. public static bool GetROKUProductionDate(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1226. {
  1227. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x14 }, true, false, out result, out data, out error, waitTime))
  1228. {
  1229. if (data[0] == 0x14)
  1230. {
  1231. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1232. return true;
  1233. }
  1234. else
  1235. {
  1236. error = "返回Production Date类型错误,应为14";
  1237. return false;
  1238. }
  1239. }
  1240. else
  1241. return false;
  1242. }
  1243. /// <summary>
  1244. /// 获取SCBC ROKU 项目遥控器类型信息(00---普通遥控器;01---语音遥控器)
  1245. /// </summary>
  1246. /// <param name="Comport"></param>
  1247. /// <param name="result"></param>
  1248. /// <param name="data"></param>
  1249. /// <param name="error"></param>
  1250. /// <returns></returns>
  1251. public static bool GetROKURemoteType(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1252. {
  1253. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x18 }, true, false, out result, out data, out error, waitTime))
  1254. {
  1255. if (data[0] == 0x18)
  1256. {
  1257. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1258. return true;
  1259. }
  1260. else
  1261. {
  1262. error = "返回Remote Type类型错误,应为0x18";
  1263. return false;
  1264. }
  1265. }
  1266. else
  1267. return false;
  1268. }
  1269. /// <summary>
  1270. /// 产品机型名抄写
  1271. /// </summary>
  1272. /// <param name="Comport"></param>
  1273. /// <param name="param"></param>
  1274. /// <param name="result"></param>
  1275. /// <param name="data"></param>
  1276. /// <param name="error"></param>
  1277. /// <returns></returns>
  1278. public static bool SetModelName(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1279. {
  1280. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x09 }, param, false, false, out result, out data, out error,waitTime);
  1281. }
  1282. /// <summary>
  1283. /// 产品机型名检查
  1284. /// </summary>
  1285. /// <param name="Comport"></param>
  1286. /// <param name="result"></param>
  1287. /// <param name="data"></param>
  1288. /// <param name="error"></param>
  1289. /// <returns></returns>
  1290. public static bool CheckModelName(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1291. {
  1292. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x08 }, true, false, out result, out data, out error, waitTime))
  1293. {
  1294. if (data.Length == 2 && data[0] == 0x08 && data[1] == 0x01)
  1295. return true;
  1296. else
  1297. {
  1298. error = "Model name check fail,return status shoule be 0x08 ,0x01";
  1299. return false;
  1300. }
  1301. }
  1302. else
  1303. return false;
  1304. }
  1305. /// <summary>
  1306. /// 产品机型名读取
  1307. /// </summary>
  1308. /// <param name="Comport"></param>
  1309. /// <param name="result"></param>
  1310. /// <param name="data"></param>
  1311. /// <param name="error"></param>
  1312. /// <returns></returns>
  1313. public static bool GetModelName(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1314. {
  1315. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x0E }, true, false, out result, out data, out error, waitTime))
  1316. {
  1317. if (data[0] == 0x0E)
  1318. {
  1319. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1320. return true;
  1321. }
  1322. else
  1323. {
  1324. error = "返回Model name类型错误,应为0E";
  1325. return false;
  1326. }
  1327. }
  1328. else
  1329. return false;
  1330. }
  1331. /// <summary>
  1332. /// 写入Attestation Key
  1333. /// </summary>
  1334. /// <param name="Comport"></param>
  1335. /// <param name="param"></param>
  1336. /// <param name="result"></param>
  1337. /// <param name="data"></param>
  1338. /// <param name="error"></param>
  1339. /// <returns></returns>
  1340. public static bool SetAttestationKey(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1341. {
  1342. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xE9, 0x0D }, param, false, false, out result, out data, out error, waitTime);
  1343. }
  1344. /// <summary>
  1345. /// 检查Attestation Key
  1346. /// </summary>
  1347. /// <param name="Comport"></param>
  1348. /// <param name="result"></param>
  1349. /// <param name="data"></param>
  1350. /// <param name="error"></param>
  1351. /// <returns></returns>
  1352. public static bool CheckAttestationKey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1353. {
  1354. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEA }, new byte[] { 0x0D }, true, false, out result, out data, out error, waitTime))
  1355. {
  1356. if (data.Length == 2 && data[0] == 0x0D && data[1] == 0x01)
  1357. return true;
  1358. else
  1359. {
  1360. error = "Attestation Key return status fail,should be 0x0D,0x01";
  1361. return false;
  1362. }
  1363. }
  1364. else
  1365. return false;
  1366. }
  1367. /// <summary>
  1368. /// 读取AttestationKey
  1369. /// </summary>
  1370. /// <param name="Comport"></param>
  1371. /// <param name="result"></param>
  1372. /// <param name="data"></param>
  1373. /// <param name="error"></param>
  1374. /// <returns></returns>
  1375. public static bool GetAttestationKey(SerialPort Comport, out byte[] result, out byte[] data, out string error,int waitTime)
  1376. {
  1377. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEC }, new byte[] { 0x0D }, true, true, out result, out data, out error, waitTime))
  1378. {
  1379. if (data[0] == 0x0D)
  1380. {
  1381. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1382. return true;
  1383. }
  1384. else
  1385. {
  1386. error = "返回AttestationKey类型错误,应为0D";
  1387. return false;
  1388. }
  1389. }
  1390. else
  1391. return false;
  1392. }
  1393. /// <summary>
  1394. /// FireTV项目WiFi_Mac抄写
  1395. /// </summary>
  1396. /// <param name="Comport"></param>
  1397. /// <param name="param"></param>
  1398. /// <param name="result"></param>
  1399. /// <param name="data"></param>
  1400. /// <param name="error"></param>
  1401. /// <param name="waitTime"></param>
  1402. /// <returns></returns>
  1403. public static bool SetFireTVWifiMac(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1404. {
  1405. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x16 }, param, false, false, out result, out data, out error, waitTime);
  1406. }
  1407. /// <summary>
  1408. /// FireTV项目BT_Mac抄写
  1409. /// </summary>
  1410. /// <param name="Comport"></param>
  1411. /// <param name="param"></param>
  1412. /// <param name="result"></param>
  1413. /// <param name="data"></param>
  1414. /// <param name="error"></param>
  1415. /// <param name="waitTime"></param>
  1416. /// <returns></returns>
  1417. public static bool SetFireTVBTMac(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1418. {
  1419. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x17 }, param, false, false, out result, out data, out error, waitTime);
  1420. }
  1421. /// <summary>
  1422. /// FireTV项目DSN抄写
  1423. /// </summary>
  1424. /// <param name="Comport"></param>
  1425. /// <param name="param"></param>
  1426. /// <param name="result"></param>
  1427. /// <param name="data"></param>
  1428. /// <param name="error"></param>
  1429. /// <param name="waitTime"></param>
  1430. /// <returns></returns>
  1431. public static bool SetFireTVDSN(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1432. {
  1433. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x18 }, param, false, false, out result, out data, out error, waitTime);
  1434. }
  1435. /// <summary>
  1436. /// 校验FireTV项目WiFi_Mac
  1437. /// </summary>
  1438. /// <param name="Comport"></param>
  1439. /// <param name="result"></param>
  1440. /// <param name="data"></param>
  1441. /// <param name="error"></param>
  1442. /// <returns></returns>
  1443. public static bool CheckFireTVWifiMac(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1444. {
  1445. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x10 }, true, false, out result, out data, out error, waitTime))
  1446. {
  1447. if (data.Length == 2 && data[0] == 0x10 && data[1] == 0x01)
  1448. return true;
  1449. else
  1450. {
  1451. error = "FireTVWifiMac return status fail,should be 0x10,0x01";
  1452. return false;
  1453. }
  1454. }
  1455. else
  1456. return false;
  1457. }
  1458. /// <summary>
  1459. /// 校验FireTV项目BT_Mac
  1460. /// </summary>
  1461. /// <param name="Comport"></param>
  1462. /// <param name="result"></param>
  1463. /// <param name="data"></param>
  1464. /// <param name="error"></param>
  1465. /// <returns></returns>
  1466. public static bool CheckFireTVBTMac(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1467. {
  1468. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x11 }, true, false, out result, out data, out error, waitTime))
  1469. {
  1470. if (data.Length == 2 && data[0] == 0x11 && data[1] == 0x01)
  1471. return true;
  1472. else
  1473. {
  1474. error = "FireTVBTMac return status fail,should be 0x11,0x01";
  1475. return false;
  1476. }
  1477. }
  1478. else
  1479. return false;
  1480. }
  1481. /// <summary>
  1482. /// 校验FireTV项目DSN
  1483. /// </summary>
  1484. /// <param name="Comport"></param>
  1485. /// <param name="result"></param>
  1486. /// <param name="data"></param>
  1487. /// <param name="error"></param>
  1488. /// <returns></returns>
  1489. public static bool CheckFireTVDSN(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1490. {
  1491. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x12 }, true, false, out result, out data, out error, waitTime))
  1492. {
  1493. if (data.Length == 2 && data[0] == 0x12 && data[1] == 0x01)
  1494. return true;
  1495. else
  1496. {
  1497. error = "FireTVDSN return status fail,should be 0x12,0x01";
  1498. return false;
  1499. }
  1500. }
  1501. else
  1502. return false;
  1503. }
  1504. /// <summary>
  1505. /// 获取FireTV项目WiFi_Mac
  1506. /// </summary>
  1507. /// <param name="Comport"></param>
  1508. /// <param name="result"></param>
  1509. /// <param name="data"></param>
  1510. /// <param name="error"></param>
  1511. /// <returns></returns>
  1512. public static bool GetFireTVWiFi_Mac(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1513. {
  1514. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x15 }, true, false, out result, out data, out error, waitTime))
  1515. {
  1516. if (data[0] == 0x15)
  1517. {
  1518. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1519. return true;
  1520. }
  1521. else
  1522. {
  1523. error = "返回FireTVWiFi_Mac类型错误,应为15";
  1524. return false;
  1525. }
  1526. }
  1527. else
  1528. return false;
  1529. }
  1530. /// <summary>
  1531. /// 获取FireTV项目BT_Mac
  1532. /// </summary>
  1533. /// <param name="Comport"></param>
  1534. /// <param name="result"></param>
  1535. /// <param name="data"></param>
  1536. /// <param name="error"></param>
  1537. /// <returns></returns>
  1538. public static bool GetFireTVBT_Mac(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1539. {
  1540. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x16 }, true, false, out result, out data, out error, waitTime))
  1541. {
  1542. if (data[0] == 0x16)
  1543. {
  1544. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1545. return true;
  1546. }
  1547. else
  1548. {
  1549. error = "返回FireTVBT_Mac类型错误,应为16";
  1550. return false;
  1551. }
  1552. }
  1553. else
  1554. return false;
  1555. }
  1556. /// <summary>
  1557. /// 获取FireTV项目DSN
  1558. /// </summary>
  1559. /// <param name="Comport"></param>
  1560. /// <param name="result"></param>
  1561. /// <param name="data"></param>
  1562. /// <param name="error"></param>
  1563. /// <returns></returns>
  1564. public static bool GetFireTVDSN(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1565. {
  1566. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x17 }, true, false, out result, out data, out error, waitTime))
  1567. {
  1568. if (data[0] == 0x17)
  1569. {
  1570. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1571. return true;
  1572. }
  1573. else
  1574. {
  1575. error = "返回FireTVDSN类型错误,应为17";
  1576. return false;
  1577. }
  1578. }
  1579. else
  1580. return false;
  1581. }
  1582. /// <summary>
  1583. /// FireTV项目Fairplay key抄写
  1584. /// </summary>
  1585. /// <param name="Comport"></param>
  1586. /// <param name="param"></param>
  1587. /// <param name="result"></param>
  1588. /// <param name="data"></param>
  1589. /// <param name="error"></param>
  1590. /// <returns></returns>
  1591. public static bool SetFireTVFairplay(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1592. {
  1593. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xE9, 0x0E }, param, false, false, out result, out data, out error, waitTime);
  1594. }
  1595. /// <summary>
  1596. /// 校验FireTV项目Fairplay key
  1597. /// </summary>
  1598. /// <param name="Comport"></param>
  1599. /// <param name="param"></param>
  1600. /// <param name="result"></param>
  1601. /// <param name="data"></param>
  1602. /// <param name="error"></param>
  1603. /// <returns></returns>
  1604. public static bool CheckFireTVFairplay(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1605. {
  1606. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEA }, new byte[] { 0x0E }, true, false, out result, out data, out error, waitTime))
  1607. {
  1608. if (data.Length == 2 && data[0] == 0x0E && data[1] == 0x01)
  1609. return true;
  1610. else
  1611. {
  1612. error = "Fairplay return status fail,should be 0x0E,0x01";
  1613. return false;
  1614. }
  1615. }
  1616. else
  1617. return false;
  1618. }
  1619. /// <summary>
  1620. /// 读取FireTV项目Fairplay key
  1621. /// </summary>
  1622. /// <param name="Comport"></param>
  1623. /// <param name="param"></param>
  1624. /// <param name="result"></param>
  1625. /// <param name="data"></param>
  1626. /// <param name="error"></param>
  1627. /// <returns></returns>
  1628. public static bool ReadFireTVFairplay(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1629. {
  1630. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEC }, new byte[] { 0x0F }, true, true, out result, out data, out error, waitTime))
  1631. {
  1632. if (data[0] == 0x0F)
  1633. {
  1634. data = data.Skip(1).Take(data.Length - 1).ToArray();
  1635. return true;
  1636. }
  1637. else
  1638. {
  1639. error = "返回Fairplay类型错误,应为0F";
  1640. return false;
  1641. }
  1642. }
  1643. else
  1644. return false;
  1645. }
  1646. /// <summary>
  1647. /// DHA激活生成
  1648. /// </summary>
  1649. /// <param name="Comport"></param>
  1650. /// <param name="param"></param>
  1651. /// <param name="result"></param>
  1652. /// <param name="data"></param>
  1653. /// <param name="error"></param>
  1654. /// <returns></returns>
  1655. public static bool CreateFireTVDHA(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1656. {
  1657. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x96, 0x03 }, new byte[] { 0x00 }, false, false, out result, out data, out error, waitTime);
  1658. }
  1659. /// <summary>
  1660. /// 检查DHA生成情况
  1661. /// </summary>
  1662. /// <param name="Comport"></param>
  1663. /// <param name="result"></param>
  1664. /// <param name="data"></param>
  1665. /// <param name="error"></param>
  1666. /// <param name="waitTime"></param>
  1667. /// <returns></returns>
  1668. public static bool CheckFireTVDHA(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1669. {
  1670. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x14 }, true, false, out result, out data, out error, waitTime))
  1671. {
  1672. if (data.Length == 2 && data[0] == 0x14 && data[1] == 0x01)
  1673. return true;
  1674. else
  1675. {
  1676. error = "DHA return status fail,should be 0x14,0x01";
  1677. return false;
  1678. }
  1679. }
  1680. else
  1681. return false;
  1682. }
  1683. /// <summary>
  1684. /// 读取设备码
  1685. /// </summary>
  1686. /// <param name="Comport"></param>
  1687. /// <param name="result"></param>
  1688. /// <param name="data"></param>
  1689. /// <param name="error"></param>
  1690. /// <returns></returns>
  1691. public static bool GetFireTVDevcieCode(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1692. {
  1693. // 计算函数耗时;
  1694. Stopwatch watch = new Stopwatch();
  1695. watch.Start();
  1696. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xEC }, new byte[] { 0x11,0x06 }, true, false, out result, out data, out error, waitTime))
  1697. {
  1698. if (data[0] == 0x11 & data[1] == 0x06)
  1699. {
  1700. data = data.Skip(2).Take(data.Length - 2).ToArray();
  1701. if (data.Length == 3)
  1702. return true;
  1703. error = "返回DevcieCode长度错误,应为3 bytes";
  1704. }
  1705. else
  1706. {
  1707. error = "返回DevcieCode类型错误,应为0x11 0x06";
  1708. }
  1709. }
  1710. Log.WriteInfoLog(string.Format("GetDeviceCode Elapsed = {0}", watch.Elapsed.TotalMilliseconds));
  1711. return false;
  1712. }
  1713. /// <summary>
  1714. /// 烧录FireTV项目Playready key
  1715. /// </summary>
  1716. /// <param name="Comport"></param>
  1717. /// <param name="param"></param>
  1718. /// <param name="result"></param>
  1719. /// <param name="data"></param>
  1720. /// <param name="error"></param>
  1721. /// <param name="waitTime"></param>
  1722. /// <returns></returns>
  1723. public static bool SetFireTVPlayready(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1724. {
  1725. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x00 }, param, false, false, out result, out data, out error, waitTime);
  1726. }
  1727. /// <summary>
  1728. /// 检查FireTV项目Playready key
  1729. /// </summary>
  1730. /// <param name="Comport"></param>
  1731. /// <param name="result"></param>
  1732. /// <param name="data"></param>
  1733. /// <param name="error"></param>
  1734. /// <param name="waitTime"></param>
  1735. /// <returns></returns>
  1736. public static bool CheckFireTVPlayready(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1737. {
  1738. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x00 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  1739. {
  1740. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x00 && data[2] == 0x01)
  1741. return true;
  1742. else
  1743. {
  1744. error = "Playready return status fail,should be 0x02,0x00,0x01";
  1745. return false;
  1746. }
  1747. }
  1748. else
  1749. return false;
  1750. }
  1751. /// <summary>
  1752. /// 读取FireTV项目Playready key
  1753. /// </summary>
  1754. /// <param name="Comport"></param>
  1755. /// <param name="result"></param>
  1756. /// <param name="data"></param>
  1757. /// <param name="error"></param>
  1758. /// <param name="waitTime"></param>
  1759. /// <returns></returns>
  1760. public static bool ReadFireTVPlayready(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1761. {
  1762. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x00 }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  1763. {
  1764. if (data[0] == 0x04 && data[1] == 0x00)
  1765. {
  1766. data = data.Skip(2).Take(data.Length - 2).ToArray();
  1767. return true;
  1768. }
  1769. else
  1770. {
  1771. error = "返回Playready类型错误,应为0x04, 0x00";
  1772. return false;
  1773. }
  1774. }
  1775. else
  1776. return false;
  1777. }
  1778. /// <summary>
  1779. /// 烧录FireTV项目LEK
  1780. /// </summary>
  1781. /// <param name="Comport"></param>
  1782. /// <param name="param"></param>
  1783. /// <param name="result"></param>
  1784. /// <param name="data"></param>
  1785. /// <param name="error"></param>
  1786. /// <param name="waitTime"></param>
  1787. /// <returns></returns>
  1788. public static bool SetFireTVLEK(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1789. {
  1790. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x02 }, param, false, false, out result, out data, out error, waitTime);
  1791. }
  1792. /// <summary>
  1793. /// 检查FireTV项目LEK
  1794. /// </summary>
  1795. /// <param name="Comport"></param>
  1796. /// <param name="result"></param>
  1797. /// <param name="data"></param>
  1798. /// <param name="error"></param>
  1799. /// <param name="waitTime"></param>
  1800. /// <returns></returns>
  1801. public static bool CheckFireTVLEK(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1802. {
  1803. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x02 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  1804. {
  1805. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x02 && data[2] == 0x01)
  1806. return true;
  1807. else
  1808. {
  1809. error = "LEK return status fail,should be 0x02,0x02,0x01";
  1810. return false;
  1811. }
  1812. }
  1813. else
  1814. return false;
  1815. }
  1816. /// <summary>
  1817. /// 读取FireTV项目LEK
  1818. /// </summary>
  1819. /// <param name="Comport"></param>
  1820. /// <param name="result"></param>
  1821. /// <param name="data"></param>
  1822. /// <param name="error"></param>
  1823. /// <param name="waitTime"></param>
  1824. /// <returns></returns>
  1825. public static bool ReadFireTVLEK(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1826. {
  1827. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x02 }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  1828. {
  1829. if (data[0] == 0x04 && data[1] == 0x02)
  1830. {
  1831. data = data.Skip(2).Take(data.Length - 2).ToArray();
  1832. return true;
  1833. }
  1834. else
  1835. {
  1836. error = "返回LEK类型错误,应为0x04,0x02";
  1837. return false;
  1838. }
  1839. }
  1840. else
  1841. return false;
  1842. }
  1843. /// <summary>
  1844. /// 烧录FireTV项目PEK
  1845. /// </summary>
  1846. /// <param name="Comport"></param>
  1847. /// <param name="param"></param>
  1848. /// <param name="result"></param>
  1849. /// <param name="data"></param>
  1850. /// <param name="error"></param>
  1851. /// <param name="waitTime"></param>
  1852. /// <returns></returns>
  1853. public static bool SetFireTVPEK(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1854. {
  1855. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x01 }, param, false, false, out result, out data, out error, waitTime);
  1856. }
  1857. /// <summary>
  1858. /// 检查FireTV项目PEK
  1859. /// </summary>
  1860. /// <param name="Comport"></param>
  1861. /// <param name="result"></param>
  1862. /// <param name="data"></param>
  1863. /// <param name="error"></param>
  1864. /// <param name="waitTime"></param>
  1865. /// <returns></returns>
  1866. public static bool CheckFireTVPEK(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1867. {
  1868. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x01 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  1869. {
  1870. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x01 && data[2] == 0x01)
  1871. return true;
  1872. else
  1873. {
  1874. error = "PEK return status fail,should be 0x02,0x01,0x01";
  1875. return false;
  1876. }
  1877. }
  1878. else
  1879. return false;
  1880. }
  1881. /// <summary>
  1882. /// 读取FireTV项目PEK
  1883. /// </summary>
  1884. /// <param name="Comport"></param>
  1885. /// <param name="result"></param>
  1886. /// <param name="data"></param>
  1887. /// <param name="error"></param>
  1888. /// <param name="waitTime"></param>
  1889. /// <returns></returns>
  1890. public static bool ReadFireTVPEK(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1891. {
  1892. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x01 }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  1893. {
  1894. if (data[0] == 0x04 && data[1] == 0x01)
  1895. {
  1896. data = data.Skip(2).Take(data.Length - 2).ToArray();
  1897. return true;
  1898. }
  1899. else
  1900. {
  1901. error = "返回PEK类型错误,应为0x04 0x01";
  1902. return false;
  1903. }
  1904. }
  1905. else
  1906. return false;
  1907. }
  1908. /// <summary>
  1909. /// 烧录FireTV项目的DAK
  1910. /// </summary>
  1911. /// <param name="Comport"></param>
  1912. /// <param name="param"></param>
  1913. /// <param name="result"></param>
  1914. /// <param name="data"></param>
  1915. /// <param name="error"></param>
  1916. /// <param name="waitTime"></param>
  1917. /// <returns></returns>
  1918. public static bool SetFireTVDAK(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1919. {
  1920. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x0E }, param, false, false, out result, out data, out error, waitTime);
  1921. }
  1922. /// <summary>
  1923. /// 校验FireTV项目的DAK抄写状态;
  1924. /// </summary>
  1925. /// <param name="Comport"></param>
  1926. /// <param name="result"></param>
  1927. /// <param name="data"></param>
  1928. /// <param name="error"></param>
  1929. /// <param name="waitTime"></param>
  1930. /// <returns></returns>
  1931. public static bool CheckFireTVDAK(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1932. {
  1933. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x0E }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  1934. {
  1935. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x0E && data[2] == 0x01)
  1936. return true;
  1937. else
  1938. {
  1939. error = "DAK return status fail,should be 0x02,0x0E,0x01";
  1940. return false;
  1941. }
  1942. }
  1943. else
  1944. return false;
  1945. }
  1946. /// <summary>
  1947. /// 激活小米FireTV项目的FVP
  1948. /// </summary>
  1949. /// <param name="Comport"></param>
  1950. /// <param name="param"></param>
  1951. /// <param name="result"></param>
  1952. /// <param name="data"></param>
  1953. /// <param name="error"></param>
  1954. /// <param name="waitTime"></param>
  1955. /// <returns></returns>
  1956. public static bool ActiveMiFireTVFVP(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1957. {
  1958. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x00, 0x0F }, param, false, false, out result, out data, out error, waitTime);
  1959. }
  1960. /// <summary>
  1961. /// 校验小米FireTV项目的FVP激活状态;
  1962. /// </summary>
  1963. /// <param name="Comport"></param>
  1964. /// <param name="result"></param>
  1965. /// <param name="data"></param>
  1966. /// <param name="error"></param>
  1967. /// <param name="waitTime"></param>
  1968. /// <returns></returns>
  1969. public static bool CheckMiFireTVFVP(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  1970. {
  1971. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x0F }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  1972. {
  1973. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x0F && data[2] == 0x01)
  1974. return true;
  1975. else
  1976. {
  1977. error = "FVP return status fail,should be 0x02,0x0F,0x01";
  1978. return false;
  1979. }
  1980. }
  1981. else
  1982. return false;
  1983. }
  1984. /// <summary>
  1985. /// 烧录FireTV项目Hash key
  1986. /// </summary>
  1987. /// <param name="Comport"></param>
  1988. /// <param name="param"></param>
  1989. /// <param name="result"></param>
  1990. /// <param name="data"></param>
  1991. /// <param name="error"></param>
  1992. /// <param name="waitTime"></param>
  1993. /// <returns></returns>
  1994. public static bool SetFireTVHashkey(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  1995. {
  1996. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x03 }, param, false, false, out result, out data, out error, waitTime);
  1997. }
  1998. /// <summary>
  1999. /// 检查FireTV项目Hash key
  2000. /// </summary>
  2001. /// <param name="Comport"></param>
  2002. /// <param name="result"></param>
  2003. /// <param name="data"></param>
  2004. /// <param name="error"></param>
  2005. /// <param name="waitTime"></param>
  2006. /// <returns></returns>
  2007. public static bool CheckFireTVHashkey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2008. {
  2009. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x03 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  2010. {
  2011. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x03 && data[2] == 0x01)
  2012. return true;
  2013. else
  2014. {
  2015. error = "Hashkey return status fail,should be 0x02,0x03,0x01";
  2016. return false;
  2017. }
  2018. }
  2019. else
  2020. return false;
  2021. }
  2022. /// <summary>
  2023. /// 读取FireTV项目Hash key
  2024. /// </summary>
  2025. /// <param name="Comport"></param>
  2026. /// <param name="result"></param>
  2027. /// <param name="data"></param>
  2028. /// <param name="error"></param>
  2029. /// <param name="waitTime"></param>
  2030. /// <returns></returns>
  2031. public static bool ReadFireTVHashkey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2032. {
  2033. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x03 }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  2034. {
  2035. if (data[0] == 0x04 && data[1] == 0x03)
  2036. {
  2037. data = data.Skip(2).Take(data.Length - 2).ToArray();
  2038. return true;
  2039. }
  2040. else
  2041. {
  2042. error = "返回Hashkey类型错误,应为0x04 0x03";
  2043. return false;
  2044. }
  2045. }
  2046. else
  2047. return false;
  2048. }
  2049. /// <summary>
  2050. /// 烧录条码
  2051. /// </summary>
  2052. /// <param name="Comport"></param>
  2053. /// <param name="param"></param>
  2054. /// <param name="result"></param>
  2055. /// <param name="data"></param>
  2056. /// <param name="error"></param>
  2057. /// <param name="waitTime"></param>
  2058. /// <returns></returns>
  2059. public static bool SetBarcode(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2060. {
  2061. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x71 }, param, false, false, out result, out data, out error, waitTime);
  2062. }
  2063. /// <summary>
  2064. /// 烧录PSN
  2065. /// </summary>
  2066. /// <param name="Comport"></param>
  2067. /// <param name="param"></param>
  2068. /// <param name="result"></param>
  2069. /// <param name="data"></param>
  2070. /// <param name="error"></param>
  2071. /// <param name="waitTime"></param>
  2072. /// <returns></returns>
  2073. public static bool SetFireTVPSN(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2074. {
  2075. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x00, 0x05 }, param, false, false, out result, out data, out error, waitTime);
  2076. }
  2077. /// <summary>
  2078. /// 烧录FireTV项目Youtube
  2079. /// </summary>
  2080. /// <param name="Comport"></param>
  2081. /// <param name="param"></param>
  2082. /// <param name="result"></param>
  2083. /// <param name="data"></param>
  2084. /// <param name="error"></param>
  2085. /// <param name="waitTime"></param>
  2086. /// <returns></returns>
  2087. public static bool SetFireTVYoutube(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2088. {
  2089. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x06 }, param, false, false, out result, out data, out error, waitTime);
  2090. }
  2091. /// <summary>
  2092. /// 检查FireTV项目Youtube
  2093. /// </summary>
  2094. /// <param name="Comport"></param>
  2095. /// <param name="result"></param>
  2096. /// <param name="data"></param>
  2097. /// <param name="error"></param>
  2098. /// <param name="waitTime"></param>
  2099. /// <returns></returns>
  2100. public static bool CheckFireTVYoutube(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2101. {
  2102. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x06 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  2103. {
  2104. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x06 && data[2] == 0x01)
  2105. return true;
  2106. else
  2107. {
  2108. error = "Youtube return status fail,should be 0x02,0x06,0x01";
  2109. return false;
  2110. }
  2111. }
  2112. else
  2113. return false;
  2114. }
  2115. /// <summary>
  2116. /// 读取FireTV项目Youtube
  2117. /// </summary>
  2118. /// <param name="Comport"></param>
  2119. /// <param name="result"></param>
  2120. /// <param name="data"></param>
  2121. /// <param name="error"></param>
  2122. /// <param name="waitTime"></param>
  2123. /// <returns></returns>
  2124. public static bool ReadFireTVYoutube(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2125. {
  2126. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x06 }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  2127. {
  2128. if (data[0] == 0x04 && data[1] == 0x06)
  2129. {
  2130. data = data.Skip(2).Take(data.Length - 2).ToArray();
  2131. return true;
  2132. }
  2133. else
  2134. {
  2135. error = "返回Youtube类型错误,应为0x04 0x06";
  2136. return false;
  2137. }
  2138. }
  2139. else
  2140. return false;
  2141. }
  2142. /// <summary>
  2143. /// 读取条码
  2144. /// </summary>
  2145. /// <param name="Comport"></param>
  2146. /// <param name="result"></param>
  2147. /// <param name="data"></param>
  2148. /// <param name="error"></param>
  2149. /// <param name="waitTime"></param>
  2150. /// <returns></returns>
  2151. public static bool ReadBarcode(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2152. {
  2153. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x03 }, true, false, out result, out data, out error, waitTime))
  2154. {
  2155. if (data[0] == 0x03)
  2156. {
  2157. data = data.Skip(1).Take(data.Length - 1).ToArray();
  2158. return true;
  2159. }
  2160. else
  2161. {
  2162. error = "返回S/N类型错误,应为0x03";
  2163. return false;
  2164. }
  2165. }
  2166. else
  2167. return false;
  2168. }
  2169. /// <summary>
  2170. /// 读取PSN
  2171. /// </summary>
  2172. /// <param name="Comport"></param>
  2173. /// <param name="result"></param>
  2174. /// <param name="data"></param>
  2175. /// <param name="error"></param>
  2176. /// <param name="waitTime"></param>
  2177. /// <returns></returns>
  2178. public static bool ReadFireTVPSN(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2179. {
  2180. // 计算函数耗时;
  2181. Stopwatch watch = new Stopwatch();
  2182. watch.Start();
  2183. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x05 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  2184. {
  2185. if (data[0] == 0x04 && data[1] == 0x05)
  2186. {
  2187. data = data.Skip(2).Take(data.Length - 2).ToArray();
  2188. Log.WriteInfoLog(string.Format("Read PSN Elapsed={0}", watch.Elapsed.TotalMilliseconds));
  2189. return true;
  2190. }
  2191. else
  2192. {
  2193. error = "返回PSN类型错误,应为0x04 0x05";
  2194. }
  2195. }
  2196. return false;
  2197. }
  2198. /// <summary>
  2199. /// 读取日本客户的ACAS ID;
  2200. /// </summary>
  2201. /// <param name="Comport"></param>
  2202. /// <param name="result"></param>
  2203. /// <param name="data"></param>
  2204. /// <param name="error"></param>
  2205. /// <param name="waitTime"></param>
  2206. /// <returns></returns>
  2207. public static bool ReadJapaneseACASID(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2208. {
  2209. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x15 }, true, false, out result, out data, out error, waitTime))
  2210. {
  2211. if (data[0] == 0x15)
  2212. {
  2213. data = data.Skip(1).Take(data.Length - 1).ToArray();
  2214. return true;
  2215. }
  2216. else
  2217. {
  2218. error = "返回ACASID类型错误,应为15";
  2219. return false;
  2220. }
  2221. }
  2222. return false;
  2223. }
  2224. /// <summary>
  2225. /// 读取EDID Pid;
  2226. /// </summary>
  2227. /// <param name="Comport"></param>
  2228. /// <param name="result"></param>
  2229. /// <param name="data"></param>
  2230. /// <param name="error"></param>
  2231. /// <param name="waitTime"></param>
  2232. /// <returns></returns>
  2233. public static bool ReadEDIDPid(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2234. {
  2235. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x09 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  2236. {
  2237. if (data[0] == 0x04 && data[1] == 0x09)
  2238. {
  2239. data = data.Skip(2).Take(data.Length - 2).ToArray();
  2240. return true;
  2241. }
  2242. else
  2243. {
  2244. error = "返回EDID PID错误,应为0x04 0x07";
  2245. }
  2246. }
  2247. return false;
  2248. }
  2249. /// <summary>
  2250. /// 设置EDID Pid;
  2251. /// </summary>
  2252. /// <param name="Comport"></param>
  2253. /// <param name="param"></param>
  2254. /// <param name="result"></param>
  2255. /// <param name="data"></param>
  2256. /// <param name="error"></param>
  2257. /// <param name="waitTime"></param>
  2258. /// <returns></returns>
  2259. public static bool SetEDIDPid(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2260. {
  2261. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x00, 0x09 }, param, false, false, out result, out data, out error, waitTime);
  2262. }
  2263. /// <summary>
  2264. /// 读取EDID Mode Name;
  2265. /// </summary>
  2266. /// <param name="Comport"></param>
  2267. /// <param name="result"></param>
  2268. /// <param name="data"></param>
  2269. /// <param name="error"></param>
  2270. /// <param name="waitTime"></param>
  2271. /// <returns></returns>
  2272. public static bool ReadEDIDModelName(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2273. {
  2274. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xBE }, new byte[] { 0x0E }, true, false, out result, out data, out error, waitTime))
  2275. {
  2276. if (data[0] == 0x0E)
  2277. {
  2278. data = data.Skip(1).Take(data.Length - 1).ToArray();
  2279. return true;
  2280. }
  2281. else
  2282. {
  2283. error = "返回EDID Mode Name错误,应为01";
  2284. }
  2285. }
  2286. return false;
  2287. }
  2288. /// <summary>
  2289. /// 抄写EDID Mode Name;
  2290. /// </summary>
  2291. /// <param name="Comport"></param>
  2292. /// <param name="param"></param>
  2293. /// <param name="result"></param>
  2294. /// <param name="data"></param>
  2295. /// <param name="error"></param>
  2296. /// <param name="waitTime"></param>
  2297. /// <returns></returns>
  2298. public static bool SetEDIDModelName(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2299. {
  2300. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x99, 0x09 }, param, false, false, out result, out data, out error, waitTime);
  2301. }
  2302. /// <summary>
  2303. /// 读取ACAS Key
  2304. /// </summary>
  2305. /// <param name="Comport"></param>
  2306. /// <param name="result"></param>
  2307. /// <param name="data"></param>
  2308. /// <param name="error"></param>
  2309. /// <param name="waitTime"></param>
  2310. /// <returns>注意返回值为:md5xxxxx</returns>
  2311. public static bool ReadACASKeyData(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2312. {
  2313. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x08 }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  2314. {
  2315. if (data[0] == 0x04 && data[1] == 0x08)
  2316. {
  2317. data = data.Skip(2).Take(data.Length - 2).ToArray();
  2318. return true;
  2319. }
  2320. else
  2321. {
  2322. error = "返回ACAS KEY DATA错误!";
  2323. }
  2324. }
  2325. return false;
  2326. }
  2327. public static bool CheckACASKeyData(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2328. {
  2329. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x08 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  2330. {
  2331. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x08 && data[2] == 0x01)
  2332. {
  2333. return true;
  2334. }
  2335. else
  2336. {
  2337. error = "检验ACAS KEY DATA错误,应为0x02 0x08 0x01";
  2338. }
  2339. }
  2340. return false;
  2341. }
  2342. /// <summary>
  2343. /// 设置ACAS Key
  2344. /// </summary>
  2345. /// <param name="Comport"></param>
  2346. /// <param name="param"></param>
  2347. /// <param name="result"></param>
  2348. /// <param name="data"></param>
  2349. /// <param name="error"></param>
  2350. /// <param name="waitTime"></param>
  2351. /// <returns></returns>
  2352. public static bool SetACASKeyData(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2353. {
  2354. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x08 }, param, false, false, out result, out data, out error, waitTime);
  2355. }
  2356. /// <summary>
  2357. /// 读取ACAS Key
  2358. /// </summary>
  2359. /// <param name="Comport"></param>
  2360. /// <param name="result"></param>
  2361. /// <param name="data"></param>
  2362. /// <param name="error"></param>
  2363. /// <param name="waitTime"></param>
  2364. /// <returns>注意返回值为:md5xxxxx</returns>
  2365. public static bool ReadACASKeyTool(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2366. {
  2367. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x0A }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  2368. {
  2369. if (data[0] == 0x04 && data[1] == 0x0A)
  2370. {
  2371. data = data.Skip(2).Take(data.Length - 2).ToArray();
  2372. return true;
  2373. }
  2374. else
  2375. {
  2376. error = "返回ACAS KEY TOOL 错误!";
  2377. }
  2378. }
  2379. return false;
  2380. }
  2381. public static bool CheckACASKeyTool(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2382. {
  2383. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x0A }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  2384. {
  2385. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x0A && data[2] == 0x01)
  2386. {
  2387. return true;
  2388. }
  2389. else
  2390. {
  2391. error = "检验ACAS KEY TOOL 错误,应为0x02 0x0A 0x01";
  2392. }
  2393. }
  2394. return false;
  2395. }
  2396. /// <summary>
  2397. /// 设置ACAS Key
  2398. /// </summary>
  2399. /// <param name="Comport"></param>
  2400. /// <param name="param"></param>
  2401. /// <param name="result"></param>
  2402. /// <param name="data"></param>
  2403. /// <param name="error"></param>
  2404. /// <param name="waitTime"></param>
  2405. /// <returns></returns>
  2406. public static bool SetACASKeyTool(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2407. {
  2408. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x0A }, param, false, false, out result, out data, out error, waitTime);
  2409. }
  2410. #region 波兰工厂临时功能-抄写所有Key后执行Trigger和Check指令;
  2411. public static bool TriggerDHA(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2412. {
  2413. return SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x96, 0x03 }, new byte[]{ 0x00 }, false, false, out result, out data, out error, waitTime);
  2414. }
  2415. public static bool CheckDHA(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2416. {
  2417. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0x9A }, new byte[] { 0x014 }, true, false, out result, out data, out error, waitTime))
  2418. {
  2419. if (data[0] == 0x14 && data[1] == 0x01)
  2420. {
  2421. data = data.Skip(1).Take(data.Length - 1).ToArray();
  2422. return true;
  2423. }
  2424. else
  2425. {
  2426. error = "Check DHA失败,应为01";
  2427. }
  2428. }
  2429. return false;
  2430. }
  2431. #endregion
  2432. public static bool SetDolbyKey(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2433. {
  2434. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x13 }, param, false, false, out result, out data, out error, waitTime);
  2435. }
  2436. public static bool CheckDolbyKey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2437. {
  2438. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x13 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  2439. {
  2440. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x13 && data[2] == 0x01)
  2441. {
  2442. return true;
  2443. }
  2444. else
  2445. {
  2446. error = "检验 Dolby Key 错误,应为0x02 0x13 0x01";
  2447. }
  2448. }
  2449. return false;
  2450. }
  2451. public static bool ReadDolbyKey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2452. {
  2453. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x13 }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  2454. {
  2455. if (data[0] == 0x04 && data[1] == 0x13)
  2456. {
  2457. data = data.Skip(2).Take(data.Length - 2).ToArray();
  2458. return true;
  2459. }
  2460. else
  2461. {
  2462. error = "返回Dolby Key错误!";
  2463. }
  2464. }
  2465. return false;
  2466. }
  2467. /// <summary>
  2468. ///
  2469. /// </summary>
  2470. /// <param name="Comport"></param>
  2471. /// <param name="param"></param>
  2472. /// <param name="result"></param>
  2473. /// <param name="data"></param>
  2474. /// <param name="error"></param>
  2475. /// <param name="waitTime"></param>
  2476. /// <returns></returns>
  2477. public static bool SetKFPKey(SerialPort Comport, byte[] param, out byte[] result, out byte[] data, out string error, int waitTime)
  2478. {
  2479. return SendcmdEx(Comport, new byte[] { 0xAA, 0xFE }, new byte[] { 0xFC, 0x00, 0x15 }, param, false, false, out result, out data, out error, waitTime);
  2480. }
  2481. public static bool CheckKFPKey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2482. {
  2483. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x01, 0x15 }, new byte[] { }, true, false, out result, out data, out error, waitTime))
  2484. {
  2485. if (data.Length == 3 && data[0] == 0x02 && data[1] == 0x15 && data[2] == 0x01)
  2486. {
  2487. return true;
  2488. }
  2489. else
  2490. {
  2491. error = "检验 KFP Key 错误,应为0x02 0x15 0x01";
  2492. }
  2493. }
  2494. return false;
  2495. }
  2496. public static bool ReadKFPKey(SerialPort Comport, out byte[] result, out byte[] data, out string error, int waitTime)
  2497. {
  2498. if (SendcmdEx(Comport, new byte[] { 0xAA }, new byte[] { 0xFC, 0x03, 0x15 }, new byte[] { }, true, true, out result, out data, out error, waitTime))
  2499. {
  2500. if (data[0] == 0x04 && data[1] == 0x15)
  2501. {
  2502. data = data.Skip(2).Take(data.Length - 2).ToArray();
  2503. return true;
  2504. }
  2505. else
  2506. {
  2507. error = "返回KFP Key错误!";
  2508. }
  2509. }
  2510. return false;
  2511. }
  2512. /// <summary>
  2513. /// 通讯逻辑
  2514. /// </summary>
  2515. /// <param name="Comport"></param>
  2516. /// <param name="CMDHead"></param>
  2517. /// <param name="CMDID"></param>
  2518. /// <param name="param"></param>
  2519. /// <param name="receive2"></param>
  2520. /// <param name="TwoLengthBit"></param>
  2521. /// <param name="result"></param>
  2522. /// <param name="data"></param>
  2523. /// <param name="error"></param>
  2524. /// <returns></returns>
  2525. private static bool Sendcmd(SerialPort Comport, byte[] CMDHead,byte[] CMDID, byte[] param,bool receive2,bool TwoLengthBit,out byte[] result,out byte[] data,out string error,int waitTime)
  2526. {
  2527. result = new byte[20480];
  2528. data = new byte[20480];
  2529. error = "";
  2530. Comport.ReadExisting();
  2531. ArrayList command = new ArrayList();
  2532. command.Add(CMDHead);
  2533. int Wholelength = CMDHead.Length * 2 + param.Length + CMDID.Length + 2;
  2534. if(CMDHead.Length==1)
  2535. command.Add(new byte[1] { Convert.ToByte(Wholelength) } );
  2536. else if(CMDHead.Length==2)
  2537. command.Add(new byte[2] { Convert.ToByte(Wholelength/256), Convert.ToByte(Wholelength % 256) });
  2538. else
  2539. {
  2540. error = "无法识别的命令头";
  2541. return false;
  2542. }
  2543. command.Add(CMDID);
  2544. command.Add(param);
  2545. ArrayList head1 = new ArrayList();
  2546. byte[] head = new byte[Convert.ToUInt16(param.Length + CMDHead.Length * 2 + CMDID.Length)];
  2547. foreach (byte[] b in command)
  2548. {
  2549. foreach (byte b2 in b)
  2550. head1.Add(b2);
  2551. }
  2552. head1.CopyTo(head);
  2553. try
  2554. {
  2555. string CRC = CrcTest.Program.CalcCRC16(head);
  2556. command.Add(SerialInit.HexToByte(CRC));
  2557. string s = "";
  2558. byte[] wdata = new byte[0] { };
  2559. foreach (byte[] b in command)
  2560. {
  2561. wdata= wdata.Concat(b).ToArray();
  2562. }
  2563. Comport.WriteTimeout = 3000;
  2564. Comport.Write(wdata, 0, wdata.Length);
  2565. s += SerialInit.ByteToHex(wdata);
  2566. Log.WriteInfoLog("Write:" + s);
  2567. bool mark = false;
  2568. // 设置读超时;
  2569. Comport.ReadTimeout = ReadTimeout;
  2570. //delay(Comport, CMDID);//已有ReadTimeout了,这里多余;
  2571. // ReadTimeout对ReadByte生效的话,所有ReadByte都会有超时响应,如果异常存在会导致更长的延时?
  2572. while (true)
  2573. {
  2574. if (Comport.ReadByte() == ACKhead[0])
  2575. {
  2576. if (Comport.ReadByte() == ACKhead[1])
  2577. {
  2578. int onebit = Comport.ReadByte();
  2579. if (onebit == ACKhead[2])
  2580. {
  2581. if (Comport.ReadByte() == ACKhead[3])
  2582. if (Comport.ReadByte() == ACKhead[4])
  2583. {
  2584. for (int j = 0; j <= 4; j++)
  2585. {
  2586. result[j] = ACKhead[j];
  2587. }
  2588. mark = true;
  2589. goto CheckTCL2Receive;
  2590. }
  2591. }
  2592. else if (onebit == ACKhead2[2])
  2593. {
  2594. if (Comport.ReadByte() == ACKhead2[3])
  2595. if (Comport.ReadByte() == ACKhead2[4])
  2596. {
  2597. for (int j = 0; j <= 4; j++)
  2598. {
  2599. result[j] = ACKhead2[2];
  2600. }
  2601. error = "命令错误或无法识别数据返回";
  2602. Log.WriteInfoLog("Received ErrorACK:" + SerialInit.ByteToHex(ACKhead2) + "\r\n" + error);
  2603. return false;
  2604. }
  2605. }
  2606. else if (onebit == ACKhead3[2])
  2607. {
  2608. if (Comport.ReadByte() == ACKhead3[3])
  2609. if (Comport.ReadByte() == ACKhead3[4])
  2610. {
  2611. for (int j = 0; j <= 4; j++)
  2612. {
  2613. result[j] = ACKhead3[2];
  2614. }
  2615. Log.WriteInfoLog("Received ErrorACK:" + SerialInit.ByteToHex(ACKhead3) + "\r\n" + error);
  2616. error = "CRC16校验错误返回";
  2617. return false;
  2618. }
  2619. }
  2620. }
  2621. }
  2622. //delay(Comport, CMDID);
  2623. }
  2624. CheckTCL2Receive:
  2625. if (receive2)
  2626. {
  2627. //delay(Comport, CMDID, true);
  2628. if (mark)
  2629. {
  2630. // 分2段2次返回,第2次同样要再次设置超时值;
  2631. Comport.ReadTimeout = ReadTimeout;
  2632. //等待一段时间确保接收到完整数据
  2633. Thread.Sleep(100);
  2634. //取一个空间存放第二段
  2635. //校验第二段CRC是否正确
  2636. //根据长度判断是否有FE字段
  2637. byte[] receive2Data = new byte[20480];
  2638. //划一个空间用来存放实际长度
  2639. int reallyLength=Comport.Read(receive2Data, 0,20480);
  2640. //CRC校验
  2641. byte crcHighByte = receive2Data[reallyLength - 2];
  2642. byte crcLowByte = receive2Data[reallyLength - 1];
  2643. string crc = CrcTest.Program.CalcCRC16(receive2Data.Take(reallyLength - 2).ToArray());
  2644. byte[] calCrc = SerialInit.HexToByte(crc);
  2645. if(crcHighByte == calCrc[0] && crcLowByte == calCrc[1])
  2646. {
  2647. //根据实际收到的数据判断是否有FE字段
  2648. if (reallyLength > 255)
  2649. {
  2650. //数据大于255,应该有FE
  2651. if (receive2Data[1] != 0xFE)
  2652. {
  2653. Log.WriteErrorLog("数据大于255,协议无FE字段");
  2654. return false;
  2655. }
  2656. //获取数据,获取长度字节,然后判断
  2657. uint packetLen = (uint)((receive2Data[2] << 8) | receive2Data[3]);
  2658. if (packetLen != reallyLength)
  2659. {
  2660. Log.WriteErrorLog("实际长度与读出的长度不符");
  2661. return false;
  2662. }
  2663. //判断命令是否正确(有无FC字段,有的时候命令应往后移一个
  2664. if (receive2Data[receive2Data[4] != 0xFC ? 4 : 5] != CMDID[0] + 1)
  2665. {
  2666. Log.WriteErrorLog("收到的命令与发送的命令计算后值不同");
  2667. return false;
  2668. }
  2669. // 获取数据部分;
  2670. int skipLen = receive2Data[4] == 0xFC ? 6 : 5;
  2671. data = receive2Data.Skip(skipLen).Take(reallyLength - skipLen - 2).ToArray();
  2672. Log.WriteInfoLog("Receive Data:" + SerialInit.ByteToHex(result.Take(5).ToArray()) + SerialInit.ByteToHex(receive2Data.Take(reallyLength).ToArray()));
  2673. return true;
  2674. }
  2675. else
  2676. {
  2677. //获取数据,获取长度字节,然后判断
  2678. int packetLength = receive2Data[1];
  2679. if (packetLength != reallyLength)
  2680. {
  2681. Log.WriteErrorLog("实际长度与读出的长度不符");
  2682. return false;
  2683. }
  2684. //判断命令是否正确(有无FC字段,有的时候命令应往后移一个
  2685. if (receive2Data[receive2Data[2] == 0xFC ? 3 : 2] != CMDID[0] + 1)
  2686. {
  2687. Log.WriteErrorLog("收到的命令与发送的命令计算后值不同");
  2688. return false;
  2689. }
  2690. int skipLen = receive2Data[2] == 0xFC ? 4 : 3;
  2691. data = receive2Data.Skip(skipLen).Take(reallyLength - skipLen - 2).ToArray();
  2692. Log.WriteInfoLog("Receive Data:" + SerialInit.ByteToHex(result.Take(5).ToArray()) + SerialInit.ByteToHex(receive2Data.Take(packetLength).ToArray()));
  2693. return true;
  2694. }
  2695. }
  2696. else
  2697. {
  2698. Log.WriteErrorLog("校验错误");
  2699. return false;
  2700. }
  2701. Thread.Sleep(NextCommandWaitTime);
  2702. return true;
  2703. }
  2704. else
  2705. {
  2706. return false;
  2707. }
  2708. }
  2709. else
  2710. {
  2711. Log.WriteInfoLog("Received ACK:" + SerialInit.ByteToHex(result.Take(5).ToArray()));
  2712. Thread.Sleep(NextCommandWaitTime);
  2713. return true;
  2714. }
  2715. }
  2716. catch(Exception ex)
  2717. {
  2718. error = ex.Message;
  2719. Log.WriteErrorLog("Serial Error:" + ex.Message);
  2720. return false;
  2721. }
  2722. }
  2723. private static bool SendcmdEx(SerialPort Comport, byte[] CMDHead, byte[] CMDID, byte[] param, bool receive2, bool TwoLengthBit, out byte[] result, out byte[] data, out string error, int waitTime)
  2724. {
  2725. if (!EnableRetry)
  2726. return Sendcmd(Comport, CMDHead, CMDID, param, receive2, TwoLengthBit, out result, out data, out error, waitTime);
  2727. int count = RetryCount;
  2728. bool bRet = false;
  2729. do
  2730. {
  2731. --count;
  2732. Log.WriteInfoLog(string.Format("Retrying {0} time", RetryCount-count));
  2733. bRet = Sendcmd(Comport, CMDHead, CMDID, param, receive2, TwoLengthBit, out result, out data, out error, waitTime);
  2734. if (bRet) break;
  2735. } while (count > 0);
  2736. return bRet;
  2737. }
  2738. // 这个函数在receive2时,不具有超时有效性,不保证能读取成功;
  2739. private static void delay(SerialPort Comport, byte[] CMDID, bool receive2 = false)
  2740. {
  2741. int l = 0;
  2742. int num = SerialTimeout * 20;
  2743. // CMD = 0x10表示EnterFactory指令;
  2744. if (CMDID.Length == 1 && CMDID[0] == 0x10)
  2745. num = 20;
  2746. while (Comport.BytesToRead < 5 && l < num)
  2747. {
  2748. Thread.Sleep(SerialTimeout);
  2749. l++;
  2750. }
  2751. }
  2752. }
  2753. }