Hi i was wondering if any Java ppl have managed to check this out, am i 
on the right track or wasting my time ? Is there a better way to send 
the payload to do the bandwidth testing. Let me know.

Dan Rossi wrote:
> Just thought id resend just in case people thought it was a question.
>
> Dan Rossi wrote:
>   
>> Hi there ive taken the initiative because i cant seem to find any other 
>> solution out there to port the FMS code. Ive prob made alot of mistakes 
>> in terms of the HashMap and arrays. I had to also port the 
>> client.getStats method from FMS which returns information in methods 
>> returned from red5 but not easily accessible via variables, maybe there 
>> is a better way of accessing this until the stats API is avail ?
>>
>> Basically all it does is send a packet array and calculate the result 
>> time to work out the download rate or something like that ? Ive yet to 
>> manage to get the right calculation for the download rate as i was 
>> testing it locally, i dont think that one is right. If someone wants to 
>> clean it up go ahead :)
>>
>> //example
>> public boolean appConnect(IConnection conn) {
>>        
>>         BandwidthDetection detect = new BandwidthDetection();
>>         detect.checkBandwidth(conn);
>> }
>>
>> BandwidthDetection.java
>>
>> import org.red5.server.api.IConnection;
>> import org.red5.server.api.Red5;
>> import org.red5.server.api.service.IPendingServiceCall;
>> import org.red5.server.api.service.IPendingServiceCallback;
>> import org.red5.server.api.service.IServiceCapableConnection;
>> import org.red5.server.api.stream.IStreamCapableConnection;
>>
>>
>> import java.util.Date;
>> import java.util.Map;
>> import java.util.HashMap;
>>
>> public class BandwidthDetection implements IPendingServiceCallback {
>>     
>>     private long bytes_in = 0;
>>     private long msg_in;
>>     private long bytes_out;
>>     private long msg_out;
>>     private long msg_dropped;
>>     private long ping_rtt;
>>     
>>     private int latency = 0;
>>     private int cumLatency = 1;
>>     private int bwTime = 0;
>>     private int count = 0;
>>     private int sent = 0;
>>     private Object client;
>>     private long now;
>>     private long[] pakSent = new long[1200];
>>     private long[] pakRecv = new long[1200];
>>     private Map<String, Long> beginningValues;
>>     private double[] payload = new double[1200];
>>     
>>     public BandwidthDetection()
>>     {
>>         pakSent = new long[1200];
>>         pakRecv = new long[1200];
>>         payload = new double[1200];
>>     }
>>     
>>     public void checkBandwidth(Object client)
>>     {
>>         this.calculateClientBw(client);
>>     }
>>     
>>     private void calculateClientBw(Object client)
>>     {
>>         
>>         for (int i=0; i<1200; i++){
>>             payload[i] = Math.random();    //16K approx
>>         }
>>         
>>         this.getStats();
>>         
>>         this.client = client;
>>         long now = (new Date().getTime()/1);
>>         
>>         Map<String, Long> map = new HashMap<String, Long>();
>>         map.put("b_down", this.bytes_out);
>>         map.put("b_up", this.bytes_in);
>>         map.put("time", now);
>>         this.beginningValues = map;
>>         
>>         System.out.println(now);
>>         
>>         pakSent[this.sent++] = now;
>>
>>         this.callBWCheck("");
>>         
>>         this.pakSent[this.sent++] = now;
>>         
>>         this.callBWCheck(this.payload);
>>         
>>     }
>>     
>>     
>>     private void callBWCheck(Object params)
>>     {
>>         IConnection conn = Red5.getConnectionLocal();
>>         
>>         if (conn instanceof IServiceCapableConnection) {
>>             ((IServiceCapableConnection) conn).invoke("onBWCheck", new 
>> Object[]{params}, this);
>>             //log.info("sending notification to "+conn);
>>         }
>>     }
>>     
>>     private void callBWDone(double kbitDown,  long deltaDown, double 
>> deltaTime, int latency)
>>     {
>>         IConnection conn = Red5.getConnectionLocal();
>>
>>         if (conn instanceof IServiceCapableConnection) {
>>             ((IServiceCapableConnection) conn).invoke("onBWDone", new 
>> Object[]{kbitDown,  deltaDown, deltaTime, latency});
>>             //log.info("sending notification to "+conn);
>>         }
>>     }
>>     
>>     private void getStats()
>>     {
>>         IConnection conn = Red5.getConnectionLocal();
>>         
>>         if (conn instanceof IStreamCapableConnection) {
>>             IStreamCapableConnection streamConn = 
>> (IStreamCapableConnection) conn;
>>             bytes_in = streamConn.getReadBytes();
>>             msg_in = streamConn.getReadMessages();
>>             bytes_out = streamConn.getWrittenBytes();
>>             msg_out = streamConn.getWrittenMessages();
>>             msg_dropped = streamConn.getDroppedMessages();
>>             ping_rtt = streamConn.getLastPingTime();
>>         }
>>
>>     }
>>     
>>     
>>     /**
>>      * Handle callback from service call.
>>      */
>>     
>>     public void resultReceived(IPendingServiceCall call) {
>>         long now = (new Date()).getTime()/1;
>>         this.pakRecv[this.count] = now;
>>         this.count++;
>>         int timePassed = (int)(now - this.beginningValues.get("time"));
>>         
>>         if (this.count == 1) {
>>
>>             this.latency = Math.min(timePassed, 800);
>>
>>             this.latency = Math.max(this.latency, 10);
>>
>>         }
>>         
>>         //If we have a hi-speed network with low latency send more to 
>> determine
>>         // better bandwidth numbers, send no more than 6 packets
>>         
>>         if ( this.count == 2 && (timePassed<2000))
>>         {
>>             
>>             this.pakSent[this.sent++] = now;
>>             this.cumLatency++;
>>             this.callBWCheck(this.payload);
>>             
>>             //this.client.call("onBWCheck", res, this.client.payload);
>>         } else if (this.sent == this.count) {    
>>             // See if we need to normalize latency
>>             if ( this.latency >= 100 )
>>             {
>>                 
>>                 // make sure we detect sattelite and modem correctly
>>                 if (this.pakRecv[1] - this.pakRecv[0] > 1000)
>>                 {
>>                     this.latency = 100;
>>                 }
>>                 
>>             }
>>             
>>             
>>             this.payload = new double[0];
>>             //delete this.client.payload;
>>
>>             // Got back responses for all the packets compute the bandwidth.
>>             this.getStats();
>>
>>             long  deltaDown = this.bytes_out - 
>> this.beginningValues.get("b_down")*8/1000;
>>             double deltaTime = ( (now - 
>> this.beginningValues.get("time")) - (this.latency*this.cumLatency))/1000;
>>             
>>             if (deltaTime <= 0) deltaTime = (now - 
>> this.beginningValues.get("time"))/1000;
>>             //System.out.println(deltaDown + " " + this.bytes_out + " " 
>> + this.beginningValues.get("b_down") + " " + deltaTime + " " + (now - 
>> this.beginningValues.get("time")) + " " + (this.latency*this.cumLatency));
>>             
>>             double kbitDown = deltaDown/deltaTime;
>>
>>             System.out.println("onBWDone: kbitDown = " + kbitDown + ", 
>> deltaDown= " + deltaDown + ", deltaTime = " + deltaTime + ", latency = " 
>> + this.latency + "KBytes " + (this.bytes_out - 
>> this.beginningValues.get("b_down"))/1024);
>>
>>             this.callBWDone(kbitDown, deltaDown, deltaTime, this.latency);
>>         }
>>         
>>     }
>>     
>>     
>>     
>> }
>>
>> _______________________________________________
>> Red5 mailing list
>> [email protected]
>> http://osflash.org/mailman/listinfo/red5_osflash.org
>>
>>   
>>     
>
>
> _______________________________________________
> Red5 mailing list
> [email protected]
> http://osflash.org/mailman/listinfo/red5_osflash.org
>
>   


_______________________________________________
Red5 mailing list
[email protected]
http://osflash.org/mailman/listinfo/red5_osflash.org

Reply via email to