broadcast.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <signal.h>
  9. #include <errno.h>
  10. #include "common.h"
  11. #include "sys.h"
  12. #include "cfg.h"
  13. #include <errno.h>
  14. #include "broadcast.h"
  15. #include "thread.h"
  16. typedef struct {
  17. int broad_sock_fd;
  18. int mul_sock_fd;
  19. struct sockaddr_in broadcast_addr;
  20. struct sockaddr_in bind_addr;
  21. struct ip_mreq mreq;
  22. }broad_cast_t;
  23. static broad_cast_t broad_cast;
  24. extern GlobalDeviceManager __globalDeviceManage;
  25. #define BROADCAST_PORT 31002
  26. #define BROADCAST_INTERVAL 5
  27. #define MAX_MESSAGE_SIZE 1024
  28. #define MULTICAST_PORT 31001
  29. #define MULTICAST_GROUP "224.0.0.88"
  30. static volatile int running = 1;
  31. void signal_handler(int sig) {
  32. running = 0;
  33. printf("\nShutting down...\n");
  34. }
  35. #define TYPE_MESSGE "{"\
  36. "\"version\":\"%s\","\
  37. "\"powerState\":\"on\","\
  38. "\"hostname\":\"%s\","\
  39. "\"product_id\":\"%s\","\
  40. "\"device_name\":\"%s\","\
  41. "\"https\":true,"\
  42. "\"network\":[{"\
  43. "\"hostIP\":\"%s\","\
  44. "\"netmask\":\"%s\","\
  45. "\"gateway\":\"%s\","\
  46. "\"dns1\":\"%s\","\
  47. "\"dns2\":\"%s\","\
  48. "\"mode\":\"%s\","\
  49. "\"autoDNS\":true,"\
  50. "\"macAddress\":\"%s\""\
  51. "}]"\
  52. "}\r\n"
  53. void * broard_thread(void *argc)
  54. {
  55. NetworkInfo_t nw4;
  56. int r4 = sys_get_net(&nw4, IP_V4);
  57. thread_handle_t *h=(thread_handle_t*)argc;
  58. char message[MAX_MESSAGE_SIZE] = {0};
  59. GlobalDeviceManager *mgr = &__globalDeviceManage;
  60. while(h->quit == 0)
  61. {
  62. int len = snprintf(message,sizeof(message),TYPE_MESSGE,
  63. VERSION,
  64. mgr->_globalDevInfo.product.name,
  65. mgr->_globalDevInfo.product.pnumber,
  66. mgr->_globalDevInfo.product.pname,
  67. getLocalIpAddress("eth0"),
  68. getLocalMask("eth0"),
  69. getLocalGateway("eth0"),
  70. nw4.dns1,
  71. nw4.dns2,
  72. nw4.mode == 0 ? "dhcp" : "static",
  73. get_mac_address("eth0"));
  74. ssize_t sent = sendto(broad_cast.broad_sock_fd, message, len, 0, (struct sockaddr *)&(broad_cast.broadcast_addr), sizeof(broad_cast.broadcast_addr));
  75. if (sent < 0) {
  76. fprintf(stderr, "sendto failed (errno %d: %s)\n", errno, strerror(errno));
  77. } else {
  78. printf("Broadcast Discovery message sent (%zd bytes)\n", sent);
  79. }
  80. sleep(BROADCAST_INTERVAL);
  81. }
  82. pthread_exit(NULL);
  83. }
  84. void* broard_mul_thread(void *argc)
  85. {
  86. NetworkInfo_t nw4;
  87. int r4 = sys_get_net(&nw4, IP_V4);
  88. thread_handle_t *h=(thread_handle_t*)argc;
  89. GlobalDeviceManager *mgr = &__globalDeviceManage;
  90. char message[MAX_MESSAGE_SIZE] = {0};
  91. char buffer[1024];
  92. while(h->quit == 0)
  93. {
  94. struct sockaddr_in sender_addr;
  95. socklen_t sender_len = sizeof(sender_addr);
  96. ssize_t received = recvfrom(broad_cast.mul_sock_fd, buffer, sizeof(buffer) - 1, 0,
  97. (struct sockaddr *)&sender_addr, &sender_len);
  98. if (received > 0) {
  99. buffer[received] = '\0';
  100. printf("Received multicast request from %s:%d: %s\n", inet_ntoa(sender_addr.sin_addr), ntohs(sender_addr.sin_port), buffer);
  101. // Check if it's a discovery request
  102. if (strstr(buffer,"\"command\":\"discover\"") != NULL) {
  103. printf("Discovery request received, sending multicast discovery message...\n");
  104. int len = snprintf(message,sizeof(message),TYPE_MESSGE,
  105. VERSION,
  106. mgr->_globalDevInfo.product.name,
  107. mgr->_globalDevInfo.product.pnumber,
  108. mgr->_globalDevInfo.product.pname,
  109. getLocalIpAddress("eth0"),
  110. getLocalMask("eth0"),
  111. getLocalGateway("eth0"),
  112. nw4.dns1,
  113. nw4.dns2,
  114. nw4.mode == 0 ? "dhcp" : "static",
  115. get_mac_address("eth0"));
  116. ssize_t sent = sendto(broad_cast.mul_sock_fd, message, len, 0, (struct sockaddr *)&sender_addr, sizeof(sender_addr));
  117. if (sent < 0) {
  118. fprintf(stderr, "sendto failed (errno %d: %s)\n", errno, strerror(errno));
  119. } else {
  120. printf("Multicast Discovery message sent to %s:%d (%zd bytes)\n", inet_ntoa(sender_addr.sin_addr), ntohs(sender_addr.sin_port), sent);
  121. }
  122. }
  123. } else if (received < 0) {
  124. if (errno != EAGAIN && errno != EWOULDBLOCK) {
  125. fprintf(stderr, "recvfrom failed (errno %d: %s)\n", errno, strerror(errno));
  126. break;
  127. }
  128. }
  129. }
  130. pthread_exit(NULL);
  131. }
  132. void broadcast_init(void)
  133. {
  134. GlobalDeviceManager *mgr = &__globalDeviceManage;
  135. NetworkInfo_t nw4;
  136. int r4 = sys_get_net(&nw4, IP_V4);
  137. if(mgr->_globalDevInfo.broadcast.broad_enable)
  138. {
  139. broad_cast.broad_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
  140. if(broad_cast.broad_sock_fd < 0)
  141. {
  142. perror("socket");
  143. goto faild;
  144. }
  145. int broadcast = 1;
  146. if (setsockopt(broad_cast.broad_sock_fd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) < 0) {
  147. perror("setsockopt SO_BROADCAST");
  148. goto faild1;
  149. }
  150. broad_cast.broadcast_addr.sin_family = AF_INET;
  151. broad_cast.broadcast_addr.sin_port = htons(mgr->_globalDevInfo.broadcast.broadcast_port);
  152. broad_cast.broadcast_addr.sin_addr.s_addr = inet_addr(mgr->_globalDevInfo.broadcast.boardcast_ip);
  153. //create broard thread
  154. thread_start(THREAD_ID_BROADCAST,broard_thread,NULL);
  155. broad_cast.mul_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
  156. if( broad_cast.mul_sock_fd < 0)
  157. goto failed_mul;
  158. int reuse = 1;
  159. if (setsockopt(broad_cast.mul_sock_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {
  160. perror("setsockopt SO_REUSEADDR");
  161. goto failed_mul_1;
  162. }
  163. //struct sockaddr_in bind_addr;
  164. memset(&broad_cast.bind_addr, 0, sizeof(broad_cast.bind_addr));
  165. broad_cast.bind_addr.sin_family = AF_INET;
  166. broad_cast.bind_addr.sin_port = htons(mgr->_globalDevInfo.broadcast.mulcast_port);
  167. broad_cast.bind_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  168. if (bind(broad_cast.mul_sock_fd, (struct sockaddr *)&(broad_cast.bind_addr), sizeof(broad_cast.bind_addr)) < 0) {
  169. perror("bind");
  170. goto failed_mul_1;
  171. }
  172. int ttl = 255;
  173. if (setsockopt(broad_cast.mul_sock_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) {
  174. perror("setsockopt IP_MULTICAST_TTL");
  175. goto failed_mul_1;
  176. }
  177. int loopback = 0;
  178. if (setsockopt(broad_cast.mul_sock_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loopback, sizeof(loopback)) < 0) {
  179. perror("setsockopt IP_MULTICAST_LOOP");
  180. goto failed_mul_1;
  181. }
  182. //struct ip_mreq mreq;
  183. broad_cast.mreq.imr_multiaddr.s_addr = inet_addr(mgr->_globalDevInfo.broadcast.mulcast_ip);
  184. broad_cast.mreq.imr_interface.s_addr = htonl(INADDR_ANY);
  185. if (setsockopt(broad_cast.mul_sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &broad_cast.mreq, sizeof(broad_cast.mreq)) < 0) {
  186. perror("setsockopt IP_ADD_MEMBERSHIP");
  187. /*
  188. char buff[256] = {0};
  189. sprintf(buff,"ip route add default via %s dev eth0",nw4.gateway);
  190. system(buff);
  191. sleep(1);
  192. if (setsockopt(broad_cast.mul_sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &broad_cast.mreq, sizeof(broad_cast.mreq)) < 0) {
  193. perror("setsockopt IP_ADD_MEMBERSHIP");
  194. goto failed_mul_1;
  195. }
  196. */
  197. goto failed_mul_1;
  198. }
  199. struct timeval timeout;
  200. timeout.tv_sec = 1; // 1 second timeout
  201. timeout.tv_usec = 0;
  202. if (setsockopt(broad_cast.mul_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) {
  203. perror("setsockopt SO_RCVTIMEO");
  204. goto failed_mul_1;
  205. }
  206. //create broard mul thread
  207. thread_start(THREAD_ID_MULCAST,broard_mul_thread,NULL);
  208. }
  209. return;
  210. failed_mul_1:
  211. close(broad_cast.mul_sock_fd);
  212. broad_cast.mul_sock_fd = -1;
  213. failed_mul:
  214. return;
  215. faild1:
  216. close(broad_cast.broad_sock_fd);
  217. broad_cast.broad_sock_fd = -1;
  218. faild:
  219. return;
  220. }
  221. void broadcast_deinit(void)
  222. {
  223. if(broad_cast.mul_sock_fd > 0)
  224. {
  225. close(broad_cast.mul_sock_fd);
  226. thread_stop(THREAD_ID_MULCAST);
  227. broad_cast.mul_sock_fd = -1;
  228. }
  229. if(broad_cast.broad_sock_fd > 0)
  230. {
  231. close(broad_cast.broad_sock_fd);
  232. thread_stop(THREAD_ID_BROADCAST);
  233. broad_cast.broad_sock_fd = -1;
  234. }
  235. }
  236. void* broardcast_tread(void* args)
  237. {
  238. int port = BROADCAST_PORT;
  239. char message[MAX_MESSAGE_SIZE] ={0};
  240. // signal(SIGINT, signal_handler);
  241. // signal(SIGTERM, signal_handler);
  242. int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  243. if (sockfd < 0) {
  244. perror("socket");
  245. return NULL;
  246. }
  247. int broadcast = 1;
  248. if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) < 0) {
  249. perror("setsockopt SO_BROADCAST");
  250. close(sockfd);
  251. return NULL;
  252. }
  253. struct sockaddr_in broadcast_addr = {0};
  254. broadcast_addr.sin_family = AF_INET;
  255. broadcast_addr.sin_port = htons(port);
  256. broadcast_addr.sin_addr.s_addr = inet_addr("192.168.1.147");
  257. // char ip[32]={0};
  258. // char mac[32] = {0};
  259. // char mask[32] = {0};
  260. // char gateway[32] = {0};
  261. NetworkInfo_t nw4;
  262. int r4 = sys_get_net(&nw4, IP_V4);
  263. //paras_data_t* para = paras_get();
  264. while (running) {
  265. int len = snprintf(message,sizeof(message),TYPE_MESSGE,VERSION,"SmartPDU","1","",
  266. getLocalIpAddress("eth0"),
  267. getLocalMask("eth0"),
  268. getLocalGateway("eth0"),
  269. nw4.dns1,
  270. nw4.dns2,
  271. nw4.mode == 0 ? "dhcp" : "static",
  272. get_mac_address("eth0"));
  273. ssize_t sent = sendto(sockfd, message, len, 0, (struct sockaddr *)&broadcast_addr, sizeof(broadcast_addr));
  274. if (sent < 0) {
  275. fprintf(stderr, "sendto failed (errno %d: %s)\n", errno, strerror(errno));
  276. } else {
  277. printf("Broadcast Discovery message sent (%zd bytes)\n", sent);
  278. }
  279. sleep(BROADCAST_INTERVAL);
  280. }
  281. close(sockfd);
  282. pthread_exit(NULL);
  283. }
  284. void* multcast_tread(void* args)
  285. {
  286. int port = MULTICAST_PORT;
  287. char message[MAX_MESSAGE_SIZE] = {0};
  288. // signal(SIGINT, signal_handler);
  289. // signal(SIGTERM, signal_handler);
  290. int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  291. if (sockfd < 0) {
  292. return NULL;
  293. }
  294. int reuse = 1;
  295. if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {
  296. perror("setsockopt SO_REUSEADDR");
  297. close(sockfd);
  298. return NULL;
  299. }
  300. struct sockaddr_in bind_addr;
  301. memset(&bind_addr, 0, sizeof(bind_addr));
  302. bind_addr.sin_family = AF_INET;
  303. bind_addr.sin_port = htons(port);
  304. bind_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  305. if (bind(sockfd, (struct sockaddr *)&bind_addr, sizeof(bind_addr)) < 0) {
  306. perror("bind");
  307. close(sockfd);
  308. return NULL;
  309. }
  310. int ttl = 255;
  311. if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) {
  312. perror("setsockopt IP_MULTICAST_TTL");
  313. close(sockfd);
  314. return NULL;
  315. }
  316. int loopback = 0;
  317. if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &loopback, sizeof(loopback)) < 0) {
  318. perror("setsockopt IP_MULTICAST_LOOP");
  319. close(sockfd);
  320. return NULL;
  321. }
  322. struct ip_mreq mreq;
  323. mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP);
  324. mreq.imr_interface.s_addr = htonl(INADDR_ANY);
  325. if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
  326. perror("setsockopt IP_ADD_MEMBERSHIP");
  327. close(sockfd);
  328. return NULL;
  329. }
  330. struct timeval timeout;
  331. timeout.tv_sec = 1; // 1 second timeout
  332. timeout.tv_usec = 0;
  333. if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) {
  334. perror("setsockopt SO_RCVTIMEO");
  335. close(sockfd);
  336. return NULL;
  337. }
  338. // Set up multicast send address
  339. // struct sockaddr_in multicast_addr;
  340. // memset(&multicast_addr, 0, sizeof(multicast_addr));
  341. // multicast_addr.sin_family = AF_INET;
  342. // multicast_addr.sin_port = htons(port);
  343. // multicast_addr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);
  344. char buffer[1024];
  345. NetworkInfo_t nw4;
  346. int r4 = sys_get_net(&nw4, IP_V4);
  347. while (running) {
  348. struct sockaddr_in sender_addr;
  349. socklen_t sender_len = sizeof(sender_addr);
  350. ssize_t received = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0,
  351. (struct sockaddr *)&sender_addr, &sender_len);
  352. if (received > 0) {
  353. buffer[received] = '\0';
  354. printf("Received multicast request from %s:%d: %s\n", inet_ntoa(sender_addr.sin_addr), ntohs(sender_addr.sin_port), buffer);
  355. // Check if it's a discovery request
  356. if (strstr(buffer, "\"command\":\"discover\"") != NULL) {
  357. printf("Discovery request received, sending multicast discovery message...\n");
  358. int len = snprintf(message,sizeof(message),TYPE_MESSGE,VERSION,"SmartPDU","1","",
  359. getLocalIpAddress("eth0"),
  360. getLocalMask("eth0"),
  361. getLocalGateway("eth0"),
  362. nw4.dns1,
  363. nw4.dns2,
  364. nw4.mode == 0 ? "dhcp" : "static",
  365. get_mac_address("eth0"));
  366. ssize_t sent = sendto(sockfd, message, len, 0, (struct sockaddr *)&sender_addr, sizeof(sender_addr));
  367. if (sent < 0) {
  368. fprintf(stderr, "sendto failed (errno %d: %s)\n", errno, strerror(errno));
  369. } else {
  370. printf("Multicast Discovery message sent to %s:%d (%zd bytes)\n", inet_ntoa(sender_addr.sin_addr), ntohs(sender_addr.sin_port), sent);
  371. }
  372. }
  373. } else if (received < 0 && running) {
  374. if (errno != EAGAIN && errno != EWOULDBLOCK) {
  375. fprintf(stderr, "recvfrom failed (errno %d: %s)\n", errno, strerror(errno));
  376. break;
  377. }
  378. }
  379. }
  380. close(sockfd);
  381. pthread_exit(NULL);
  382. }