SNMP AGENT

BÄ°LGÄ°

Faydalı Linkler

SNMP Research--SNMPv3 Information
Secure Your Network This page provides information about SNMPv3 including RFCs and related materials available online. Some SNMPv3 books are listed at end of the page.
http://www.snmp.com/snmpv3/
RFC3410 gibi tanımlamalar
Configure SNMP version 1 or 2c for engines
You configure an SNMP agent for version 1 or 2c of the software, so that SMC engines can share network management information using the SNMP protocol. Select Configuration. Browse to . Right-click SNMP Agents and select New SNMP Agent. The SNMP Agent Properties dialog box opens.
https://help.stonesoft.com/onlinehelp/StoneGate/SMC/6.0.0/GUID-D4D594E3-CE69-4B6F-AC66-2A7B46C44006.html
TUT:snmptrap
Most SNMP traffic is sent from a management station to a network entity, in order to find out about that system or adjust its configuration in some way. Notifications (Traps and Informs) can be used by a network entity to signal abnormal conditions to a management station.
http://www.net-snmp.org/wiki/index.php/TUT:snmptrap
TUT:snmptrap SNMPv3
Additionally, the following page is similar in many ways to this page but laid out from the perspective of the snmptrapd application. It's possibly better written too: A quick recap on the difference between TRAPs and INFORMs: A TRAP is a SNMP message sent from one application to another (which is typically on a remote host).
http://www.net-snmp.org/wiki/index.php/TUT:snmptrap_SNMPv3
TUT:Configuring snmptrapd to receive SNMPv3 notifications
Before you can begin to understand how to use snmptrapd with SNMPv3 protected notifications you need to understand some basic concepts. Specifically, please read: SNMPv3 Options -- Documents how to use Net-SNMP with SNMPv3 in general TUT:snmptrap -- Discussing SNMP notifications and sending them using snmptrap TUT:snmptrap SNMPv3 -- Discussing SNMPv3 notifications and sending them using snmptrap SNMP supports two types of notifications: TRAPs and INFORMs. (In SNMPv1, there was only TRAPs; SNMPv2c and SNMPv3 support INFORMs too).
http://net-snmp.sourceforge.net/wiki/index.php/TUT:Configuring_snmptrapd_to_receive_SNMPv3_notifications
How SNMPv3 Works - a simple security breakdown
Watch first � How SNMP Works: https://youtu.be/2IXP0TkwNJU ### ** Download Nagios XI to start monitoring devices with SNMPv3: http://nag.is/snmpxidd ** L...
https://www.youtube.com/watch?v=NgceiOe9SO0
Configuring SNMPv3 Security Settings
Overview The version 3 of SNMP (SNMP v3) is used to provide a secured environment in managing the systems and networks. The Network Simulator supports SNMP v3 and provides option to start the network with SNMP v3 support in the Settings -> Runtime Settings dialog.
https://www.webnms.com/simulator/help/sim_network/netsim_conf_snmpv3.html
noAuthnoPriv, authNoPriv, authPriv
Net-SNMP
Net-SNMP Tutorial -- SNMPv3 Options The 3rd version of the SNMP protocol introduced a whole slew of new security related features that have been missing from the previous versions. In SNMPv1 and SNMPv2c, a simple community string was put in clear text into the packet to authenticate the request.
http://net-snmp.sourceforge.net/tutorial/tutorial-5/commands/snmpv3.html
Önemli örnekler
[SNMP] [Part 1] What is SNMP?
SNMP stands for Simple Network Management P rotocol . This is a protocol used primarily for "monitoring" network devices like servers, network switches, containers (like docker containers), etc. SNMP works over port 162 in most common scenarios. But they can be made to work over port 161 if using TCP.
https://medium.com/@sysadminhelp/what-is-snmp-part-1-4092c8143cc2
[SNMP ] [Part 2] Versions of SNMP
In both SNMPv1 and v2c, the client and server authenticate each other using a "community string". This is a user defined string of characters that are used more like a username or password to authenticate the communication between the SNMP client and SNMP server/manager. The community string is configured on both the client and the server/manager.
https://medium.com/@sysadminhelp/snmp-versions-of-snmp-part-2-1b34955b8d8c
[SNMP ] [Part3] SNMP v3 explained furthur - how is it better than SNMPv2
Read about versions of SNMP before starting this: https://medium.com/@sysadminhelp/snmp-versions-of-snmp-part-2-1b34955b8d8c SNMPv3 explained furthur SNMP is very very powerful protocol and if not configured/secured properly, it can be used to extract sensitive information like passwords from the client machine.
https://medium.com/@sysadminhelp/snmp-part3-snmp-v3-explained-furthur-how-is-it-better-than-snmpv2-5f42288342a2

Ek Özellikler

snmp version comperantion

V1 ile V3 Arasında tcpdump ile Farklar

�uan ki Cihazın Engine ID si 80001F8880A8C84459A3B9BB5E

V3 için Kullanıcı Eklemek

net-snmp-config komutu ile kullanıcı eklemek

> sudo apt-get install net-snmp-config
> sudo apt-get install libsnmp-dev
> net-snmp-config yazıp help bilgilerine erişebilirsin.
> service snmpd stop
> sudo net-snmp-config --create-snmpv3-user -ro -a md5hakan -x aeshakan -X AES -A MD5 hakan
> sudo net-snmp-config --create-snmpv3-user -ro -a md5tafi8234 -x aestafi8234 -X AES -A MD5 ibo

> sudo net-snmp-config --create-snmpv3-user -ro -a md5hakan -x aeshakan -X AES -A MD5 hakanusta
adding the following line to /var/lib/snmp/snmpd.conf:
   createUser hakanusta MD5 "md5hakan" AES aeshakan
adding the following line to /usr/share/snmp/snmpd.conf:
   rouser hakanusta

> sudo net-snmp-config --create-snmpv3-user -ro -a md5deneme -A MD5 deneme
adding the following line to /var/lib/snmp/snmpd.conf:
   createUser deneme MD5 "md5deneme" DES
adding the following line to nano /var/lib/snmp/snmpd.conf:
   rouser deneme

> service snmpd start

Yukarıdaki komutu yazdığında yeni kullanıcı oluşur. Bunu

> nano /var/lib/snmp/snmpd.conf

içerisinde ve

> nano /usr/share/snmp/snmpd.conf

içerisinde görebilirsin.

Ek bilgi :

rouser ibo yanına priv .1 yani rouser ibo priv .1 yazmanında bir anlamı vardır.

Manual kullanıcı eklemek

