关于smartconfig的研究


           smartconfig 实际就是 手机端发送多播一串经过处理的数据,然后接收端,接受到这个数据之后,解析到wifi密码,连接上wifi,在实现过程中可能遇到的问题如下:

           1.  send socket的设置 

          

 SOCKET sendSock = socket(AF_INET,SOCK_DGRAM,0);
    if (sendSock == INVALID_SOCKET)
    {
        printf("socket error\n");
        return -1;
    }
    int n = 1;
    ret = setsockopt(sendSock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&n, sizeof(n));
    if (0 != ret)
    {
        printf("setsockopt error\n");
        return -1;
    }

 

需要将sock设置为广播模式,在 将数据组装以后,发送数据时:

 ssize_t ret = sendto(sendSock, buf, strlen(buf) + 1, 0, (sockaddr*)&addr, sizeof(sockaddr));
                if (ret == SOCKET_ERROR)
                {
                    printf("sendto error!\n");
                }

其中地址,为你多播的地址,不同的协议发送的地址,不一样,看你的芯片。

 

           2.  手机接受返回数据如下:

           

  SOCKET recvSock = socket(AF_INET, SOCK_DGRAM, 0);
    if (INVALID_SOCKET == recvSock)
    {
        printf("socket error\n");
        return -1;
    }
    
    sockaddr_in recvAddr;
    recvAddr.sin_family = AF_INET;
    recvAddr.sin_addr.s_addr = INADDR_ANY;
    recvAddr.sin_port = htons(8068);
    
    int ret = bind(recvSock, (sockaddr*)&recvAddr, sizeof(recvAddr));
    if (ret != 0)
    {
        printf("bind error\n");
        return -1;
    }
    
    //用一个保留地址,用作监听
    ip_mreq multiCast;
    multiCast.imr_interface.s_addr = INADDR_ANY;
    multiCast.imr_multiaddr.s_addr = inet_addr("236.236.238.50");
    ret = setsockopt(recvSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&multiCast, sizeof(multiCast));
    if (0 != ret)
    {
        printf("setsockopt error\n");
        return -1;
    }

socket的创建;

socket接受时的处理:

 do
    {
        timeout.tv_sec=0;
        timeout.tv_usec=500000;
        
        FD_ZERO(&readset);
        FD_SET(recvSock,&readset);
        int result=select(recvSock+1,&readset,NULL,NULL,&timeout);
        printf("the result is %d\n",result);
        
        if(FD_ISSET(recvSock,&readset)>0)
        {
            socklen_t len = sizeof(sockaddr);
            
            char buf[100] = {0};
            printf("start recv\n");
            ssize_t ret = recvfrom(recvSock, buf, sizeof(buf) - 1, 0, (sockaddr*)&recvAddr, &len);
            
            if (ret == SOCKET_ERROR)
            {
                printf("recvfrom error!\n");
                return -1;
            }
            printf("recv len is %d\n,the data is %s\n the strlen is %ld",len,buf,strlen(buf));
  //处理数据 }
while(1)

 

目前不再使用 发送信道数据的长度来截取密码和SSID了,不安全也又可能失败。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM