Plot grafik ping time delay


setelah kita membuat program sederhana untuk meplot grafik temperature kali ini kita mencoba membuat grafik plot delay ping, seperti yang kita ketahui ping pada terminal akan menghasilkan hasil seperti berikut

Screenshot from 2015-09-19 14:17:05

sekarang kita mencoba memplot kolom time menggunakan bahasa pemgoraman python, pada dasarnya program ini hanya menggabungkan script deteksi suhu dengan script Python Ping


import os, sys, socket, struct, select, time
import serial # import Serial Library
import numpy  # Import numpy
import matplotlib.pyplot as plt #import matplotlib library
from drawnow import *

ICMP_ECHO_REQUEST = 8 # Seems to be the same on Solaris.
tempF= []
#arduinoData = serial.Serial('/dev/ttyACM0', 9600) #Creating our serial object named arduinoData
plt.ion() #Tell matplotlib you want interactive mode to plot live data

 
def checksum(source_string):
    """
    I'm not too confident that this is right but testing seems
    to suggest that it gives the same answers as in_cksum in ping.c
    """
    sum = 0
    countTo = (len(source_string)/2)*2
    count = 0
    while count<countTo:
        thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])
        sum = sum + thisVal
        sum = sum & 0xffffffff # Necessary?
        count = count + 2
 
    if countTo<len(source_string):
        sum = sum + ord(source_string[len(source_string) - 1])
        sum = sum & 0xffffffff # Necessary?
 
    sum = (sum >> 16)  +  (sum & 0xffff)
    sum = sum + (sum >> 16)
    answer = ~sum
    answer = answer & 0xffff
 
    # Swap bytes. Bugger me if I know why.
    answer = answer >> 8 | (answer << 8 & 0xff00)
 
    return answer
 
 
def receive_one_ping(my_socket, ID, timeout):
    """
    receive the ping from the socket.
    """
    timeLeft = timeout
    while True:
        startedSelect = time.time()
        whatReady = select.select([my_socket], [], [], timeLeft)
        howLongInSelect = (time.time() - startedSelect)
        if whatReady[0] == []: # Timeout
            return
 
        timeReceived = time.time()
        recPacket, addr = my_socket.recvfrom(1024)
        icmpHeader = recPacket[20:28]
        type, code, checksum, packetID, sequence = struct.unpack(
            "bbHHh", icmpHeader
        )
        if packetID == ID:
            bytesInDouble = struct.calcsize("d")
            timeSent = struct.unpack("d", recPacket[28:28 + bytesInDouble])[0]
            return timeReceived - timeSent
 
        timeLeft = timeLeft - howLongInSelect
        if timeLeft <= 0:
            return
 
 
def send_one_ping(my_socket, dest_addr, ID):
    """
    Send one ping to the given >dest_addr<.
    """
    dest_addr  =  socket.gethostbyname(dest_addr)
 
    # Header is type (8), code (8), checksum (16), id (16), sequence (16)
    my_checksum = 0
 
    # Make a dummy heder with a 0 checksum.
    header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, my_checksum, ID, 1)
    bytesInDouble = struct.calcsize("d")
    data = (192 - bytesInDouble) * "Q"
    data = struct.pack("d", time.time()) + data
 
    # Calculate the checksum on the data and the dummy header.
    my_checksum = checksum(header + data)
 
    # Now that we have the right checksum, we put that in. It's just easier
    # to make up a new header than to stuff it into the dummy.
    header = struct.pack(
        "bbHHh", ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), ID, 1
    )
    packet = header + data
    my_socket.sendto(packet, (dest_addr, 1)) # Don't know about the 1
 
 
def do_one(dest_addr, timeout):
    """
    Returns either the delay (in seconds) or none on timeout.
    """
    icmp = socket.getprotobyname("icmp")
    try:
        my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
    except socket.error, (errno, msg):
        if errno == 1:
            # Operation not permitted
            msg = msg + (
                " - Note that ICMP messages can only be sent from processes"
                " running as root."
            )
            raise socket.error(msg)
        raise # raise the original error
 
    my_ID = os.getpid() & 0xFFFF
 
    send_one_ping(my_socket, dest_addr, my_ID)
    delay = receive_one_ping(my_socket, my_ID, timeout)
 
    my_socket.close()
    return delay
 
 
def verbose_ping(dest_addr, timeout = 2, count = 4):
  	def verbose_ping(dest_addr, timeout = 2, count = 4):
  	cnt = 0
	
	while True: # While loop that loops forever
		delay  =  do_one(dest_addr, timeout) #read the line of text from the serial port
		tempF.append(delay)                     #Build our tempF array by appending temp readings
		drawnow(makeFig)                       #Call drawnow to update our live graph
		plt.pause(.000001)                     #Pause Briefly. Important to keep drawnow from crashing
		cnt=cnt+1
		if(cnt>50):                            #If you have 50 or more points, delete the first one from the array
			tempF.pop(0)      


 
def makeFig(): #Create a function that makes our desired plot
    #delay  =  do_one(dest_addr, timeout)
    #plt.ylim(int(delay)-3,int(delay)+3)                                 #Set y min and max values
    plt.title('My Live Streaming Sensor Data')      #Plot the title
    plt.grid(True)                                  #Turn the grid on
    plt.ylabel('Temp C')                            #Set ylabels
    plt.plot(tempF, 'ro-')       #plot the temperature
    plt.legend(loc='upper left')                    #plot the legend
  