> service snmpd stop
> nano /etc/snmp/snmpd.conf

createUser ali MD5 "md5tafi8234" AES "aestafi8234" 

yazılıp

> nano /var/lib/snmp/snmpd.conf

rouser ali 

ya da rwuser ali

> service snmpd start

gibi yazılırsa manual olarak kullanıcı eklenmiş olur.

> nano /var/lib/snmp/snmpd.conf

Yine yukarıdaki dosyaya baktığımızda kullanıcının eklendiğini görebiliriz.

V3 manual kullanıcı eklemek ve çıkarmak (web)

link:CONGTOGEL

In my understandings, the net-snmp-create-v3-user would simply do the following:

service stop snmpd
$EDITOR  /var/lib/net-snmp/snmpd.conf  - my link -> /var/lib/snmp/snmpd.conf
[add *usmUser* lines]
$EDITOR  /etc/snmp/snmpd.conf
[add *rouser* and *rwuser* lines]
service start snmpd

The snmpd should be stopped before adding new user data in the .conf files.

Equivalent to net-snmp-create-v3-user, removing an user would be something similar:

service stop snmpd
$EDITOR  /var/lib/net-snmp/snmpd.conf  - my link -> /var/lib/snmp/snmpd.conf
[find and remove *usmUser* info]
$EDITOR  /etc/snmp/snmpd.conf
[find and remove *rouser* and *rwuser* info]
service start snmpd

Rather than printable characters, the usmUser fields are expressed as hex strings. They are simply not encrypted.

PowerSNMP Free Manager V3 Ayarları

Komut Satırından V3 te snmpget ile data çekmek

> snmpget -v 3 -l authPriv -u bulo -A '12345678' -x AES -X '123456789' -a MD5 10.0.0.197 .1.3.6.1.4.1.54358.1.1.5.1.2.0

cevap : iso.3.6.1.4.1.54358.1.1.5.1.2.0 = STRING: "STS203"

Trap Çalışmaları

link:

http://www.net-snmp.org/tutorial/tutorial-5/commands/snmptrap.htmlhttp://www.net-snmp.org/wiki/index.php/TUT:snmptrap_SNMPv3

calisan v1 snmp trap

snmptrap -v 1 -c public 10.0.0.105 '.1.3.6.1.4.1.54358' '10.0.0.197' 6 22 '' .1.3.6.1.4.1.54358 s "Sound Off"

calisan v2c snmp trap

snmptrap -v 2c -c public 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358 s "Sound Off"
snmptrap -v 2c -r '3' -t '5' -c public 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358 s "Sound Off"
-r repeat
-t timeout (sn)

calisan v3 snmp trap

snmptrap -v 3 -u 'bulo' -a MD5 -A 12345678 -l authNoPriv 10.0.0.105 6 .1.3.6.1.4.1.54358
snmptrap -v 3 -u bulo -l authNoPriv -x AES -X 123456789 -a MD5 -A 12345678 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358 s "Sound off"	
PowerSNMP Free Manager da bu komut sonucu oluÅŸan trap

⚠�
v3 için yukarıdakilerde yanlışlıklar var, aşağıdaki tam doğru
> snmptrap -v 3 -u bulo -l authPriv -x AES -X 123456789 -a MD5 -A 12345678 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358 s "Sound off"	

Inform Çalışmaları

⚠�
Yukarıdaki snmptrap göndermelerinde .1.3.6.1.4.1.54358 şeklinde bırakılıyordu. Aşağıda .1.3.6.1.4.1.54358.1.1.4.4.1.26 şekline getirildi. Message Details daki farklılıklar incelenmelidir.

V2c trap

> snmptrap -v 2c -c public 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358.1.1.4.4.1.26 s "Sound Off"

V2 inform

> snmptrap -Ci -v 2c -c public 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358.1.1.4.4.1.26 s "Sound Off"


V3 trap

> snmptrap -v 3 -u bulo -l authPriv -x AES -X 123456789 -a MD5 -A 12345678 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358.1.1.4.4.1.26 s "Sound off"

V3 inform

> snmptrap -Ci -v 3 -u bulo -l authPriv -x AES -X 123456789 -a MD5 -A 12345678 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358.1.1.4.4.1.26 s "Sound off"

Manager da ayarlıysa aşağıdaki inform bilgisi gelir.

Timeout olma durumunundaki şartları aynı şekilde ayarlayabiliriz. Yani ;

> snmptrap -Ci -v 3 -t 5 -r 2 -u bulo -l authPriv -x AES -X 123456789 -a MD5 -A 12345678 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358 s "Sound off"

şeklinde 5 sn timeout tan sonra 2 + 1 → 3 sefer inform gönderir. Bu değerler girilmezse 5 sefer inform gönderir.

V3 inform da sistem inform alabilmesi için manager tarafında ayar gerekir.

Manager Ayar

ID kendinden yazıyordu.

Trap e EngineID eklemek

The Security Engine ID
Several copies of a given username can exist within an SNMP installation, however only one copy can exist within the scope of any one Security Engine. So the group of five options shown above are always paired with a Security Engine ID. This is a numerical string represented in hex format. There are many long and varied methods for determining what value to use for a security engine ID and there is as yet no formal consensus. This document is not the place to examine the arguments, however in the setup you will need to choose a value to use as the Security Engine ID. This must match the receiver's Engine ID and Username's config grouping of options.

Link: https://www.microfocus.com/documentation/server-cobol/51/chaudt21.htm

#define ENGINEID_TYPE_IPV4    1
#define ENGINEID_TYPE_IPV6    2
#define ENGINEID_TYPE_MACADDR 3
#define ENGINEID_TYPE_TEXT    4

Aslında trap gonderirken istenirse engineID gönderilen komutun içerisine eklenir ve karşı tarafta

şeklinde kaydedince istenilen engineID ile data gönderilmiş olur.

Örnek:

> snmptrap -e 0x12345678901234 -v 3 -u emirali -l authPriv -x AES -X aesemirali -a MD5 -A md5emirali 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358 s "Sound off"

Görüldüğü üzere yukarıdaki komut gönderildiğinde aşağıdaki trap belirir. (EngineID sine dikkat ediniz.)

Trap gönderirken eğer engineID eklemezseniz

> nano /etc/snmp/snmpd.conf

komutu ile dosyanın içerisindeki engineIDType ile engineID nin MAC adresine göre ayarladığımızda elde edilme yöntem olan engineIDType 3 yaptığımızda,

snmptrap -v 3 -u emirali -l authPriv -x AES -X aesemirali -a MD5 -A md5emirali 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358 s "Sound off"

