Selasa, 06 November 2018

Raspi sebagai LCD Proyektor

Ceritanya

Dosen login....dia scan semua PC di jaringannya...muncullah ip ip computer para siswanya
trus dia piih salah satu untuk presentasi....
maka pc yang dia klik akan tertuju di layar utama...

Konsepnya adalah sama dengan remote desktop...hanya ini di modif seakan2:
LCD proyektor,.........

++++++++++++++++++++++++++++++++++++++++++++++++++


metode u aplikasi Impelemantasi share desktop raspberry PI untuk LCD projector adalah menggunakan metode pencocokan content atau biasa di sebut dgn sequential search

cara kerjanya:
1.admin/dosen/moderator dosen akan menscan IP di jaringan kelas tsb
sehingga akan ketahuan IP mana saja yang aktif dan yang tidak aktif
2.admin/dosen/moderator memilih ip yang akan di munculkan layar desktopnya ke monitor
3.disini diperlukan admin/moderator/dosen agar tidak terjadi rebutan klik ip yang akan aktif
4.konsep koneknya adalah, dengan terlebih dahulu mendiskonek perangkat /laptop sebelumnya baru autokonek ip laptop terpilih
5.ada tombol juga reset all yang artinya diskonesi ke semua pc client dari layar monitor
6.semua aktivitas akan tercatat di tabel log

keterbatasan:
1.aplikasi hanya bisa diterapkan dalam 1 jaringan network/satu subnetmask
2.pengenalan antar laptop adalah menggunakan ip address sehingga setiap laptop agar mudah dikenali siapa pemiliknya maka harus di daftarkan dahulu
3.harus install library apliaksi di client juga

novelty/nilai kebaruan aplikasi ini dari sebelumnya:
1.aplikasi berbasis cient server sehingga mudah memantaunya bisa berbasis desktop, mobile(android), web
2.adanya tabel .log u menyimpan semua aktivitas
3.adanya fitur scan sehingga pc/laptop bisa ditambah atau dikurangkan secara dinamis


Nah ino code veri dosennya:


 <?php

if(isset($_GET["scan"])){
$sql="insert into tb_command values('scan')";
process($conn,$sql);
                echo "<script>alert('Please wait 30 seconds then press OK button')</script>";
                //sleep(30);
                die("<script>location.href='?mnu=controlpanel'</script>");
}

if(isset($_GET["close"])){
  $sql="update tb_status set status='standby'";// where ip='$ip'
        process($conn,$sql);

  $sql="insert into tb_command values('close')";
process($conn,$sql);
die("<script>location.href='?mnu=controlpanel'</script>");
}

if(isset($_GET["st"])){
$kode_status=$_GET["kode"];
$ip=$_GET["id"];
$st=$_GET["st"];

$sql="update tb_status set status='$st' where ip='$ip'";
process($conn,$sql);

if($st=="on"){
//$sql="insert into tb_close values('close')";
$sql="update tb_status set status='$st' where ip='$ip'";
                process($conn,$sql);

$sql="insert into tb_command values('on#$ip')";
process($conn,$sql);
                echo "<script>alert('Your session will expire in 15 minutes')</script>";
die("<script>location.href='?mnu=controlpanel'</script>");
}
else{//standby
$sql="insert into tb_command values('close')";
process($conn,$sql);
die("<script>location.href='?mnu=controlpanel'</script>");
}
}
?>

<div id="accordion">
  <h3>Data</h3>
  <div><p style="text-align:left;">

    <a href="tightvnc-2.8.8-gpl-setup-32bit.msi">Download software presentasi (Win32)</a></span></p>
    <span style="float:right;"> <a href="tightvnc-2.8.8-gpl-setup-64bit.msi">Download software presentasi (Win64)</a></span>
  <br>

<table width="50%" class="table table-bordered table-striped table-hover js-basic-example dataTable">
  <tr bgcolor="#036">
    <th width="3%"><center>No</th>
    <th width="30%"><center>IP</th>
    <th width="15%"><center>Status</th>
    <th width="10%"><center>Jam</th> 
    <th width="10%"><center>PLAY</th> 
  </tr>
<?php
  $sql="select * from `$tbstatus` order by `kode_status` desc";
  $jum=getJum($conn,$sql);
