MainForm.carled.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. using StackExchange.Redis;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading;
  8. namespace ErpServer
  9. {
  10. public partial class MainForm
  11. {
  12. Dictionary<string, ServerList> serverDics = new Dictionary<string, ServerList>();
  13. Dictionary<string, string> carnoLst = new Dictionary<string, string>();
  14. byte[] server_ip;
  15. int pServer = -1;
  16. private void carLedTimerCall(object obj)
  17. {
  18. if (carDics.Count < 1) return;
  19. var keys2 = redis.RedisHelper.getFilterKeys("carled_*");
  20. if (keys2 != null && keys2.Length > 0)
  21. {
  22. try
  23. {
  24. string txt = "";
  25. bool isSend = false;
  26. foreach (RedisKey rk in keys2)
  27. {
  28. isSend = false;
  29. string carno = rk.ToString().Replace("carled_", "");
  30. if (carDics.ContainsKey(carno))
  31. {
  32. txt = redis.RedisHelper.StringGet(rk.ToString());
  33. AppendLog(carno + "," + txt + "要发送LED屏" + "," + carDics[carno]);
  34. if (txt != null && txt.Length > 0)
  35. {
  36. string[] cArr = carDics[carno].Split(',');
  37. if (serverDics.ContainsKey(cArr[0]))
  38. {
  39. lock (sendObj)
  40. {
  41. isSend = false;
  42. isSend = sendCarLedText(serverDics[cArr[0]], cArr[0], txt, carno);
  43. if (isSend)
  44. {
  45. AppendLog("自动发送成功!" + cArr[0]);
  46. redis.RedisHelper.KeyDelete("carled_" + carno);
  47. }
  48. //else
  49. //{
  50. // isSend = sendCarLedText(serverDics[cArr[1]], cArr[1], txt, carno);
  51. // if (isSend)
  52. // {
  53. // AppendLog("自动发送成功!" + cArr[1]);
  54. // redis.RedisHelper.KeyDelete("carled_" + carno);
  55. // }
  56. //}
  57. }
  58. }
  59. else if (cArr.Length > 1 && serverDics.ContainsKey(cArr[1]))
  60. {
  61. lock (sendObj)
  62. {
  63. isSend = false;
  64. isSend = sendCarLedText(serverDics[cArr[1]], cArr[1], txt, carno);
  65. if (isSend)
  66. {
  67. AppendLog("自动发送成功!" + cArr[1]);
  68. redis.RedisHelper.KeyDelete("carled_" + carno);
  69. }
  70. //else
  71. //{
  72. // isSend = sendCarLedText(serverDics[cArr[0]], cArr[0], txt, carno);
  73. // if (isSend)
  74. // {
  75. // AppendLog("自动发送成功!" + cArr[0]);
  76. // redis.RedisHelper.KeyDelete("carled_" + carno);
  77. // }
  78. //}
  79. }
  80. }
  81. }
  82. else
  83. {
  84. AppendLog("车号:" + carno + ",led编号:" + carDics[carno]);
  85. helper.writeLog("车号:" + carno + ",led编号:" + carDics[carno] + ",找不到相应的卡号");
  86. return;
  87. }
  88. }
  89. else
  90. {
  91. AppendLog("车号:" + carno + ",找不到相应的卡号");
  92. helper.writeLog("车号:" + carno + ",找不到相应的卡号");
  93. }
  94. }
  95. }
  96. catch (Exception ex)
  97. {
  98. helper.writeLog("carLedTimerCall:" + ex.Message);
  99. }
  100. }
  101. }
  102. Dictionary<string, string> carDics = new Dictionary<string, string>();
  103. private void initCar()
  104. {
  105. carDics.Clear();
  106. string sql = "select carid,cnid from car where cnid<>''";
  107. DataTable dt = SqlHelper.ExecuteDataset(sql).Tables[0];
  108. foreach (DataRow dr in dt.Rows)
  109. {
  110. //AppendLog(dr["carid"].ToString()+","+dr["cnid"].ToString());
  111. carDics.Add(dr["carid"].ToString(), dr["cnid"].ToString());
  112. }
  113. }
  114. public void runLedServer()
  115. {
  116. int err = bxdualsdk_56.bxDual_InitSdk();
  117. if (err != 0)
  118. {
  119. AppendLog(err + ",初始化发生错误");
  120. return;
  121. }
  122. //控制卡IP 服务器模式用服务器IP或者127.0.0.1
  123. server_ip = Encoding.GetEncoding("GBK").GetBytes("127.0.0.1");
  124. int port = 1244;
  125. //启动服务器
  126. pServer = Server.bxDual_Start_Server(port);
  127. AppendLog("LED屏开启监听");
  128. //循环获取led控制卡
  129. getCardList();
  130. }
  131. bool isGetCard = false;
  132. byte[] ocards = new byte[2048];
  133. private static object getcarObj = new object();
  134. string wkey = "";
  135. string owkey = "";
  136. byte[] cards = null;
  137. public void getCardList()
  138. {
  139. if (isGetCard) return;
  140. //isGetCard = true;
  141. new Thread(new ThreadStart(delegate ()
  142. {
  143. int count = 0;
  144. while (true)
  145. {
  146. try
  147. {
  148. cards = new byte[2048];
  149. for (int i = 0; i < 2048; i++) { cards[i] = 0; }
  150. //AppendLog("获取在线个数!");
  151. //控制卡上线个数
  152. count = Server.bxDual_Get_CardList(cards);
  153. //AppendLog(count.ToString());
  154. if (count > 0)
  155. {
  156. //if (CompareArray(ocards, cards)) return;
  157. //ocards = cards;
  158. //一个控制卡数据20个长度
  159. for (int i = 0; i < count; i++)
  160. {
  161. lock (getcarObj)
  162. {
  163. //前14位数据是控制卡网络ID编号
  164. byte[] barcode = cards.Skip(0 + i * 20).Take(16 + i * 20).ToArray();
  165. //根据网络ID获取通讯使用端口
  166. int port = Server.bxDual_Get_Port_Barcode(barcode);
  167. if (port == -1) continue;
  168. ServerList serverObj = new ServerList(barcode, port);
  169. string key = System.Text.Encoding.GetEncoding("GBK").GetString(barcode).Trim();
  170. if (key.Substring(0, 3) == "JH-") key = key.Substring(0, 11);
  171. else if (key.Substring(0, 4) == "B6A0") key = key.Substring(0, 16);
  172. //if (key.Length >= 16) key = key.Substring(0, 16);
  173. if (!serverDics.ContainsKey(key))
  174. {
  175. helper.writeLog("新的号:" + key);
  176. wkey = getLedCarNo(key);
  177. if (wkey == "" || owkey == wkey) continue;
  178. owkey = wkey;
  179. if (carnoLst.ContainsKey(wkey))//如果已经包含了一个,就删除之前的一个
  180. {
  181. if (serverDics.ContainsKey(carnoLst[wkey]))
  182. {
  183. serverDics.Remove(carnoLst[wkey]);
  184. selCars.Items.Remove(wkey + "-" + carnoLst[wkey]);
  185. }
  186. carnoLst[wkey] = key;
  187. }
  188. else
  189. {
  190. carnoLst.Add(wkey, key);
  191. }
  192. serverDics.Add(key, serverObj);
  193. selCars.Items.Add(wkey + "-" + key);
  194. AppendLog(wkey + "_" + key + "_" + port + ":上线了!");
  195. helper.writeLog(wkey + "_" + key + "|" + port + ":上线了!");
  196. }
  197. else
  198. {
  199. //AppendLog(getLedCarNo(key) + "-" + key + "|" + port + ":更新!");
  200. if (serverDics[key].port != serverObj.port)
  201. {
  202. serverDics[key] = serverObj;
  203. helper.writeLog(getLedCarNo(key) + "-" + key + "|" + port + ":更新!");
  204. }
  205. }
  206. Thread.Sleep(20);
  207. }
  208. }
  209. }
  210. }
  211. catch (Exception ex)
  212. {
  213. //AppendLog("发生错误"+ex.Message);
  214. helper.writeLog("发生错误" + ex.Message);
  215. }
  216. finally
  217. {
  218. //isGetCard = false;
  219. Thread.Sleep(30000);
  220. }
  221. }
  222. })).Start();
  223. }
  224. private string getLedCarNo(string code)
  225. {
  226. code = code.Trim();
  227. //helper.writeLog("检查:" + code + "," + carDics.Count);
  228. if (carDics.Count > 0)
  229. {
  230. //AppendLog(code.Length + "," + code);
  231. string[] tmp = null;
  232. foreach (KeyValuePair<string, string> kvp in carDics)
  233. {
  234. if (kvp.Value.IndexOf(",") != -1)
  235. {
  236. tmp = kvp.Value.Split(',');
  237. if (tmp[0].Trim() == code || tmp[1].Trim() == code) return kvp.Key;
  238. }
  239. else
  240. {
  241. if (kvp.Value == code) return kvp.Key;
  242. }
  243. //helper.writeLog(tmp[0] + "_" + tmp[1] + "_" + tmp[1].Length + "_" + code + "_" + code.Length);
  244. }
  245. }
  246. helper.writeLog(code + "_没有找到");
  247. return "";
  248. }
  249. /// <summary>
  250. /// 数组比较是否相等
  251. /// </summary>
  252. /// <param name="bt1">数组1</param>
  253. /// <param name="bt2">数组2</param>
  254. /// <returns>true:相等,false:不相等</returns>
  255. public bool CompareArray(byte[] bt1, byte[] bt2)
  256. {
  257. var len1 = bt1.Length;
  258. var len2 = bt2.Length;
  259. if (len1 != len2)
  260. {
  261. return false;
  262. }
  263. for (var i = 0; i < len1; i++)
  264. {
  265. if (bt1[i] != bt2[i])
  266. return false;
  267. }
  268. return true;
  269. }
  270. public void stopLedServer()
  271. {
  272. //关闭服务器
  273. int err = Server.bxDual_Stop_Server(pServer);
  274. //释放动态库
  275. bxdualsdk_56.bxDual_ReleaseSdk();
  276. }
  277. public static object sendObj = new object();
  278. byte off = 0x00;
  279. public bool sendCarLedText(ServerList sl, string key, string txt, string carno)
  280. {
  281. //new Thread(new ThreadStart(delegate ()
  282. //{
  283. try
  284. {
  285. int port = sl.port;
  286. bxdualsdk_56.Ping_data data = new bxdualsdk_56.Ping_data();
  287. int err = bxdualsdk_56.bxDual_cmd_tcpPing(server_ip, (ushort)port, ref data);
  288. if (err == -1)
  289. {
  290. AppendLog(key + ":" + port + ", ping不通");
  291. helper.writeLog(key + ":" + port + ", ping不通");
  292. return false;
  293. }
  294. if (data.CurrentOnOffStatus == off)
  295. {
  296. AppendLog("屏幕关闭不发送");
  297. return false;
  298. }
  299. //Console.WriteLine("tcpPing:" + err);
  300. byte cmb_ping_Color = 1;
  301. ushort ct = 17763;//类型
  302. err = bxdualsdk_56.bxDual_program_setScreenParams_G56((bxdualsdk_56.E_ScreenColor_G56)cmb_ping_Color, ct, bxdualsdk_56.E_DoubleColorPixel_G56.eDOUBLE_COLOR_PIXTYPE_1);
  303. if (err != 0)
  304. {
  305. AppendLog("program_setScreenParams_G56:" + err);
  306. helper.writeLog("program_setScreenParams_G56:" + err);
  307. return false;
  308. }
  309. //创建节目
  310. program_6.Creat_Program_6();
  311. //创建图文区
  312. program_6.Creat_Area_6(0, 0, 0, 64, 16, 0);
  313. //添加显示文本
  314. if (txt.Length <= 6)
  315. {
  316. program_6.Creat_AddStr_6S(0, " " + txt + " ", "宋体");
  317. }
  318. else
  319. {
  320. program_6.Creat_AddStr_6(0, " " + txt + " ", "宋体");
  321. }
  322. //发送节目显示
  323. program_6.Net_SengProgram_6(server_ip, (ushort)port);
  324. AppendLog("发送:" + key + "|" + txt);
  325. helper.writeLog("发送:" + key + "|" + txt);
  326. return true;
  327. }
  328. catch (Exception ex)
  329. {
  330. AppendLog("发送失败:" + ex.Message);
  331. helper.writeLog("发送失败:" + ex.Message);
  332. return false;
  333. }
  334. }
  335. }
  336. public class Item
  337. {
  338. public string Name;
  339. public string Value;
  340. public Item(string name, string value)
  341. {
  342. Name = name; Value = value;
  343. }
  344. }
  345. }