şeklinde gönderdiğimizde

snmptrap -e 0x80001F8880A8C84459A3B9BB5E-v 3 -u emirali -l authPriv -x AES -X aesemirali -a MD5 -A md5emirali 10.0.0.105 '' '.1.3.6.1.4.1.54358' .1.3.6.1.4.1.54358 s "Sound off" ile aynıdır.

Tabiki istersek yine -e ile istediğimiz id yi yazıp karşı taraftan alma ayarı ona göre yapıldığında çalışma sorunu yaşanmaz.

EngineID yi bulmak

snmpget -v 2c -c public localhost .1.3.6.1.6.3.10.2.1.1.0 bu komut oldEngineID yi veriyor.

> snmpget -v 2c -c public 10.0.0.197 .1.3.6.1.6.3.10.2.1.1.0
iso.3.6.1.6.3.10.2.1.1.0 = Hex-STRING: 80 00 1F 88 03 02 81 E1 CA 0B C1
https://knowledge.broadcom.com/external/article/192361/how-to-get-the-snmpengineid-on-messaging.html

DeÄŸiÅŸik OID listeleri

�
Bu linkte deÄŸiÅŸik bir ÅŸekilde OID listesi mevcut https://p.libren.ms/view/raw/cae96791
�
http://oidref.com/1.3.6.1.6.3.10.2.1.1

AutoStart Sorunu için Çözüm

Sorun:

ilk açılışta node-red server açılamıyordu. Ben de sudo systemctl disable nodered.service yapıp auto start ı kapattım ve terminalden >node-red yazarak çalıştırdığımda node-red possible EventEmitter memory leak detected. Use emitter.setMaxListeners() to increase limit şeklinde bir hatadan dolayı açılmadığını gördüm. (Fakat >node-red ile bir müddet bekleyince açılıyor.)

Çözüm

Bunun üzerine araştırmalarım sonucu node ları manage pallete ten (node-red/admin den) update ettim. Bu sefer sqlite hatası verdi. Bunun için

> sudo npm install -g --unsafe-perm node-red                 //şart mı bilmiyorum
> cd ~/.node-red
> npm rebuild

yaptım. (https://flows.nodered.org/node/node-red-node-sqlite)

> sudo systemctl enable nodered.service

>nano /etc/systemd/system/nodered.service ile "Environment="NODE_OPTIONS=--max-old-space-size=256" → 128 di 256 yaptım ve "Nice=50" → 10 du 50 yaptım.

�
/etc/systemd/system/nodered.service da Nice ın anlamını bilmiyorum.

Aşağıdaki komutlar da npm update için fakat bana faydası olup olmadığını bilmiyorum.

npm cache clean -f
npm install -g n

(sorunu çözerken denediklerim)

> sudo apt-get install npm
> npm update
> node-red-pi --max-old-space-size=256

sts 4 kutup mib dosyası

node-red service i auto start tan çıkartır

> systemctl disable nodered.service

Removed /etc/systemd/system/multi-user.target.wants/nodered.service.

( NEW ) UPS, STS SNMP AGENT

NODE-RED kullanmadan lightweight web server DESIGN

Links:

https://www.raspberrypi.org/documentation/remote-access/web-server/nginx.md#:~:text=NGINX (pronounced engine x) is,scripting languages such as PHP.

Lightweight Raspberry Pi 3 Web Server Using PHP And HTML
This article demonstrates how to make a lightweight Web Server for the home using Raspberry Pi 3 and Python 3 IDE. The Pi can even handle Web Server so if you want to launch your own website with a proper back-end you can easily do it.
https://www.c-sharpcorner.com/article/lightweight-raspberry-pi-3-web-server-using-python/
Which Light Weight, Open Source Web Server is Right for You? - Linux.com
If you use Linux, most likely Apache is your web server of choice. Apache is a great choice. It's incredibly powerful, very reliable, and secure. There may, however, be certain deployments that either do not need all of the features found in Apache, do not have the resources to support Apache (such as in the ...
https://www.linux.com/news/which-light-weight-open-source-web-server-right-you/

https://www.nginx.com/resources/wiki/modules/index.html (Nginx adons)

How To Install Linux, Nginx, MySQL, PHP (LEMP stack) in Ubuntu 16.04 | DigitalOcean
The LEMP software stack is a group of software that can be used to serve dynamic web pages and web applications. This is an acronym that describes a Linux operating system, with an Nginx web server. The backend data is stored in the MySQL database and
https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04

Python Web Development | Web Development Using Django

Python Web Development | Web Development Using Django | Python Django Tutorial | Edureka
🔥 Edureka Python Master Program: https://www.edureka.co/masters-program/python-developer-trainingThis Edureka video on 'Python Web Development' will help y...
https://www.youtube.com/watch?v=zuxzE7--RYM

Orange pi ya da Raspberry pi de nginx kurmak ve php yi baÄŸlamak

link : https://www.raspberrypi.org/documentation/remote-access/web-server/nginx.md#:~:text=NGINX (pronounced engine x) is,scripting languages such as PHP.

Setting up an NGINX web server on a Raspberry Pi

NGINX (pronounced engine x) is a popular lightweight web server application you can install on the Raspberry Pi to allow it to serve web pages.

Like Apache, NGINX can serve HTML files over HTTP, and with additional modules can serve dynamic web pages using scripting languages such as PHP.

Refresh database of available packages

Ensure that the package manager has up-to-date information about which packages are available:

sudo apt update

You only need to do this occasionally, but it's the most likely solution if subsequent steps fail with messages like:

  404  Not Found [IP: 93.93.128.193 80]

Install NGINX

First install the nginx package by typing the following command in to the Terminal:

> sudo apt install nginx

and start the server with:

sudo /etc/init.d/nginx start

Test the web server

By default, NGINX puts a test HTML file in the web folder. This default web page is served when you browse to http://localhost/ on the Pi itself, or http://192.168.1.10 (whatever the Pi's IP address is) from another computer on the network. To find the Pi's IP address, type hostname -I at the command line (or read more about finding your IP address).

Browse to the default web page either on the Pi or from another computer on the network and you should see the following:

Changing the default web page

NGINX defaults its web page location to /var/www/html on Raspberry Pi OS. Navigate to this folder and edit or replace index.nginx-debian.html as you like. You can confirm the default page location at /etc/nginx/sites-available on the line which starts with 'root', should you need to.

Additional - Install PHP

sudo apt install php-fpm

Enable PHP in NGINX

cd /etc/nginx
sudo nano sites-enabled/default

find the line

index index.html index.htm;

roughly around line 25 (Press CTRL + C in nano to see the current line number)

Add index.php after index to look like this:

index index.php index.html index.htm;

Scroll down until you find a section with the following content:

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
# location ~ \.php$ {

Edit by removing the # characters on the following lines:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}


Burası açıldığında normaldeki php(php5-fpm.sock) versiyonundan başka versiyon görünüyor olabilir.
Bunu cd /var/run/php/ ile ls yaptığımızda görürüz. �uan için bende "php7.2-fpm.sock". Bu yüzden 

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php7.2-fpm.sock;
}
olarak deÄŸiÅŸtirl

