10. IoT cihazları ve cihaz istemcileri

<< İçindekileri Görüntülemek İçin Tıklayın >>

Yer:  Teknik Kılavuzlar > Netsim System Agent İstemci Protokolü Referansı >

10. IoT cihazları ve cihaz istemcileri

Ağ geçidinin WebSocket sözleşmesi §5.2'dedir; bu bölüm cihaz tanımlarını ve cihaz istemcilerini anlatır.

Ağ geçidi tarafı. IoTGateway işlemcisine bağlanabilecek cihazlar MASTER'daki iot$device sistem tablosunda tanımlanır. Ağ geçidi her komutta iot$active değeri true olan satırları okur; bir satırdaki değişiklik sonraki komutta geçerlidir. Satır, bağlanan cihaz istemcisine cihaz bilgisi olarak gönderilir ve istemcideki cihaz sınıfı parametrelerini buradan alır. Boş kolon sınıfın öndeğerini kullanır; bir sınıfın kullanmadığı kolon boş bırakılır.

Kolon Anlam
iot$device_id Satırın kimliği; verilmezse üretilir.
iot$gateway_device_id Cihazın kimliği; istemci deviceConnect'te bunu verir. Tabloda tekildir.
iot$description Açıklama.
iot$active Cihazın bağlanabilir olup olmadığı; öndeğer true.
iot$device_class Cihaz sınıfı: COM (seri porttan ham metin okuyan cihaz, ör. terazi ya da kantar göstergesi), TCP (aynı cihaz bir seri-ethernet dönüştürücünün arkasında) ya da EmkoEZM9950 (Modbus sayaç).
iot$secret_key deviceConnect'in paylaşılan gizli anahtarı. Tabloda açık metin durur.
iot$update_interval Okuma aralığı (ms, 1–86400000; öndeğer 300).
iot$update_threshold_change Bildirim için gereken en küçük değişim (öndeğer 1).
iot$update_threshold_time Değişim olmasa da bildirim aralığı (ms; öndeğer 10000).
iot$port, iot$baud_rate, iot$data_bits Seri port numarası (COM), hızı ve veri bitleri (5–8). TCP: dönüştürücünün TCP portu.
iot$host TCP: dönüştürücünün adresi (ad ya da IP).
iot$parity, iot$stop_bits, iot$flow_control None/Odd/Even/Mark/Space; 1/1.5/2; None/XOnXOff/RTS_CTS/DSR_DTR.
iot$input_buffer_size, iot$output_buffer_size Seri port tampon boyları.
iot$input_timeout, iot$output_timeout Okuma ve yazma zaman aşımı (ms).
iot$packet_size, iot$packet_timeout COM / TCP: sabit çerçeve boyu (-1 = kayıt sonlandırıcıya kadar) ve bir çerçeve için en uzun bekleme (ms). Sonlandırıcı da boy da yoksa çerçeve, bu süre kadar sessizliğe kadar gelenlerdir.
iot$raw_data_trim_left, iot$raw_data_trim_right, iot$record_terminator COM / TCP: çerçevenin baş/son boşluklarının kırpılması ve çerçeve sonlandırıcı (en çok 3 bayt, tamamı eşleşir: c'\r\n').
iot$request_command COM / TCP: her okumadan önce cihaza yazılan istek (istek bekleyen gösterge, ör. c'R\r\n'); boşsa cihaz kendiliğinden gönderir ve her okuma o ana kadar gelen çerçevelerin en sonuncusunu verir.
iot$protocol, iot$byte_order, iot$word_order, iot$unit_id Modbus: RTU/ASCII/TCP…; Big/Little; birim numarası.

Örnek (bir Modbus sayaç ve bir terazi; iot$record_terminator satır başı karakteridir):

-- iot_agcihazlar.sql  (msql -U SYSDBA -W <parola> -f iot_agcihazlar.sql)
insert into iot$device (iot$gateway_device_id, iot$description, iot$device_class, iot$secret_key,
    iot$update_interval, iot$update_threshold_change, iot$update_threshold_time,
    iot$port, iot$baud_rate, iot$data_bits, iot$parity, iot$stop_bits, iot$input_timeout, iot$output_timeout,
    iot$protocol, iot$byte_order, iot$word_order, iot$unit_id)
  values ('35F807FE-AE63-451B-AECF-89E68DCC225F', 'KALİTE 1 SAYAÇ', 'EmkoEZM9950', '123456',
    300, 1, 10000,
    1, 9600, 8, 'None', '1', 1200, 100,
    'ASCII', 'Big', 'Big', 1);
insert into iot$device (iot$gateway_device_id, iot$description, iot$device_class, iot$secret_key,
    iot$update_interval, iot$update_threshold_change, iot$update_threshold_time,
    iot$port, iot$baud_rate, iot$data_bits, iot$parity, iot$stop_bits,
    iot$input_buffer_size, iot$input_timeout, iot$output_timeout,
    iot$packet_size, iot$packet_timeout, iot$raw_data_trim_left, iot$raw_data_trim_right, iot$record_terminator)
  values ('5E21D039-C737-4C38-84DA-F9D5E710676F', 'KALİTE 1 TERAZİ', 'COM', '123456',
    100, 0, 10000,
    3, 9600, 8, 'None', '1',
    2048, 1200, 100,
    -1, 2000, false, false, c'\r');
