Sparkplug B veri tipleri, 8 bit işaretli bir tamsayıdan satır ve sütunlardan oluşan tam bir tabloya kadar her metrik değerinin tam olarak nasıl kodlandığını tanımlar. Bu referans her veri tipi kodunu kullandığı Protobuf alanıyla birlikte listeliyor, metrik property'lerini ve kalite kodlarını açıklıyor ve gerçek trafiği incelerken her tipi tanıyabilmeniz için çözülmüş örnekler gösteriyor.
Sparkplug'ın Neden Kendi Veri Tipleri Var?
JSON'da sayılar, dizeler ve boolean'lar bulunur. Endüstriyel sistemler bundan daha fazla kesinliğe ihtiyaç duyar. Bir PLC register'ı işaretsiz 16 bit bir tamsayı olabilir, bir sayaç 64 bit işaretsiz bir değer olabilir ve bir zaman damgası sıradan bir sayıyla karıştırılmamalıdır. Sparkplug B her metriğe açık bir datatype kodu verir; böylece dünyanın öbür ucundaki bir host uygulaması değeri edge node'un amaçladığı şekilde birebir yorumlar.
Veri tipi, birth mesajlarında her metrik için bildirilir. Veri mesajları bunu atlayabilir; bu yüzden tüketiciler, Sparkplug B payload rehberimizde anlatıldığı gibi veri tiplerini birth mesajlarından saklar.
Skaler Sparkplug B Veri Tipleri
| Kod | Ad | Protobuf değer alanı | Notlar |
|---|---|---|---|
| 0 | Unknown | yok | Yer tutucu, geçerli metriklerde görünmemeli |
| 1 | Int8 | int_value | İşaretli, işaretsiz bir alanda ikiye tümleyen |
| 2 | Int16 | int_value | İşaretli, ikiye tümleyen |
| 3 | Int32 | int_value | İşaretli, ikiye tümleyen |
| 4 | Int64 | long_value | İşaretli, uint64 içinde ikiye tümleyen |
| 5 | UInt8 | int_value | İşaretsiz |
| 6 | UInt16 | int_value | İşaretsiz |
| 7 | UInt32 | int_value | İşaretsiz |
| 8 | UInt64 | long_value | İşaretsiz |
| 9 | Float | float_value | 32 bit IEEE 754 |
| 10 | Double | double_value | 64 bit IEEE 754 |
| 11 | Boolean | boolean_value | true veya false |
| 12 | String | string_value | UTF-8 metin |
| 13 | DateTime | long_value | Unix epoch'tan bu yana milisaniye, UTC |
| 14 | Text | string_value | Daha uzun metin, String ile aynı kodlama |
| 15 | UUID | string_value | Dize biçiminde UUID |
| 16 | DataSet | dataset_value | Tipli sütun ve satırlardan oluşan tablo |
| 17 | Bytes | bytes_value | Ham binary veri |
| 18 | File | bytes_value | MetaData ile tanımlanan dosya içeriği |
| 19 | Template | template_value | Kullanıcı tanımlı tip veya örnek |
20 ve 21 kodları (PropertySet ve PropertySetList) metrik değerleri için değil, property değerleri için kullanılır.
İşaretli tamsayı tuzağı
Sparkplug'daki en yaygın çözme hatası, işaretli tamsayıları doğrudan okumaktır. int_value işaretsiz 32 bit bir alan olduğu için -5 değerindeki bir Int32 4294967291 olarak, -1 değerindeki bir Int64 ise long_value içinde 18446744073709551615 olarak gelir. Tüketici, bildirilen veri tipine göre ikiye tümleyen uygulamalıdır. Edge node'lar kodlarken bunun tersini yapmalıdır. Bir dashboard aniden dört milyar derecelik bir sıcaklık gösteriyorsa, sebep neredeyse her zaman budur.
DateTime bir sayı değildir
Bir DateTime metriği ile bir Int64 metriği aynı alanı kullanır, ancak farklı anlamlar taşır. DateTime'ı UTC olarak epoch'tan bu yana milisaniye kabul edin ve görüntülemek için dönüştürün. Asla saniye göndermeyin ve asla yerel saat göndermeyin.
Dizi Veri Tipleri
Sparkplug, skaler tiplerin dizilerini de tanımlar. Bunlar bytes_value içinde paketlenmiş little-endian değerler olarak taşınır; Sparkplug 3.0 bu kodlamayı kesin olarak açıklar (başka nelerin netleştirildiğini görmek için Sparkplug 3.0 karşılaştırmamıza bakın).
| Kod | Ad | Kod | Ad |
|---|---|---|---|
| 22 | Int8Array | 29 | UInt64Array |
| 23 | Int16Array | 30 | FloatArray |
| 24 | Int32Array | 31 | DoubleArray |
| 25 | Int64Array | 32 | BooleanArray |
| 26 | UInt8Array | 33 | StringArray |
| 27 | UInt16Array | 34 | DateTimeArray |
| 28 | UInt32Array |
Dizi desteği ürünler arasında farklılık gösterir. Farklı üreticiler arasında dizilere bağımlıysanız, her iki ucu da aynı broker'a bağlayarak onları erkenden test edin.
Metrik Bayrakları
Her metrik, tüketicilerin onu nasıl ele alacağını değiştiren boolean bayraklar taşıyabilir:
| Bayrak | Anlamı | Tüketici davranışı |
|---|---|---|
| is_null | Metrik var ama değeri yok | Null veya kötü kalite olarak gösterin, yerine sıfır koymayın |
| is_historical | Değer geçmişe ait, örneğin store and forward | Saklayın, canlı değerin üzerine yazmayın |
| is_transient | Değer historian'a kaydedilmemeli | Gösterin, saklamayın |
Metriklerin ayrıca payload zaman damgasından ayrı, isteğe bağlı bir timestamp alanı vardır. Değerin kaynakta ne zaman örneklendiğini kaydetmek için bunu kullanın.
Metrik Property'leri
Bir metrik bir PropertySet taşıyabilir: anahtarlar ve tipli değerlerden oluşan paralel listeler. Property değerleri aynı veri tipi kodlarını, artı iç içe yapılara izin veren PropertySet (20) ve PropertySetList (21) kodlarını kullanır.
Quality property'si
Spesifikasyonun tanımlı bir anlam verdiği tek property, bir Int32 olan Quality'dir:
| Değer | Anlamı |
|---|---|
| 192 | İyi |
| 0 | Kötü |
| 500 | Bayat (stale) |
Quality değeri 0 olan bir metrik alan host, bir değer mevcut olsa bile onu kötü olarak göstermelidir. Birçok edge platformu, alttaki cihazla iletişimi kaybettiğinde ancak node'u bağlı tutmaya devam ettiğinde Quality değerini 500 yapar.
Diğer yaygın property'ler
Mühendislik birimleri, aralıklar, açıklamalar ve görüntüleme biçimleri sıklıkla property olarak taşınır, ancak anahtar adları spesifikasyonun parçası değil, her platformun kendi geleneğidir. Edge node'larınız genelinde bir property sözlüğü üzerinde anlaşın; aksi takdirde host uygulamanız aynı kavramı farklı anahtarlar altında görür.
DataSet'ler
DataSet, tek bir metriğin içindeki küçük, tipli bir tablodur. Bir sütun sayısı, sütun adları, her sütun için bir veri tipi kodu ve bir satır listesi içerir. Her satır değeri sınırlı bir alan kümesi kullanır: int, long, float, double, boolean veya string.
Çözüldüğünde, bir reçete parametre tablosu şöyle görünebilir:
{
"name": "Recipe/Steps",
"datatype": 16,
"datasetValue": {
"numOfColumns": 3,
"columns": ["Step", "Temperature", "Duration"],
"types": [3, 9, 7],
"rows": [
{ "elements": [{ "intValue": 1 }, { "floatValue": 180.0 }, { "intValue": 600 }] },
{ "elements": [{ "intValue": 2 }, { "floatValue": 220.0 }, { "intValue": 300 }] }
]
}
}
DataSet'ler, bir arada kalması gereken ilişkili değer grupları için kullanışlıdır. Yapılandırılmış ekipman modelleri için ise genellikle template'ler daha uygundur; Sparkplug template'leri ve UDT'ler yazısına bakın.
Çözülmüş Örnekler
İşte birkaç veri tipi ve bir Quality property'si içeren bir birth parçası, çözüldükten sonra göreceğiniz hâliyle:
[
{ "name": "Pump/Running", "alias": 1, "datatype": 11, "booleanValue": true },
{ "name": "Pump/Speed", "alias": 2, "datatype": 9, "floatValue": 1475.0,
"properties": { "keys": ["Quality"], "values": [{ "type": 3, "intValue": 192 }] } },
{ "name": "Pump/StartCount", "alias": 3, "datatype": 8, "longValue": "18342" },
{ "name": "Pump/LastService", "alias": 4, "datatype": 13, "longValue": "1789000000000" },
{ "name": "Pump/Offset", "alias": 5, "datatype": 2, "intValue": 4294967286 },
{ "name": "Pump/Serial", "alias": 6, "datatype": 12, "stringValue": "P-0042" }
]
Int16 offset'e dikkat edin: ham 4294967286 değeri, ikiye tümleyen uygulandıktan sonra -10'dur. Ayrıca bazı JSON gösterimlerinin, JavaScript'te hassasiyet kaybını önlemek için 64 bit değerleri dize olarak gösterdiğine dikkat edin.
Veri Tiplerini Pratikte Kontrol Etmek
Veri tiplerini doğrulamanın en hızlı yolu çözülmüş birth mesajlarını okumaktır. ConnectMQ, portaldaki topic gezgininde Sparkplug B'yi çözer; böylece kod yazmadan bir NBIRTH veya DBIRTH açıp her metriğin veri tipini ve değerini kontrol edebilirsiniz. Otomatik kontroller için, Python ile Sparkplug B çözme eğitimimizdeki decoder kodları adlara eşler ve işaretli dönüşümü yapar.
Herkese açık MQTT test broker'ında test ederken rastgele bir grup ID'si kullanın ve oradaki her şeyin herkes tarafından okunabildiğini unutmayın.
Edge Node Yapılandırması İçin Veri Tipi Kontrol Listesi
- Her Sparkplug tipini kaynak register tipiyle eşleştirin; her şeyi Double'a genişletmeyin.
- Asla negatife düşmeyen sayaçlar için işaretsiz tipler kullanın.
- Zaman damgaları için her zaman UTC milisaniye cinsinden DateTime kullanın.
- Kaynağı node'dan bağımsız olarak arızalanabilen metriklerde Quality ayarlayın.
- Bir değer mevcut olmadığında sıfır yerine is_null kullanın.
- Store and forward verisini historical olarak işaretleyin.
- Tüm edge node'larda property anahtar adları üzerinde anlaşın.
- Yaygınlaştırmadan önce dizileri, DataSet'leri ve template'leri uçtan uca test edin.
Veri Tipleri Nereye Oturur?
Doğru veri tipleri, Sparkplug verisinin tag başına düzeltmeler gerekmeden historian'ları, SCADA'yı ve bir Unified Namespace'i beslemesini sağlar. Mimari rehberlik için MQTT ile Endüstriyel IoT rehberine bakın. Standartlara uygun her MQTT broker bu payload'ları taşır; bunları ayrıca çözen tam yönetilen bir MQTT servisi ise doğrulamayı çok hızlandırır.
ConnectMQ ile Başlayın
app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun. Edge node'unuzu bağlayın ve her metriğin veri tipini, değerini ve kalitesini ConnectMQ topic gezgininde kontrol edin.
Sık Sorulan Sorular
Kaç tane Sparkplug B veri tipi var?
Spesifikasyon 1'den 19'a kadar kodlarla skaler tipleri, 20 ve 21 numaralı property set tiplerini ve 22'den 34'e kadar dizi tiplerini tanımlar. 0 kodu Unknown'dur.
Negatif Sparkplug değerim neden devasa bir sayı olarak görünüyor?
İşaretli tamsayılar işaretsiz Protobuf alanlarında saklanır. Bildirilen veri tipine göre ikiye tümleyen uygulayın veya bunu sizin yerinize yapan bir decoder kullanın.
Sparkplug'da Quality 192 ne anlama gelir?
İyi kalite anlamına gelir. Quality property'si iyi için 192, kötü için 0 ve bayat için 500 kullanır.
Veri mesajlarında Sparkplug veri tipleri zorunlu mu?
Birth mesajlarında zorunlu, NDATA ve DDATA'da ise isteğe bağlıdır. Tüketiciler her metriğin veri tipini birth'ten hatırlamalıdır.