It should look like this:

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

        # With php-fpm (or other unix sockets):
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        # With php-cgi (or other tcp sockets):
    #    fastcgi_pass 127.0.0.1:9000;
        }

Reload the configuration file

sudo /etc/init.d/nginx reload

Yukarıdakilerle yaptığımda bazı sorunlar yüzünden php çalışmadı.

SEBEBÄ°:

> sudo nano /etc/nginxsites-enabled/default

location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php5-fpm.sock; }

ya da hangi versiyon yazıyorsa (bende 7.0 yazıyıordu.) onun yerine

ls /var/run/php/      

php7.2-fpm.sock dosyasını gördüm.

Yani sonuçta;

> sudo nano /etc/nginxsites-enabled/default

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php7.2-fpm.sock;
}
olmalı. Bunlara ek olarak
location ~ /\.ht {
        deny all;
    }
ları da açtım. 
(https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04)

Yine ek olarak;

> sudo nano /etc/php/7.2/fpm/php.ini

cgi.fix_pathinfo=0 yaptım.

> sudo systemctl restart php7.2-fpm

Test PHP

yedek aldımindex.nginx-debian.html to yedek_index.nginx-debian.html:

> cd /var/www/html
> cp index.nginx-debian.html yedek_index.nginx-debian.html

Open index.php with a text editor:

> sudo nano index.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>www.yazilimkodlama.com</title>
</head>
 
<body>
<?php
echo "<table border='1' width='200px'>";
echo "<tr>";
echo "<th>Sayı</th>";
echo "<th>Karesi</th>";
echo "<th>Küpü</th>";
echo "</tr>";
for ($i=1;$i<=10;$i++){
   echo "<tr>";
   echo "<td>$i</td>";
   echo "<td>",$i*$i,"</td>";
   echo "<td>",$i*$i*$i,"</td>";
   echo "</tr>";
}
echo "</table>";
?>
</body>
</html>

Çalıştı.

Udemy den php dersi aldım. Ona çalışıyorum. Link:

https://www.notion.so/PHP-Dersi-ea97e100c7664a2da9d17189bbc4c111

Yazılacak PHP kodlarda dosya açma ve kapama gibi işlemlerin yapılabilmesi için chown ile bazı komutların girilmesi lazım.

> cat /etc/passwd
ile kullanıcı listesinden bizim kullanacağımız olan www-data bulundu. (server apachi değil nginx)

> chown -R www-data:www-data /var/www/html/
> chmod -R 755  /var/www/html/