commit;

Ham metin cihazları (COM, TCP). Ajan göstergenin protokolünü bilmez: her çerçeve ham metin olarak gider, ayrıştırma (ağırlık, işaret, kararlı/hareket bayrağı) istemcinindir. Değer yalnız değiştiğinde (ya da iot$update_threshold_time dolunca) yayımlanır. Abone istemci login + subscribe {deviceId} ile dinler, getValues ile iletileri alır; ileti topic (cihaz kimliği) ve sequence taşır, values nesnesinde value (çerçeve), timestamp ve frameSequence vardır. Aynı cihazı birden çok istemci aynı anda dinleyebilir. setValues {deviceId, values: {value}} (yönetici) metni cihaza olduğu gibi yazar (istek, röle).

Cihaz bağlantısı koptuğunda (port açılamadı, dönüştürücü kapandı) cihaz görevi kopuk durumu yayımlar ve yeniden bağlanmayı dener; bağlanınca bağlı durumunu yayımlar. Durum iki yoldan okunur: abonelere giden bir ileti (values = {event: "state", connected, error, timestamp}; value taşımaz) ve cihazın durum kaydı getStates {deviceId} → connected ("true" / "false"), error, stateTime. Sonradan bağlanan istemci güncel durumu getStates ile okur.

-- kantar göstergesi: biri seri portta (kendiliğinden gönderir), biri dönüştürücü arkasında (istek bekler)
insert into iot$device (iot$gateway_device_id, iot$description, iot$device_class, iot$secret_key, iot$update_interval,
    iot$port, iot$baud_rate, iot$data_bits, iot$parity, iot$stop_bits, iot$packet_timeout, iot$record_terminator,
    iot$raw_data_trim_left, iot$raw_data_trim_right)
  values ('KANTAR-1', 'Kantar 1', 'COM', '123456', 300, 1, 9600, 8, 'None', '1', 500, c'\r\n', true, true);
insert into iot$device (iot$gateway_device_id, iot$description, iot$device_class, iot$secret_key, iot$update_interval,
    iot$host, iot$port, iot$packet_timeout, iot$record_terminator, iot$request_command)
  values ('KANTAR-2', 'Kantar 2', 'TCP', '123456', 300, '192.168.1.50', 4001, 1000, c'\r\n', c'R\r\n');
commit;

Cihaz tarafı. Ajanın çalıştığı makineye bağlı bir cihaz (terazi, sayaç) bir IoTGateway'e cihaz istemcisi olarak bağlanabilir. İstemciler MASTER'daki iot$legacy_device sistem tablosunda tanımlanır. Görev zamanlayıcısı hizmet açılışında iot$active değeri true olan her satır için bir cihaz görevi başlatır; tablodaki değişiklik hizmet yeniden başlayınca geçerli olur. Tablo her veritabanında vardır, ajanın okuduğu MASTER'ınkidir. Ağ geçidi tarafında aynı cihaz, aynı kimlik ve gizli anahtarla ağ geçidinin iot$device tablosunda tanımlı olmalıdır.

Kolon Anlam
iot$legacy_device_id Satırın kimliği; verilmezse üretilir.
iot$gateway_device_id Cihazın ağ geçidindeki kimliği (ağ geçidinin iot$device.iot$gateway_device_id'si); tabloda tekildir.
iot$name Cihazın adı; görev ve günlük satırları bu adla anılır.
iot$description Serbest açıklama.
iot$active Görevin başlatılıp başlatılmayacağı; öndeğer true.
iot$gateway Ağ geçidinin adresi, ör. ws://localhost:82/IoTGateway.
iot$secret_key Cihaz kaydının paylaşılan gizli anahtarı. Tabloda açık metin durur.

Tanımlar çalışan hizmete msql ile girilir. Örnek (iki cihaz; tanım, cihazın bağlı olduğu makinedeki ajanda iot$active = true ile girilir):

-- iot_cihazlar.sql
insert into iot$legacy_device (iot$gateway_device_id, iot$name, iot$active, iot$gateway, iot$secret_key)
  values ('35F807FE-AE63-451B-AECF-89E68DCC225F', 'Kalite 1 Sayaç', false, 'ws://localhost:82/IoTGateway', '123456');
insert into iot$legacy_device (iot$gateway_device_id, iot$name, iot$active, iot$gateway, iot$secret_key)
  values ('5E21D039-C737-4C38-84DA-F9D5E710676F', 'Kalite 1 Terazi', false, 'ws://localhost:82/IoTGateway', '123456');
commit;

msql -U SYSDBA -W <parola> -f iot_cihazlar.sql

Görev zamanlayıcısı bu satırları görev listesini kurarken okur; yeni ya da değişen bir satırın görev listesine girmesi için hizmet yeniden başlatılır (görev listesi zamanlayıcı alt sürecinin açılışında kurulur).

Ağ geçidi yanlış anahtar ya da bilinmeyen cihaz nedeniyle bağlantıyı reddederse görev durur ve günlüğe tek bir hata yazar; oturum sınırı gibi geçici retlerde yeniden dener.