net_debug.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: net_debug.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2012-11-07
  7. 功能说明: 网络调试接口
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. #ifdef LINUX_KERNEL_APP
  15. #include <linux/delay.h>
  16. #include <linux/syscalls.h>
  17. #include <linux/signal.h>
  18. #else
  19. #include <pthread.h>
  20. #include <sys/prctl.h>
  21. #endif
  22. /*------------------------------- 宏定义 --------------------------------------
  23. */
  24. /*------------------------------ 类型结构 -------------------------------------
  25. */
  26. /*------------------------------ 全局变量 -------------------------------------
  27. */
  28. #ifdef LINUX_KERNEL_APP
  29. static struct task_struct *g_ts_debug_send;
  30. static struct task_struct *g_ts_debug_recv;
  31. #else
  32. static pthread_t g_ts_debug_recv = 0;
  33. #endif
  34. SOCKET g_debug_client = RT_SOCKET_ERR;
  35. unsigned char g_net_debug_buf[NET_RECV_MAX]; // 以太网接收缓冲区
  36. int g_print_to_net;
  37. int g_print_time;
  38. int g_print_comm_raw;
  39. int g_print_101;
  40. int g_print_104;
  41. int g_print_lnk;
  42. int g_print_hmi;
  43. int g_print_can;
  44. int g_print_can_monitor;
  45. int g_print_sys;
  46. int g_print_dd;
  47. int g_print_goose;
  48. u32 g_print_port = -1; // 允许打印的串口通道,用位表示
  49. int g_test_on;
  50. extern struct semaphore g_print_sem;
  51. #ifdef LINUX_KERNEL_APP
  52. extern struct semaphore g_print_sem;
  53. static pid_t g_net_debug_thread_send_pid;
  54. static pid_t g_net_debug_thread_recv_pid;
  55. static int g_net_debug_send_exit_flag = 0;
  56. #endif
  57. static volatile int g_net_debug_sock_flag = NET_SOCKET_INIT; // 关闭SOCKET标志
  58. static int g_net_debug_recv_exit_flag = 0;
  59. DEBUG_COMM g_tDebug; // 定义下载串口结构
  60. /*------------------------------ 函数声明 -------------------------------------
  61. */
  62. void _net_debug_recv_reset(void);
  63. void _net_debug_print_reset(void);
  64. #ifdef LINUX_KERNEL_APP
  65. int _net_debug_thread_send(void *unused);
  66. #endif
  67. int _net_debug_thread_recv(void *unused);
  68. /*------------------------------ 外部函数 -------------------------------------
  69. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  70. */
  71. // 设置socket关闭标志并等待socket关闭完成
  72. void net_debug_set_sock_closing(int no)
  73. {
  74. struct sockaddr_in local_addr;
  75. unsigned int len = sizeof(local_addr);
  76. RUN_PARA *pRunPara = &tRunPara;
  77. unsigned int ip = 0;
  78. int bflag = 0;
  79. // 如果有客户端连接
  80. if (g_debug_client != RT_SOCKET_ERR)
  81. {
  82. // 获取客户端连接的IP
  83. rt_getsockname(g_debug_client, (struct sockaddr *)&local_addr, &len);
  84. #if 1
  85. if (pRunPara->tNetPara[no].old_index == 0)
  86. {
  87. // 获取网卡IP
  88. rt_if_ip_get(pRunPara->tNetPara[no].old_ethid, (unsigned char *)&ip); // sunxi: 20220825 335x
  89. }
  90. else
  91. {
  92. // 获取虚拟网卡上的IP地址
  93. rt_if_ip_get2(pRunPara->tNetPara[no].old_ethid, pRunPara->tNetPara[no].old_index, (unsigned char *)&ip); // sunxi: 20220825 335x
  94. }
  95. // 如果是该网卡的IP并且该网卡要修改IP或MASK,则需要通知关闭socket
  96. if ((htonl(ip) == local_addr.sin_addr.s_addr) && pRunPara->tNetPara[no].bInit) // sunxi: 20220825 335x
  97. {
  98. bflag = 1;
  99. }
  100. #endif
  101. // 该网卡的IP和MASK没有修改,则不需要通知关闭socket
  102. if (!bflag)
  103. {
  104. return;
  105. }
  106. g_net_debug_sock_flag = NET_SOCKET_CLOSING; // 置关闭标志
  107. // 等待关闭完成
  108. while (g_net_debug_sock_flag != NET_SOCKET_CLOSED)
  109. {
  110. msleep(20);
  111. }
  112. }
  113. }
  114. // 设置socket重新创建标志
  115. void net_debug_set_sock_initflag(void)
  116. {
  117. if (g_net_debug_sock_flag == NET_SOCKET_CLOSED)
  118. {
  119. g_net_debug_sock_flag = NET_SOCKET_REINIT;
  120. }
  121. }
  122. //
  123. #ifdef LINUX_KERNEL_APP
  124. int net_debug_s_init(void)
  125. {
  126. struct sched_param sp;
  127. pid_t pid;
  128. #if 1
  129. // 如果已经初始化,退出
  130. if (g_ts_debug_send)
  131. {
  132. return 0;
  133. }
  134. // 运行应用调试线程
  135. // g_ts_debug_send = kthread_run(_net_debug_thread_send,NULL,"net_debug_send");
  136. pid = kernel_thread(_net_debug_thread_send, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD);
  137. g_ts_debug_send = find_task_by_vpid(pid);
  138. if (IS_ERR(g_ts_debug_send))
  139. {
  140. printk("ts=%p\r\n", g_ts_debug_send);
  141. g_ts_debug_send = NULL;
  142. return -1;
  143. }
  144. g_net_debug_thread_send_pid = pid;
  145. memset(&sp, 0, sizeof(sp));
  146. sp.sched_priority = 8;
  147. sched_setscheduler(g_ts_debug_send, SCHED_FIFO, &sp);
  148. // 设置进程名字
  149. set_task_comm(g_ts_debug_send, "net_debug_send");
  150. #endif
  151. return 0;
  152. }
  153. #else
  154. int net_debug_s_init(void)
  155. {
  156. return 0;
  157. }
  158. #endif
  159. #ifdef LINUX_KERNEL_APP
  160. int net_debug_s_exit(void)
  161. {
  162. int status;
  163. if (g_ts_debug_send != NULL)
  164. {
  165. up(&g_print_sem);
  166. g_net_debug_send_exit_flag = 1;
  167. sys_wait4(g_net_debug_thread_send_pid, (int __user *)&status, 0, NULL);
  168. g_ts_debug_send = NULL;
  169. }
  170. return 0;
  171. }
  172. #else
  173. int net_debug_s_exit(void)
  174. {
  175. return 0;
  176. }
  177. #endif
  178. // TODO: 需要确认是否需要重新初始化
  179. int net_debug_init(void)
  180. {
  181. int ret;
  182. pthread_attr_t attr;
  183. // attr.__schedpolicy = SCHED_FIFO;
  184. // attr.__schedparam.sched_priority =8;
  185. // 设置调度策略和优先级
  186. pthread_attr_init(&attr);
  187. pthread_attr_setschedpolicy(&attr, SCHED_FIFO); // 调度
  188. struct sched_param s_parm;
  189. // s_parm.sched_priority = sched_get_priority_max(SCHED_FIFO);
  190. s_parm.sched_priority = 8;
  191. pthread_attr_setschedparam(&attr, &s_parm); // 优先级
  192. ret = pthread_create(&g_ts_debug_recv, &attr, (void *)_net_debug_thread_recv, NULL);
  193. if (!ret)
  194. {
  195. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  196. // g_ts_rcd = 0;
  197. return ret;
  198. }
  199. return 0;
  200. }
  201. #ifdef LINUX_KERNEL_APP
  202. int net_debug_exit(void)
  203. {
  204. int status;
  205. #if 0
  206. if(g_ts_debug_send != NULL)
  207. {
  208. up(&g_print_sem);
  209. g_net_debug_send_exit_flag = 1;
  210. sys_wait4(g_net_debug_thread_send_pid, (int __user *)&status, 0, NULL);
  211. g_ts_debug_send = NULL;
  212. }
  213. #endif
  214. if (g_ts_debug_recv != NULL)
  215. {
  216. g_net_debug_recv_exit_flag = 1;
  217. sys_wait4(g_net_debug_thread_recv_pid, (int __user *)&status, 0, NULL);
  218. g_ts_debug_recv = NULL;
  219. }
  220. return 0;
  221. }
  222. #else
  223. int net_debug_exit(void)
  224. {
  225. if (g_ts_debug_recv)
  226. {
  227. g_net_debug_recv_exit_flag = 1;
  228. // sys_wait4(g_net_debug_thread_recv_pid, (int __user *)&status, 0, NULL);
  229. pthread_join(g_ts_debug_recv, NULL);
  230. g_ts_debug_recv = 0;
  231. }
  232. return 0;
  233. }
  234. #endif
  235. // 此函数必须在线程中调用,不能在中断中调用。
  236. int net_debug_send(unsigned char *buf, int len)
  237. {
  238. if (g_debug_client == RT_SOCKET_ERR)
  239. {
  240. return 0;
  241. }
  242. return rt_send(g_debug_client, buf, len, 0);
  243. }
  244. #ifdef METERING_ENERGY
  245. const char main_Debug[] =
  246. "\r\n*********装置调试菜单*******\r\n \
  247. 0:通讯原始数据监视[通道可选]\r\n \
  248. 1:101报文监视[通道可选]\r\n \
  249. 2:104报文监视[通道可选]\r\n \
  250. 3:CAN报文监视\r\n \
  251. 4:系统信息监视\r\n \
  252. 5:报文时标开启\r\n \
  253. 6:关闭所有监视\r\n \
  254. 7:面板报文监视\r\n \
  255. 8:CAN总线监视\r\n \
  256. A:载入默认公钥\r\n \
  257. B:加密测试\r\n \
  258. C:SOE测试\r\n \
  259. D:重启系统\r\n \
  260. E:打印点表\r\n \
  261. F: 级联报文监视[通道可选]\r\n \
  262. G:goose报文监视\r\n \
  263. H:文件召唤测试\r\n \
  264. I:程序升级测试\r\n \
  265. J:打印终端固有参数\r\n \
  266. K:新生成soe.xml文件\r\n \
  267. L:新生成co.xml文件\r\n \
  268. M:清零电压合格率\r\n \
  269. N:清零脉冲计数值\r\n \
  270. P:61850信息打印\r\n \
  271. Q:生成菜单显示文件\r\n \
  272. R:生成icd文件\r\n \
  273. S:计量板校准\r\n \
  274. T:计量电能清零\r\n \
  275. U:CAN子板ID打印\r\n \
  276. 其它:关闭所有监视信息\r\n \
  277. \r\n>:";
  278. #else
  279. const char main_Debug[] =
  280. "\r\n*********装置调试菜单*******\r\n \
  281. 0:通讯原始数据监视[通道可选]\r\n \
  282. 1:101报文监视[通道可选]\r\n \
  283. 2:104报文监视[通道可选]\r\n \
  284. 3:CAN报文监视\r\n \
  285. 4:系统信息监视\r\n \
  286. 5:报文时标开启\r\n \
  287. 6:关闭所有监视\r\n \
  288. 7:面板报文监视\r\n \
  289. 8:CAN总线监视\r\n \
  290. A:载入默认公钥\r\n \
  291. B:加密测试\r\n \
  292. C:SOE测试\r\n \
  293. D:重启系统\r\n \
  294. E:打印点表\r\n \
  295. F: 级联报文监视[通道可选]\r\n \
  296. G:goose报文监视\r\n \
  297. H:文件召唤测试\r\n \
  298. I:程序升级测试\r\n \
  299. J:打印终端固有参数\r\n \
  300. K:新生成soe.xml文件\r\n \
  301. L:新生成co.xml文件\r\n \
  302. M:清零电压合格率\r\n \
  303. N:清零脉冲计数值\r\n \
  304. P:61850信息打印\r\n \
  305. Q:生成菜单显示文件\r\n \
  306. R:生成icd文件\r\n \
  307. r:查看实时线程状态\r\n \
  308. s:复位实时线程状态\r\n \
  309. S:ADC采样状态\r\n \
  310. v:遥调点表打印\r\n \
  311. w:录波修正\r\n \
  312. 其它:关闭所有监视信息\r\n \
  313. \r\n>:";
  314. #endif
  315. BYTE arrApn[48];
  316. extern int g_soe_test;
  317. int _net_debug_get_chn(void)
  318. {
  319. int chn;
  320. if (g_tDebug.cRecvCnt >= 3)
  321. {
  322. chn = g_tDebug.arrRecvBuf[2] - '0';
  323. if (chn >= 0 && chn < COMM_CHANNEL_NUM)
  324. {
  325. g_print_port = 1 << chn;
  326. return chn;
  327. }
  328. }
  329. return -1;
  330. }
  331. extern int dt_cmd_rt(void);
  332. extern int dt_cmd_adc(void);
  333. extern int dt_cmd_rt_reset(void);
  334. void net_debug_app(void)
  335. {
  336. u8 ch;
  337. int chn;
  338. int ret = -1;
  339. #ifdef CAN_SLAVE_BOARD
  340. static bool sb_metering = false;
  341. #endif
  342. if (!g_tDebug.bData)
  343. return;
  344. g_tDebug.bData = false;
  345. // 超级终端处理
  346. ch = g_tDebug.arrRecvBuf[g_tDebug.cRecvCnt - 1];
  347. if (ch != 0x0d) // 回车键
  348. {
  349. _net_debug_recv_reset();
  350. return;
  351. }
  352. // 前7个和维护工具配合使用,不可改变
  353. switch (g_tDebug.arrRecvBuf[0])
  354. {
  355. case '0':
  356. g_print_comm_raw = 1;
  357. g_print_to_net = 1;
  358. chn = _net_debug_get_chn();
  359. rt_printf("\r\n打开串口原始数据监视[chn=%d]:\r\n", chn);
  360. break;
  361. case '1':
  362. g_print_101 = 1;
  363. g_print_to_net = 1;
  364. chn = _net_debug_get_chn();
  365. rt_printf("\r\n打开101报文监视[chn=%d]:\r\n", chn);
  366. break;
  367. case '2':
  368. g_print_104 = 1;
  369. g_print_to_net = 1;
  370. chn = _net_debug_get_chn();
  371. rt_printf("\r\n打开104报文监视[chn=%d]:\r\n", chn);
  372. break;
  373. case '3':
  374. g_print_can = 1;
  375. g_print_to_net = 1;
  376. rt_printf("\r\n打开CAN报文监视:\r\n");
  377. break;
  378. case '4':
  379. g_print_sys = 1;
  380. g_print_to_net = 1;
  381. rt_printf("\r\n打开系统监视:\r\n");
  382. break;
  383. case '5':
  384. g_print_time = 1;
  385. rt_printf("\r\n报文时标开启:\r\n");
  386. break;
  387. case '6':
  388. g_print_to_net = 1;
  389. g_print_port = -1;
  390. rt_printf("\r\n所有报文监视关闭:\r\n");
  391. _net_debug_print_reset();
  392. break;
  393. case '7':
  394. g_print_hmi = 1;
  395. g_print_to_net = 1;
  396. rt_printf("\r\n打开面板报文监视:\r\n");
  397. break;
  398. case '8':
  399. g_print_can_monitor = 1;
  400. g_print_to_net = 1;
  401. break;
  402. case 'A':
  403. case 'a':
  404. g_print_to_net = 1;
  405. #ifdef ENCRYPT_SM2
  406. InitSM2Key();
  407. rt_printf("\r\n公钥保存成功\r\n");
  408. #else
  409. rt_printf("\r\n不支持SM2加密\r\n");
  410. #endif
  411. break;
  412. case 'B':
  413. case 'b':
  414. g_print_sys = 1;
  415. g_print_to_net = 1;
  416. #ifdef ENCRYPT_SM2
  417. encrypt_test();
  418. #else
  419. rt_printf("\r\n不支持SM2加密\r\n");
  420. #endif
  421. break;
  422. case 'C':
  423. case 'c':
  424. g_print_to_net = 1;
  425. g_soe_test = 1;
  426. break;
  427. case 'D':
  428. case 'd':
  429. g_print_to_net = 1;
  430. rt_printf("\r\n系统重新启动\r\n");
  431. Delayms(dTCounter, T_1s);
  432. watchdog_reset_cpu(4);
  433. break;
  434. case 'E':
  435. case 'e':
  436. g_print_to_net = 1;
  437. tbl_printf_cvs();
  438. break;
  439. case 'f':
  440. case 'F':
  441. g_print_lnk = 1;
  442. g_print_to_net = 1;
  443. chn = _net_debug_get_chn();
  444. rt_printf("\r\n打开级联报文监视[chn=%d]:\r\n", chn);
  445. break;
  446. case 'J':
  447. case 'j':
  448. {
  449. extern void iec_printfihertset(void);
  450. g_print_to_net = 1;
  451. rt_printf("\r\n-----配电终端固有参数-----------\r\n");
  452. iec_printfixedset();
  453. g_print_dd = 1;
  454. }
  455. break;
  456. case 'h':
  457. case 'H':
  458. {
  459. g_print_to_net = 1;
  460. g_print_lnk = 1;
  461. lnk_read_test_file();
  462. }
  463. break;
  464. case 'i':
  465. case 'I':
  466. {
  467. g_print_to_net = 1;
  468. g_print_lnk = 1;
  469. lnk_write_test_file();
  470. }
  471. case 'G':
  472. case 'g':
  473. g_print_goose = 1;
  474. g_print_to_net = 1;
  475. g_print_port = -1;
  476. //_net_debug_get_chn();
  477. rt_printf("\r\n打开goose报文监视:\r\n");
  478. break;
  479. case 'k':
  480. case 'K':
  481. g_print_to_net = 1;
  482. ret = del_history_file(HS_FILE_SOE);
  483. if (!ret)
  484. {
  485. ret = create_event_rcd_file(HS_FILE_SOE);
  486. }
  487. if (!ret)
  488. {
  489. rt_printf("新生成soe.msg文件成功\r\n");
  490. }
  491. else
  492. {
  493. rt_printf("新生成soe.msg文件失败\r\n");
  494. }
  495. break;
  496. case 'l':
  497. case 'L':
  498. g_print_to_net = 1;
  499. ret = del_history_file(HS_FILE_CO);
  500. if (!ret)
  501. {
  502. ret = create_event_rcd_file(HS_FILE_CO);
  503. }
  504. if (!ret)
  505. {
  506. rt_printf("新生成co.msg文件成功\r\n");
  507. }
  508. else
  509. {
  510. rt_printf("新生成co.msg文件失败\r\n");
  511. }
  512. break;
  513. case 'M':
  514. case 'm':
  515. g_print_to_net = 1;
  516. SaveUqua(true);
  517. rt_printf("\r\n电压合格率清零\r\n");
  518. break;
  519. case 'N':
  520. case 'n':
  521. g_print_to_net = 1;
  522. {
  523. int sw;
  524. for (sw = 0; sw < SWITCH_NUM_MAX; sw++)
  525. {
  526. g_sw[sw].ac_in[SW_AC_IN_IMP1] = 0;
  527. g_sw[sw].ac_in[SW_AC_IN_IMP2] = 0;
  528. }
  529. }
  530. rt_printf("\r\n脉冲计数率清零\r\n");
  531. break;
  532. case 'P':
  533. case 'p':
  534. {
  535. void app_goose_inf_print(void);
  536. g_print_to_net = 1;
  537. #ifdef __IEC61850_GOOSE_FUNC__
  538. app_goose_inf_print();
  539. #endif
  540. }
  541. break;
  542. case 'Q':
  543. case 'q':
  544. {
  545. void mmd_create_menufile(void);
  546. g_print_to_net = 1;
  547. mmd_create_menufile();
  548. rt_printf("\r\n/app/data/lcd_menu.csv 菜单定义文件已生成\r\n");
  549. }
  550. break;
  551. case 'r':
  552. {
  553. g_print_to_net = 1;
  554. dt_cmd_rt();
  555. }
  556. break;
  557. case 'S':
  558. {
  559. g_print_to_net = 1;
  560. dt_cmd_adc();
  561. }
  562. break;
  563. case 's':
  564. {
  565. g_print_to_net = 1;
  566. dt_cmd_rt_reset();
  567. }
  568. break;
  569. #ifdef CAN_SLAVE_BOARD
  570. case 'R':
  571. case 'r':
  572. {
  573. g_print_to_net = 1;
  574. can_id_printf();
  575. }
  576. break;
  577. case 'S':
  578. case 's':
  579. {
  580. sb_metering = true;
  581. g_print_to_net = 1;
  582. can_metering_calib(g_tDebug.arrRecvBuf);
  583. }
  584. break;
  585. case 'T':
  586. case 't':
  587. {
  588. g_print_to_net = 1;
  589. can_app_energy_clear(0, get_can_slot(0));
  590. }
  591. break;
  592. case 'U':
  593. case 'u':
  594. {
  595. g_print_to_net = 1;
  596. can_id_printf();
  597. }
  598. break;
  599. #endif
  600. case 'v':
  601. {
  602. g_print_to_net = 1;
  603. printf_myRmtSetArray();
  604. }
  605. break;
  606. case 'w':
  607. {
  608. g_print_to_net = 1;
  609. enable_lb_zero_adjust();
  610. }
  611. break;
  612. default:
  613. #ifdef CAN_SLAVE_BOARD
  614. ret = 0;
  615. g_print_to_net = 1;
  616. if (sb_metering)
  617. {
  618. ret = can_metering_calib(g_tDebug.arrRecvBuf);
  619. }
  620. if (!ret)
  621. #endif
  622. {
  623. _net_debug_print_reset();
  624. net_debug_send((unsigned char *)main_Debug, sizeof(main_Debug));
  625. g_print_sys = false;
  626. }
  627. break;
  628. }
  629. _net_debug_recv_reset();
  630. }
  631. void print_mem_net(char *addr, unsigned char *pd, int lenth)
  632. {
  633. BYTE i, j;
  634. char buf[128], tempstr[8];
  635. if (addr != NULL)
  636. {
  637. sprintf(buf, "%s", addr);
  638. rt_printf(buf);
  639. }
  640. strcpy(buf, "");
  641. for (i = 0, j = 0; i < lenth; i++)
  642. {
  643. sprintf(tempstr, "%02X ", *pd++);
  644. strcat(buf, tempstr);
  645. j++;
  646. if (j > 18)
  647. {
  648. rt_printf(buf);
  649. strcpy(buf, "\r\n ");
  650. j = 0;
  651. }
  652. }
  653. if (j > 0)
  654. {
  655. rt_printf(buf);
  656. }
  657. rt_printf("\r\n");
  658. }
  659. /*------------------------------ 内部函数 -------------------------------------
  660. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  661. */
  662. void _net_debug_recv_reset(void)
  663. {
  664. g_tDebug.cTypeCounter = 0;
  665. g_tDebug.cRecvCnt = 0;
  666. }
  667. void _net_debug_print_reset(void)
  668. {
  669. g_print_to_net = 0;
  670. g_print_time = 0;
  671. g_print_101 = 0;
  672. g_print_104 = 0;
  673. g_print_lnk = 0;
  674. g_print_hmi = 0;
  675. g_print_can = 0;
  676. g_print_can_monitor = 0;
  677. g_print_sys = 0;
  678. g_print_dd = 0;
  679. g_print_comm_raw = 0;
  680. g_print_port = -1;
  681. g_test_on = 0;
  682. g_print_goose = 0;
  683. }
  684. void _net_debug_recv(BYTE cRcvData)
  685. {
  686. if (g_tDebug.bData)
  687. {
  688. return;
  689. }
  690. // xshell 发送的保活状态消息
  691. if (cRcvData == 0xff || cRcvData == 0xf1)
  692. {
  693. return;
  694. }
  695. // rt_printf("cRcvData=%02x\r\n",cRcvData);
  696. g_tDebug.arrRecvBuf[g_tDebug.cRecvCnt++] = cRcvData;
  697. if (cRcvData == 0x0d)
  698. {
  699. g_tDebug.bData = true;
  700. }
  701. if (g_tDebug.cRecvCnt >= UART_FRAME_LEN)
  702. {
  703. _net_debug_recv_reset();
  704. return;
  705. }
  706. return;
  707. }
  708. #ifdef LINUX_KERNEL_APP
  709. int _net_debug_thread_send(void *unused)
  710. {
  711. while (1)
  712. {
  713. msleep(100);
  714. // 检查是否退出
  715. if (g_net_debug_send_exit_flag)
  716. {
  717. g_net_debug_send_exit_flag = 0;
  718. return 0;
  719. }
  720. // noted by sunxi: 20220701 统一冷火和335x,有信号量,才往下执行
  721. if (down_interruptible(&g_print_sem) < 0)
  722. {
  723. continue;
  724. }
  725. rt_printf_fifo_get(1);
  726. }
  727. return 0;
  728. }
  729. #endif
  730. /*
  731. noted by sunxi:20220825 335x 修复 6000端口超时或断开后,不能重连的问题
  732. */
  733. int _net_debug_thread_recv(void *unused)
  734. {
  735. struct sockaddr_in server_addr;
  736. struct sockaddr_in client_addr;
  737. struct linger ling;
  738. #ifndef LINUX_KERNEL_APP
  739. struct timeval timeout;
  740. #endif
  741. SOCKET sk_server, tmp_sock;
  742. int sin_size;
  743. int i, len, ret;
  744. unsigned char *ip;
  745. #ifdef LINUX_KERNEL_APP
  746. unsigned int recv_timeout;
  747. unsigned int link_timeout = dTCounter;
  748. #else
  749. int recv_timeout;
  750. int link_timeout = 0;
  751. #endif
  752. unsigned int ip_server;
  753. // while(1) //noted by sunxi:20220825 335x 修复 6000端口超时或断开后,不能重连的问题
  754. // {
  755. NET_BEGIN:
  756. // 1、建立socket并侦听
  757. // 服务器端开始建立socket描述符
  758. #ifdef LINUX_KERNEL_APP
  759. sk_server = rt_socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
  760. #else
  761. sk_server = rt_socket(AF_INET, SOCK_STREAM, 0);
  762. #endif
  763. if (sk_server == RT_SOCKET_ERR)
  764. {
  765. RT_PRINTF_POSITION();
  766. g_ts_debug_recv = NULL;
  767. return -1;
  768. }
  769. // 服务器端填充sockaddr结构
  770. memset(&server_addr, 0, sizeof(struct sockaddr_in));
  771. server_addr.sin_family = AF_INET;
  772. if (get_mt_port_proc() == NET_MT_PORT_PROC_2)
  773. {
  774. if (rt_if_ip_get2(0, 3, (unsigned char *)&ip_server) == 0)
  775. {
  776. server_addr.sin_addr.s_addr = htonl(ip_server);
  777. }
  778. else
  779. {
  780. server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  781. }
  782. }
  783. else
  784. {
  785. server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  786. }
  787. server_addr.sin_port = htons(NET_DEBUG_PORT);
  788. // 捆绑sockfd描述符
  789. ret = rt_bind(sk_server, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));
  790. if (ret < 0)
  791. {
  792. RT_PRINTF_POSITION();
  793. rt_socket_close(sk_server);
  794. g_ts_debug_recv = NULL;
  795. return -2;
  796. }
  797. // 监听sockfd描述符
  798. ret = rt_listen(sk_server, 1);
  799. if (ret < 0)
  800. {
  801. RT_PRINTF_POSITION();
  802. rt_socket_close(sk_server);
  803. g_ts_debug_recv = NULL;
  804. return -3;
  805. }
  806. #ifndef LINUX_KERNEL_APP
  807. // 设置接收超时
  808. timeout.tv_sec = 0;
  809. timeout.tv_usec = 500000;
  810. rt_setsockopt(sk_server, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));
  811. #endif
  812. // 设置关闭延时
  813. ling.l_onoff = 1;
  814. ling.l_linger = 0;
  815. rt_setsockopt(sk_server, SOL_SOCKET, SO_LINGER, (char *)&ling, sizeof(struct linger));
  816. prctl(PR_SET_NAME, "_net_debug_recv");
  817. while (1) // noted by sunxi:20220825 335x 修复 6000端口超时或断开后,不能重连的问题
  818. {
  819. g_debug_client = RT_SOCKET_ACCEPT_RST;
  820. // 2、接受外部链接
  821. #ifdef RT_SOCKET_FD
  822. while (g_debug_client < 0)
  823. #else
  824. while (g_debug_client == RT_SOCKET_ACCEPT_RST)
  825. #endif
  826. {
  827. msleep(100);
  828. // 服务器阻塞,直到客户程序建立连接
  829. sin_size = sizeof(struct sockaddr_in);
  830. g_debug_client = rt_accept(sk_server, (struct sockaddr *)(&client_addr), &sin_size);
  831. // 检查是否退出
  832. // if(kthread_should_stop())
  833. if (g_net_debug_recv_exit_flag)
  834. {
  835. // 关闭客户端
  836. if (g_debug_client != RT_SOCKET_ERR)
  837. {
  838. tmp_sock = g_debug_client;
  839. g_debug_client = RT_SOCKET_ERR;
  840. rt_socket_close(tmp_sock);
  841. }
  842. // 关闭服务器
  843. rt_socket_close(sk_server);
  844. g_net_debug_recv_exit_flag = 0;
  845. return 0;
  846. }
  847. // IP已经修改要关闭SOCKET
  848. if (g_net_debug_sock_flag == NET_SOCKET_CLOSING)
  849. {
  850. // 关闭客户端
  851. if (g_debug_client != RT_SOCKET_ERR)
  852. {
  853. tmp_sock = g_debug_client;
  854. g_debug_client = RT_SOCKET_ERR;
  855. rt_socket_close(tmp_sock);
  856. }
  857. // 关闭服务器
  858. rt_socket_close(sk_server);
  859. // 置已经关闭标志
  860. g_net_debug_sock_flag = NET_SOCKET_CLOSED;
  861. // 等待IP修改完成
  862. while (g_net_debug_sock_flag != NET_SOCKET_REINIT)
  863. {
  864. msleep(100);
  865. }
  866. // 置为初始化
  867. g_net_debug_sock_flag = NET_SOCKET_INIT;
  868. goto NET_BEGIN;
  869. }
  870. }
  871. // 3、关闭侦听socket,避免多个外部连接
  872. // rt_shutdown(sk_server, SHUT_RDWR);
  873. // rt_socket_close(sk_server); //noted by sunxi:20220825 335x 修复 6000端口超时或断开后,不能重连的问题
  874. ip = (unsigned char *)&client_addr.sin_addr.s_addr;
  875. rt_printf("debug client connect(ip=%d.%d.%d.%d)!\r\n", ip[0], ip[1], ip[2], ip[3]);
  876. {
  877. char buf[64];
  878. char log_info[128];
  879. sprintf(buf, "6000端口连接(%d#网络:IP=%d.%d.%d.%d)!\r\n", set_get_network_id_from_socket(g_debug_client) + 1, ip[0], ip[1], ip[2], ip[3]);
  880. log_str_time(LOG_OPERATE, buf, 0, 1);
  881. sprintf(log_info, "6000 port connection(%d#net:IP=%d.%d.%d.%d)", set_get_network_id_from_socket(g_debug_client) + 1, ip[0], ip[1], ip[2], ip[3]);
  882. load_hs_log_rcd(TYPE_CHNL_LINK, true, NULL, log_info, 1);
  883. }
  884. // 4、客户端已连接,处理客户端命令
  885. #ifdef LINUX_KERNEL_APP
  886. recv_timeout = dTCounter;
  887. #else
  888. recv_timeout = 0;
  889. #endif
  890. while (1)
  891. {
  892. #ifdef LINUX_KERNEL_APP
  893. msleep(2); // noted by sunxi: 20221212 设为非阻塞型
  894. len = rt_recv(g_debug_client, g_net_debug_buf, NET_RECV_MAX, MSG_DONTWAIT);
  895. #else
  896. len = rt_recv(g_debug_client, g_net_debug_buf, NET_RECV_MAX, 0);
  897. #endif
  898. // 检查是否退出
  899. if (g_net_debug_recv_exit_flag)
  900. {
  901. // 关闭客户端
  902. tmp_sock = g_debug_client;
  903. g_debug_client = RT_SOCKET_ERR;
  904. rt_socket_close(tmp_sock);
  905. // 关闭服务器
  906. rt_socket_close(sk_server); // noted by sunxi:20220825 335x 修复 6000端口超时或断开后,不能重连的问题
  907. g_net_debug_recv_exit_flag = 0;
  908. return 0;
  909. }
  910. // IP已经修改要关闭SOCKET
  911. if (g_net_debug_sock_flag == NET_SOCKET_CLOSING)
  912. {
  913. // 关闭客户端
  914. tmp_sock = g_debug_client;
  915. g_debug_client = RT_SOCKET_ERR;
  916. rt_socket_close(tmp_sock);
  917. // 关闭服务器
  918. rt_socket_close(sk_server); // noted by sunxi:20220825 335x 修复 6000端口超时或断开后,不能重连的问题
  919. // 置已经关闭标志
  920. g_net_debug_sock_flag = NET_SOCKET_CLOSED;
  921. // 等待IP修改完成
  922. while (g_net_debug_sock_flag != NET_SOCKET_REINIT)
  923. {
  924. msleep(100);
  925. }
  926. // 置为初始化
  927. g_net_debug_sock_flag = NET_SOCKET_INIT;
  928. goto NET_BEGIN;
  929. }
  930. #ifdef LINUX_KERNEL_APP
  931. if (len == -EAGAIN)
  932. #else
  933. if ((len == -EAGAIN) || (len == -1)) // 使用linux的recvfrom没有接收到数据时返回-1 jack.liu 20200916
  934. #endif
  935. {
  936. if (rt_get_net_linkstatus(rt_get_netcard_id_from_socket(g_debug_client)) == 1)
  937. {
  938. #ifdef LINUX_KERNEL_APP
  939. if ((dTCounter - link_timeout) > RT_LINK_TIMEOUT * T_1s) // 500ms超时
  940. #else
  941. link_timeout++;
  942. if (link_timeout > RT_LINK_TIMEOUT * 2) // 500ms超时
  943. #endif
  944. {
  945. rt_printf("%s: link down\n", __FUNCTION__);
  946. #ifdef LINUX_KERNEL_APP
  947. link_timeout = dTCounter;
  948. #else
  949. link_timeout = 0;
  950. #endif
  951. break;
  952. }
  953. }
  954. else
  955. {
  956. #ifdef LINUX_KERNEL_APP
  957. link_timeout = dTCounter;
  958. #else
  959. link_timeout = 0;
  960. #endif
  961. }
  962. // 超时
  963. #ifdef LINUX_KERNEL_APP
  964. if ((dTCounter - recv_timeout) > 120 * T_1s) // 超时2分钟,端口未收到数据,关闭端口
  965. #else
  966. recv_timeout++;
  967. if (recv_timeout > 240) // 超时2分钟,端口未收到数据,关闭端口
  968. #endif
  969. {
  970. rt_printf("net_debug_thread:timeout\r\n");
  971. break;
  972. }
  973. continue;
  974. }
  975. #ifdef LINUX_KERNEL_APP
  976. else if (len <= 0)
  977. #else
  978. else if ((len == 0) || (len < -1)) // 使用linux的recvfrom没有接收到数据时返回-1 jack.liu 20200916
  979. #endif
  980. {
  981. // 调用recv时,如果返回0,则表示对端关闭;返回负数,表示出错
  982. rt_printf("net_debug_thread:peer close(ret=%d).\r\n", len);
  983. msleep(100);
  984. break;
  985. }
  986. // 接收数据
  987. #ifdef LINUX_KERNEL_APP
  988. recv_timeout = dTCounter;
  989. link_timeout = dTCounter;
  990. #else
  991. recv_timeout = 0;
  992. link_timeout = 0;
  993. #endif
  994. for (i = 0; i < len; i++)
  995. {
  996. _net_debug_recv(g_net_debug_buf[i]);
  997. }
  998. g_tDebug.bNet = true;
  999. }
  1000. // 复位调试打印信息
  1001. _net_debug_print_reset();
  1002. // 关闭客户端socket
  1003. tmp_sock = g_debug_client;
  1004. g_debug_client = RT_SOCKET_ERR;
  1005. {
  1006. char buf[64];
  1007. sprintf(buf, "6000端口关闭(%d#网络:IP=%d.%d.%d.%d)!\r\n", set_get_network_id_from_socket(tmp_sock) + 1, ip[0], ip[1], ip[2], ip[3]);
  1008. log_str_time(LOG_OPERATE, buf, 0, 0);
  1009. load_hs_log_rcd(TYPE_CHNL_LINK, true, NULL, "6000 port disconnection", 0);
  1010. }
  1011. rt_socket_close(tmp_sock);
  1012. }
  1013. // 理论上,程序不会运行到这儿
  1014. return 0;
  1015. }
  1016. /*------------------------------ 测试函数 -------------------------------------
  1017. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  1018. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  1019. */
  1020. /*------------------------------ 文件结束 -------------------------------------
  1021. */