Pendahuluan
Pada artikel ini, saya akan memberi tahu Anda cara menghubungkan dosimeter AtomTag melalui modul Bluetooth Beg112 Bluegiga ke Raspberry PI untuk mentransfer hasil pengukuran ke layanan Pemantauan Orang .AtomTag - dosimeter Bluetooth Rendah Energi untuk ponsel cerdas dan tablet dengan penghitung Geiger SBM-20. Perangkat akan mengirimkan ke server: laju dosis, kesalahan statistik dan pengisian baterai. Di akhir artikel, kita akan melihat bagaimana pembacaan dosimeter terkait dengan peristiwa cuaca.(narodmon.ru) — SaaS ( , ) (, , ., , , ), - () .
Generic Attribute Profile (GATT)
Dosimeter AtomTag mendukung profil GATT. Dalam terminologi Bluetooth, profil adalah serangkaian fitur atau kemampuan yang tersedia untuk perangkat Bluetooth tertentu.Profil GATT menentukan struktur hirarkis penyimpanan data. Struktur ditunjukkan pada gambar:
Layanan adalah wadah yang berisi beberapa atribut yang disebut karakteristik. Semua layanan memiliki pengidentifikasi unik UUID dan HANDLE. Misalnya, dosimeter memiliki 2 layanan:1. Layanan untuk pengguna, yang berisi karakteristik untuk membaca hasil pengukuran dan merekam pengaturan pengguna (pengaturan alarm suara).2.Layanan yang berisi karakteristik untuk menyimpan pengaturan pabrik: faktor kalibrasi, nama perangkat, dll.Karakteristik - terdiri dari:1. Nilai (biasanya tidak lebih dari 20 byte).2. Penjelasan - di sini tujuan karakteristik, jenis data yang disimpan, serta pengaturan karakteristik dijelaskan.3. UUID dan HANDLE pengidentifikasi unik.Data yang kami minati: jumlah pulsa terdaftar dan pengisian baterai disimpan persis dalam karakteristik.BLED112
Modul ini adalah perangkat USB-CDC, yang didefinisikan dalam sistem sebagai / dev / ttyACM0 dan tidak memerlukan instalasi driver apa pun pada Raspbian Jessie Lite dengan kernel versi 4.4. Pertukaran data dengan modul juga dilakukan seperti dengan port serial. Protokol pertukaran adalah biner. Kami tidak akan menulis parser protokol sendiri, karena Ada cukup banyak perintah untuk modul ini dan mengambil SDK di C dari pabrikan. Tautan ke SDK akan berada di akhir artikel.Perangkat Lunak Raspberry PI
Kita akan membutuhkan file-file berikut dari SDK:1. cmd_defs.c, cmd_defs.h2. apitypes.h3. commands.c4. uart.c, uart.cAPI berbasis callback. File Command.c menyatakan implementasi rintisan untuk panggilan balik yang tidak digunakan. SDK mendefinisikan 2 jenis pesan yang dapat berasal dari modul: acara dan hasil operasi. Dalam program kami, kami akan menerima data dari dosimeter menggunakan peringatan yang dikirim oleh dosimeter setiap 2 detik ketika karakteristik pengukuran berubah. Akibatnya, setiap 2 detik acara dari modul akan datang dan panggilan balik yang sesuai akan dipanggil.Mari kita menganalisis algoritma untuk menghubungkan dan bertukar data dengan dosimeter:1. Buka port /dev/ttyACM0
2.Kami me-reboot modul Bluetooth menggunakan fungsi api ble_cmd_system_reset();
3. Kami terhubung ke perangkat di alamatnya menggunakan ble_cmd_gap_connect_direct()
4. Meminta daftar layanan perangkat dan rentang nilai yang mencakup TANGAN karakteristik dari layanan ini ble_cmd_attclient_read_by_group_type()
5. Setelah acara, kami ble_evt_attclient_procedure_completed
meminta daftar karakteristik menggunakan ble_cmd_attclient_find_information().
6. Dalam acara tersebut, ble_evt_attclient_find_information_found
ingat HANDL karakteristik pengukuran dan Deskripsi Konfigurasi Karakteristik Klien (CCCD).7. Dalam acara tersebut, ble_evt_attclient_procedure_completed
hidupkan peringatan. Pada paragraf sebelumnya, kami mengenali HANDLE CCCD dan dapat membaca atau menulisnya. Untuk mengaktifkan notifikasi, Anda perlu mengatur bendera "notifikasi diaktifkan" di deskriptor CCCD menggunakan fungsible_cmd_attclient_attribute_write()
. Setelah memutuskan sambungan dari perangkat, nilai pegangan ini diatur ulang.8. Sekarang, ketika mengubah nilai karakteristik perangkat, sebuah acara akan dimunculkan ble_evt_attclient_attribute_value(const struct ble_msg_attclient_attribute_value_evt_t *msg)
. Anda dapat membedakan satu karakteristik dari yang lain dengan parameter: Tentukan struktur nilai karakteristik pengukuran:msg->atthandle.
typedef struct __attribute__((__packed__)){
uint8 status_flags;
float dose;
float doserate_search;
uint16 pulses_last2sec;
uint8 battery;
uint8 temperature;
} atomtag_measurement_t;
atomtag_measurement_t measurement_char;
Karena urutan byte dalam nilai karakteristik pengukuran adalah endian kecil, maka cukup untuk menyalin semua byte ini ke dalam struktur yang dikemas:memcpy((uint8 *)&measurement_char, msg->value.data, msg->value.len);
Tingkat dosis akan dihitung selama interval waktu 6 menit. Kami tidak akan mengirim kesaksian ke server narodmon.ru lebih dari sekali setiap 6 menit. Selain tingkat dosis, kami akan mengirimkan pengisian baterai dan kesalahan statistik. Semua perhitungan dilakukan di callback ble_evt_attclient_attribute_value()
dalam file. main.c.
Pembacaan dikirim ke port 8283 narodmon.ru menggunakan protokol tcp. Respons dari server tidak dicentang. Protokol teks:#00:00:00:00:00:00\n
#R1#10.5#err = 10%, batt = 100%\n
##
Pertama datang alamat MAC perangkat (6 byte). Di sumbernya, alamat MAC didorong untuk contoh, jangan lupa untuk mengubahnya! Lebih lanjut, di mana 10,5 adalah tingkat dosis dalam μR / jam, err adalah kesalahan statistik.Kompilasi semua ini dengan gcc:gcc -std=gnu99 -lm main.c cmd_def.c commands.c uart.c web.c -o narodmon-bin
Agar program mulai secara otomatis setelah memuat OS, saya menambahkan baris berikut sebelum keluar 0 ke file rc.local:cd /
./home/pi/narodmon/narodmon-bin /dev/ttyACM0 5c:31:3e:da:e8:9c
5c: 31: 3e: da: e8: 9c - alamat perangkat Bluetooth, yang dapat ditemukan jika Anda menjalankan program ini dengan parameter pemindaian:./narodmon-bin /dev/ttyACM0 scan
Hasil
Setelah beberapa hari operasi perangkat, hal-hal menarik muncul di grafik. Di sini Anda dapat melihat bagaimana laju dosis berubah selama musim salju. 11 November pada ~ 17:00 ... 18:00, hujan yang membeku berhenti dan salju mulai turun. Ketika ketebalan lapisan salju meningkat, laju dosis rata-rata menurun. Dosimeter dipasang pada ketinggian 2 meter dari tanah.Penurunan laju dosis dijelaskan oleh fakta bahwa lapisan salju secara parsial melindungi radiasi gamma alami di permukaan bumi. Selain itu, lapisan salju memblokir akses gas radon ke permukaan, produk-produk turunannya dapat dideteksi dengan dosimeter konvensional.Sekarang kita dapat memperkirakan ketebalan salju :) Pada masa itu, sekitar 8-10 sentimeter salju jatuh. Fotografi udara dipraktekkan di dunia untuk menilai ketebalan salju di daerah di mana pembangkit listrik tenaga air berada, untuk memahami jenis banjir apa yang akan terjadi di musim semi. Hanya ada spektrometer gamma dengan detektor kilau yang digunakan karena sensitivitasnya yang lebih besar.Gambaran serupa diamati pada dosimeter lain dari layanan pemantauan rakyat, meskipun tidak semua dari mereka memberikan data begitu sering dan tidak jelas algoritma apa untuk menghitung laju dosis yang digunakan di sana.Program ini dapat dimodifikasi dengan menambahkan buffer yang pembacaan dosimeter akan disimpan ketika tidak ada koneksi Internet. API Pemantauan Orang memungkinkan Anda mengirim bacaan secara surut. Anda juga perlu menghubungkan pi raspberry ke catu daya yang tidak pernah terputus. Terlepas dari kesederhanaan desainnya, adalah mungkin untuk mendapatkan waktu aktif sekitar tiga puluh hari. Dosimeter pada peta pemantauan nasional dapat ditemukan di sini. Tolong jangan menendang - Saya baru mengenal linux.
Referensi
1. AtomTag dosimeter2. Dokumentasi SDK dan Bluegiga BLED1123. Layanan pemantauan orang4. Bluetooth LE, spesifikasi5. Kode sumber
program untuk Raspberry PI6. Pemantauan Orang Pemantauan aplikasi Android