点击(此处)折叠或打开
- #if 1 //multicast -> emulate easylink of mico .
- #define DEMO_AP_SSID "xiaomi"
- #define DEMO_AP_PWD "xiaomi99"
- #define EASYLINK_PORT 10000
- #define EASYLINK_SYNC "abcdefghijklmnopqrstuvw"
- #define EASYLINK_EXT_NO_USERINFO "ND,0,121.207.243.132,8086,111111,C,222222"
- static void broadcast_client_task_exec(os_thread_arg_t arg)
- {
- int iret, addr_len, yes;
- unsigned char one;
- struct sockaddr_in LocalAddr, to;
- struct ip_mreq mc;
-
- info("multicast of mico startting...");
- uint32_t mcast_addr = inet_addr("224.0.0.251");
- uint8_t mcast_mac[6];
- wifi_get_ipv4_multicast_mac(ntohl(mcast_addr), mcast_mac);
- wifi_add_mcast_filter(mcast_mac);
- info("multicast mac is ");
- dump_hex(mcast_mac, 6);
- int sock_udp = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (sock_udp >= 0) {
- yes = 1;
- setsockopt(sock_udp, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes));
- one = 0;
- setsockopt(sock_udp, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&one, sizeof(one));
- one = 255;
- setsockopt(sock_udp, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&one, sizeof(one));
-
- mc.imr_multiaddr.s_addr = mcast_addr;
- mc.imr_interface.s_addr = htonl(INADDR_ANY);
- if (setsockopt(sock_udp, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mc, sizeof(mc)) < 0) {
- info("multicast join-group failed.");
- //fixme: error for bind.
- close(sock_udp);
- return;
- }
-
- memset(&LocalAddr, 0, sizeof(LocalAddr));
-
- LocalAddr.sin_family = AF_INET;
- LocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
- LocalAddr.sin_port = htons(EASYLINK_PORT);
- addr_len = sizeof(struct sockaddr_in);
- iret = bind(sock_udp, (struct sockaddr *)&LocalAddr, addr_len);
- if (iret < 0) {
- info("multicast monitor binding failed.");
- //fixme: error for bind.
- close(sock_udp);
- return;
- }
- // 组织测试数据。
- //len_ssid, len_key, ssid, len, len_userdata, flag, data.
- char msg[256], msg_sync[256], ip_addr[32], msg_tmp[256];
- unsigned char msg_len = 0, iTmp, iExt;
- memset(msg_tmp, 0, sizeof(msg_tmp));
- strcpy((char *)msg_sync, EASYLINK_SYNC);
- msg[msg_len++] = strlen(DEMO_AP_SSID);
- msg[msg_len++] = strlen(DEMO_AP_PWD);
- strcpy(&msg[msg_len], DEMO_AP_SSID);
- msg_len += strlen(DEMO_AP_SSID);
- strcpy(&msg[msg_len], DEMO_AP_PWD);
- msg_len += strlen(DEMO_AP_PWD);
- if ((msg_len%2)>0)
- msg[msg_len++] = 0; //补足偶数位
- //*
- msg[msg_len++] = strlen(EASYLINK_EXT_NO_USERINFO);
- msg[msg_len++] = 0;
- strcpy(&msg[msg_len], EASYLINK_EXT_NO_USERINFO);
- msg_len += strlen(EASYLINK_EXT_NO_USERINFO);
-
- if ((msg_len%2)>0)
- msg[msg_len++] = 0; //补足偶数位
- //*/
- info("multicast msg is ");
- dump_hex(msg, msg_len);
- //发送数据
- while (1) {
- //向 239.118.0.0 发送同步头 5 次。 EASYLINK_SYNC
- to.sin_family = AF_INET;
- to.sin_port = htons(EASYLINK_PORT);
- to.sin_addr.s_addr = inet_addr("239.118.0.0");
-
- for (iTmp = 0; iTmp < 5; iTmp ++) {
- while ((iret = sendto(sock_udp, (char *)msg_sync, 20 /*strlen(EASYLINK_SYNC)*/,
- 0, (struct sockaddr *)&to, sizeof(struct sockaddr_in))) != 20);
- ;
- info("send sync: %d bytes ", iret);
- os_thread_sleep(os_msec_to_ticks(50));
- }
- //发送组播报文。
- for (iTmp=0; iTmp<msg_len; iTmp+=2) {
- memset(ip_addr, 0, sizeof(ip_addr));
- sprintf(ip_addr, "239.126.%d.%d", (int)(msg[iTmp] & 0xff), (int)(msg[iTmp+1] & 0xff));
- to.sin_addr.s_addr = inet_addr(ip_addr);
- iExt = iTmp/2 + 20;
- while ((iret = sendto(sock_udp, (char *)msg_tmp, iExt,
- 0, (struct sockaddr *)&to, sizeof(struct sockaddr_in))) != iExt); //发送随机内容到组。
- info("sendto [%s]: %d bytes ", ip_addr, iret);
-
- //os_thread_sleep(os_msec_to_ticks(50));
- }
- os_thread_sleep(os_msec_to_ticks(200));
- }
-
- }
- //while (1) os_thread_sleep(os_msec_to_ticks(3000));
- os_thread_self_complete(NULL);
- }
- #else