if($jum > 0){
$no=1;
$arr=getData($conn,$sql);
foreach($arr as $d) {
$kode_status=$d["kode_status"]; ;
$jam=$d["jam"];
$ip=$d["ip"];
$status=$d["status"];
$color="#dddddd";
if($no %2==0){$color="#eeeeee";}
echo"<tr bgcolor='$color'>
<td>$no</td>
<td align='center'>$ip</td>
<td align='center'>$status</td>
<td align='center'>$jam</td>";

if($status=="on"){
echo"<td align='center'>
<a href='?mnu=controlpanel&st=standby&kode=$kode_status&id=$ip'><input type='button' value='$status'></a>
</td>";
}
else{
echo"<td align='center'><a href='?mnu=controlpanel&st=on&kode=$kode_status&id=$ip'><input type='button' value='$status'></a></td>";
}

echo"</tr>";

$no++;
}//while
}//if
else{echo"<tr><td colspan='7'><blink>Maaf, Data status belum tersedia...</blink></td></tr>";}
?>
</table>
</div>


</div>
<a href='?mnu=controlpanel&scan=scan'><input type='button' value='SCAN IP'></a>
<a href='?mnu=controlpanel&close=close'><input type='button' value='CLOSE ALL'></a>

Sedang di raspinya:


import MySQLdb
from time import gmtime, strftime
from random import randint
import time
import subprocess
import os
import os, sys

data1=""
data2=""
data3=""

start=0
kon=1
paketimer=False

while kon==1:

    sql="SELECT * FROM tb_command"
    db = MySQLdb.connect("localhost","dian","12345","db_matakuliah")
    cursor = db.cursor()
    proses=0

    cursor.execute(sql)
    res = cursor.fetchall()
    mdata=""
    time.sleep(1)

    if paketimer==True:
      if time.time() > start + 900:
        os.system("pkill vncviewer")
        sql = "UPDATE tb_status set status='standby', keterangan='-' where status='on'"
        try:
           cursor.execute(sql)
           db.commit()
        except:
           db.rollback() 

    for row in res :
        mdata =row[0]

        print(mdata)
        data = mdata.split("#")

        if len(data)==1:
            data1=data[0]
        elif len(data)==2:
            data1=data[0]
            data2=data[1]
        elif len(data)==3:
            data1=data[0]
            data2=data[1]
            data3=data[2]
         
        proses =0
        if len(data)==1: 
            if data1 == "scan": #scan
                print "SCAN"
                proses=1
                #SCAN

                sql="Truncate tb_status"
                try:
                     cursor.execute(sql)
                     db.commit()
               
                except:
                     db.rollback()
               
                with open(os.devnull, "wb") as limbo:
                    for n in xrange(100, 150):
                        ip="192.168.1.{0}".format(n)
                        result=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "1", ip],
                        stdout=limbo, stderr=limbo).wait()
                        if result:
                            print ip, "offline"
                        else:
                            print ip, "online"
                            tanggal=strftime("%Y-%m-%d", gmtime())
                            jam=strftime("%H:%M:%S", gmtime())
                            sql="INSERT INTO `tb_status` (`tanggal` ,`jam` ,`ip` ,`status` ,`keterangan`) VALUES('%s','%s','%s','%s','%s')" % (tanggal,jam,ip,'standby','-')
                            print sql
                            try:
                                cursor.execute(sql)
                                db.commit()
                            except:
                                db.rollback()
            elif data1 == "close":
                  proses=1
                  print "CLOSE"
                  os.system("pkill vncviewer")
                  paketimer=False

        elif len(data)<=3: 
            if data1 == "on": #on#192.168
                proses=1

                ip=data2
                tanggal=strftime("%Y-%m-%d", gmtime())
                jam=strftime("%H:%M:%S", gmtime())
                keterangan=data1

                sql="Truncate tb_command"
                try:
                     cursor.execute(sql)
                     db.commit()

                except:
                     db.rollback()


                sql ="UPDATE `tb_status` set `status`='%s', `jam`='%s', `tanggal`='%s', `keterangan`='%s' where ip='%s'" % ('on',jam,tanggal,keterangan,ip)
                #print (sql)
                try:
                     cursor.execute(sql)
                     db.commit()
                except:
                     db.rollback()

                #AL = os.system("./vnc2.sh "+ ip)
                subprocess.Popen(["./vnc2.sh", ip])
                paketimer=True
                start = time.time()

             
        print "OK-LOPS----"
        if proses==1:
            sql="Truncate tb_command"
            try:
                 cursor.execute(sql)
                 db.commit()
               
            except:
                 db.rollback()
    cursor.close ()
    db.close () 



+++++++++++++
sedang Bash Shell nya sbb: vnc2.sh

#!/bin/bash

ssvnc -cmd -viewer -scale 0.75  -fullscreen $1

+++++++++++++
tabelnya sbb:

