MQTT Protocol

MQTT is a handy protocol for sending/receiving lightweight data.

What is MQTT

MQTT stands for MQ Telemetry Transport. It is a publish/subscribe, extremely simple and lightweight messaging protocol, designed for constrained devices and low-bandwidth, high-latency or unreliable networks. The design principles are to minimise network bandwidth and device resource requirements whilst also attempting to ensure reliability and some degree of assurance of delivery. These principles also turn out to make the protocol ideal of the emerging “machine-to-machine” (M2M) or “Internet of Things” world of connected devices, and for mobile applications where bandwidth and battery power are at a premium.

V5.0 and v3.1.1 are OASIS standards (v3.1.1 is also a standard for ISO)

Protocol

The standard ports for MQTT to use.

TCP/IP port 1883 is reserved with IANA for use with MQTT.
TCP/IP port 8883 is also registered, for using MQTT over SSL.

What security does MQTT support.

You can pass a user name and password with an MQTT packet in V3.1 of the protocol. Encryption across the network can be handled with SSL, independently of the MQTT protocol itself (it is worth noting that SSL is not the lightest of protocols, and does add significant network overhead). Additional security can be added by an application encrypting data that it sends and receives, but this is not something built-in to the protocol, in order to keep it simple and lightweight.

Temperatur sensor

I dette projekt er der brugt en digital temperatur måler tilkoblet en Raspberry PI.

I projektet er der brugt:
Raspberry PI 3
DS18B20 Temperatur Sensor

Afsnit 1: Opsætning

Projektet som denne tutorial er baseret på er opsat som følgende:

1. Der skal i command prompten, indtastes:

sudo nano /boot/config.txt

så skal der i bunden af files indsættes:

dtoverlay=w1–gpio 

2. Luk Nano, and genstart Pi’en

sudo reboot

3. Log ind i Pi igen, og igen i the command prompten indtastes:

sudo modprobe w1–gpio 

4. indtast så:

sudo modprobe w1-therm 

5. skift standard path til /sys/bus/w1/devices path’en ved at indtaste:

 cd /sys/bus/w1/devices 

6. tilføj så ls til listen af moduler ved at indtaste:

ls

det giver et display som skal have et formatet:
28-XXXXXXXXXXXX med X værende modulets variable identifikations værdig

7. indtast så cd 28-XXXXXXXXXXXX (skift X til værdien du har fået oplyst)

8. indtast

cat w1_slave

det promter et display en en temperaturmåling i rå data givet af sensoren, den specifikke temperatur er givet ved t=xxxxx, formatet skal ses som xx,xxx grader celsius

Afsnit 2: Automatisk måling med logfil

import os 
import glob 
import time 
from time import * 

os.system('modprobe w1-gpio') 
os.system('modprobe w1-therm') 

base_dir = '/sys/bus/w1/devices/' 
device_folder = glob.glob(base_dir + '28*')[0] 
device_file = device_folder + '/w1_slave' 
 

def read_temp_raw(): 
   f = open(device_file, 'r') 
   lines = f.readlines() 
   f.close() 
   return lines 

def read_temp(): 
  lines = read_temp_raw() 
  while lines[0].strip()[-3:] != 'YES': 
    time.sleep(0.2) 
    lines = read_temp_raw() 
  equals_pos = lines[1].find('t=') 
  if equals_pos != -1: 
    temp_string = lines[1][equals_pos+2:] 
    temp_c = int(temp_string) / 1000.0 
    temp_c = str(round(temp_c, 1)) 
    return temp_c 

def write_temp(): 
    with open("/home/pi/temp.csv", "a") as log: 
        log.write("{0},{1}\n".format(strftime("%d-%m %H:%M"), read_temp())) 
while True: 
    write_temp()  
    print(read_temp()) 
    sleep(150) 

overstående stykke kode er et python program som har funktionen at måle sensorens temperatur hvert tredje minut og derefter nedskrive det i en csv fil på en forbestemt path. målingerne har en følgende struktur:

Afsnit 3: Graf

import dash  
import dash_core_components as dcc 
import dash_html_components as html 
import csv 
import sys 

with open('temp.csv') as csv_file: 
    reader = csv.reader(csv_file, delimiter=',') 
mylist = list(reader) 
    x={} 
    y={) 
    z=[] 
    xy=[] 