if __name__ == '__main__':
    #verbose_ping("heise.de")
    #verbose_ping("google.com")
    #verbose_ping("a-test-url-taht-is-not-available.com")
    verbose_ping("192.168.0.1")

grafik yang dihasilkan sebagai berikut

Screenshot from 2015-09-19 14:27:49

Advertisements

Plot Suhu sensor temperature arduino


Setelah sebelumnya kita membuat Sensor suhu sederhana Arduino dan koneksi serial data arduino ke Phyton ke php. Kali ini kita mencoba untuk membuat grafik atau plot suhu yang kita dapatkan melalui data serial.

Script yang digunakan untuk arduino tidak kita rubah, namun disarankan untuk menempatkan delay (misal” delay(1000);) agar plot dapat berjalan dengan baik

float temp;
int tempPin = 2;
 
void setup()
{
Serial.begin(9600);
}
 
void loop()
{
 temp = analogRead(tempPin);
 temp = temp * 0.48828125; //(5V * 100C)/1024
 Serial.print("TEMPERATURE = ");
 Serial.print(temp);
 Serial.print("*C");
 Serial.println();
 delay(1000);
}

Sedangkan untuk display grafik plot dengan koneksi serial kita menggunakan pemograman python dengan script sebagai berikut:

import serial # import Serial Library
import numpy  # Import numpy
import matplotlib.pyplot as plt #import matplotlib library
from drawnow import *
 
tempF= []
arduinoData = serial.Serial('/dev/ttyACM0', 9600) #Creating our serial object named arduinoData
plt.ion() #Tell matplotlib you want interactive mode to plot live data
cnt=0
 
def makeFig(): #Create a function that makes our desired plot
    plt.ylim(int(temp)-5,int(temp)+5)                                 #Set y min and max values
    plt.title('My Live Streaming Sensor Data')      #Plot the title
    plt.grid(True)                                  #Turn the grid on
    plt.ylabel('Temp C')                            #Set ylabels
    plt.plot(tempF, 'ro-', label= str(temp) + ' Celcius')       #plot the temperature
    plt.legend(loc='upper left')                    #plot the legend
  

while True: # While loop that loops forever
    while (arduinoData.inWaiting()==0): #Wait here until there is data
        pass #do nothing
    arduinoString = arduinoData.readline() #read the line of text from the serial port
    kata2=arduinoString.rsplit(None,3)[2]
    dataArray = kata2.split('*')
    temp = float( dataArray[0])            #Convert first element to floating number and put in temp
    tempF.append(temp)                     #Build our tempF array by appending temp readings
    drawnow(makeFig)                       #Call drawnow to update our live graph
    plt.pause(.000001)                     #Pause Briefly. Important to keep drawnow from crashing
    cnt=cnt+1
    if(cnt>50):                            #If you have 50 or more points, delete the first one from the array
        tempF.pop(0)                       #This allows us to just see the last 50 data point

hasil grafik yang kita dapatkan sebagai berikut:

Screenshot from 2015-09-19 00:00:28

Perubahan Bit LSB MSB pada citra digital


Pada dasarya setiap citra digital 2D direpresentasikan kedalam bentuk nilai pixel pada setiap posisi 2 dimensi (x,y). Disetiap pixel nya itu dapat direpresentasikan derajat keabuabuannya dalam bentuk nilai 0-255 atau juga bisa kita representaikan dalam bentuk byte yang terdiri dari 8 bit (catatan: tentunya tergantung dari format yang digunakan, saat ini kita menggunakan bmp atau png)

b0,b1,b2,b3,b4,b5,b6,b6 ==> adalah susunan bit dengan b0 adalah adalah MSB Most significant bit atau high order bit dengan kata lain nilai terbesar dari susunan bit, sedangkan b6 adalah nilai terkecil dari susunan bit.

Misal citra digital grayscale mempunyai pixel 512×512 Pixel, kita hanya mengambil b0 atau b4 atau b6 nya saja apa yang akan terjadi?

melalui program script sederhana matlab dapat kita dapatkan hasil sebagai berikut
Screenshot from 2015-09-05 17:10:52
Program tanpa uint8 (unsigned integer 8)

Screenshot from 2015-09-05 17:12:37
Program dengan uint8 (unsigned integer 8)

dari gambar diatas dapat kita simpulkan bahwa perbuahan pada bit MSB akan membuat citra “rusak” dan sebaliknya pada perubahan bit pada LSB. Hal ini sering dimanfaatkan untuk enkripsi citra ataupun steganografi citra

Script matlab

clc, clear all, close all
Im=imread('Cameraman.bmp');
subplot(3,3,1), subimage(Im)
set(gca,'visible','off')
[M N]=size(Im);
Im_b=de2bi(Im,8,'left-msb');
[Mb Nb]=size(Im_b);
for j=1:Nb
    Im_bx=zeros(Mb,Nb);
    for i=1:Mb
        Im_bx(i,j)=Im_b(i,j);
    end
    Im_r=reshape((bi2de(Im_bx,'left-msb')),N,M);
    subplot(3,3,j+1), subimage(uint8(Im_r))
    set(gca,'visible','off')
end