( https://stackoverflow.com/questions/47902954/shell-command-touch-not-working-in-php )

Server Kapatılıp otomatik Start pasif

> sudo systemctl stop nginx
> sudo systemctl disable nginx

Server ın durumunu ogrenmek için

> sudo systemctl status nginx
> sudo systemctl status nginx | grep 'running' | awk '{print $3}'
  (running)

PHP vs JavaScript, backend(sunucu), frontend (istemci)

Link: https://www.hostinger.web.tr/rehberler/php-nedir/#:~:text=PHP

Programlama dilleri ya istemci tarafında (frontend), ya da sunucu tarafında (backend) çalışabilir.

İstemci tarafındaki scriptler web tarayıcıları tarafından işlenir. Tarayıcınız, yani istemci istemci taraflı scriptleri içeren bir sayfa isterse, sunucu tarayıcı için çalıştırılabilir olan kaynak kodları yollarak cevap verir.

Öte yandan sunucu taraflı programlama dili scriptlerin tarayıcılara yollamadan önce sunucularda çalıştırıldığı anlamına gelir. Yani kaynak konu yollamadan önce web sunucuları kodları sade bir HTML formatına dönüştürmeden önce işler(çözümler).

Bundan dolayı sunucu taraflı programlama web masterların kaynak kodlarını saklamalarına izin verirken istemci taraflı scriptler istemcinin kullanıcıları kolaylıkla görülebilir.

Artık programlama dillerinin temelini anladığınıza göre PHP nedir adlı esas sorumuza geri dönebiliriz.

PHP vs JavaScript

Daha önce de belirttiğimiz gibi PHP ile birçok şey yapabilirsiniz. Ancak PHP genellikle dinamik içerik oluşturmak için kullanılmaktadır.

Eğer JavaScript’e aşinaysanız JavaScript’in ayrıca statik bir sayfanın daha dinamik ve interaktif için kullanıldığını da bilirsiniz. Bu nedenden dolayı PHP ve JavaScript birbirine benzer fonksiyonlara sahip olan iki adet programlama dilidir.

Neden ikisine de ihtiyacımız var?

Konu bir dinamik web sitesi kurmaya geldiğinde tamamiyle JavaScript ile çalışan bir tane kurmak mümkündür. Ancak fonksiyonellik değişebilir.

JavaScript ile fare rollover efekti, otomatik doğrulama ve fotoğraf galerileri gibi basit etkileşimlere izin veren dinamik bir site yapabilirsiniz. Ancak sosyal ağlar ve eticaret (kullanıcı davranışına göre değişen web siteler) gibi kullanıcı katkılı içerikler yaratamaz. Bunu yapmak için PHP’ye ihtiyaç duyarsınız.

Diyelim ki bir sosyal ağa giriş yapıyorsunuz. Profilinizi görüntülemek için PHP veritabanınızdan veri alır ve tarayıcınıza sonuç yollar.

Profilinize her değişik yaptığınızda ilerideki veri alımları için PHP yeni bilgiyi depolayacaktır. Bütün bu işlem bir sosyal ağın farklı kullanıcılara farklı içerikleri görüntülemesine izin verir.

Bu yüzden JavaScript ve PHP rakip değillerdir. Hatta birlikte güzel bir dinamik web sitesi yapmak için kullanılabilirler.

Yardımcı linkler :

Top 7 Web Development Languages To Use In 2020 - Designveloper
If you are a newcomer in the sofware development industry, the nuisance here is where to start or which web development languages you should learn.
https://www.designveloper.com/blog/web-development-languages-2020/

Web GeliÅŸtirmede PHP ve Python

Web GeliÅŸtirmede PHP ve Python
Son zamanlarda web teknolojilerinde karşımıza sık sık PHP vs. Python karşılaştırmaları çıkmaya başladı. Peki, iyi bir web sitesi hazırlamak için hangisini tercih etmeliyiz? Bu sorunun cevabını merak edip ufak bir araştırma yaptım. Cevap aslında oldukça göreceli çünkü bu en iyi bildiğiniz programlama diline bağlı.
https://medium.com/@beryasar/i%CC%87yi-bir-web-sitesi-i%CC%87%C3%A7in-php-mi-python-m%C4%B1-45ccf7bcc012
Top 7 Web Development Languages To Use In 2020 - Designveloper
If you are a newcomer in the sofware development industry, the nuisance here is where to start or which web development languages you should learn.
https://www.designveloper.com/blog/web-development-languages-2020/

Sonuç olarak düşük bellekli bir sistem (max 128 mb) tasarımı yapacağım için PHP yi tercih edeceğim.

Python için framework ler

Web Geliştirme İçin En İyi 5 Python Framework'ü | Teknoloji.org
Son yıllarda popülaritesi oldukça yüksek olan Python, insanlar tarafından en çok Web Geliştirme ve Makine Öğrenimi alanlarında kullanılıyor. Popülaritesinin bu kadar fazla olmasının en temel sebeplerinden biri, her şeyi kolaylaştıran kütüphane ve frameworklerinin bulunmasıdır. Java veya C++ gibi programlama dillerinde 50 kod satırı gerektiren bir işlem Python'da sadece 5 satırda yapılabiliyor.
https://teknoloji.org/web-gelistirme-icin-en-iyi-5-python-frameworku/
WebFrameworks - Python Wiki
Generally, frameworks provide support for a number of activities such as interpreting requests (getting form parameters, handling cookies and sessions), producing responses (presenting data as HTML or in other formats), storing data persistently, and so on.
https://wiki.python.org/moin/WebFrameworks

C# kullanarak cihazı ip tabanı farketmezsizin ağda bulan ve ip sini değiştirebilen programa ihtiyacımız var

Open source snmp library for c#

Configure network devices using the SNMP protocol with C# and .NET
The Simple Network Management P rotocol (SNMP) is an Internet Standard protocol to manage network devices and can be used to change the behaviour of a network device remotely and help with network monitoring. Use the more secure SNMP v3 standard for improved performance, flexbility and security to deploy and monitor network devices.
https://nitinmanju.medium.com/configure-network-devices-using-the-snmp-protocol-with-c-and-net-1124c5ea8827
SnmpSharpNet 0.9.5
Simple Network Management Protocol Open Source library written in c# with support for SNMP version 1, 2c and 3. Support for Get, Get-Next, Get-Bulk and Set requests, Response and Report replies and Trap, V2Trap and Inform Notifications is implemented. SNMP version 1 Traps have a dedicated packet class SnmpV1TrapPacket because they are substantially different from other SNMP version 1 packets.
https://www.nuget.org/packages/SnmpSharpNet/

SNMP agent ı ağda bulma

Farklı methodlar mevcut cihazı bulmak için. IP tarayarak bulmak çok uzun bir method. Daha hızlı bir teknik olan teknik ise ARP ın çalışma mantığındaki iki cihazın birbiriyle haberleşmesi için kullanılan broadcast e bu ip kimin diye bir soru sorup cevap olarak MAC adresi alması olayının benzerini burada kullandık. ARP çalışma mantığı ile alakalı aşağıdaki linkten bilgi edinilebilir.

https://medium.com/@gokhansengun/bilgisayarlar-ağda-birbirlerini-nasıl-bulurlar-45824b166908

https://www.geeksforgeeks.org/arp-reverse-arprarp-inverse-arp-inarp-proxy-arp-and-gratuitous-arp/?ref=lbp

Yapılan çalışma mantığı ise cihaz belli aralıklarla broadcast e 161 portundan TESCOM-UPS ve MAC adresini gönderiyor.

Yapılan PC programı ağda UDP 161 portunu dinleyip TESCOM-UPS kelimesini bekliyor. Cihazı bulduğunda ip,mac gibi bilgilere edinmiş oluyor. Ağda bulunduktan sonra PC programı yine broadcast e 162 portundan ayarlanan ip verilerini gönderiyor.

Aynı şekilde cihaz da UDP 162 portunu dinliyor ve oradan gelecek veriye göre /etc/network/interfaces dosyasını değiştirip reboot yapıyor. Bu dinleme ve gonderme işlerini cihaz, node-red ile web server üzerinde yapılıyor.

Bunu yapan node-red kodu:

Aşağıdaki kod 07.01.2021 12:36 da yenilenip eklendi. Farkı ise PC programı start-to-send diye data gönderiyor. Ondan sonra ağa 20 sn boyunca 1sn aralıklarla broadcast üzerinden yayın yapıyor. Ondan sonra broadcast yayınını durduruyor.

PC tarafın C# kodu yazıldı fakat Hercules ile UDP dinlenip yine UDP den data gönderilebilir.

PC kodu: ( https://stackoverflow.com/questions/40616911/c-sharp-udp-broadcast-and-receive-example )

static void Main()
{
    UdpClient Configuration = new UdpClient(new IPEndPoint(IPAddress.Parse(data.IPAddress), configuration.Port));  //set up the bind to the local IP address of my choosing
    ConfigurationServer.EnableBroadcast = true;
    Configuration.Connect(new IPEndpoint(IPAddress.Parse(data.BroadcastIP), configuration.Port);
    Listen();

 }

private void Listen()
{
    Task.Run(async () =>
            {
                while (true)
                {
                    var remoteIp = new IPEndPoint(IPAddress.Any, configuration.Port);
                    var data = await ConfigurationServer.ReceiveAsync();

                    // i would send based on what data i received here
                    int j = 32;
                }
            }
});
} 

Aşağıdaki gönderme kodudur.

int PORT = 162;
UdpClient udpClient = new UdpClient();
udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, PORT));

var from = new IPEndPoint(0, 0);
Task.Run(() =>
{
    while (true)
    {
        var recvBuffer = udpClient.Receive(ref from);
        Console.WriteLine(Encoding.UTF8.GetString(recvBuffer));
    }
});

var data = Encoding.UTF8.GetBytes("ABCD");
udpClient.Send(data, data.Length, "255.255.255.255", PORT);