for i in range(len(mylist)): 
    f = str(mylist[i]) 
    space = ' ' 
    str4f = f.replace("[","").replace("]","").replace("'","").replace(",","").replace(" ","/") 
    x[i] = str4f[:str4f.index("/")] 
    y[i] = str4f[str4f.index("/")+1:str4f.rindex("/")] 
    z.append(float(str4f[str4f.rindex("/")+1:])) 
    xy.append(str4f[:str4f.index("/")] + space + str4f[str4f.index("/")+1:str4f.rindex("/")])  
app = dash.Dash() 
app.layout = html.Div(children=[  
    html.H1(children='Temperatur'), 
     dcc.Graph( 
        id='example', 
        figure={ 
            'data': [ 
                {'x': xy, 'y': z, 'type': 'line', 'name': 'Temps'},      
            ], 
            'layout': { 
                'title': 'Temperatur målinger' 
            } 
        } 
    ) 
]) 
if __name__ == '__main__': 
    app.run_server(debug=True)

Ved brug af førnævnte csv fil, som indeholder logget data, læses værdierne. Derefter bruges kodestykket: for i in range(len(mylist)): til at konvertere strukturen af de førnævnte værdier, så de er konvertible med Dash.
Dash er et python framework der er bruges til at lave grafer. Til sidst definer vi ud fra dash’ forudbestemte muligheder udseendet og lader dash danne grafen på en html side.

Miljø sensor

Arduino miljø sensor er teknologier bestående af Python og Arduino.

I dette projekt er der brugt:
MKR1000
KY-028

Afsnit 1: Installation

Hvis det er første gang MKR1000 modulet bliver er i brug på din pc skal der installeres nogle drivere, det plejer Arduino IDE at prompte hvis det er åbent når forbindelsen startes.

Derefter skal der hentes et library fra package manager kaldet “Wifi101”

Afsnit 2: Wifi

Når drivere og library er sat op kan vi nu påbegynde programmerings delen.

MKR1000 bliver forbundet til SKP2.4GHz da informationen fra MKR modulet skal hentes fra en python client:

char pass[] = “SSID password”;
char ssid[] = “Chosen SSID”;

while (WiFi.begin(ssid, pass) != WL_CONNECTED)
{
Serial.println(“reconnecting… “);
delay(2000);
}


Med denne code snippet kan vi registrere om Arduino modulet er forbundet til internettet.

Afsnit 3: Data

For at få fat i KY-028 data skal vi få Arduino modulet til at læse det’s input.

int intNavn analogRead(Pin hvor sensor input er)


Denne linje vil give input fra KY modulet, og så er man klar til at filosofere over problemløsninger.

Projektet som denne tutorial er baseret på:

Arduino kode:

#include <WiFiUdp.h>
#include <SPI.h>
#include <WiFi101.h>

unsigned int localPort = 2396;

int status = WL_IDLE_STATUS;
int sensorPinTemp = A0;
int sensorPinLight = A1;
int sensorValue_temp = 0;
int fixInput = 560; 

float i = 0;
float fixtemp = 20.0;
float fixedDegreeValue = 5.5;

char packetBuffer[255];
char pass[] = "SSID password";
char ssid[] = "Chosen SSID";

WiFiUDP Udp;

void setup ()
{
  Serial.begin (9600);
  pinMode(13, OUTPUT);
}

void loop () 
{
  if (WiFi.status() != WL_CONNECTED) 
  {
    digitalWrite(13, LOW);
    while (WiFi.begin(ssid, pass) != WL_CONNECTED) 
    {
      Serial.println("reconnecting... ");
      delay(2000);
    }
    Serial.print("Connected to ");
    Serial.println(WiFi.SSID());
    wifiStatus();
  }
  
  sensorValue_temp = analogRead(sensorPinTemp);
  
  int packetSize = Udp.parsePacket();
  if (packetSize) 
  {
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());
    
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) 
    {
      packetBuffer[len] = 0;
    }

    i = fixInput - sensorValue_temp;
    i = i /fixedDegreeValue;
    Serial.print("Temperature: ");
    fixtemp = fixtemp + i;
    
    String tempString = String(fixtemp);
    char tempChar[10];
    tempString.toCharArray(tempChar, 10);
    
    Serial.print(tempString);
    Serial.println();
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(tempChar);
    fixtemp = 20;
    Udp.endPacket();
  }
  delay(1000);
}

