updatez.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <unistd.h> // close()
  5. #include <string.h> // strcpy, memset(), and memcpy()
  6. #include <stdarg.h>
  7. #include <errno.h> // errno, perror()
  8. #include <stdbool.h>
  9. #include <pthread.h>
  10. #include <semaphore.h>
  11. #include <math.h>
  12. #include <dirent.h>
  13. #include <fcntl.h>
  14. #include <signal.h>
  15. #include <getopt.h>
  16. #include <termios.h>
  17. #include <netdb.h> // struct addrinfo
  18. #include <sys/stat.h>
  19. #include <sys/ioctl.h> // macro ioctl is defined
  20. #include <bits/ioctls.h> // defines values for argument "request" of ioctl.
  21. #include <sys/syscall.h>
  22. #include <sys/types.h> // needed for socket(), uint8_t, uint16_t, uint32_t
  23. #include <sys/select.h>
  24. #include <sys/socket.h> // needed for socket()
  25. #include <sys/time.h>
  26. #include <sys/ipc.h>
  27. #include <sys/sem.h>
  28. #include <libgen.h>
  29. #include <netinet/in.h> // IPPROTO_ICMP, INET_ADDRSTRLEN
  30. #include <netinet/ip.h> // struct ip and IP_MAXPACKET (which is 65535)
  31. #include <netinet/ip_icmp.h> // struct icmp, ICMP_ECHO
  32. #include <arpa/inet.h> // inet_pton() and inet_ntop()
  33. #include <net/if.h> // struct ifreq
  34. #include <net/ethernet.h>
  35. #include <linux/if_ether.h> // ETH_P_IP = 0x0800, ETH_P_IPV6 = 0x86DD
  36. #include <linux/if_packet.h> // struct sockaddr_ll (see man 7 packet)
  37. #include <linux/serial.h>
  38. #include <linux/can.h>
  39. #include <linux/can/raw.h>
  40. typedef enum
  41. {
  42. ACCEPTED,
  43. REJECTED,
  44. SUCCESS,
  45. FAIL,
  46. IDLE,
  47. UPDATING,
  48. }state_t;
  49. typedef struct update
  50. {
  51. int quit;
  52. int fd;
  53. int state;
  54. struct sockaddr_in peer_addr;
  55. socklen_t peer_addrlen;
  56. uint8_t rxbuff[1024];
  57. int rxbyte;
  58. uint8_t txbuff[1024];
  59. int txbyte;
  60. int filesize;
  61. int majorVersion;
  62. int minorVersion;
  63. int buildVersion;
  64. int major;
  65. int minor;
  66. int build;
  67. char ip_string[64];
  68. int port;
  69. FILE *logfp;
  70. }update_t;
  71. static update_t update =
  72. {
  73. .fd = -1,
  74. .logfp = NULL
  75. };
  76. #define printd(fmt, ...) printf("%s:%d, %s | "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
  77. // #define printd(fmt, ...) fprintf(dev->logfp, "%s:%d, %s | "fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
  78. int android_RequestUpdateFirmware(update_t* dev,int major, int minor, int build);
  79. int wait_android_message(update_t* dev)
  80. {
  81. dev->rxbyte = 0;
  82. while(dev->rxbyte < 1024)
  83. {
  84. int ret = recv(dev->fd, &dev->rxbuff[dev->rxbyte], 1, 0);
  85. if (ret <= 0) {
  86. printd("ret:%d, errno:%d\n", ret, errno);
  87. shutdown(dev->fd, SHUT_RDWR);
  88. close(dev->fd);
  89. dev->fd = -1;
  90. return -1;
  91. }
  92. if (ret > 0) dev->rxbyte += ret;
  93. if (dev->rxbyte>=5)
  94. {
  95. if (strncmp(dev->rxbuff, "Event", 5)==0)
  96. {
  97. if (dev->rxbuff[dev->rxbyte-1] == '\n')
  98. {
  99. return 0;
  100. }
  101. }else{
  102. memmove(&dev->rxbuff[0], &dev->rxbuff[1], dev->rxbyte - 1);
  103. dev->rxbyte = dev->rxbyte - 1;
  104. }
  105. }
  106. }
  107. return -1;
  108. }
  109. int android_LoadVersion(update_t* dev, const char* filename)
  110. {
  111. char filebuff[256];
  112. dev->major = dev->major = dev->build = 0;
  113. memset(filebuff,0,sizeof(filebuff));
  114. int ret = readlink(filename, filebuff, sizeof(filebuff));
  115. printd("%s\n",filebuff);
  116. if (ret > 0)
  117. {
  118. // char* basename_str = strchr(filebuff, '/');
  119. // if (basename_str)
  120. {
  121. sscanf(filebuff, "app_XHHW_%d_%d_%d", &dev->major, &dev->minor, &dev->build);
  122. }
  123. printd("dev->major =%d, dev->minor=%d, dev->build=%d\n",dev->major,dev->minor,dev->build);
  124. }
  125. return 0;
  126. }
  127. int android_DowanloadFile(update_t* dev, const char* filename)
  128. {
  129. printd("write %s\n",filename);
  130. FILE *fp = fopen(filename, "w");
  131. if (fp)
  132. {
  133. dev->state = UPDATING;
  134. int recved = 0;
  135. printd("this =%d,%d\n",__LINE__,dev->filesize);
  136. android_RequestUpdateFirmware(dev,dev->majorVersion, dev->minorVersion, dev->buildVersion);
  137. while(recved < dev->filesize)
  138. {
  139. int len = dev->filesize - recved;
  140. if (len > 1024) len = 1024;
  141. int ret = recv(dev->fd, dev->rxbuff, len, 0);
  142. printd("recved =%d\n",recved);
  143. if (ret <= 0) {
  144. printd("ret:%d, errno:%d\n", ret, errno);
  145. shutdown(dev->fd, SHUT_RDWR);
  146. close(dev->fd);
  147. dev->fd = -1;
  148. return -1;
  149. }
  150. if (ret > 0) recved += ret;
  151. fwrite(dev->rxbuff, ret, 1, fp);
  152. }
  153. if (recved == dev->filesize)
  154. {
  155. dev->state = SUCCESS;
  156. printd("recv success\n");
  157. }else{
  158. dev->state = FAIL;
  159. printd("recv fail\n");
  160. }
  161. fclose(fp);
  162. return 0;
  163. }
  164. return -1;
  165. }
  166. int android_Upgrade(update_t* dev, const char* oldfilename, const char* newfilename)
  167. {
  168. int ret ;
  169. if (dev->state == SUCCESS)
  170. {
  171. int idx = 0;
  172. char cmdbuff[256];
  173. memset(cmdbuff,0,sizeof(cmdbuff));
  174. idx += sprintf(&cmdbuff[idx], "pkill app_XHHW\n");
  175. idx += sprintf(&cmdbuff[idx], "chmod +x %s\n", newfilename);
  176. idx += sprintf(&cmdbuff[idx], "rm -f %s\n", oldfilename);
  177. idx += sprintf(&cmdbuff[idx], "ln -s %s %s\n", newfilename, oldfilename);
  178. idx += sprintf(&cmdbuff[idx], "sync\n");
  179. idx += sprintf(&cmdbuff[idx], "reboot\n");
  180. ret = system(cmdbuff);
  181. printf( "ret = %d, cmd = %s\n", ret, cmdbuff);
  182. // sleep(1);
  183. // memset(cmdbuff,0,sizeof(cmdbuff));
  184. // sprintf(cmdbuff, "chmod +x %s", newfilename);ret = system(cmdbuff);
  185. // printf( "ret = %d, cmd = %s\n", ret, cmdbuff);
  186. // sleep(1);
  187. // memset(cmdbuff,0,sizeof(cmdbuff));
  188. // sprintf(cmdbuff, "rm -f %s", oldfilename); ret = system(cmdbuff);
  189. // printf( "ret = %d, cmd = %s\n", ret, cmdbuff);
  190. // ret = unlink(oldfilename);
  191. // printf( "ret = %d, unlink = %s\n", ret, cmdbuff);
  192. // sleep(1);
  193. // memset(cmdbuff,0,sizeof(cmdbuff));
  194. // sprintf(cmdbuff, "ln -s %s %s", newfilename, oldfilename);ret = system(cmdbuff);
  195. // printf( "ret = %d, cmd = %s\n", ret, cmdbuff);
  196. // sprintf( cmdbuff, "/home/root/hmi.sh");system(cmdbuff);
  197. // chmod(filename, S_IRUSR|S_IWUSR|S_IXUSR | S_IXGRP|S_IRGRP|S_IXGRP | S_IROTH|S_IWOTH|S_IXOTH);
  198. // unlink(newfilename);
  199. // symlink(filename, newfilename);
  200. dev->state = IDLE;
  201. return 0;
  202. }
  203. return -1;
  204. }
  205. int android_NotifyUpdateFirmware_res(update_t* dev, const char* status)
  206. {
  207. int len = sprintf(dev->txbuff, "Event=NotifyUpdateFirmware,Type=HW,Status=%s,Message=NONE\n", status);
  208. printd("%s\n",dev->txbuff);
  209. if (dev->fd > 0)
  210. return send(dev->fd, dev->txbuff, len, 0);
  211. else
  212. return -1;
  213. }
  214. int android_RequestUpdateFirmware(update_t* dev,int major, int minor, int build)
  215. {
  216. int len = sprintf(dev->txbuff, "Event=UpdateFirmware,Type=HW,Version=%d.%d.%d\n",major, minor, build);
  217. printd("%s\n",dev->txbuff);
  218. if (dev->fd > 0)
  219. return send(dev->fd, dev->txbuff, len, 0);
  220. else
  221. return -1;
  222. }
  223. int android_NotifyUpdateFirmwareResult_res(update_t* dev, const char* status,int major, int minor, int build)
  224. {
  225. int len = sprintf(dev->txbuff, "Event=NotifyUpdateFirmwareResult,Type=HW,Status=%s,Version=%d.%d.%d,Message=NONE\n", status, major, minor, build);
  226. printd("%s\n",dev->txbuff);
  227. if (dev->fd > 0)
  228. return send(dev->fd, dev->txbuff, len, 0);
  229. else
  230. return -1;
  231. }
  232. int android_GetFirmwareVersion_res(update_t* dev, int major, int minor, int build)
  233. {
  234. int len = sprintf(dev->txbuff, "Event=GetFirmwareVersion,Type=HW,Version=%d.%d.%d\n", major, minor, build);
  235. printd("%s\n",dev->txbuff);
  236. if (dev->fd > 0)
  237. return send(dev->fd, dev->txbuff, len, 0);
  238. else
  239. return -1;
  240. }
  241. int android_connect(update_t *dev)
  242. {
  243. if (dev)
  244. {
  245. while (dev->fd < 0)
  246. {
  247. dev->fd = socket(AF_INET, SOCK_STREAM, 0);
  248. dev->peer_addr.sin_family = AF_INET;
  249. dev->peer_addr.sin_addr.s_addr = inet_addr(dev->ip_string);
  250. dev->peer_addr.sin_port = htons(dev->port);
  251. dev->peer_addrlen = sizeof(dev->peer_addr);
  252. int ret = connect(dev->fd, (struct sockaddr*)&dev->peer_addr, dev->peer_addrlen);
  253. if (ret >= 0)
  254. {
  255. printd("local socket connect to %s.%d ok.\n", dev->ip_string, dev->port);
  256. return 0;
  257. }else{
  258. printd("local socket connect to %s.%d failed.\n", dev->ip_string, dev->port);
  259. close(dev->fd);
  260. dev->fd = -1;
  261. }
  262. sleep(1);
  263. }
  264. }
  265. return -1;
  266. }
  267. void* xh_update_loop(void* argv)
  268. {
  269. update_t *dev = (update_t*)argv;
  270. while(dev->quit == 0)
  271. {
  272. if (wait_android_message(dev) == 0)
  273. {
  274. printd("%s\n",dev->rxbuff);
  275. if (strncmp(dev->rxbuff, "Event=NotifyUpdateFirmware,Type=HW", 34)==0)
  276. {
  277. printd("update cmd\n");
  278. char newfilename[256];
  279. char oldfilename[256];
  280. memset(newfilename,0,sizeof(newfilename));
  281. memset(oldfilename,0,sizeof(oldfilename));
  282. sprintf(oldfilename, "/home/root/bin/app_XHHW");
  283. sscanf(dev->rxbuff, "Event=NotifyUpdateFirmware,Type=HW,Size=%d,Version=%d.%d.%d\n", &dev->filesize, &dev->majorVersion, &dev->minorVersion, &dev->buildVersion);
  284. sprintf(newfilename, "/home/root/bin/app_XHHW_%d_%d_%d", dev->majorVersion, dev->minorVersion, dev->buildVersion);
  285. if (dev->major != dev->majorVersion || dev->minor!=dev->minorVersion || dev->build!=dev->buildVersion)
  286. {
  287. android_NotifyUpdateFirmware_res(dev, "Accepted");
  288. sleep(1);
  289. if (android_DowanloadFile(dev, newfilename)==0)
  290. {
  291. printd("android_DowanloadFile==0\n");
  292. if (android_Upgrade(dev, oldfilename, newfilename)==0)
  293. {
  294. dev->major = dev->majorVersion;
  295. dev->minor = dev->minorVersion;
  296. dev->build = dev->buildVersion;
  297. android_NotifyUpdateFirmwareResult_res(dev, "Success", dev->majorVersion, dev->minorVersion, dev->buildVersion);
  298. }
  299. printd("android_DowanloadFile==1\n");
  300. }else{
  301. printd("android_DowanloadFile==2\n");
  302. android_NotifyUpdateFirmwareResult_res(dev, "Fail", dev->majorVersion, dev->minorVersion, dev->buildVersion);
  303. }
  304. }else {
  305. android_NotifyUpdateFirmware_res(dev, "Rejected");
  306. }
  307. }
  308. if (strncmp(dev->rxbuff, "Event=NotifyUpdateFirmwareResult,Type=HW", 40)==0)
  309. {
  310. continue;
  311. }
  312. if (strncmp(dev->rxbuff, "Event=GetFirmwareVersion,Type=HW", 32)==0)
  313. {
  314. android_GetFirmwareVersion_res(dev, dev->major, dev->minor, dev->build);
  315. }
  316. }
  317. }
  318. return NULL;
  319. }
  320. int xh_update_init(update_t *dev)
  321. {
  322. if (dev)
  323. {
  324. // dev->logfp = fopen("/home/root/bin/log.txt", "w");
  325. android_connect(dev);
  326. android_LoadVersion(dev, "/home/root/bin/app_XHHW");
  327. }
  328. return -1;
  329. }
  330. void xh_update_exit(update_t *dev)
  331. {
  332. if (dev)
  333. {
  334. dev->quit = 1;
  335. close(dev->fd);
  336. dev->fd = -1;
  337. }
  338. }
  339. int main(int argc, char* argv[])
  340. {
  341. sleep(10);
  342. update_t* dev = (update_t*)&update;
  343. {
  344. int c;
  345. dev->port = 20248;
  346. sprintf(dev->ip_string, "%s", "192.168.223.10");
  347. while ((c = getopt(argc, argv, "ip:")) != -1) {
  348. switch (c) {
  349. case 'i':
  350. sprintf(dev->ip_string, "%s", optarg);
  351. break;
  352. case 'p':
  353. dev->port = atoi(optarg);
  354. break;
  355. case '?':
  356. break;
  357. default:
  358. exit(2);
  359. }
  360. }
  361. xh_update_init(dev);
  362. xh_update_loop(dev);
  363. xh_update_exit(dev);
  364. }
  365. return 0;
  366. }