Rozdział 10. Odczyt danych w formacie JSON

Spis treści

10.1. Specyfikacja zmiennych
10.2. Przykładowe dane
10.3. Przykładowy skrypt PHP przetwarzający dane

Moduł LB-480 zapewnia dostęp do danych w formacie JSON, dla systemów które potrafią odczytać dane w tym formacie. Odczyt danych możliwy jest za pomocą protokołu HTTP pod adresem:

http://lb480.example.net/json

gdzie lb480.example.net to przykładowy adres modułu LB-480.

Dodatkowo na stronie głównej modułu poniżej tabelki z wynikami znajduje się link JSON zwracający dane w tym formacie.

Dane JSON są w formacie UTF-8, co ma znaczenie dla właściwego zdekodowania znaków specjalnych, jak np. znak stopnia czy potęgi dwójki.

Format JSON opisany jest na stronie http://www.json.org/, jak również ma swoją formalną specyfikację w postaci dokumentu RFC 4627.

10.1. Specyfikacja zmiennych

vendor

Producent urządzenia.

type

Typ urządzenia.

sn

Numer seryjny urządzenia.

name

Nazwa urządzenia (konfigurowana przez użytkownika).

input

tablica obiektów, z których każdy określa aktualny stan wejścia pomiarowego INPUT 1–8. Każdy obiekt ma następujące składowe:

name

Nazwa wejścia (konfigurowana przez użytkownika).

mode

Tryb pracy wejścia [off|s300|th|pt|bin|ssw|cnt|cs|u|us|i|is].

id

Identyfikacja czujnika dołączonego na wejściu S300. Dla wejść pracujących w pozostałych trybach, lub przy braku dołączonego czujnika S300 na wejściu, zwracana jest wartość null. Dla czujnika S300 zwracany jest obiekt zawierający składowe: type i sn.

v

Wyniki pomiarów dla danego wejścia. Jeżeli brak jest dołączonego czujnika lub wykryta została sytuacja awaryjna (np. zwarcie czujnika), zwracana jest wartość null. Jeżeli czujnik jest podłączony i pracuje prawidłowo, wyniki zwracane są w postaci tabeli. Ilość elementów w tabeli zależna jest od trybu pracy wejścia i typu dołączonego czujnika (szczegółowe informacje o ilości i typie zmiennych znajdują się w wykazie zmiennych). Nawet jeżeli wynik jest tylko jeden, jest on zwracany w postaci jednoelementowej tabeli (dla ujednolicenia ogólnego formatu).

Zwracane wartości są następujące, zależnie od trybu pracy wejścia:

wyłączone

null

S300

null gdy brak czujnika na wejściu.

Tabela zawierająca wyniki z danego czujnika, w ilości zależnej od typu czujnika.

termometr

null gdy brak czujnika na wejściu lub jest on zwarty.

Jednoelementowa tabela zawierająca wynik pomiaru temperatury w postaci liczbowej.

analogowe napięciowe

Jednoelementowa tabela zawierająca wynik pomiaru napięcia w postaci liczbowej.

binarne

[false] dla stanu rozwarcia wejścia

[true] dla stanu zwarcia wejścia

binarne bezpieczne

null dla stanu zwarcia lub przerwania linii

[false] dla stanu wyłączenia

[true] dla stanu włączenia

u

Jednostka miary dla wyniku pomiaru - sposób reprezentacji jednostek zależnie od trybu pracy wejścia jest analogiczny jak dla opisanych powyżej wyników pomiarów (null przy braku czujnika, tabela jednostek gdy jest dołączony czujnik). Jeżeli wynik nie ma jednostki (np. wejście binarne) to zwracana jest wartość null.

10.2. Przykładowe dane

{
    "vendor": "LAB-EL",
    "type": "LB-480",
    "sn": "1",
    "name": "LB-480 #1",
    "input": [
        {
            "name": "Input 1",
            "mode": "bin",
            "v": [ false ],
            "u": null
        },
        {
            "name": "Input 2",
            "mode": "s300",
            "id": {
                "type": "LB-715",
                "sn": 1
            },
            "v": [
                45.1,
                25.0,
                1005.0
            ],
            "u": [
                "%",
                "°C",
                "hPa"
            ]
        },
        {
            "name": "Input 3",
            "mode": "t",
            "v": [ 26.3 ],
            "u": [ "°C" ]
        },
        {
            "name": "Input 4",
            "mode": "u",
            "v": [ 2.990 ],
            "u": [ "V" ]
        }
    ]
}

10.3. Przykładowy skrypt PHP przetwarzający dane


<?php

$LB480_HOST_ADDR = "lb480.demo.label.pl";

print "
<html>
<head>
<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">
<title>LB-480 JSON php example</title>
</head>
<body>
";

@$r = file_get_contents("http://{$LB480_HOST_ADDR}/json");
if ($r)
{
	$d = json_decode($r);
	show_device_info($d);
	show_device_data($d);
}
else
{
	echo "<h1>No response from device</h1>\n";
}

print "</body>\n";
print "</html>\n";
exit();


function show_device_info($d)
{
	print "
<h1>Device info</h1>
<table>
  <tr>
    <th>Vendor:</th>
    <td>{$d->vendor}</td>
  </tr>
  <tr>
    <th>Type:</th>
    <td>{$d->type}</td>
  </tr>
  <tr>
    <th>SN:</th>
    <td>{$d->sn}</td>
  </tr>
  <tr>
    <th>Name:</th>
    <td>{$d->name}</td>
  </tr>
</table>
";
}


function show_device_data($d)
{
	print"
<h1>Input data</h1>
<table border=\"1\" cellspacing=\"0\" cellpadding=\"5\">
  <tr>
    <th>Input</th>
    <th>Name</th>
    <th>Mode</th>
    <th>Sensor ID</th>
    <th>Value</th>
    <th>Unit</th>
  </tr>
";

	// iterate all inputs

	for ($i = 0; $i < 4; ++$i)
	{
		// v can be null, when there's no sensor attached
		// or there's sensor failure

		if (is_null($d->input[$i]->v))
		{
			$v = "";
		}
		else
		{
			// preformat bool values, because default PHP string
			// conversion show false as empty string, exactly
			// the same as for null

			for ($j = 0; $j < 8; ++$j)
			{
				if (is_bool($d->input[$i]->v[$j]))
				{
					$d->input[$i]->v[$j] = $d->input[$i]->v[$j] ? "true" : "false";
				}
			}

			$v = implode("<br>", $d->input[$i]->v);
		}

		// u can be null, when there's no sensor attached
		// or there's sensor failure
		// or there's no unit for particular sensor

		if (is_null($d->input[$i]->u))
		{
			$u = "";
		}
		else
		{
			$u = implode("<br>", $d->input[$i]->u);
		}

		$nr = $i + 1;

		print("
  <tr>
    <td>$nr</td>
    <td>{$d->input[$i]->name}</td>
    <td>{$d->input[$i]->mode}</td>
    <td>{$d->input[$i]->id}</td>
    <td>$v</td>
    <td>$u</td>
  </tr>
");
	}

	print "</table>\n";
}

?>