|
<< İç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.