SD kartın sağlığı için yapılması gerekenlerden biri : swapping işlemini minimuma indirmek ya da kapatmak

Konu ile ilgili yazımı okuyabilirsin. gate.io login

Link: https://askubuntu.com/questions/440326/how-can-i-turn-off-swap-permanently

> swapoff - a
ile swapping işlemi durur. Fakat reboot ettiğinde tekrar aktif çalışır.

Bunun için;

> sudo nano /etc/sysctl.conf
edit: vm.swappiness=10 ya da 1 e kadar indirebilirsin. Bu çok mecbur durumda swapping yapmasını sağlar.

> cat /proc/swaps
ile o sırada ne kadar ramden ne kadar swap alanı kullanılmış onu gösterir.

Visual Studio Code kurulumu ve ssh üzerinden Orange pi üzerinde çalışma

Ä°nternetten indirip kuruyoruz.

ssh kurulumu için soldaki Extention butonundan ssh-fs yazıp yönergeleri takip edince hem ssh bağlantısı yapabiliyorsunuz hem de kodu visual studio code üzerinde yazıyorsunuz fakat save edince orange pi nin içerisine kaydedilmiş oluyor. Dolayısıyla kodunuzu hemen çalıştırabiliyorsunuz.

SNMP için C# ile ssh tan testçilere program hazırlama

links:

C# send a simple SSH command
I'm a young a student and received my homework for this week. It's pretty difficult for me because I have to create a program, that is able to connect to an SSH server and send the command "etc/init.d/networking restart". I should program this application in C# and I'm pretty new to it (Just have learned from some school lessons).
https://stackoverflow.com/questions/11169396/c-sharp-send-a-simple-ssh-command
SSH Examples for C#
Chilkat * HOME * Androidâ„¢ * Classic ASP * C * C++ * C# * Mono C# *.NET Core C# * C# UWP/WinRT * DataFlex * Delphi ActiveX * Delphi DLL * Visual FoxPro * Java * Lianja * MFC * Objective-C * Perl * PHP ActiveX * PHP Extension * PowerBuilder * PowerShell * PureBasic * CkPython * Chilkat2-Python * Ruby * SQL Server * Swift 2 * Swift 3,4,5...
https://www.example-code.com/csharp/ssh.asp

SshClient cSSH = new SshClient("192.168.10.144", 22, "root", "pacaritambo");
cSSH.Connect();
SshCommand x = cSSH.RunCommand("exec \"/var/lib/asterisk/bin/retrieve_conf\"");
cSSH.Disconnect();
cSSH.Dispose();

//using SSH.Net

Orange Pi Zero LTS de çalışan Armbian için cross-compile denemesi

gcc -v ile hangi version toolchain kullandığını buldum.

root@TescomUPS:~# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/7/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=arm-linux-gnueabihf- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-werror --enable-multilib --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1)
Linaro Releases
https://releases.linaro.org/components/toolchain/gcc-linaro/

Buradan indirdim fakat ilerleyemedim ve derleyemedim.

Bunun dışında aşağıdaki link ile bir cross-compiling denedim ve Orange pi zero üzerinde çalıştırdım.

root@TescomUPS:/opt# ./deneme 
Hello world !

Fakat bunu Qt ile denediğimde olmuyor. Derliyor fakat orange pi zero üzerinde çalışmıyor.

Qt ile derlediğim kodun orange pi üzerinde çalıştırdığımdaki cevabı:

> ./HelloWorld
bash: ./HelloWorld: cannot execute binary file: Exec format error
Install the ARM cross compiler toolchain on your Linux Ubuntu PC
This article illustrates how to install on a Ubuntu Linux PC the complete toolchain to cross compile the Linux Kernel, the Linux device drivers, the Linux applications and the boot loader like as AT91Bootstrap and its derivates like AcmeBoot and AriaBoot.
https://www.acmesystems.it/arm9_toolchain

Sitenin PDF i :

Orange Pi Zero tarafında aşağıdaki komut ile qt kütüphanelerini yüklemiş oldum.

> sudo apt-get install qt5-default

Daha önce buildroot ile raspberry pi için hazırladığım qt cross-compiler ayarıyla çalıştırdım.

Ayrıca https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/arm-linux-gnueabihf/

linkinden gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz indirdim fakat bununla da qt den ayarladığımda yine cross-compile olarak çalıştıramadım.

Olması gereken yöntemler

apt-get -y install git
git clone https://github.com/armbian/build
cd build
./compile.sh

yapıp istediğin işletim sistemini seçerek derleme işlemi yapıp tüm işletim sistemini buradan yönetmekte fayda var. Fakat bunun için en kötü buradaki en düşük işletim sistemi olan ubuntu 18 olması gerekmektedir.

Yazılan örnek kod ve derlenemiş hali :

📢
Daha iyisi buildroot ta Orange Pi Zero için bir derleme yapıp tüm yazılımı burada geliştirmeli. Burada önceden snmp yi çalıştıramamıştım daha sonra çalıştırırsam daha verimli bir işletim sistemi olur.

External SNMP için LED ayarlamaları

wiringOP adında bir kütüphane var.

https://github.com/zhaolei/WiringOP

For Orangepi Pi

git clone https://github.com/zhaolei/WiringOP.git -b h3 

Installation

cd WiringOP
chmod +x ./build
sudo ./build

Examples : https://github.com/zhaolei/WiringOP/tree/h3/examples

#include <stdio.h>
#include <wiringPi.h>

// LED Pin - wiringPi pin 0 is BCM_GPIO 17.

#define	LED	0

int main (void)
{
  printf ("Raspberry Pi blink\n") ;

  wiringPiSetup () ;
  pinMode (LED, OUTPUT) ;

  for (;;)
  {
    digitalWrite (LED, HIGH) ;	// On
    delay (500) ;		// mS
    digitalWrite (LED, LOW) ;	// Off
    delay (500) ;
  }
  return 0 ;
}

Derleme sırasında kütüphaneleri düzgün çağırmak önemlidir.

> gcc LedCntlDeneme.c -l wiringPi -l pthread -l sqlite3 -o LedCntlDeneme

