$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
IoT推進ラボ ワークショップ
Search
rpaka
December 14, 2018
Programming
0
1.1k
IoT推進ラボ ワークショップ
企業の方向けに開催したIoT推進ラボワークショップの資料です。
This is presentation material of the workshop held for businessman.
rpaka
December 14, 2018
Tweet
Share
More Decks by rpaka
See All by rpaka
Driver Authentication for Smart Car Using Wireless Sensing
ritsu2891
0
890
情報家電とネットワーク
ritsu2891
0
1.2k
エネルギーの情報化 -電力のパケット化とルーティング技術-
ritsu2891
0
1.4k
スマートゴミ管理システム
ritsu2891
0
1.3k
The Channel as a Traffic Sensor: Vehicle Detection and Classification Based on Radio Fingerprinting
ritsu2891
0
1.3k
A Little Java, a Few Patterns -Ch.7 Oh, My!-
ritsu2891
0
1.2k
ARSを⽤いたFM-CWレーダーの距離分解能改善に関する検討
ritsu2891
0
1.6k
ARSを⽤いた信号分離性能に関する検討
ritsu2891
0
1.3k
Sensor Fusion for Unobtrusive Respiratory Rate Estimation in Dogs
ritsu2891
0
1.6k
Other Decks in Programming
See All in Programming
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
6
280
React Native New Architecture 移行実践報告
taminif
1
130
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
2
6.4k
NUMA環境とコンテナランタイム ― youki における Linux Memory Policy 実装
n4mlz
1
110
CSC509 Lecture 14
javiergs
PRO
0
220
無秩序からの脱却 / Emergence from chaos
nrslib
2
12k
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
140
『実践MLOps』から学ぶ DevOps for ML
nsakki55
2
560
複数人でのCLI/Infrastructure as Codeの暮らしを良くする
shmokmt
5
2.2k
TypeScriptで設計する 堅牢さとUXを両立した非同期ワークフローの実現
moeka__c
6
2.9k
All(?) About Point Sets
hole
0
280
WebRTC と Rust と8K 60fps
tnoho
2
1.9k
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
7.8k
Practical Orchestrator
shlominoach
190
11k
A designer walks into a library…
pauljervisheath
210
24k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Building Applications with DynamoDB
mza
96
6.8k
Docker and Python
trallard
46
3.7k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
Code Review Best Practice
trishagee
73
19k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Designing for Performance
lara
610
69k
Transcript
*P5ϫʔΫγϣοϓ ʢۀʣ ʢۀʣ Ѫݝཱେֶ ใՊֶ෦ใՊֶՊ Ѫݝ*P5ਪਐϥϘ ֶੜνʔϜ খٱอ थ
͡Ίʹ ਐΊํ ֓ཁͷઆ໌ ࠓճ࡞͢ΔϓϩάϥϜͰԿ͕Ͱ͖Δͷ͔ ·ͣŋŋŋ ϓϩάϥϜͷ࡞ ࣮ࡍʹखΛಈ͔͠ͳ͕ΒϓϩάϥϜΛ࡞
" ϓϩάϥϜͷ֤෦ͷઆ໌ ͲΜͳ͜ͱΛ͢Δ෦ͳͷ͔ # ϓϩάϥϛϯά࡞ۀ ༻ҙ͞Ε͍ͯΔϑΝΠϧʹଧͪࠐΈ $ ಈ࡞֬ೝ ܁ Γ ฦ ͠ ࣭ਵ࣌Ͳ͏ͧ ͪΖΜɺօ͞ΜͷपΓʹ͍Δ ֶੜ͓ख͍͠·͢ //*********************** ͜͜ΛຒΊ͍ͯͩ͘͞ //*********************** ϓϩάϥϜ݀ຒΊࣜ ࢿྉͯ͋͠Γ·͢ ݟਏ͍Օॴ͓खݩͷࢿྉͰ֬͝ೝ Լ͍͞
࣍ Ø ͡Ίʹ࣍༻ޠ Ø ֓ཁͷઆ໌ Ø ԿΛ͍͔ͨ͠
Ø μετωοτϫʔΫ Ø શମతͳߏ Ø ϓϩάϥϜᶃͷ࡞ Ø 3BTQCFSSZ1Jͷ(1*0ϐϯ Ø 3BTQCFSSZ1Jͱػثͷଓ Ø *$ʹΑΔ௨৴ Ø -JOVYͰͷσόΠεͱͷ௨৴ Ø *$σόΠε͔Βͷσʔλऔಘ Ø ίʔσΟϯάʢTFOTPSDʣ Ø ಈ࡞֬ೝʢηϯα͔Βͷσʔλऔಘʣ Ø ίʔσΟϯάʢEVTUOFUDʣ Ø ίʔσΟϯάʢNBJODʣ Ø ϓϩάϥϜᶄͷ࡞ Ø ίʔσΟϯάʢ/PUJG1SPDFTTPSQZʣ Ø ϓϩάϥϜᶅͷ࡞ Ø 63* Ø 8FCαʔόͷಇ͖ Ø ϧʔςΟϯά Ø ඇಉظ௨৴ Ø +40/ Ø -BSBWFM Ø ίʔσΟϯάʢϧʔςΟϯάʣ Ø ίʔσΟϯάʢ%#+40/ʣ Ø ϓϩάϥϜᶆͷ࡞ Ø ϓϩάϥϜᶅͷΠϯλʔϑΣʔε Ø $IBSUKT Ø ίʔσΟϯάʢ"QQKTʣ Ø ಈ࡞֬ೝ Ø σϞͷհ
༻ޠ ϑΝΠϧ σΟεΫϦϓλ σόΠεϑΝΠϧΛ։͍ͨͱ͖ʹಘΒΕΔ൪߸ σόΠεϑΝΠϧΛͬͨॲཧʢηϯαͱͷ௨৴ʣͷࡍʹར༻͢Δ Ϗοτྻ ͷฒͼ ͷฒͼ͕OݸͰ͋Δ͜ͱΛO<CJU>ͱදݱ͢Δ ม
σʔλͷೖΕ ྻ σʔλ͕͍͔ͭ͘ू·ͬͯ࿈ͳ͍ͬͯΔσʔλͷೖΕ %# σʔλϕʔε σʔλͷอॴ 3BTQCFSSZ1J খܕͷίϯϐϡʔλͷҰͭ ࠓճͷϫʔΫγϣοϓͰηϯα͔Βͷআ๏ͷऔಘͱμετωοτͰͷ௨৴Λ୲͏ Ϛωʔδϟ μετωοτͷػ Ϟʔτ μετωοτͷࢠػ
֓ཁͷઆ໌
ԿΛ͍͔ͨ͠ 1$ 3BTQCFSSZ1J ηϯα Ϟʔτ Ϛωʔδϟ
μετωοτϫʔΫͱ Ϟʔτ ʢࢠػʣ ػͱෳͷࢠػͰ࡞Δ ωοτϫʔΫ σʔλΛΓऔΓ͢ΔͨΊͷಓ࿏ ͷܗঢ়ͷҰछ ŋŋŋ ωοτϫʔΫ
ػͱશͯͷࢠػ͕ ܨ͕͍ͬͯͳ͍͕ɺଞͷࢠػΛ ܦ༝ͯ͠ଓͰ͖Δ ҰຊಓͰͳͯ͘ɺ৭ʑͳಓΛ ࡞͍ͬͯΔ ϝογϡঢ়ͷωοτϫʔΫ Ϛωʔδϟ ʢػʣ
ిͷಧ͘ൣғ ిͷಧ͘ൣғ μετωοτϫʔΫͷར ػͱશͯͷࢠػ͕ ܨ͕͍ͬͯͳ͍͕ɺଞͷࢠػΛ ܦ༝ͯ͠ଓͰ͖Δ ҰຊಓͰͳͯ͘ɺ৭ʑͳಓΛ ࡞͍ͬͯΔ ൣғΛΧόʔ
ػ ࢠػ ܨ͕Γ͍͢
μετωοτϫʔΫͷར *P5ʹ༗ޮͳߴ৴པੑωοτϫʔΫ ൣғΛΧόʔ ܨ͕Γ͍͢ ফඅిྗ͕ඇৗʹ͍
શମతͳߏ 8&#αʔό͔Β σʔλऔಘɾάϥϑԽ ϒϥβ 8&#αʔό %#͔Β σʔλऔಘɾՃ %# ϓϩάϥϜ
ϓϩάϥϜ ϓϩάϥϜ 3BTQCFSSZ1J ϓϩάϥϜ ௨৴੍ޚ ηϯα͔Β σʔλऔಘɾՃ ηϯα 1$ Ϟʔτ Ϛωʔδϟ σʔλऔಘ %#ॻ͖ࠐΈ
Թηϯα͔Βͷσʔλͷऔಘ ϞʔτͰͷૹ৴ ϓϩάϥϜͷ࡞ ϓϩάϥϜᶃ
ϓϩάϥϜᶃ r ࠓ͔Β࡞͢Δ෦ 8&#αʔό͔Β σʔλऔಘɾάϥϑԽ ϒϥβ 8&#αʔό %#͔Β σʔλऔಘɾՃ
%# ϓϩάϥϜ ϓϩάϥϜ ϓϩάϥϜ 3BTQCFSSZ1J ௨৴੍ޚ ηϯα͔Β σʔλऔಘɾՃ ηϯα 1$ Ϟʔτ Ϛωʔδϟ σʔλऔಘ %#ॻ͖ࠐΈ ϓϩάϥϜ
ϓϩάϥϜᶃ r ԿΛ͢ΔϓϩάϥϜͳͷ͔ 3BTQCFSSZ1J Ϟʔτ ηϯα ηϯαʹଓ ίϚϯυൃߦ σʔλऔಘ
σʔλΛՃ ˠ ઁࢯ ˠ Ϗοτྻ Ϟʔτʹଓ ௨৴੍ޚ Ϟʔτʹσʔλૹ৴ 1$ ̐ ϓϩάϥϜ
3BTQCFSSZ1Jͷ(1*0ϐϯ (1*0ϐϯ ୯७ͳ0/0'' -&%ͷ౮ σΟδλϧ௨৴ ηϯαͷར༻ ֎෦ػثͱͷ࿈ܞ
μετωοτͷϞʔτηϯαͱ3BTQCFSSZ1Jͷଓʢ̍ʣ 3BTQCFSSZ1J *$௨৴ ηϯα Ϟʔτ γϦΞϧ௨৴ 6"35
μετωοτͷϞʔτηϯαͱ3BTQCFSSZ1Jͷଓʢ̎ʣ 3BTQCFSSZ1J Ϟʔτ ηϯα ˞ͥͻ֬͝ೝԼ͍͞
*$ʹΑΔ௨৴ ϥζύΠ ηϯα ηϯα ηϯα Y Y Y Ϩδελ
Ϩδελ Y Y ෳͷηϯαΛଓ͠ɼΞυϨεͰ۠ผ ηϯα෦ͷϨδελΛΞυϨεͰ۠ผ ʢ͢Δ߹͋Δʣ ͋͘·Ͱ௨৴ํࣜ σʔλͷܗࣜ௨৴ͷ༰ ηϯαʔͷ༷ʹΑΔ
-JOVYͰͷσόΠεͱͷ௨৴ 595ϑΝΠϧ 'PPUYU σόΠεϑΝΠϧ *D σόΠεϑΝΠϧΛ։͘ͱ൪߸͕༩͑ΒΕΔ ˠ ϑΝΠϧσΟεΫϦϓλ ͱݺͼɺޙͷॲཧͰར༻
*$σόΠε͔Βͷσʔλऔಘʢ̍ʣ ϓϩάϥϜ read() σόΠεϑΝΠϧ *D ʁ ͍͖ͳΓಡ·ΕͯԿΛฦͨ͠Βྑ͍͔͔Βͳ͍
*$σόΠε͔Βͷσʔλऔಘʢ̎ʣ ϓϩάϥϜ write() σόΠεϑΝΠϧ *D ίϚϯυΛൃߦͯ͠σʔλऔಘ read() ԹσʔλΛଌͬͯԼ͍͞
ϓϩάϥϜᶃͷߏ -JOVY TFUVQ@TFOTPS DMPTF@TFOTPS SFBE@TFOTPS XSJUF@TFOTPS XSJUF@TFOTPS SFBE5FNQ@TIU SFBE*MMVNJOBODF@CI
SFBE*MMVNJOBODF@UTM NBJO ϑΝΠϧσΟεΫϦϓλ ηϯα͔Βͷσʔλ 4NBSU.FTI24- 4NBSU.FTI$-JCSBSZ DPOOFDU@EVTUOFU TFOE@EBUB@EVTUOFU TFOTPSD EVTUOFUD NBJOD
ϓϩάϥϜᶃͷσΟϨΫτϦߏ 3BTQCFSSZ1J TN@DMJC TN@RTM NBJOD NBJOI TFOTPSD TFOTPSI EVTUOFUD
EVTUOFUI UFTUDUFTUI 3BTQCFSSZ1J EO@ D NBLFGJMF ฤू͢ΔϑΝΠϧ͕ ݸ ͋Γ·͢
ϓϩάϥϜᶃ r ίʔσΟϯά r TFOTPSDʢ̍ʣ int setup_sensor(int addr){ //
char* i2c_dev_file = "/dev/i2c-1"; //********************************** int fd = open(i2c_dev_file, O_RDWR); //********************************** TFOTPSD ... //************************************ if (ioctl(fd, I2C_SLAVE, addr) < 0) { //************************************ ... TFUVQ@TFOTPS త ηϯαͷଓΛ͢Δ Ҿ BEES *$ηϯαͷΞυϨε ฦ GE ϑΝΠϧσΟεΫϦϓλ σόΠεϑΝΠϧͷར༻४උ ˠ ϑΝΠϧσΟεΫϦϓλΛऔಘ ΞυϨεΛࢦఆͯ͠ଓΛࢼΈΔ
ϓϩάϥϜᶃ r ίʔσΟϯά r TFOTPSDʢ̎ʣ int write_sensor8(int fd, uint8_t
command){ ... buf[0] = command; //************************************ rtn = write(fd, buf, writesize); //************************************ TFOTPSD int write_sensor16(int fd, uint16_t command){ ... buf[0] = (command >> 8) & 0xff; buf[1] = command & 0xff; //************************************ rtn = write(fd, buf, writesize); //************************************ XSJUF@TFOTPS XSJUF@TFOTPS త ηϯαίϚϯυΛॻ͖ࠐΉ Ҿ GE ϑΝΠϧσΟεΫϦϓλ DPNNBOE ॻ͖ࠐΉίϚϯυ ฦ ਖ਼ৗͰ͋Ε Τϥʔ ॻ͖ࠐΉσʔλΛCJUຖʹׂ ϑΝΠϧσΟεΫϦϓλɺׂͨ͠σʔ λɺσʔλͷαΠζΛͯ͠γεςϜ ίʔϧΛݺͿ
ϓϩάϥϜᶃ r ίʔσΟϯά r TFOTPSDʢ̎ʣ int write_sensor8(int fd, uint8_t
command){ ... buf[0] = command; //************************************ rtn = write(fd, buf, writesize); //************************************ TFOTPSD int write_sensor16(int fd, uint16_t command){ ... buf[0] = (command >> 8) & 0xff; buf[1] = command & 0xff; //************************************ rtn = write(fd, buf, writesize); //************************************ ॻ͖ࠐΉσʔλΛCJUຖʹׂ ˠ ྻͷܗࣜʹ͢Δ 01000001 11100100 0100000111100100 CVG CVG 01000001
ϓϩάϥϜᶃ r ίʔσΟϯά r TFOTPSDʢ̏ʣ int read_sensor(int fd, uint8_t
*buffer, int readsize) { int rtn; if (readsize > 0) { //************************************ rtn = read(fd, buffer, readsize); //************************************ TFOTPSD SFBE@TFOTPS త ηϯα͔ΒσʔλΛಡΈࠐΉ Ҿ GE ϑΝΠϧσΟεΫϦϓλ CVGGFS ಡΈࠐΜͩσʔλͷอଘ༻ྻ SFBETJ[F ಡΈࠐΉ ͖ σʔλαΠζ ฦ ਖ਼ৗͰ͋Ε Τϥʔ ̍ ϑΝΠϧσΟεΫϦϓλɺಡΈࠐΜͩ σʔλͷอଘ༻ྻɺಡΈࠐΉσʔλͷ αΠζΛͯ͠γεςϜίʔϧΛݺͿ
ϓϩάϥϜᶃ r ίʔσΟϯά r TFOTPSDʢ̐ʣ float readTemp_sht31(int fd) {
//************************************ write_sensor16(fd, 0x30A2); write_sensor16(fd, 0x2C0D); //************************************ delay(10); uint8_t buf[10]; TFOTPSD //************************************ read_sensor(fd, buf, 6); //************************************ ... return (float)temp; } SFBE5FNQ@TIU త ηϯα͔ΒԹΛಡΈࠐΉ Ҿ GE ϑΝΠϧσΟεΫϦϓλ ฦ UFNQ ηϯα͔ΒಡΈࠐΜͩԹ ܭଌΛࢦࣔ͢ΔίϚϯυΛൃߦ ̎ ܭଌʹඞཁͳ࣌ؒͷؒػ ܭଌ݁ՌΛಡΈࠐΉ ුಈখʹม ˞อଘͯ͠Լ͍͞
ϓϩάϥϜᶃ r ίʔσΟϯά r TFOTPSDʢ̐ʣ float readIlluminance_bh1750(int fd) {
if (!power_bh1750) { write_sensor8(fd, 0x01); power_bh1750 = 1; } write_sensor8(fd, 0x10); TFOTPSD delay(200); uint8_t buf[2]; read_sensor(fd, buf, 2); ... return illum; } SFBE*MMVNJOBODF@CI త ηϯα͔ΒরΛಡΈࠐΉ Ҿ GE ϑΝΠϧσΟεΫϦϓλ ฦ JMMVN ηϯα͔ΒಡΈࠐΜͩর ܭଌΛࢦࣔ͢ΔίϚϯυΛൃߦ ̎ ܭଌʹඞཁͳ࣌ؒͷؒػ ܭଌ݁ՌΛಡΈࠐΉ ුಈখʹม ˞อଘͯ͠Լ͍͞
ϓϩάϥϜᶃ r ίʔσΟϯά r TFOTPSDʢ̐ʣ float readIlluminance_tsl2561(int fd) {
... if (!power_tsl2561) { ... delay(400); } ... TFOTPSD ... uint16_t illum_byte_line; illum_byte_line = ...; float illum = ...; return illum; } SFBE*MMVNJOBODF@UTM త ηϯα͔ΒরΛಡΈࠐΉ Ҿ GE ϑΝΠϧσΟεΫϦϓλ ฦ JMMVN ηϯα͔ΒಡΈࠐΜͩর ిݯ0/Λࢦࣔͯ͠ܭଌʹඞཁͳ࣌ؒػ ̎ ܭଌ݁ՌΛCJUͣͭಡΈࠐΉ ුಈখʹม ˞อଘͯ͠Լ͍͞
ϓϩάϥϜᶃ r ͜͜·ͰͷՌ 3BTQCFSSZ1J Ϟʔτ ηϯα ηϯαʹଓ ίϚϯυൃߦ σʔλऔಘ
σʔλΛՃ ˠ ઁࢯ ˠ Ϗοτྻ Ϟʔτʹଓ ௨৴੍ޚ Ϟʔτʹσʔλૹ৴ 1$ ̐ ϓϩάϥϜ
ϓϩάϥϜᶃ r ಈ࡞֬ೝʢηϯα͔ΒͷσʔλऔಘͷΈʣ int main(int argc, char** argv){ while
(TRUE) { ***_***(); dn_sleep_ms(DATA_PERIOD_MS); } } NBJOD NBJODΛ࣍ͷΑ͏ʹฤूʢίϝϯτΛ֎͢ʣอଘ ࣮ߦ $ ./main ίϯύΠϧ $ cd Desktop/RaspberryPi $ make sensor_test Թηϯα 4)5 রηϯα #) রηϯα 54- test_sht31(); test_bh1750(); test_tsl2561(); /* ... [] ... */ ... [] ... //... [] ... ... [] ... ίϝϯτΛ֎͢
ϓϩάϥϜᶃ r ίʔσΟϯά r EVTUOFUDʢ̍ʣ void connect_dustnet() { ...
//************************************************************ if (dn_qsl_connect(NETID, JOINKEY, SRC_PORT, BANDWIDTH_MS)) { //************************************************************ ... EVTUOFUD ઃఆΛࢦఆͯ͠24-Λݺͼग़͠ DPOOFDU@EVTUOFU త Ϛωʔδϟʹଓ͢Δ
ϓϩάϥϜᶃ r ίʔσΟϯά r EVTUOFUDʢ̎ʣ void send_data_dustnet(float data) {
... //**************************************************** if (dn_qsl_send(payload, sizeof payload, DEST_PORT)) { //**************************************************** ... EVTUOFUD ׂͨ͠σʔλͱσʔλͷαΠζΛࢦ ఆͯ͠24-Λݺͼग़͠ TFOE@EBUB@EVTUOFU త ϞʔτͰσʔλΛૹΔ Ҿ EBUB ૹΔσʔλ ϞʔτͰૹΔσʔλΛුಈখͷ Ϗοτྻදݱʹม͠ɺCJUຖʹׂ
ϓϩάϥϜᶃ r ίʔσΟϯά r EVTUOFUDʢ̎ʣ void send_data_dustnet(float data) {
... //**************************************************** if (dn_qsl_send(payload, sizeof payload, DEST_PORT)) { //**************************************************** ... EVTUOFUD ϞʔτͰૹΔσʔλΛුಈখͷϏοτྻදݱʹม͠ɺCJUຖʹׂ 01000001 11100100 01100110 01100110 01000001111001000110011001100110 28.55 CJUຖʹׂ ୯ਫ਼ ුಈখ දݱม QBZMPBE ˞อଘͯ͠Լ͍͞
ϓϩάϥϜᶃ r ίʔσΟϯά r NBJODʢ̍ʣ int main(int argc, char**
argv){ // log_info(" ..."); dn_qsl_init(); //*************************** fd = setup_sensor(****_****); //*************************** NBJOD 24-Λݺͼग़ͯ͠μετωοτͷॳظԽॲཧ NBJO త ϞʔτͰσʔλΛૹΔ Ҿ BSHD Ҿͷݸ BSHW Ҿͷ༰ͷྻ ฦ ਖ਼ৗ࣌ Τϥʔ࣌ ηϯαͷॳظԽॲཧΛͯ͠ ϑΝΠϧσΟεΫϦϓλΛಘΔ Թηϯα 4)5 রηϯα #) রηϯα 54- addr_sht31 addr_bh1750 addr_tsl2561
ϓϩάϥϜᶃ r ίʔσΟϯά r NBJODʢ̎ʣ ... while (running) {
if (dn_qsl_isConnected()) { //************************ data = read****_****(fd); //************************ send_data_dustnet(data); NBJOD dn_sleep_ms(DATA_PERIOD_MS); } else { connect_dustnet(); } } close_sensor(fd); return EXIT_SUCCESS; } Թηϯα 4)5 রηϯα #) রηϯα 54- readTemp_sht31(fd) readIlluminance_bh1750(fd) readIlluminance_tsl2561(fd) ˞อଘͯ͠Լ͍͞
ϓϩάϥϜᶃ r ίʔσΟϯά r NBJODʢ̎ʣ ... while (running) {
if (dn_qsl_isConnected()) { //************************ data = read****_****(fd); //************************ send_data_dustnet(data); NBJOD dn_sleep_ms(DATA_PERIOD_MS); } else { connect_dustnet(); } } close_sensor(fd); return EXIT_SUCCESS; } ϚωʔδϟʹσʔλΛૹ৴Ͱ͖Δ ঢ়ଶ͔ʢଓ͍ͯ͠Δ͔ʣΛௐΔ ηϯα͔ΒσʔλΛऔಘ͢Δ ϚωʔδϟʹσʔλΛૹ৴͢Δ ͠Β͘ػ͢Δʢͦͷޙ࠶ͼᶄʣ Ϛωʔδϟʹଓ͢Δ ηϯαͱͷଓΛղআ͢Δ ˞อଘͯ͠Լ͍͞
Ϛωʔδϟ͔Βͷσʔλͷऔಘ %#ͷॻ͖ࠐΈ ϓϩάϥϜͷ࡞ ϓϩάϥϜᶄ
ϓϩάϥϜᶄ r ࠓ͔Β࡞͢Δ෦ 8&#αʔό͔Β σʔλऔಘɾάϥϑԽ ϒϥβ 8&#αʔό %#͔Β σʔλऔಘɾՃ
ϓϩάϥϜ ϓϩάϥϜ 3BTQCFSSZ1J ௨৴੍ޚ ηϯα͔Β σʔλऔಘɾՃ ηϯα Ϟʔτ %# ϓϩάϥϜ Ϛωʔδϟ σʔλऔಘ %#ॻ͖ࠐΈ 1$ ϓϩάϥϜ
ϓϩάϥϜᶄ r ԿΛ͢ΔϓϩάϥϜͳͷ͔ %# ϓϩάϥϜ 1$ Ϛωʔδϟ σʔλऔಘ
%#ॻ͖ࠐΈ Ϛωʔδϟʹଓ σʔλऔಘ %#ॻ͖ࠐΈ
1Z4FSJBM 4NBSU.FTI4%, ϓϩάϥϜᶄ r ߏ "QQQZ /PUJG$MJFOUQZ /PUJG1SPDFTTPSQZ Ϟʔτ͔Βͷ௨
.Z42-1ZUIPO$POOFDUPS ଓʹؔ͢Δใ Ճͨ͠σʔλ -JOVY ௨ ŋŋŋ Ϛωʔδϟ͔Βਵ࣌ૹΒΕͯ͘Δσʔλͷ͜ͱ ˠ Ϟʔτ͔Βͷσʔλૹ৴Ϛωʔδϟͷঢ়ଶͳͲෳछྨ͋Γ
ϓϩάϥϜᶄͷσΟϨΫτϦߏ .BOBHFS MJCT FYUFSOBM@MJCT "QQQZ /PUJG$MJFOUQZ /PUJG1SPDFTTPSQZ ฤू͢ΔϑΝΠϧ͕ ݸ
͋Γ·͢
ϓϩάϥϜᶄ r ίʔσΟϯά r /PUJG1SPDFTTPSQZʢ̍ʣ def byteLineToFloat(self, byteBlockArray): ...
byteLine = (byteBlockArray[0] << 24) + (byteBlockArray[1] << 16) + (byteBlockArray[2] << 8) + (byteBlockArray[3]) data = struct.unpack("<f", struct.pack("<I", byteLine))[0] return data /PUJG1SPDFTTPSQZ CJUͷϏοτྻʹ݁߹ CZUF-JOF5P'MPBU త σʔλΛՃ͢Δ Ҿ CZUF#MPDL "SSBZ CJUຖʹ۠ΒΕͨϏοτྻ ฦ EBUB ුಈখʹՃͨ͠ ϏοτྻΛ ୯ਫ਼ ුಈখͱͯ͠ղऍ
Ϟʔτ͔ΒૹΒΕͨσʔλΛܭCJUͷϏοτྻʹ݁߹͠ɺ ୯ਫ਼ ුಈখ ͱͯ͠ղऍ 28.55 ϓϩάϥϜᶄ r ίʔσΟϯά
r /PUJG1SPDFTTPSQZʢ̍ʣ def byteLineToFloat(self, byteBlockArray): ... byteLine = (byteBlockArray[0] << 24) + (byteBlockArray[1] << 16) + (byteBlockArray[2] << 8) + (byteBlockArray[3]) data = struct.unpack("<f", struct.pack("<I", byteLine))[0] return data 01000001 11100100 01100110 01100110 01000001111001000110011001100110 CJUʹ݁߹ ୯ਫ਼ ුಈখ ม CZUF#MPDL"SSBZ /PUJG1SPDFTTPSQZ
ϓϩάϥϜᶄ r ίʔσΟϯά r /PUJG1SPDFTTPSQZʢ̎ʣ def writeToMySQL(self, data): ...
config = { ... } ... #************************************* stmt = "INSERT INTO data_table (`data`) VALUES (?);" cursor.execute(stmt, (data, )) #************************************* ... XSJUF5P.Z42- త .Z42-%#ʹॻ͖ࠐΉ Ҿ EBUB ॻ͖ࠐΉσʔλ ฦ σʔλϕʔεଓͷͨΊͷઃఆ ̎ σʔλϕʔεଓ ˞վߦແ͠ /PUJG1SPDFTTPSQZ
ϓϩάϥϜᶄ r ίʔσΟϯά r /PUJG1SPDFTTPSQZʢ̎ʣ def writeToMySQL(self, data): ...
config = { ... } ... #************************************* stmt = "INSERT INTO data_table (`data`) VALUES (?);" cursor.execute(stmt, (data, )) #************************************* ... 42-จʹΑͬͯσʔλϕʔε Ͱߦ͏ॲཧΛࢦఆ ॻ͖ࠐΉσʔλΛࢦఆ ࣮ࡍʹॻ͖ࠐΈॲཧΛߦ͏ ˞վߦແ͠ /PUJG1SPDFTTPSQZ
ϓϩάϥϜᶄ r ίʔσΟϯά r /PUJG1SPDFTTPSQZʢ̎ʣ INSERT INTO data_table (`data`)
VALUES (28.55) INSERT INTO data_table (`data`) VALUES ( ) 28.55 .Z42-
ϓϩάϥϜᶄ r ίʔσΟϯά r /PUJG1SPDFTTPSQZʢ̏ʣ def processNotif(self, notif_name, notif_params):
#******************************************************** self.printNotif(notif_name, notif_params) if (notif_name == "notifData"): data = self.byteLineToFloat(notif_params.data) self.writeToMySQL(data) #******************************************************** /PUJG1SPDFTTPSQZ ௨ͷ༰Λදࣔ QSPDFTT/PUJG త ॲཧΛܨ͛Δ Ҿ OPUJG@OBNF ௨ͷ໊લ ฦ OPUJG@QBSBN ௨ʹؔ͢Δσʔλ ୯ਫ਼ ුಈখʹม ˞௨͕དྷͨࡍʹ NotifClient ʹΑΓ͜ͷॲཧ͕ݺͼग़͞ΕΔ .Z42-%#ʹॻ͖ࠐΈ ˞อଘͯ͠Լ͍͞
Ϛωʔδϟ͔Βͷऔಘ %#ͷॻ͖ࠐΈ ϓϩάϥϜͷ࡞ ϓϩάϥϜᶅ
ϓϩάϥϜᶅ r ࠓ͔Β࡞͢Δ෦ 8&#αʔό͔Β σʔλऔಘɾάϥϑԽ %#͔Β σʔλऔಘɾՃ ϓϩάϥϜ
3BTQCFSSZ1J ௨৴੍ޚ ηϯα͔Β σʔλऔಘɾՃ ηϯα Ϟʔτ Ϛωʔδϟ σʔλऔಘ %#ॻ͖ࠐΈ ϒϥβ 8&#αʔό %# ϓϩάϥϜ 1$ ϓϩάϥϜ ϓϩάϥϜ
ϓϩάϥϜᶅ r ԿΛ͢ΔϓϩάϥϜͳͷ͔ ϒϥβ 8&#αʔό %# ϓϩάϥϜ 1$
%#͔Βσʔλऔಘ +40/ܗࣜʹՃ
63* http://www.aichi-pu.ac.jp/about/index.html
8FCαʔόͷಇ͖ʢ̍ʣ ϒϥβ <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8">
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no- cache"> <meta name="viewport" content="width=device- width,initial-scale=1.0"> <meta name="format-detection" content="telephone=no"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <link href="css/index.css" rel="stylesheet" type="text/css"> <link href="css/index_sp.css" rel="stylesheet" type="text/css" class="sp_view"> <meta name="Keywords" content="5$=4, Aichi Prefectural University, $4, ;%, 6-, ,), APU"> <meta name="Description" content="5$=4&+ 591044# <3'44 / 7*0:94.122!0: &8 0:"( "> <title>5$=4</title> 8FCαʔό ʮJOEFYIUNMʯͷ ϖʔδΛԼ͍͞ɻ 0,Ͱ͢ɻ༰ʮŋŋŋ ݁ہɺจࣈྻΛฦͯ͠Δ͚ͩ *OEFYIUNM ༰ΛௐΔ ղऍ
8FCαʔόͷಇ͖ʢ̎ʣ ϒϥβ 8FCαʔό ʮEBUBBMMʯ ͷϖʔδΛԼ͍͞ɻ 0,Ͱ͢ɻ༰ʮŋŋŋ ͲΜͳจࣈྻͰྑ͍ 'PP #BB
'PP #BB
ϧʔςΟϯά IPNF MPHJO OPUJG EBUBBMM EBUBOFX ϒϥβ τοϓΛ දࣔ͢Δ
ϩάΠϯϢʔβ ͷೝূ %#ͷશͯͷ ใΛऔಘ͢Δ %#ͷ৽͍͠ ใΛऔಘ͢Δ ϓϩάϥϜ ॲཧͷબ ʢϧʔςΟϯάʣ 8&#αʔό
ඇಉظ௨৴ʢ̍ʣ ϒϥβ 8FCαʔό άϥϑશମͦͷͷΛมԽ͢ΔʹૹΔʁ ŋŋŋ ϖʔδશମ͕ॻ͖ΘΔ ˠ ϖʔδ͕ͪΒͭ͘ ˠ
ແବͳ௨৴͕ൃੜ
ඇಉظ௨৴ʢ̎ʣ ϒϥβ 8FCαʔό ৽͍͠ॴ͚ͩॻ͖͑Δ ŋŋŋ ৽͍͠σʔλ͚ͩཪͰऔಘ
ˠϖʔδͷҰ෦ͷΈॻ͖͑ ˠॻ͖ΘΔ෦͚ͩนը
+40/ܗࣜ +BWB4DSJQU 0CKFDU/PUBUJPO { "type" : "Temperature", "from" :
"mote", "mac-addr” : "0x01", "inner-item" : { "child1" : "Jane Smith", "child2" : "123 Maple Street" }, "data" : 24.5, "timestamp” : "2018-10-21 21:12:41 JST" } 1)1 +4 $ 1ZUIPO +BWB • +4ͷΦϒδΣΫτͷจࣈදݱ • ܰྔͳσʔλ • ѻ͍͍͢ɿ৭ʑͳڥͰར༻Մ • ਓͷʹݟ͍͢ • 8&#"1*ͰΑ͘ར༻͞ΕΔ +40/
-BSBWFMͱ • 1)1ͷ8&#ϑϨʔϜϫʔΫ • ϑϧελοΫʢػೳຬࡌʣ • .7$ • ಡΈ͍͢ɺॻ͖͍͢ʢͱݴΘΕΔʣ
• ಉҙͰ͖ΔʢൺֱతಡΈॻ͖͍͢͠ʣ • υΩϡϝϯτ͕๛ʢຊޠ͋Γʣ • ྲྀߦ͍ͬͯΔʢωοτ্ʹใຬࡌʣ • %*ʢґଘੑೖʣ • ϑΝαʔυ • σϑΥϧτͰ"NB[PO4ʹଓ • 7VFKTͱͷ౷߹ ͱͯศར ػೳຬࡌ͔ͭॳ৺ऀ͖ ͏ػೳ͚ͩཧղ͢Ε0, Ͱ͖Δ͜ͱଟա͗ʂ ແྉʂ
ϓϩάϥϜᶅʢ-BSBWFMʣͷσΟϨΫτϦߏ 8&# BQQ %BUB$POUSPMMFSQIQ )UUQ $POUSPMMFST SPVUFT XFCQIQ ŋŋŋ
ฤू͢ΔϑΝΠϧ͕ ݸ ͋Γ·͢
ϓϩάϥϜᶅ r ίʔσΟϯά r ϧʔςΟϯά Route::get('/', function () {
return view('home'); }); Route::get(‘/data/all’, “DataController@all"); Route::get(‘/data/new/{id}', ‘DataController@new'); SPVUFTXFCQIQ ϒϥβ BMM EBUBBMM EBUBOFX\JE^ OFX JE %BUB$POUSPMMFS )PNFCMBEFQIQ )5.-Έ͍ͨͳͷ ˞อଘͯ͠Լ͍͞
ϓϩάϥϜᶅ r ίʔσΟϯά r %#ΞΫηεɾ+40/ܗࣜʹม namespace App¥Http¥Controllers; use Illuminate¥Support¥Facades¥DB;
class DataController { public function all() { $data = DB::table(‘data_table')->get(); return response()->json($data); } public function new($id) { $data = DB::table(‘data_table')->where('id', '>', $id)->get(); return response()->json($data); } } BQQ)UUQ$POUSPMMFST%BUB$POUSPMMFSQIQ நԽ͞Εͨ%#ΞΫηε 42-จΛΒͳͯ͘ྑ͍ +40/ܗࣜͷมҰൃ %# ྻ +40/ ϒϥβ ˞อଘͯ͠Լ͍͞
8&#αʔό͔Βͷσʔλऔಘ άϥϑนը ϓϩάϥϜͷ࡞ ϓϩάϥϜᶆ
ϓϩάϥϜᶆ r ࠓ͔Β࡞͢Δ෦ 8&#αʔό͔Β σʔλऔಘɾάϥϑԽ %#͔Β σʔλऔಘɾՃ ϓϩάϥϜ
3BTQCFSSZ1J ϓϩάϥϜ ௨৴੍ޚ ηϯα͔Β σʔλऔಘɾՃ ηϯα Ϟʔτ Ϛωʔδϟ σʔλऔಘ %#ॻ͖ࠐΈ ϒϥβ 8&#αʔό %# ϓϩάϥϜ 1$ ϓϩάϥϜ
ϓϩάϥϜᶆ r ԿΛ͢ΔϓϩάϥϜͳͷ͔ ϒϥβ 8&#αʔό 1$ 8&#αʔό͔Β σʔλऔಘ
ϓϩάϥϜ άϥϑนը
ϓϩάϥϜᶅʢ8&#αʔόʣͷΠϯλʔϑΣʔε EBUB@UBCMF
ŋŋŋ EBUBBMM EBUBOFX\JE^ ˞\JE^Ҏ߱ͷσʔλΛฦ͢ ͜ͷ߹\JE^ 8&#αʔό %# ϒϥβ ϓϩάϥϜ ϓϩάϥϜ ˞શͯͷσʔλΛฦ͢
+2VFSZ ϓϩάϥϜᶆ r ߏ "QQKT $IBSUKT 9.-)UUQ3FRVFTU $BOWBT"1* άϥϑนըߋ৽ґཔ
HFU"MM%BUB HFU/FX%BUB @HFU%BUB ྻ 8&#αʔό͔Β ಘͨσʔλ
ແঈάϥϑนըϥΠϒϥϦ $IBSUKT
ϓϩάϥϜᶆͷσΟϨΫτϦߏ 8&# QVCMJD "QQKT KT ŋŋŋ $IBSUCVOEMFKT KRVFSZNJOKT ฤू͢ΔϑΝΠϧ͕
ݸ ͋Γ·͢
ϓϩάϥϜᶆ r ίʔσΟϯά r "QQKTʢ̍ʣ function _getData(uri, label, data,
myChart) { $.ajax({ url: uri, type: "GET", ... "QQKT ௨৴༰ͷઃఆ @HFU%BUB త 8&#αʔό͔ΒσʔλΛඇಉظͰऔಘ͢Δ Ҿ VSJ σʔλΛऔಘ͢Δ63* MBCFM σʔλͷઆ໌จͷྻ EBUB σʔλͷྻ NZ$IBSU άϥϑΛද͢ΦϒδΣΫτ
ϓϩάϥϜᶆ r ίʔσΟϯά r "QQKTʢ̎ʣ success : function(result) {
... label.push(result[key].datetime); data.push( *** ); id = result[key].id; last_id = id; ... reduceData(data); reduceData(label); myChart.update(); σʔλΛಘͨͱ͖ͷॲཧ σʔλͷઆ໌ʢ͜͜Ͱ࣌ʣͷՃ σʔλͷՃ ࠷৽ͷ*%ΛهԱ "QQKT Թηϯα 4)5 রηϯα #) রηϯα 54- result[key].data normalizeData(result[key].data)
ϓϩάϥϜᶆ r ίʔσΟϯά r "QQKTʢ̎ʣ success : function(result) {
... label.push(result[key].datetime); data.push( *** ); id = result[key].id; last_id = id; ... reduceData(data); reduceData(label); myChart.update(); άϥϑʹදࣔ͞ΕΔσʔλݸͷௐઅ άϥϑนըͷߋ৽ "QQKT Թηϯα 4)5 রηϯα #) রηϯα 54- result[key].data normalizeData(result[key].data)
ϓϩάϥϜᶆ r ίʔσΟϯά r "QQKTʢ̏ʣ function getAllData(label, data, myChart
) { //****************************** _getData("/data/all", label, data); //****************************** } function getNewData(id, label, data, myChart) { //****************************** _getData("/data/new/" + id, label, data); //****************************** } HFU"MM%BUB త શͯͷσʔλΛऔಘ͢Δ Ҿ MBCFM σʔλͷઆ໌จͷྻ EBUB σʔλͷྻ NZ$IBSU άϥϑΛද͢ΦϒδΣΫτ ˞վߦແ͠ "QQKT HFU/FX%BUB త ৽͍͠σʔλΛऔಘ͢Δ Ҿ JE औಘ͢Δൣғͷࢦఆ ˞εϥΠυࢀর MBCFM σʔλͷઆ໌จͷྻ EBUB σʔλͷྻ NZ$IBSU άϥϑΛද͢ΦϒδΣΫτ
ϓϩάϥϜᶆ r ίʔσΟϯά r "QQKTʢ̐ʣ function initGraph(label, data) {
... //*************************** return new Chart(ctx, ***); //*************************** }; "QQKT άϥϑͷઃఆͷఆٛ JOJU(SBQI త άϥϑͷॳظԽΛߦ͏ Ҿ MBCFM σʔλͷઆ໌จͷྻ EBUB σʔλͷྻ ฦ άϥϑΛද͢ΦϒδΣΫτ Թηϯα 4)5 রηϯα #) রηϯα 54- graphOption_a graphOption_m άϥϑͷ࡞
ϓϩάϥϜᶆ r ίʔσΟϯά r "QQKTʢ̑ʣ window.onload = function() {
//*************************************** var label = []; var data = []; var myChart = initGraph(label, data); "QQKT ྻͳͲͷ४උ XJOEPXPOMPBE ແ໊ؔ త ॲཧΛܨ͛Δ ˞ϖʔδͷಡΈࠐΈ͕ྃͨ͠ࡍʹϒϥβʹΑΓ͜ͷॲཧ͕ݺͼग़͞ΕΔ άϥϑͷॳظԽ
ϓϩάϥϜᶆ r ίʔσΟϯά r "QQKTʢ̒ʣ getAllData(label, data, myChart); window.setInterval(function()
{ getNewData(last_id, label, data, myChart); }, 5 * 1000); //*************************************** } "QQKT શͯͷσʔλΛऔಘͯ͠άϥϑʹө Ҏޙඵ͝ͱʹ৽͍͠σʔλΛ औಘͯ͠άϥϑʹө ˞อଘͯ͠Լ͍͞
͓ർΕ༷Ͱͨ͠ શͯͷϓϩάϥϜ͕͠·ͨ͠ʂ
ಈ࡞֬ೝ ϓϩάϥϜᶃ ίϯύΠϧ $ cd Desktop/RaspberryPi $ make all
ϓϩάϥϜᶃ ࣮ߦ $ ./main 3BTQCFSSZ1J main.c ͷςετ༻ίʔυΛίϝϯτΞτ main.c ͷຊ൪༻ίʔυͷίϝϯτΛ֎͢ 1$ ϓϩάϥϜᶄ ࣮ߦ $ cd ... $ python App.py ϓϩάϥϜᶅɾᶆ ࣮ߦ 127.0.0.1 ϒϥβͰ ʹΞΫηε ϞʔτΛࠨଆͷ64#ʹૠ͢ ʂ
σϞͷհ ࠓճ࡞ͨ͠ϓϩάϥϜΛجຊʹൃలͤ͞ŋŋŋ 8&#ʹΑΔརศੑͷߴ͍6* ෳηϯαͷσʔλͷಉ࣌ૹ৴ ᮢखಈʹΑΔػثͷ੍ޚ ػثͷঢ়ଶͷදࣔ ŋŋŋΛ࣮ݱͨ͠σϞΛ࡞͠·ͨ͠
&/%