void wifiStatus()
{
  IPAddress ipv4 = WiFi.localIP();
  Serial.print("Arduino IP: ");
  Serial.println(ipv4);
  Udp.begin(localPort);
  digitalWrite(13, HIGH);
}

Python kode:

import sys
import time
import _thread
from socket import *
import tkinter as tk


address = ('192.168.1.69', 2396)
client_socket = socket(AF_INET, SOCK_DGRAM)
client_socket.settimeout(1)


def arduino_conn():
    data = "0"
    try:
        client_socket.sendto(str.encode(data), address)
        rec_data, addr = client_socket.recvfrom(2048)
        data_recived = str(rec_data)
        udp_temp_string = data_recived[data_recived.index('\'') + 1:]
        udp_temp_string = udp_temp_string.replace("\'", "")
        #print(udp_temp_string + " °C")
        return udp_temp_string
    except Exception as e:
        print(e)
        pass


class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()
        #self.get_temp()


    def create_widgets(self):
        self.temp = tk.Label(self, text="00.00°C", fg="red")
        self.temp.config(font=("Courier", 70))
        self.temp.pack(side="bottom")
        _thread.start_new_thread( self.get_temp,())
        
    def get_temp(self):
        while 1:
            try:
                self.temp['text'] = arduino_conn()+ "°C"
                time.sleep(3)
            except Exception as e:
                print(e)
                pass
        

root = tk.Tk()
app = Application(master=root)
app.mainloop()