Pinler ( https://pcminipro.ru/stati/primer-programmy-miganie-svetodiodom-cherez-gpio/ )

💡
#define LED 0 → 0 yerine 1 yazarsak GPIO.1 i temsil eder.

11.01.2021 tarihindeki kod

�emalar

>gpio readall ile komut satırında pinler görünüyor.

WEB SERVER TASARIMI

<script src="vendor/jquery/jquery.min.js"></script>
<script type="text/javascript">
    function myFunction() 
    {
        setInterval
        ( 
            function()
            {
                $(".deneme").load("deneme2.php?data=15");
            } , 1000
        );
    }

    
</script>

<button onclick="myFunction()"  >Try it</button>
deneme2.php

<?php
    function getOneData($address)
    {

        $shm_id = shmop_open(0x1000, "w", 0666, 400);
        $shared_memory_string = shmop_read($shm_id,0,400); 
        $shared_memory_array = array_slice(unpack('C*', "\0".$shared_memory_string), 1);

        //print_r($shared_memory_array);
    
    
        $countOfArray = count($shared_memory_array) / 2 - 1;
        //echo "count: " . $countOfArray;
        for ($i = 0; $i <= $countOfArray; $i++) {
            $All_Data[$i] = ($shared_memory_array[($i<<1)+1] << 8) + $shared_memory_array[$i<<1];
        }


        //global $All_Data;
        $data = $All_Data[$address];
 
        return($data);
    }
    echo getOneData($_GET['data']);
?>
<script src="vendor/jquery/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(
    function myFunction() 
    {
        setInterval
        ( 
            function()
            {
                $(".deneme").load("deneme2.php?data=15");
            } , 1000
        );
    });

    
</script>

PC programı bizim SNMP cihazını bulabilmesi için PHP tarafına iki fonksiyon yazıldı.

<?php

    require 'header.php';


    function udpSend()//broadcast e data gonderiyor.
    {
        $ip = "255.255.255.255";
        $port = 50001;//161;
        $str = "02:81:cd:61:4a:d0#TMONX-SNMP#255.255.255.0#10.0.0.254#10.0.0.1";

        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
        socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
        socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>7, "usec"=>0));
        socket_sendto($sock, $str, strlen($str), 0, $ip, $port);

        /*
        while(true) {
        $ret = @socket_recvfrom($sock, $buf, 20, 0, $ip, $port);
        if($ret === false) break;
        echo "Messagge : < $buf > , $ip : $port <br>";
        }
        */

        socket_close($sock);
    }
    function udpRcv()//50002 portunu dinliyor
    {

        error_reporting(~E_WARNING);

        if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
        {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        
        die("Couldn't create socket: [$errorcode] $errormsg \n");
        }
        
        echo "Socket created \n";
        
        // Bind the source address
        if( !socket_bind($sock, '0.0.0.0' , 50002) )
        {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        
        die("Could not bind socket : [$errorcode] $errormsg \n");
        }
        
        echo "Socket bind OK \n";
        
        while(1)
        {
            echo "Waiting for data ... \n";
            
            //Receive some data
            $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);
            echo "$remote_ip : $remote_port -- " . $buf;
            
            //Send back the data to the client
            //socket_sendto($sock, "OK " . $buf , 100 , 0 , $remote_ip , $remote_port);
            if( $buf == "start-to-send" )
            {
                udpSend();//broadcast e data gonderiyor.
                break;
            }
        }
        
        socket_close($sock);
        
    }
    udpRcv();
?>

Yukarıdaki işlem php içerisinde düzgün çalışıyordu. Fakat iptal ettim çünkü web ile bağımlılıklar olmasın istedim. O yüzden c kodu ile aşağıdaki kodu çalıştırdım. (https://www.programmersought.com/article/59644473996/)

/*
	Simple udp server
*/
#include<stdio.h>	//printf
#include<string.h> //memset
#include<stdlib.h> //exit(0);
#include<arpa/inet.h>
#include<sys/socket.h>

#define BUFLEN 512	//Max length of buffer
#define PORT 162	//The port on which to listen for incoming data

int broadCast();
void die(char *s);

void die(char *s)
{
	perror(s);
	exit(1);
}

int broadCast()
{
	struct sockaddr_in b_addr;
	char *str = "02:81:cd:61:4a:d0#TMONX-SNMP#255.255.255.0#10.0.0.254#10.0.0.1";
	int socked=socket(AF_INET,SOCK_DGRAM,0);
	if(socked<0)
	{
		perror("sock failed");
		return 1;
	}
	int yes=1;
	if(setsockopt(socked,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes))<0)
	{
		perror("setsockopt failed\n");
		return 2;
	}
	
	b_addr.sin_family=AF_INET;
	b_addr.sin_addr.s_addr=inet_addr("255.255.255.255");
	b_addr.sin_port=htons(atoi("161"));
	
	int b_addr_len=sizeof(b_addr);
	int send_len=0;
	char buf[512];
	memset(buf,'\0',512);
	stpcpy(buf,"This is a broadcase UDP!");
	//send_len = sendto(socked, buf, strlen(buf), 0,(struct sockaddr *)&b_addr, b_addr_len);
	send_len = sendto(socked, (const char *)str, strlen(str), MSG_CONFIRM ,(struct sockaddr *)&b_addr, b_addr_len);
    if (send_len < 0) {
            printf("\n\rsend error.\n\r");
            exit(EXIT_FAILURE);
    }
    printf("send success %d.\n\r",send_len);
    close(send_len);
}


int main(void)
{
	struct sockaddr_in si_me, si_other;
	
	int s, i, slen = sizeof(si_other) , recv_len;
	char buf[BUFLEN];
    char *hello = "Hello from server"; 
	
	//create a UDP socket
	if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
	{
		die("socket");
	}
	
	// zero out the structure
	memset((char *) &si_me, 0, sizeof(si_me));
	
	si_me.sin_family = AF_INET;
	si_me.sin_port = htons(PORT);
	si_me.sin_addr.s_addr = htonl(INADDR_ANY);
	
	//bind socket to port
	if( bind(s , (struct sockaddr*)&si_me, sizeof(si_me) ) == -1)
	{
		die("bind");
	}
	
	//keep listening for data
	while(1)
	{
		printf("Waiting for data...");
		fflush(stdout);
		
		//try to receive some data, this is a blocking call
		if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == -1)
		{
			die("recvfrom()");
		}
		
		//print details of the client/peer and the data received
		printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
		printf("Data: %s\n" , buf);
		
		//now reply the client with the same data
	//	if (sendto(s, (const char *)hello, strlen(hello), MSG_CONFIRM, (struct sockaddr*) &si_other, slen) == -1)
	//	{
	//		die("sendto()");
	//	}
        broadCast();
	}

	close(s);
	return 0;
}

Aşağıdaki deneme Hercules ekranıdır. Normalde PC programı ile de denendi. Burada Broadcast e data gonderemediğim için 10.0.0.196 ile cihaz ip sini yazdım. Fakat PC programı broadcast e data gonderecektir.