CREATE TABLE `tb_command` (
  `command` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `tb_status` (
  `kode_status` int(15) NOT NULL,
  `tanggal` date NOT NULL,
  `jam` time NOT NULL,
  `ip` varchar(20) NOT NULL,
  `status` varchar(15) NOT NULL,
  `keterangan` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `tb_status` (`kode_status`, `tanggal`, `jam`, `ip`, `status`, `keterangan`) VALUES
(1, '2018-10-30', '15:50:51', '192.168.1.8', 'standby', '-'),
(2, '2018-10-30', '15:50:51', '192.168.1.9', 'standby', '-'),
(3, '2018-10-30', '15:59:49', '192.168.1.10', 'on', 'on'),
(4, '2018-10-30', '15:50:52', '192.168.1.11', 'standby', '-');



Ok mudah yaaaaaaaaaaaaaaaaaaaaaaaaaa

 




Rabu, 03 Januari 2018

Aplikasi Counter Bank GUI

Teman-teman sy ingin berbagi tentang penerapan raspberry untuk aplikasi counter di RS, Bank dll
cara kerjanya adalah: sistem raspberry menerima data serial dari PC operator
msial operator2 mengirimkand data antrian U77

maka secara background : PC tsb akan mengirimkan data serialnya ke raspberry
dan raspberry akan meresponnya dengan menampilkannya secara Realtime ke display moitornya
Sederhana namun bobot dari koding ini adalah sbb:
+Realtime GUI
+Realtime Serial Event
+Python Berbasis GUI

Harapannya semoga aplikasi ini bisa menambah kecintaan kita pada raspberry PI....CMIIw :-)


from PyQt5 import QtCore, QtGui, QtWidgets
import serial
import time, threading
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import QtWidgets
global ser
ser = serial.Serial('/dev/ttyUSB0', baudrate=1200, timeout=10,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    bytesize=serial.EIGHTBITS
                    )



class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        desktop = QDesktopWidget()
     
        screenwidth = desktop.screen().width()+100
        screenheight = desktop.screen().height()+100
        top=screenheight/7
        bottom=screenheight-top-top-100
   
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(screenwidth, screenheight)
        MainWindow.setStyleSheet("background-color: #003366;")
     
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.lbl = QtWidgets.QLabel(self.centralwidget)
        self.lbl.setGeometry(QtCore.QRect(-5, top-100, screenwidth, 80))
        self.lbl.setStyleSheet("color: #FFFFFF;font:Bold")
        self.lbl.setFont(QFont('Xtreme Chrome',60))
        self.lbl.setAlignment(QtCore.Qt.AlignCenter)
        self.lbl.setObjectName("lbl")
     
        self.lblCounter = QtWidgets.QLabel(self.centralwidget)
        self.lblCounter.setGeometry(QtCore.QRect(-5, top+30, screenwidth, 300))
        self.lblCounter.setStyleSheet("background-color: #000000; color: #FFFF00;font:Bold")
        self.lblCounter.setFixedHeight(300)
        self.lblCounter.setAlignment(QtCore.Qt.AlignCenter)
        self.lblCounter.setFont(QFont('Xtreme Chrome',250))
        self.lblCounter.setObjectName("lblCounter")

        self.lblLoket = QtWidgets.QLabel(self.centralwidget)
        self.lblLoket.setGeometry(QtCore.QRect(-5, bottom, screenwidth, 130))
        self.lblLoket.setStyleSheet("background-color: #cccccc; color: #ff0000;font:Bold")
        self.lblLoket.setFixedHeight(150)
        self.lblLoket.setAlignment(QtCore.Qt.AlignCenter)
        self.lblLoket.setFont(QFont('Xtreme Chrome',130))
        self.lblLoket.setObjectName("lblLoket")
     
    ##################
     
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 259, 21))
        self.menubar.setObjectName("menubar")
     
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "   "))
        self.lblCounter.setText(_translate("MainWindow", "A000"))
        self.lblLoket.setText(_translate("MainWindow", "Loket X"))
        self.lbl.setText(_translate("MainWindow", "NOMOR ANTRIAN"))
     
        # User Code
        self.timeout = 0
        self.check_serial_event()

    def check_serial_event(self):
        serial_thread = threading.Timer(1, self.check_serial_event)
        if ser.is_open == True:
            serial_thread.start()
            distance=""
            char1='T' #Loket 1
            char2='B'
     
            if ser.in_waiting:
                while True:
                    try:
                        msg = ser.readline().decode('ascii')
                        distance=distance+msg  
                        if distance.index(char2):
                            break
                     
                    except:
                        pass
                 
                print (distance)  
                ser.flush()
                #ser.close()
                l1=distance.index(char1)
                #l2=distance.index(char2)
                l2=distance.find(char2, l1+5)

                H1=distance[l1:l2-2] #l1+7
                H2=distance[l2:l2+4]

                print ('H1='+H1)
                print ('H2='+H2)
             
                self.lblLoket.setText(H1)
                self.lblCounter.setText(H2)
                distance=""
             
         
        #ser.close()
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())



Implementasinya:
OK ...In Sya Allah Mudah....