Toggle Console (0)
No entries found.
Profiler (0 ms)
No entries found.
SQL (58 queries | 33.64 ms)
2.7199
SELECT name, val 
FROM www_wfconfig 
WHERE autoload = 'yes'
0.4721
SELECT `name`, `value` 
FROM `www_wfls_settings` 
WHERE `autoload` = 'yes'
0.3819
SELECT name, val, autoload 
FROM www_wfconfig 
WHERE name = 'detectProxyRecommendation'
1.3640
SHOW FULL COLUMNS 
FROM `www_wfblocks7`
0.4919
SELECT * 
FROM `www_wfblocks7` 
WHERE `IP` = '\0\0\0\0\0\0\0\0\0\0\"̺[' 
AND `type` = 7 
AND (`expiration` = 0 OR `expiration` > UNIX_TIMESTAMP())
0.3190
SELECT name, val, autoload 
FROM www_wfconfig 
WHERE name = 'wordfenceCentralConnected'
0.3209
SELECT option_value 
FROM www_options 
WHERE option_name = 'acm_server_settings' 
LIMIT 1
0.3250
SELECT name, val, autoload 
FROM www_wfconfig 
WHERE name = 'needsGeoIPSync'
0.4270
SELECT name, val, autoload 
FROM www_wfconfig 
WHERE name = 'detectProxyRecommendation'
0.3040
SELECT MAX(attackLogTime) 
FROM www_wfhits
0.3030
SELECT option_value 
FROM www_options 
WHERE option_name = 'wordfence_lastSyncAttackData' 
LIMIT 1
1.1060
SELECT *, CASE WHEN `type` = 3 THEN 0 WHEN `type` = 4 THEN 1 WHEN `type` = 7 THEN 2 WHEN `type` = 6 THEN 3 WHEN `type` = 5 THEN 4 WHEN `type` = 9 THEN 5 WHEN `type` = 8 THEN 6 WHEN `type` = 2 THEN 7 WHEN `type` = 1 THEN 8 ELSE 9999 END AS `typeSort`, CASE WHEN `type` = 3 THEN `parameters` WHEN `type` = 4 THEN `parameters` WHEN `type` = 1 THEN `IP` WHEN `type` = 9 THEN `IP` WHEN `type` = 5 THEN `IP` WHEN `type` = 6 THEN `IP` WHEN `type` = 7 THEN `IP` WHEN `type` = 2 THEN `IP` WHEN `type` = 8 THEN `IP` ELSE 9999 END AS `detailSort` 
FROM `www_wfblocks7` 
WHERE `type` IN (4) 
AND (`expiration` = 0 OR `expiration` > UNIX_TIMESTAMP()) 
ORDER BY `typeSort` ASC, `id` DESC
0.6731
SELECT *, CASE WHEN `type` = 3 THEN 0 WHEN `type` = 4 THEN 1 WHEN `type` = 7 THEN 2 WHEN `type` = 6 THEN 3 WHEN `type` = 5 THEN 4 WHEN `type` = 9 THEN 5 WHEN `type` = 8 THEN 6 WHEN `type` = 2 THEN 7 WHEN `type` = 1 THEN 8 ELSE 9999 END AS `typeSort`, CASE WHEN `type` = 3 THEN `parameters` WHEN `type` = 4 THEN `parameters` WHEN `type` = 1 THEN `IP` WHEN `type` = 9 THEN `IP` WHEN `type` = 5 THEN `IP` WHEN `type` = 6 THEN `IP` WHEN `type` = 7 THEN `IP` WHEN `type` = 2 THEN `IP` WHEN `type` = 8 THEN `IP` ELSE 9999 END AS `detailSort` 
FROM `www_wfblocks7` 
WHERE `type` IN (3) 
AND (`expiration` = 0 OR `expiration` > UNIX_TIMESTAMP()) 
ORDER BY `typeSort` ASC, `id` DESC
0.5560
SELECT * 
FROM `www_wfblocks7` 
WHERE `type` IN (1, 8, 9, 2, 5, 6) 
AND `IP` = '\0\0\0\0\0\0\0\0\0\0\"̺[' 
AND (`expiration` = 0 OR `expiration` > UNIX_TIMESTAMP()) 
ORDER BY `blockedTime` DESC 
LIMIT 1
0.6330
SELECT option_value 
FROM www_options 
WHERE option_name = 'can_compress_scripts' 
LIMIT 1
0.3769
SELECT option_value 
FROM www_options 
WHERE option_name = 'ure_role_additional_options_values' 
LIMIT 1
1.1499
SHOW FULL COLUMNS 
FROM `www_wflivetraffichuman`
0.3312
SELECT COUNT(*) 
FROM www_wflivetraffichuman 
WHERE IP = '\0\0\0\0\0\0\0\0\0\0\"̺[' 
AND identifier = 'F	V\nV|!' 
AND expiration >= UNIX_TIMESTAMP()
0.6442
SELECT t.*, tt.* 
FROM www_terms AS t 
INNER JOIN www_term_taxonomy AS tt ON t.term_id = tt.term_id 
WHERE tt.taxonomy IN ('category') 
AND t.slug = 'wiki-iot' 
LIMIT 1
0.4001
SELECT t.*, tt.* 
FROM www_terms AS t 
INNER JOIN www_term_taxonomy AS tt ON t.term_id = tt.term_id 
WHERE tt.taxonomy IN ('category') 
AND t.slug IN ('wiki-iot')
0.4578
SELECT t.*, tt.* 
FROM www_terms AS t 
INNER JOIN www_term_taxonomy AS tt ON t.term_id = tt.term_id 
WHERE tt.taxonomy IN ('category') 
AND t.term_id IN ( 25 )
0.7551
SELECT SQL_CALC_FOUND_ROWS www_posts.ID 
FROM www_posts LEFT JOIN www_term_relationships ON (www_posts.ID = www_term_relationships.object_id) 
WHERE 1=1 
AND ( www_term_relationships.term_taxonomy_id IN (25) ) 
AND www_posts.post_type = 'post' 
AND (www_posts.post_status = 'publish') 
GROUP BY www_posts.ID 
ORDER BY www_posts.post_date DESC 
LIMIT 0, 4
0.1640
SELECT FOUND_ROWS()
0.5209
SELECT www_posts.* 
FROM www_posts 
WHERE ID IN (1303,673,527,525)
1.6530
SELECT t.*, tt.*, tr.object_id 
FROM www_terms AS t 
INNER JOIN www_term_taxonomy AS tt ON t.term_id = tt.term_id 
INNER JOIN www_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id 
WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') 
AND tr.object_id IN (525, 527, 673, 1303) 
ORDER BY t.name ASC
0.6418
SELECT post_id, meta_key, meta_value 
FROM www_postmeta 
WHERE post_id IN (525,527,673,1303) 
ORDER BY meta_id ASC
0.4351
SELECT t.*, tt.* 
FROM www_terms AS t 
INNER JOIN www_term_taxonomy AS tt ON t.term_id = tt.term_id 
WHERE t.term_id = 24
0.3712
SELECT COUNT(*) 
FROM www_wflivetraffichuman 
WHERE IP = '\0\0\0\0\0\0\0\0\0\0\"̺[' 
AND identifier = 'F	V\nV|!' 
AND expiration >= UNIX_TIMESTAMP()
0.4439
SELECT * 
FROM www_users 
WHERE ID = '2' 
LIMIT 1
0.5000
SELECT user_id, meta_key, meta_value 
FROM www_usermeta 
WHERE user_id IN (2) 
ORDER BY umeta_id ASC
0.6030
SELECT * 
FROM `www_yoast_indexable` 
WHERE `object_id` = '25' 
AND `object_type` = 'term' 
LIMIT 1
0.4580
SELECT * 
FROM `www_yoast_indexable` 
WHERE `object_type` = 'home-page' 
LIMIT 1
0.2892
SELECT `ancestor_id` 
FROM `www_yoast_indexable_hierarchy` 
WHERE `indexable_id` = '168' 
ORDER BY `depth` DESC
0.3250
SELECT * 
FROM `www_yoast_indexable` 
WHERE `id` IN ('160') 
ORDER BY FIELD(id,160)
0.2329
SELECT option_value 
FROM www_options 
WHERE option_name = 'https_migration_required' 
LIMIT 1
0.3259
SELECT t.*, tt.* 
FROM www_terms AS t 
INNER JOIN www_term_taxonomy AS tt ON t.term_id = tt.term_id 
WHERE t.term_id = 15
0.2940
SELECT tr.object_id 
FROM www_term_relationships AS tr 
INNER JOIN www_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id 
WHERE tt.taxonomy IN ('nav_menu') 
AND tt.term_id IN ('15') 
ORDER BY tr.object_id ASC
0.6082
SELECT www_posts.* 
FROM www_posts 
WHERE 1=1 
AND www_posts.ID IN (310,311,312,313,314,337,365,399,1162,1163,1185,1482) 
AND www_posts.post_type = 'nav_menu_item' 
AND ((www_posts.post_status = 'publish')) 
ORDER BY www_posts.menu_order ASC
0.9139
SELECT post_id, meta_key, meta_value 
FROM www_postmeta 
WHERE post_id IN (310,1163,311,312,313,314,1185,1162,399,365,1482,337) 
ORDER BY meta_id ASC
0.6800
SELECT www_posts.* 
FROM www_posts 
WHERE 1=1 
AND www_posts.ID IN (290,292,295,297,1183,76,362,1470,80) 
AND www_posts.post_type = 'page' 
AND ((www_posts.post_status = 'publish')) 
ORDER BY www_posts.post_date DESC
0.5388
SELECT post_id, meta_key, meta_value 
FROM www_postmeta 
WHERE post_id IN (1470,1183,362,297,295,292,290,80,76) 
ORDER BY meta_id ASC
0.3328
SELECT * 
FROM www_posts 
WHERE ID = 92 
LIMIT 1
0.4101
SELECT * 
FROM www_posts 
WHERE ID = 92 
LIMIT 1
0.3140
SELECT * 
FROM www_posts 
WHERE ID = 92 
LIMIT 1
0.2770
SELECT * 
FROM www_posts 
WHERE ID = 92 
LIMIT 1
0.5541
SELECT t.*, tt.* 
FROM www_terms AS t 
INNER JOIN www_term_taxonomy AS tt ON t.term_id = tt.term_id 
WHERE tt.taxonomy IN ('category') 
AND t.name IN ('wiki-iot') 
LIMIT 1
0.8039
SELECT www_posts.*, CHAR_LENGTH(www_posts.post_title) post_title_length 
FROM www_posts 
WHERE 1=1 
AND www_posts.ID NOT IN (1303) 
AND www_posts.post_type = 'encyclopedia' 
AND (www_posts.post_status = 'publish') 
ORDER BY post_title_length DESC
0.6552
SELECT www_posts.* 
FROM www_posts 
WHERE 1=1 
AND www_posts.post_name = '3372eab85d65e6bbc80eb048d63de8d9' 
AND www_posts.post_type = 'oembed_cache' 
AND ((www_posts.post_status = 'publish')) 
ORDER BY www_posts.post_date DESC
0.3781
SELECT post_id, meta_key, meta_value 
FROM www_postmeta 
WHERE post_id IN (116) 
ORDER BY meta_id ASC
0.6042
SELECT www_posts.*, CHAR_LENGTH(www_posts.post_title) post_title_length 
FROM www_posts 
WHERE 1=1 
AND www_posts.ID NOT IN (673) 
AND www_posts.post_type = 'encyclopedia' 
AND (www_posts.post_status = 'publish') 
ORDER BY post_title_length DESC
0.3309
SELECT * 
FROM www_users 
WHERE ID = '141' 
LIMIT 1
0.7930
SELECT user_id, meta_key, meta_value 
FROM www_usermeta 
WHERE user_id IN (141) 
ORDER BY umeta_id ASC
0.5641
SELECT www_posts.* 
FROM www_posts 
WHERE ID IN (1098,662)
0.4241
SELECT post_id, meta_key, meta_value 
FROM www_postmeta 
WHERE post_id IN (662,1098) 
ORDER BY meta_id ASC
0.5560
SELECT www_posts.* 
FROM www_posts 
WHERE ID IN (1105)
0.3839
SELECT post_id, meta_key, meta_value 
FROM www_postmeta 
WHERE post_id IN (1105) 
ORDER BY meta_id ASC
0.6611
SELECT www_posts.*, CHAR_LENGTH(www_posts.post_title) post_title_length 
FROM www_posts 
WHERE 1=1 
AND www_posts.ID NOT IN (527) 
AND www_posts.post_type = 'encyclopedia' 
AND (www_posts.post_status = 'publish') 
ORDER BY post_title_length DESC
1.0870
SELECT www_posts.*, CHAR_LENGTH(www_posts.post_title) post_title_length 
FROM www_posts 
WHERE 1=1 
AND www_posts.ID NOT IN (525) 
AND www_posts.post_type = 'encyclopedia' 
AND (www_posts.post_status = 'publish') 
ORDER BY post_title_length DESC
Templates
[0] => themes/busiprof/theme_setup_data.php
[1] => themes/busiprof/child_theme_compatible.php
[2] => themes/busiprof/functions/menu/busiprof_nav_walker.php
[3] => themes/busiprof/functions/menu/default_menu_walker.php
[4] => themes/busiprof/functions/woo/woocommerce.php
[5] => themes/busiprof/functions/font/font.php
[6] => themes/busiprof/functions/breadcrumbs/breadcrumbs.php
[7] => themes/busiprof/functions/scripts/script.php
[8] => themes/busiprof/functions/widgets/custom-widgets.php
[9] => themes/busiprof/functions/commentbox/comment-function.php
[10] => themes/busiprof/functions/customizer/customizer-pro-feature.php
[11] => themes/busiprof/functions/customizer/custo_general_settings.php
[12] => themes/busiprof/functions/customizer/custo_sections_settings.php
[13] => themes/busiprof/functions/customizer/customizer-archive.php
[14] => themes/busiprof/functions/customizer/customizer_recommended_plugin.php
[15] => themes/busiprof/functions/customizer-notify/busiprof-customizer-notify.php
[16] => themes/busiprof/functions/class-tgm-plugin-activation.php
[17] => themes/busiprof/category.php
[18] => themes/busiprof/header.php
[19] => themes/busiprof/content.php
[20] => themes/busiprof/sidebar.php
[21] => themes/busiprof/footer.php
Globals
$_GET = array (
);