UPS için SNMP PCB slot connetor Örnekleri

Electronic Components
Digi-Key is your authorized distributor with over a million in stock products from the world's top suppliers. Rated #1 in content and design support!
https://www.digikey.com/en/products/result?s=N4IgTCBcDaIMIEMBOATABAURQcwKZrgHsA7Y3AYwBdCkQBdAXyA

Soketler

[Hot Item] 2.54mm Card Edge Connector, Right Angle DIP Available for Different Poles PBT Selective Gold Plated
China 2.54mm Card Edge Connector, Right Angle DIP Available for Different Poles PBT Selective Gold Plated, Find details about China 2.54mm Card Connector, Right Angle DIP Available Connector from 2.54mm Card Edge Connector, Right Angle DIP Available for Different Poles PBT Selective Gold Plated - Antenk Electronics Co., Ltd.
https://antenk01.en.made-in-china.com/product/uBXEcWVrrFhM/China-2-54mm-Card-Edge-Connector-Right-Angle-DIP-Available-for-Different-Poles-PBT-Selective-Gold-Plated.html

Tr.off-discount.com
http://tr.off-discount.com/Elektrik-ekipman-ve-malzemeleri/15336-5-adet-grup-20-pin-kart-kenar-kad%C4%B1n-idc-konnektor-duz-%C5%9Ferit-kablo-icin-i%CC%87ndirim-50.html
2.54mm pitch
IDC CONNECTORS - IDC Card Edge Connectors 2.54mm pitch for flat-ribbon cables with 1.27mm pitch, Reliable PCB contact thanks to Hi-rel dual beam contact. PCB thicknesses from 1.38mm to 1.78mm are supported.
https://www.e-tec.com/v5/products/pcb-interconnect-products/idc-connectors/idc-card-edge-connectors/idc-card-edge-connector-2_54mm-pitch_90.html
583680-1 TE Connectivity AMP Connectors | Connectors, Interconnects | DigiKey
Order today, ships today. 583680-1 - 30 Position Card Edge Connector Housing Black 0.156" (3.96mm) Panel Mount from TE Connectivity AMP Connectors. Pricing and Availability on millions of electronic components from Digi-Key Electronics.
https://www.digikey.com/en/products/detail/te-connectivity-amp-connectors/583680-1/1136910

Kart slot plastikleri

307-220-078 EDAC Inc. | Connectors, Interconnects | DigiKey
Order today, ships today. 307-220-078 - Connector Card Guide For 305, 306, 307, 315, 316, 337, 338, 355, 356, 357, 387 Series from EDAC Inc.. Pricing and Availability on millions of electronic components from Digi-Key Electronics.
https://www.digikey.com/en/products/detail/edac-inc/307-220-078/1292400

Edge Card Connectors and Systems | Samtec
High-speed edge card sockets in vertical, right-angle, and edge mount designs with choice of 0.50 mm, 0.635 mm, 0.80 mm, 1.00 mm, 1.27 mm and 2.00 mm pitch. Edge card socket and cage interface in 2x10, 2x15 or 2x35 positions for mating with SFP, SFP+, XFP and XENPAK transceivers.
https://www.samtec.com/connectors/edge-card

Build an Event Calendar with PHP using jQuery, Ajax, and MySQL

Build an Event Calendar with PHP using jQuery, Ajax, and MySQL
Read Tutorial and Download source code from CodexWorld.com - https://www.codexworld.com/build-event-calendar-using-jquery-ajax-php/PHP Event Calendar - Build...
https://www.youtube.com/watch?v=Ttkxlr7BrVs

Source Code:https://www.codexworld.com/build-event-calendar-using-jquery-ajax-php/

Satılan Calender kodları:

eCalendar - Responsive Events Calendar
You have the opportunity to schedule your company's events in a beautifully designed calendar. Not for a company? No problem, maybe you are a person who is looking to be better organized. Therefore, eCalendar allows you to add endless amounts of events to any date in just few seconds.
https://codecanyon.net/item/ecalendar-responsive-events-calendar/9722895

Çalıştığım takvim kodunun kaynağı:

<?php
$monthNames = Array("Ocak", "Subat", "Mart", "Nisan", "Mayis", "Haziran", "Temmuz", "Agustos", "Eylul", "Ekim", "Kasim", "Aralik");
?>

<?php
if (!isset($_REQUEST["month"])) $_REQUEST["month"] = date("n");
if (!isset($_REQUEST["year"])) $_REQUEST["year"] = date("Y");
?>

<?php
$cMonth = $_REQUEST["month"];
$cYear = $_REQUEST["year"];

$prev_year = $cYear;
$next_year = $cYear;

$prev_month = $cMonth-1;
$next_month = $cMonth+1;

if ($prev_month == 0 ) {
$prev_month = 12;
$prev_year = $cYear - 1;
}
if ($next_month == 13 ) {
$next_month = 1;
$next_year = $cYear + 1;
}
?>


<table width="200">
<tr align="center">
<td bgcolor="#999999" style="color:#FFFFFF">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" align="left">&nbsp;&nbsp;<a href="<?php echo $_SERVER["PHP_SELF"] . "?month=". $prev_month . "&year=" . $prev_year; ?>" style="color:#FFFFFF">Geri</a></td>
<td width="50%" align="right"><a href="<?php echo $_SERVER["PHP_SELF"] . "?month=". $next_month . "&year=" . $next_year; ?>" style="color:#FFFFFF">Ileri</a>&nbsp;&nbsp;</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center">
<table width="100%" border="0" cellpadding="2" cellspacing="2">
<tr align="center">
<td colspan="7" bgcolor="#999999" style="color:#FFFFFF"><strong><?php echo $monthNames[$cMonth-1].' '.$cYear; ?></strong></td>
</tr>
<tr>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>S</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>M</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>T</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>W</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>T</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>F</strong></td>
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>S</strong></td>
</tr>

<?php
$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate ($timestamp);
$startday = $thismonth['wday'];

for ($i=0; $i<($maxday+$startday); $i++) {
if(($i % 7) == 0 ) echo "<tr>\n";
if($i < $startday) echo "<td></td>\n";
else echo "<td align='center' valign='middle' height='20px'>". ($i - $startday + 1) . "</td>\n";
if(($i % 7) == 6 ) echo "</tr>\n";
}
?>

</table>
</td>
</tr>
</table>

(Kaynak :https://www.r10.net/php/288515-php-sitenize-takvim.html )

467471021