Upgrade to Pro — share decks privately, control downloads, hide ads and more …

IoT推進ラボ キャッチアップ

rpaka
October 24, 2018

IoT推進ラボ キャッチアップ

学内での知見共有用に作成した資料です。
This is presentation material to share my knowledge about IoT system.

rpaka

October 24, 2018
Tweet

More Decks by rpaka

Other Decks in Programming

Transcript

  1. ⽬次 ಺༰ Ø શମతͳߏ੒ Ø Թ౓ηϯα͔Βͷσʔλͷऔಘ Ø 3BTQCFSSZ1Jͷ(1*0ϐϯ Ø *$σόΠεͱͷ௨৴

    Ø -JOVYͰͷσόΠεͱͷ௨৴ Ø .Z42-΁ͷॻ͖ࠐΈ Ø %#͔Βͷσʔλͷऔಘ Ø ϧʔςΟϯά Ø 8FCαʔόͷಇ͖ Ø ඇಉظ௨৴ Ø +40/ܗࣜ Ø -BSBWFM  Ø άϥϑͷදࣔ Ø "+"9 Ø $IBSUKT Ø μετωοτͷར༻ Ø ߏ੒Ҋ Ø Ϟʔτ Š ϥζύΠͷ઀ଓ Ø Ϛωʔδϟ Š 1$ͷ઀ଓ Ø 4.24-ɾ4.4%,ͷར༻ Ø ࢀߟࢿྉͷఏڙ
  2. ⼤雑把に⽅式を決定(2) 1$ 3BTQCFSSZ1J ϒϥ΢β 8&#αʔό 8&#αʔόͷೖΓޱ σʔλϕʔε ϓϩάϥϜ Թ౓ηϯα 

    ϓϩάϥϜ ϓϩάϥϜ σʔλͷऔಘɾՃ޻ σʔλͷอଘ σʔλͷऔಘɾՃ޻ σʔλͷදࣔ
  3. 具体的に何を使うのか 1$ 3BTQCFSSZ1J ϒϥ΢β $IBSUKT άϥϑ੍ޚ  +4 8&#αʔό /HJOY

    -BSBWFM .Z42- ηϯα੍ޚ  $1ZUIPO %#σʔλऔಘ  QIQ Թ౓ηϯα 
  4. 1. 温度センサに接続・コマンド発⾏  *$ʹΑΔ௨৴ ϥζύΠ ηϯα ηϯα ηϯα Y Y

    Y Ϩδελ Ϩδελ Y Y ෳ਺ͷηϯαΛ઀ଓ͠ɼΞυϨεͰ۠ผ ηϯα಺෦ͷϨδελΛΞυϨεͰ۠ผ ʢ͢Δ৔߹΋͋Δʣ ͋͘·Ͱ΋௨৴ํࣜ σʔλͷܗࣜ΍௨৴ͷ಺༰ ͸ηϯαʔͷ࢓༷ʹΑΔ
  5. 3. MySQLに書き込み  sql::Driver *driver; sql::Connection *con; sql::Statement *stmt; sql::PreparedStatement

    *p_stmt; driver = get_driver_instance(); con = driver->connect("tcp://127.0.0.1:3306", "ritsu2891", "****"); stmt = con->createStatement(); stmt->execute("USE iot_dev;"); p_stmt = con->prepareStatement("INSERT INTO temp (`data`, `timestamp`) VALUES (?, ?);"); p_stmt->setDouble(1, sht31.readTemp()); p_stmt->setString(2, "00:00:00"); p_stmt->execute(); $ 42-จ
  6. 処理の流れ  1$ 8&#αʔό -BSBWFM .Z42- %#σʔλऔಘ  QIQ 3BTQCFSSZ1J

    %#͔Βσʔλऔಘ ̍ +40/ܗࣜͰแΉ ̎ )5.-$44+4ϑΝΠϧ ϒϥ΢β %#σʔλͷཁٻԠ౴ άϥϑนըϓϩάϥϜ౳ͷ഑৴
  7. ルーティング  IPNF CMPH TQFDJBM UFNQ UFNQBMM ϒϥ΢β τοϓΛ දࣔ͢Δ

    ϩάΠϯϢʔβ ͷೝূ Թ౓৘ใΛ औಘ͢Δ ϒϩάهࣄΛ දࣔ͢Δ ϓϩάϥϜ ॲཧͷબ୒ ʢϧʔςΟϯάʣ 8&#αʔό
  8. Webサーバの働き(1)  ϒϥ΢β <!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="愛知県⽴⼤学, Aichi Prefectural University, 県⼤, 名古屋, ⻑久⼿, 守⼭, APU"> <meta name="Description" content="愛知県⽴⼤学公式サイ トです。5学部10学科、⼤学院4研究科を擁する総合⼤学。⼤学の紹介 や⼊試情報、学部・⼤学院、就職・キャリア、学⽣⽣活、教育情報の 公表などの情報を掲載しています。"> <title>愛知県⽴⼤学</title> 8FCαʔό ʮJOEFYIUNMʯͷ ϖʔδΛԼ͍͞ɻ 0,Ͱ͢ɻ಺༰͸ʮŋŋŋ ݁ہɺจࣈྻΛฦͯ͠Δ͚ͩ *OEFYIUNM ಺༰Λௐ΂Δ ղऍ
  9. JSON形式  +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/
  10. Laravelとは  • 1)1ͷ8&#ϑϨʔϜϫʔΫ • ϑϧελοΫʢػೳϞϦϞϦʣ • .7$ • ಡΈ΍͍͢ɺॻ͖΍͍͢ʢͱݴΘΕΔʣ

    • ಉҙͰ͖ΔʢൺֱతಡΈॻ͖͠΍͍͢ͱࢥ͏ʣ • υΩϡϝϯτ͕๛෋ʢ೔ຊޠ͋Γʣ • ྲྀߦͬͯΔʢωοτ্ʹ৘ใຬࡌʣ • %*ʢґଘੑ஫ೖʣ • ϑΝαʔυ • σϑΥϧτͰ"NB[PO4ʹ઀ଓ • 7VFKTͱͷ౷߹ ΊͪΌศར ΍Γ͗͢ʁ ػೳϞϦϞϦ͔ͭॳ৺ऀ޲͖ ࢖͏ػೳ͚ͩཧղ͢Ε͹0, Ͱ͖Δ͜ͱଟա͗ʂ ແྉʂ
  11. Laravelの使⽤ ̶ ルーティング  Route::get('/', function () { return view('home');

    }); Route::get('/temp/all', "TempController@all"); Route::get('/temp/new/{id}', 'TempController@new'); 1)1  ϒϥ΢β BMM UFNQBMM UFNQOFX\JE^ OFX JE 5FNQ$POUSPMMFS )PNFCMBEFQIQ )5.-Έ͍ͨͳ΍ͭ
  12. Laravelの使⽤ ̶ DBアクセス・JSONで包む  namespace App¥Http¥Controllers; use Illuminate¥Support¥Facades¥DB; class TempController

    { public function all() { $data = DB::table('temp')->get(); // SQL: SELECT * FROM temp; return response()->json($data); } public function new($id) { $data = DB::table('temp')->where('id', '>', $id)->get(); // SQL: SELECT * FROM temp WHERE id > $id; return response()->json($data); } } 1)1 ந৅Խ͞Εͨ%#ΞΫηε 42-จΛ஌Βͳͯ͘΋ྑ͍ +40/ܗࣜ΁ͷม׵͸Ұൃ %# ഑ྻ +40/ ϒϥ΢β΁
  13. 処理の流れ  1$ ϒϥ΢β $IBSUKT άϥϑ੍ޚ  +4 8&#αʔό /HJOY

    8&#αʔό͔Β σʔλऔಘ ̍ άϥϑนը ̎ +40/ܗࣜ グラフ壁画ライブラリ
  14. ⾮同期通信(AJAX)  var updateData = function () {$.ajax({ url :

    "/temp/new/" + id, type : "GET", async : true, data : null, dataType: "json", success : function(result) { console.log(result); Object.keys(result).forEach(function(key) { label.push(' ‘); temp.push(result[key].data); id = result[key].id; c.update(); }); } });} window.setInterval(updateData, 5 * 1000); +4 8&#αʔό UFNQOFX\JE^ +40/ σʔλ σʔλ σʔλ
  15. グラフ壁画ライブラリ ̶ ほぼ何もしなくて良い  var drawGraph = function(label, temp){ var

    ctx = document.getElementById('graph').getContext('2d’); var myChart = new Chart(ctx, { type: 'line’, data: { labels: label, datasets: [{ label:'気温', data:temp }] } }); return myChart; }; window.onload=function () { var label = [’’]; var temp = []; var last_id = -1; c = drawGraph(label, temp); } c.update(); +4 UFNQʹσʔλΛ௥Ճͯ͠ VQEBUF Λ࣮ߦ͢Δ͚ͩ ৭ʑͳઃఆ
  16. 説明した構成  1$ 3BTQCFSSZ1J ϒϥ΢β $IBSUKT άϥϑ੍ޚ  +4 8&#αʔό

    /HJOY -BSBWFM .Z42- ηϯα੍ޚ  $1ZUIPO %#σʔλऔಘ  QIQ Թ౓ηϯα 8J'J
  17. ダストネットでそのまま置き換える?(2)  ηϯα ηϯα੍ޚ μετωοτ௨৴੍ޚ 1$ αʔό Ϟʔτ Ϛωʔδϟ 3BTQCFSSZ1J

    μετωοτ௨৴੍ޚ /HJOY 8&#αʔό -BSBWFM %#σʔλऔಘ ϒϥ΢β $IBSUKT άϥϑ੍ޚ Ϟʔτ Ϟʔτ .Z42-
  18. ダストネットを導⼊した構成案  ηϯα ηϯα੍ޚ μετωοτ௨৴੍ޚ 1$ αʔό Ϟʔτ Ϛωʔδϟ 3BTQCFSSZ1J

    μετωοτ௨৴੍ޚ /HJOY 8&#αʔό -BSBWFM %#σʔλऔಘ ϒϥ΢β $IBSUKT άϥϑ੍ޚ όοϑΝ 595ϑΝΠϧͳͲ Ϟʔτ .Z42- Ϟʔτ
  19. γϦΞϧ௨৴ σόΠευϥΠό ダストネットでの通信 ̶ モート側  3BTQCFSSZ1J Ϟʔτ $ϓϩάϥϜ ʢࣗ෼ͷϓϩάϥϜʣ

    4NBSU.FTI 2VJDL4UBSU-JCSBSZ 4NBSU.FTI $-JCSBSZ μετωοτ ϑΝʔϜ΢ΣΞ • Ϟʔτͷ௨৴ঢ়ଶΛ؅ཧ͢ Δঢ়ଶભҠػց • ͱΓ͋͑ͣ࢖͏༻ͷ؆ศͳ "1*ͷఏڙ • ϥζύΠ༻ͷϓϩάϥϜย ʢԼҐͷ$ϥΠϒϥϦͰ࢖ ΘΕΔʣ • "1*Λୟ͚ͩ͘ • ௨৴ʹؔ͢ΔԼҐͷॲཧ ʢ04*ࢀরϞσϧͷωοτ ϫʔΫ૚ҎԼʹ֘౰͢Δॲ ཧʣ͸ؾʹ͠ͳͯ͘ྑ͍
  20. SmartMesh QSL サンプルコード ̶ マネージャへの送信  uint8_t payload[4]; uint8_t inboxBuf[DN_DEFAULT_PAYLOAD_SIZE_LIMIT];

    uint8_t bytesRead; dn_qsl_init(); // Always returns TRUE at the moment while (TRUE) { if (dn_qsl_isConnected()) { static uint8_t count = 0; dn_write_uint32_t(payload, val); if (dn_qsl_send(payload, sizeof (payload), DEST_PORT)) {} else {} do { bytesRead = dn_qsl_read(inboxBuf); parsePayload(inboxBuf, bytesRead); } while (bytesRead > 0); dn_sleep_ms(DATA_PERIOD_MS); } else { if (dn_qsl_connect(NETID, JOINKEY, SRC_PORT, BANDWIDTH_MS)) {} else {} } } $
  21. γϦΞϧ௨৴ σόΠευϥΠό ダストネットでの通信 ̶ マネージャ側  Ϛωʔδϟ 1ZUIPOϓϩάϥϜ ʢࣗ෼ͷϓϩάϥϜʣ 4NBSU.FTI

    4%, QZ4FSJBM μετωοτ ϑΝʔϜ΢ΣΞ • "1*Λୟ͚ͩ͘ • 1ZUIPO༻ϥΠϒϥϦ • ʮ௨஌ʯͷड৴༻Ϋϥε͕ ༻ҙ͞ΕͯΔͳͲɺ͔ͳΓ ߴϨϕϧͳॴ·Ͱ࡞ΒΕͯ Δ • ֤छπʔϧྨʢ8JOEPXT ༻ʣ΋෇ଐ • 04ͷγϦΞϧ௨৴ͷৄࡉ ΛӅṭʁ • 8JOͰ΋.BDͰ΋-JOVYͰ ΋࢖͑ͨ 1$
  22. SmartMesh SDK サンプルコード ̶ 通知の取得  connector = IpMgrConnectorSerial.IpMgrConnectorSerial() connector.connect({'port':

    '/dev/tty.usbserial-00001014D’}) notif_client_hndl = NotifClient.NotifClient(connector, None) class NotifClient(object): def __init__(self, connector, disconnected_callback): self.connector = connector self.subscriber = IpMgrSubscribe.IpMgrSubscribe(self.connector) self.subscriber.start() self.subscriber.subscribe( notifTypes=[ IpMgrSubscribe.IpMgrSubscribe.NOTIFDATA, IpMgrSubscribe.IpMgrSubscribe.NOTIFIPDATA, ], fun=self._notif_callback, isRlbl=False, ) def _notif_callback(self, notif_name, notif_params): 1ZUIPO
  23. END