$_POST = array (
);

$_COOKIE = array (
);

$_SESSION = array (
);

$_SERVER = array (
  'SERVER_SOFTWARE' => 'Apache',
  'REQUEST_URI' => '/category/wiki/wiki-iot/',
  'ONECOM_DOMAIN_NAME' => 'ats-skpdatait.dk',
  'ONECOM_DOMAIN_ROOT' => '/customers/b/3/2/ats-skpdatait.dk/',
  'ONECOM_MEMORYLIMIT' => '2684354560',
  'ONECOM_CPU_SHARES' => '4096',
  'ONECOM_EXEC' => 'latest',
  'ONECOM_DIR_LAYOUT_VER' => '0',
  'CONTENT_LENGTH' => '0',
  'HTTP_CONNECTION' => 'close',
  'SCRIPT_NAME' => '/index.php',
  'QUERY_STRING' => '',
  'REQUEST_METHOD' => 'GET',
  'SERVER_PROTOCOL' => 'HTTP/1.1',
  'GATEWAY_INTERFACE' => 'CGI/1.1',
  'REDIRECT_URL' => '/category/wiki/wiki-iot/',
  'REMOTE_PORT' => '57664',
  'SCRIPT_FILENAME' => '/customers/b/3/2/ats-skpdatait.dk/httpd.www/index.php',
  'SERVER_ADMIN' => 'support@one.com',
  'CONTEXT_DOCUMENT_ROOT' => '/var/www',
  'CONTEXT_PREFIX' => '',
  'REQUEST_SCHEME' => 'https',
  'REMOTE_ADDR' => '34.204.186.91',
  'SERVER_PORT' => '80',
  'SERVER_ADDR' => '10.27.3.13',
  'SERVER_NAME' => 'www.ats-skpdatait.dk',
  'SERVER_SIGNATURE' => '',
  'PATH' => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
  'HTTP_X_VARNISH' => '349374314',
  'HTTP_ACCEPT_ENCODING' => 'gzip',
  'HTTP_X_ONECOM_HOST' => 'ats-skpdatait.dk',
  'HTTP_X_ONECOM_BRAND' => 'one.com',
  'HTTP_X_FORWARDED_PROTO' => 'https',
  'HTTP_X_ONECOM_FORWARDED_PROTO' => 'https',
  'HTTP_X_FORWARDED_FOR' => '34.204.186.91',
  'HTTP_HOST' => 'www.ats-skpdatait.dk',
  'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.5',
  'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'HTTP_USER_AGENT' => 'CCBot/2.0 (https://commoncrawl.org/faq/)',
  'ENV_VCV_ENV_ADDONS_ID' => 'one.com',
  'ENV_VCV_TOKEN_URL' => 'https://wpapi.one.com/api/v1.0/plugins/visualcomposer/activate',
  'ONECOM_ONE_PHOTO_URL' => 'https://onephoto.one.com/domain_discover',
  'ONECOM_WP_ADDONS_API' => 'https://wpapi.one.com',
  'ONECOM_WEBSHOP_HOST' => 'webshop1.cst.webpod11-cph3.one.com',
  'HTTP_AUTHORIZATION' => '',
  'HTTPS' => 'on',
  'ONECOM_TMPDIR' => '/customers/b/3/2/ats-skpdatait.dk//tmp',
  'DOMAIN_NAME' => 'ats-skpdatait.dk',
  'ONECOM_DOCUMENT_ROOT' => '/customers/b/3/2/ats-skpdatait.dk/httpd.www',
  'DOCUMENT_ROOT' => '/customers/b/3/2/ats-skpdatait.dk/httpd.www',
  'REDIRECT_STATUS' => '200',
  'REDIRECT_ENV_VCV_ENV_ADDONS_ID' => 'one.com',
  'REDIRECT_ENV_VCV_TOKEN_URL' => 'https://wpapi.one.com/api/v1.0/plugins/visualcomposer/activate',
  'REDIRECT_ONECOM_ONE_PHOTO_URL' => 'https://onephoto.one.com/domain_discover',
  'REDIRECT_ONECOM_WP_ADDONS_API' => 'https://wpapi.one.com',
  'REDIRECT_ONECOM_WEBSHOP_HOST' => 'webshop1.cst.webpod11-cph3.one.com',
  'REDIRECT_HTTP_AUTHORIZATION' => '',
  'REDIRECT_HTTPS' => 'on',
  'REDIRECT_ONECOM_CPU_SHARES' => '4096',
  'REDIRECT_ONECOM_MEMORYLIMIT' => '2684354560',
  'REDIRECT_ONECOM_EXEC' => 'latest',
  'REDIRECT_ONECOM_DIR_LAYOUT_VER' => '0',
  'REDIRECT_ONECOM_TMPDIR' => '/customers/b/3/2/ats-skpdatait.dk//tmp',
  'REDIRECT_ONECOM_DOMAIN_ROOT' => '/customers/b/3/2/ats-skpdatait.dk/',
  'REDIRECT_ONECOM_DOMAIN_NAME' => 'ats-skpdatait.dk',
  'REDIRECT_DOMAIN_NAME' => 'ats-skpdatait.dk',
  'REDIRECT_ONECOM_DOCUMENT_ROOT' => '/customers/b/3/2/ats-skpdatait.dk/httpd.www',
  'REDIRECT_DOCUMENT_ROOT' => '/customers/b/3/2/ats-skpdatait.dk/httpd.www',
  'FCGI_ROLE' => 'RESPONDER',
  'PHP_SELF' => '/index.php',
  'REQUEST_TIME_FLOAT' => 1618689413.2770740985870361328125,
  'REQUEST_TIME' => 1618689413,
  'ONECOM_CLIENT_IP' => '34.204.186.91',
);

Close