PositioningServlet.java 2.8 KB
package servlet;

import core.repository.Location;
import core.service.PositioningService;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetAddress;

import static java.lang.Thread.sleep;

/**
 * Servlet handling positioning request coming from clients.
 *
 * Created by Guillaume on 15/05/2017.
 */
public class PositioningServlet extends HttpServlet{
    @Override
    public void service (final HttpServletRequest servletRequest, final HttpServletResponse servletResponse)
            throws ServletException, IOException {
    
        
        String clientMacAddr = servletRequest.getParameter("CLIENT_MAC_ADDR");
        PositioningService posServ = new PositioningService();
        
        multicastPositioningRequest(clientMacAddr);
        
        
        Location loc;
        do{
            try{
                sleep(500L);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
    
            loc = posServ.getLocation(clientMacAddr);
        }while(loc==null);
        
        servletResponse.setContentType("application/json");
        servletResponse.getWriter().print(String.format("{\"x\": \"%f\", \"y\": \"%f\", \"map\": \"%d\"}", loc.getX(), loc.getY(), loc.getMap().getId()));
    }
    
    @Override
    public void doGet(final HttpServletRequest servletRequest, final HttpServletResponse servletResponse)
            throws ServletException, IOException {
        service(servletRequest, servletResponse);
    }
    
    @Override
    public void doPost(final HttpServletRequest servletRequest, final HttpServletResponse servletResponse)
            throws ServletException, IOException {
        service(servletRequest, servletResponse);
    }

    /**
     * Method broadcasting UPD request to AP, request asking for positioning data.
     *
     * @param clientMacAddress mac address of client on which ap's measurement will be based
     */
    private void multicastPositioningRequest(String clientMacAddress){
        try (DatagramSocket socket = new DatagramSocket(4445)){
            
            byte[] buf;
        
            String dString = "{\"LOCATE\": \"" + clientMacAddress + "\", \"SERV\": \"" + Inet4Address.getLocalHost().getHostAddress()+"\"}";
            buf = dString.getBytes();
        
            // send it
            InetAddress group = InetAddress.getByName("10.255.255.255");
            DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446);
            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}