Rozdział 8. Odczyt danych w formacie JSON

Spis treści

8.1. Specyfikacja zmiennych
8.2. Przykładowe dane
8.3. Przykładowy skrypt PHP przetwarzający dane

Moduł LB-856 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://lb856.example.net/json, gdzie lb856.example.net to przykładowy adres modułu LB-856.

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.

8.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

5-elementowa tablica obiektów, z których każdy określa aktualny stan wejść pomiarowych (CO2/O2/TEMP/0-10V/S300). Każdy obiekt ma następujące składowe:

name

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

mode

Tryb pracy wejścia [off|co2|o2|temp|10v|s300].

id

Identyfikacja czujnika dołączonego na wejściu S300. Dla innych wejść 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

CO2, O2, termometr, 0-10V

nulldla czujnika temperatury - gdy brak czujnika na wejściu lub jest on zwarty.

Jednoelementowa tabela zawierająca wynik pomiaru w postaci liczbowej.

S300

null gdy brak czujnika na wejściu.

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

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.

8.2. Przykładowe dane

{
  "vendor": "LAB-EL",
  "type": "LB-856",
  "sn": "35",
  "name": "LB-856 #35",
  "input":
  [
    {
      "name": "CO2",
      "mode": "co2",
      "id": null,
      "v": [ 758 ],
      "u": [ "ppm" ]
    },
    {
      "name": "O2",
      "mode": "o2",
      "id": null,
      "v": [ 15.1 ],
      "u": [ "%" ]
    },
    {
      "name": "temperature",
      "mode": "temp",
      "id": null,
      "v": [ 24.7 ],
      "u":[ "°C" ]
    },
    {
      "name":  "0-10V",
      "mode":  "10v",
      "id":  null,
      "v":  [ 0.001 ],
      "u": [ "V" ]
    },
    {
      "name": "S300",
      "mode": "s300",
      "id": "LB-715 #101",
      "v":
      [
        37.2,
        23.2,
        988.3
      ],
      "u":
      [
        "%",
        "°C",
        "hPa"
      ]
    }
  ]
}

8.3. Przykładowy skrypt PHP przetwarzający dane


<?php

$LB856_HOST_ADDR = "lb856.demo.label.pl";

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

@$r = file_get_contents("http://{$LB856_HOST_ADDR}/json");
if ($r)
{
	$d = json_decode($r);
	show_device_info($d);
	show_device_data($d);
}
else
{
	echo "<h1>No response from LB-856 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";
}

?>