/* * Class UDPSocketTask * * This software is developed for Choral devices with Java. * Copyright Choral srl. All Rights reserved. */ package general; import java.io.*; import java.util.*; import javax.microedition.io.*; import com.cinterion.io.BearerControl; /** * Task that executes send of strings through GPRS connection using UDP sockets. * * @version 1.00 <BR> <i>Last update</i>: 24-06-2009 * @author matteobo * */ public class UDPSocketTask extends ThreadCustom implements GlobCost { /* * local variables */ private double ctrlSpeed =0; private boolean close = false; private boolean exitTRKON = true; private int temp; private boolean ram = true; /** Full string to send through GPRS */ private String outText; // socket TCP UDPDatagramConnection udpConn; Datagram dgram; byte[] buff; private String destAddressUDP; private int val_insensibgps; private int countDownException = 0; private boolean errorSent = false; BCListenerCustom list; String answer = ""; /* * constructors */ public UDPSocketTask() { if(debug){ System.out.println("TT*UDPSocketTask: CREATED"); } } /* * methods */ /** * Task execution code: * <BR> ---------- <BR> * Performed operations: <br> * <ul type="disc"> * <li> Add alarm to position strings, if necessary; * <li> Send string; * <li> Check the number of sent strings. * </ul> */ public void run() { list = new BCListenerCustom(); list.addInfoStato(infoS); BearerControl.addListener(list); while (!infoS.isCloseUDPSocketTask()){ //if(false){ if((infoS.getInfoFileString(TrkState).equals("ON") || (infoS.getInfoFileString(TrkState)).equalsIgnoreCase("ON,FMS")) && infoS.getInfoFileString(GPRSProtocol).equals("UDP") && ((infoS.getInfoFileInt(TrkIN) != infoS.getInfoFileInt(TrkOUT)) || !infoS.getDataRAM().equals(""))){ exitTRKON = false; try { // Indicates if GPRS SOCKET is ACTIVE //System.out.println("TT*UDPSocketTask: START"); infoS.setIfsocketAttivo(true); destAddressUDP = "datagram://" + infoS.getInfoFileString(DestHost) + ":" + infoS.getInfoFileString(DestPort); /* * Once this task has been started, it is completely * finished before proceeding to a re-use, even if the * timeout expires (so there may be a FIX GPRS timeout * expired!) */ try { try{ while (!InfoStato.getCoda()) Thread.sleep(1L); }catch(InterruptedException e){} if(infoS.getInfoFileInt(TrkIN) == infoS.getInfoFileInt(TrkOUT)){ outText = infoS.getDataRAM(); ram = true; } else{ ram = false; temp = infoS.getInfoFileInt("TrkOUT"); System.out.println("TT*UDPSocketTask: pointer out - " + temp); if ((temp >= codaSize) || (temp < 0)) temp = 0; outText = infoS.getRecord(temp); new LogError("TT*UDPSocketTask: pointer out - " + temp + " " + outText); System.out.println("TT*UDPSocketTask: data in queue: " + outText); } System.out.println("TT*UDPSocketTask: string to send through GPRS:\r\n" + this.outText); ctrlSpeed = infoS.getSpeedForTrk(); if(debug_speed){ ctrlSpeed = infoS.getSpeedGree(); System.out.println("SPEED " + ctrlSpeed); } try{ val_insensibgps = Integer.parseInt(infoS.getInfoFileString(InsensibilitaGPS)); }catch(NumberFormatException e){ val_insensibgps = 0; } //new LogError("Actual speed: " + ctrlSpeed + ". Val insens: " + val_insensibgps); if (ram){ //System.out.println("ACTUAL SPEED: " + this.ctrlSpeed); //System.out.println("outText.indexOf(ALARM) " + (this.outText.indexOf("ALARM") > 0)); //System.out.println("outText.indexOf(ALIVE) " + (this.outText.indexOf("ALIVE") > 0)); //System.out.println("SPEED LIMIT: " + this.val_insensibgps); //System.out.println("PREVIOUS MESSAGE IS ALIVE: " + this.infoS.getPreAlive()); //System.out.println("SPEED LIMIT: " + this.val_insensibgps); //System.out.println("PREVIOUS SPEED: " + this.infoS.getPreSpeedDFS()); if (this.ctrlSpeed > this.val_insensibgps) { System.out.println("Speed check ok."); infoS.settrasmetti(true); if (this.infoS.getInvioStop()) { infoS.setApriGPRS(true); } infoS.setInvioStop(false); } else { if((outText.indexOf("ALARM")>0) || (outText.indexOf("ALIVE")>0)){ System.out.println("Alarm"); infoS.settrasmetti(true); infoS.setApriGPRS(true); } else{ if((!infoS.getPreAlive())&&(ctrlSpeed <= val_insensibgps)&&(infoS.getPreSpeedDFS() > val_insensibgps)){ System.out.println("Speed check less then insensitivity, previous speed is greater"); infoS.settrasmetti(true); if (infoS.getInvioStop()== true){ infoS.setApriGPRS(true); } infoS.setInvioStop(false); } else{ System.out.println("Speed check failed."); if (infoS.getInvioStop()== false){ System.out.println("Send stop coordinate."); infoS.settrasmetti(true); infoS.setInvioStop(true); infoS.setChiudiGPRS(true); //new LogError("Send stop."); } } } } if (this.outText.indexOf("ALIVE") > 0) { System.out.println("ALIVE MESSAGE"); infoS.setPreAlive(true); } else { infoS.setPreAlive(false); System.out.println("NO ALIVE MESSAGE"); } } else{ //new LogError("From store."); infoS.settrasmetti(true); infoS.setChiudiGPRS(false); } //new LogError("Transmission status: " + infoS.gettrasmetti()); if (infoS.gettrasmetti()== true){ infoS.settrasmetti(false); if (infoS.getApriGPRS()==true){ close = false; infoS.setTRKstate(true); try{ semAT.getCoin(5); infoS.setATexec(true); mbox2.write("at^smong\r"); while(infoS.getATexec()) { Thread.sleep(whileSleep); } infoS.setATexec(true); mbox2.write("at+cgatt=1\r"); while(infoS.getATexec()) { Thread.sleep(whileSleep); } semAT.putCoin(); } catch(Exception e){} // Open GPRS Channel try{ udpConn = (UDPDatagramConnection) Connector.open(destAddressUDP); }catch(Exception e){ System.out.println("TT*UDPSocketTask: Connector.open"); } infoS.setApriGPRS(false); } try{ //mem2 = r.freeMemory(); //System.out.println("Free memory after allocation: " + mem2); if((outText == null) || (outText.indexOf("null")>=0)){ outText = infoS.getInfoFileString(Header)+","+infoS.getInfoFileString(IDtraker)+defaultGPS+",<ERROR>*00"; buff = outText.getBytes(); } System.out.println("OPEN DATAGRAM"); System.out.println(outText); dgram = udpConn.newDatagram(outText.length()); buff = new byte[outText.length()]; System.out.println("SEND DATAGRAM"); buff = outText.getBytes(); new LogError("outText = " + outText); dgram.setData(buff,0,buff.length); udpConn.send(dgram); int gprsCount = 0; answer = ""; String ack = infoS.getInfoFileString(Ackn); if(!infoS.getInfoFileString(Ackn).equals("")){ while(true){ dgram.reset(); dgram.setLength(infoS.getInfoFileString(Ackn).length()+1); udpConn.receive(dgram); byte[] data = dgram.getData(); answer = new String(data); answer = answer.substring(0, ack.length()); if(debug){ System.out.println("ACK: " + answer); } if(answer.equals(ack)){ new LogError("ACK"); if(debug) System.out.println("ACK RECEIVED"); break; } else{ if(debug) System.out.println("WAITING ACK"); try{ Thread.sleep(1000); }catch(InterruptedException e){} gprsCount++; } if(gprsCount>15){ new LogError("NACK"); infoS.setReboot(); errorSent = true; break; } } } }catch(Exception err){ System.out.println("TT*UDPSocketTask: Exception err"); new LogError("TT*UDPSocketTask: Exception during out text" + err.getMessage()); infoS.setReboot(); errorSent = true; break; } //new LogError(outText); if(debug) System.out.println(outText); if (infoS.getChiudiGPRS()==true){ infoS.setTRKstate(false); try{ System.out.println("TT*UDPSocketTask: close UDP"); udpConn.close(); }catch(NullPointerException e){ infoS.setChiudiGPRS(false); } infoS.setChiudiGPRS(false); } } System.out.println("BEARER: " + infoS.getGprsState()); if(!infoS.getGprsState()){ errorSent = true; System.out.println("BEARER ERROR"); new LogError("BEARER ERROR"); } if(ram){ if(!errorSent){ infoS.setDataRAM(""); } } else{ if(!errorSent){ temp++; if(temp >= codaSize || temp < 0) temp = 0; infoS.setInfoFileInt(TrkOUT, "" + temp); file.setImpostazione(TrkOUT, "" + temp); InfoStato.getFile(); file.writeSettings(); InfoStato.freeFile(); } errorSent = false; } InfoStato.freeCoda(); infoS.setIfsocketAttivo(false); Thread.sleep(100); if(errorSent){ close = true; semAT.putCoin(); // release AT interface infoS.setIfsocketAttivo(false); infoS.setApriGPRS(false); infoS.setChiudiGPRS(false); } //r.gc(); // request garbage collection //mem2 = r.freeMemory(); //System.out.println("Free memory after collecting" + " discarded Integers: " + mem2); } catch (IOException e) { close = true; String msgExcept = e.getMessage(); System.out.println("TT*UDPSocketTask: exception: "+msgExcept); //new LogError("SocketGPRStask IOException: " + e); infoS.setIfsocketAttivo(false); infoS.setApriGPRS(false); infoS.setChiudiGPRS(false); } catch (EmptyStackException e) { close = true; //System.out.println("exception: " + e.getMessage()); e.printStackTrace(); //new LogError("SocketGPRStask EmptyStackException"); infoS.setIfsocketAttivo(false); infoS.setApriGPRS(false); infoS.setChiudiGPRS(false); } //catch } catch (Exception e) { close = true; //new LogError("SocketGPRSTask generic Exception"); infoS.setIfsocketAttivo(false); infoS.setApriGPRS(false); infoS.setChiudiGPRS(false); } if(close){ try{ semAT.getCoin(5); infoS.setATexec(true); mbox2.write("at^smong\r"); while(infoS.getATexec()) { Thread.sleep(whileSleep); } semAT.putCoin(); } catch(Exception e){} try{ //System.out.println("***************CLOSE******************"); try{ udpConn.close(); }catch(NullPointerException e){ } //System.out.println("***************CLOSED******************"); infoS.setTRKstate(false); infoS.setEnableCSD(true); semAT.getCoin(5); // Close GPRS channel //System.out.println("SocketGPRSTask: KILL GPRS"); infoS.setATexec(true); mbox2.write("at+cgatt=0\r"); while(infoS.getATexec()) { Thread.sleep(whileSleep); } semAT.putCoin(); Thread.sleep(5000); } catch(InterruptedException e){ } catch(IOException e){ } catch(Exception e){ } System.out.println("WAIT - DISCONNECT GPRS"); for(countDownException = 0;countDownException < 100;countDownException++){ if(infoS.isCloseUDPSocketTask()) break; try{ Thread.sleep(1000); }catch(InterruptedException e){} } infoS.setApriGPRS(true); } } else{ try{ if(infoS.getInfoFileString(TrkState).equals("OFF")){ infoS.setTRKstate(false); infoS.setEnableCSD(true); semAT.putCoin(); // release AT interface try{ semAT.getCoin(5); // Close GPRS channel //System.out.println("SocketGPRSTask: TRK OFF KILL GPRS"); infoS.setATexec(true); mbox2.write("at+cgatt=0\r"); while(infoS.getATexec()) { Thread.sleep(whileSleep); } semAT.putCoin(); } catch(InterruptedException e){} } Thread.sleep(2000); }catch (InterruptedException e){} } }// while } //run } //UDPSocketTask