自我介紹
- directions_walk 黃志賢 @hoyo.idv.tw
- directions_walk pc@hoyo.idv.tw
- directions_walk GitHub (https://github.com/HoyoHuang)
- directions_walk YouTube (Hoyo 的資訊生活 https://ppt.cc/fi8drx)
社群分享經歷
- assistant 2004 酷學園 X-Box + Linux
- assistant 2005 酷學園 2005 年群英會! PHP的硬體控制術
- assistant 2007 酷學園 一月主題: php 的應用 - 支援 Socket
- assistant 2010 酷學園 7月份 SA@Tainan 囉哩囉唆談「數位出版」
- assistant 2012 酷學園 群英會 有影嘸!? - 雲端“影 分身術”
- assistant 2015 酷學園 7月份 SA@Tainan 愛愛上雲端
今天目的 - 以小米智能插座 WiFi 版為例
两分视频
看到什麼?
- chevron_right 小姐姐
- chevron_right 插座
- chevron_right 50 人民幣 (225)
- chevron_right 使用 WiFi
- chevron_right 使用 APP 操作控制電源開關
- chevron_right 內部溫度感測
- chevron_right 定時 (主機推送不依賴 APP)、語音 (小愛同學)
沒看到什麼?
- chevron_right 閘道器 ( Gateway )
- chevron_right 如何設定 WiFi SSID & 密碼 ( SmartConfig )
- chevron_right SSL 傳輸加密
- chevron_right 廠商如何出貨及設計
彈幕發起來
https://hoyo.idv.tw/barrage.html
為什麼要自己做?
- build 巛暜
- build 番號
- build 上千人在荒郊野地
- build 參加 MOPCON
從選擇 IoT 開始 - ESP8266
- info_outline 可用 Arduino IDE 開發的最便宜 WiFi 模組 (NodeMCU NT 100)
- info_outline 支援 802.11 b/g/n
- info_outline 具備類比 I/O & 數位 I/O
- info_outline EEPROM
加強版: ESP32, LinkIt 7697
決定架構 - 把 IoT 設定為 AP Mode (Server)
決定架構 - 把 IoT 設定為 AP Mode (Server)
IPv6 & 入侵 (連線數限制)
決定架構 - 把 IoT 設定為 Client
決定架構 - Client 也可雙向連線
IoT 連線需求
- signal_wifi_4_bar_lock 商家出貨須有辨識身份 SN (Token)
- signal_wifi_4_bar_lock WiFi 連線設定方法 - SSID, Password
- signal_wifi_4_bar_lock SSL 傳輸加密
小米IOT开发者大会 ●
Arduino 範例程式
類 C,至少需要 setup() & loop()
// 加載、宣告
#define LED_PIN 13
// 開機只跑這麼一次
void setup() {
pinMode(LED_PIN, OUTPUT);
}
// 無限迴圈 什麼時候當機什麼時候到頭
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}
這就是為什麼要按住 reset 後再開機
Arduino - 使用 SmartConfig 設定 WiFi
- signal_wifi_4_bar_lock 無螢幕 Client IoT 較佳 WiFi 設定方案
- signal_wifi_4_bar_lock 將手機使用中的 WiFi 資訊丟給 IoT
- signal_wifi_4_bar_lock 原理是算 UDP 封包長度,因此 APP 是必須 (Cordova + Plugin)
Demo : IoT SmartConfig 設定 WiFi 及綁定
Arduino - SSL 加密 BearSSL::setFingerprint
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const char fingerprint[] PROGMEM = "E7 67 DA 4F F0 7C CB 59 26 71 C8 D6 19 2B FF 89 75 A7 0C D0";
WiFiClientSecure client;
void setup() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
client.setFingerprint(fingerprint);
client.connect(host, port);
}
2.5.0 後開始支援,SSL 證書更新指紋也會更新
發個 X 年證書吧...
硬漢止步看這裡
Google: IoT platform
嫌麻煩的可以交給攤主處理...
Hoyo 的選擇? Socket Server
- cloud_circle 隔行如隔山,還是找框架吧 ...
- cloud_circle 除了 Text 傳輸最好可以支援 WebSocket ...
- cloud_circle 最好是 PHP 的 ...
Socket Server - Workerman
Workerman 是一款开源高性能异步 PHP socket 即时通讯框架。支持高并发,超高稳定性,被广泛的用于手机 app、移动通讯,微信小程序,手游服务端、网络游戏、PHP 聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持 TCP 长连接,支持 Websocket、HTTP 等协议,支持自定义协议。拥有异步 Mysql、异步 Redis、异步 Http、MQTT 物联网客户端、异步消息队列等众多高性能组件。
https://www.workerman.net/
WebSocket 範例 - 嚕阿嚕
ppt.cc/fHElBx
嚕阿嚕使用說明
- vibration 三人(設備) 一組
- vibration 一人主控畫面:選擇難度 → 開新局
- vibration 另外兩人分別掃描玩家 A, 玩家 B
- vibration 準備好之後開始搖手機
想換手機可以常玩
長連結通訊難點
- live_help 通訊協定:內容自訂
- live_help 設計「認人」方法
- live_help 長時間逾時:斷線心跳、資料庫再連接
通訊:一對一
通訊:對多
通訊對象必須自己記
Socket 的通訊協定設計 - 以嚕阿嚕為例
function wsSend(a,b,c,d) {
var command = {
'room': a, // 分區域
'player': b, // 使用者
'command': c, // 指令
'value': d, // 變數、數值
'checksum': 'xxxxxxx'
};
ws.send( JSON.stringify(command) );
}
Workerman - 基本架構
<?php
$w = new Worker("websocket://0.0.0.0:3001");
// 連接處理
$w->onConnect = function($connection){};
// 程式啟動處理 心跳推送、
$w->onWorkerStart = function($w){};
// 接收訊號處理
$w->onMessage = function($connection, $data){};
Workerman 通訊協定切換
WebSocket
$w = new Worker("websocket://0.0.0.0:3001");
Text Socket
$w = new Worker("text://0.0.0.0:3001");
主動推送 - Workerman
<?php
$w->onWorkerStart = function($w)
{
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker('Text://0.0.0.0:3002');
$inner_text_worker->onMessage = function($connection, $buffer)
{
// $data数组格式,里面有uid,表示向那个uid的页面推送数据
$data = json_decode($buffer, true);
$uid = $data['uid'];
// 通过workerman,向uid的页面推送数据
$ret = sendMessageByUid($uid, $buffer);
// 返回推送结果
$connection->send($ret ? 'ok' : 'fail');
};
$inner_text_worker->listen();
};
https://wenda.workerman.net/question/508
主動推送 - send.php
<?php
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:3002', $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 发送数据,注意 3002 端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
Socket 架構
Hoyo 怎麼做? IoT 以外 ...
- WEB
- personal_video 商家出貨管理後台
- personal_video 使用者 Web 操作平台 (非必要)
- APP
-
personal_video 使用者綁定 & 操作 APP
Hoyo 怎麼做? Web - 前後端分離
- personal_video 前端:HTML, JS, CSS, jQuery, php.js
php.js : js 使用 php function
- personal_video 後端:PHP, phpQuery
phpQuery : php 使用 jQuery 選擇器操作 DOM
前端沒有 PHP ;後端沒有 HTML;php.js + jQuery + phpQuery 程式統一
Hoyo 怎麼做? APP - Cordova (Android & iOS)
- phone_android 拿 Web 畫面套用
- phone_android SmartConfig (cordova-plugin-smartconfig)
- phone_android 目前使用 WiFi SSID & BSSID (WifiWizard)
情境 - 將單一或多個動作組成 HTTP API
觸發情境的方法
- gps_not_fixed 智能音箱
- gps_not_fixed 語音助理
- gps_not_fixed 其他: IFTTT, Chat Bot, 密室逃脫 ...
智能音箱 & 語音助理
- phone_android 智能音箱:Server - Server
- phone_android 語音助理:助理 - APP
- phone_android 第三方:IFTTT
決定架構 - 智能音箱串接
需要特定步驟才能在 APP 裝置清單內, ex: WF8266
連接情境和智能語音 - IFTTT
IFTTT,是一個新生的網絡服務平台,通過其他不同平台的條件來決定是否執行下一條命令。即對網絡服務通過其他網絡服務作出反應。IFTTT得名為其口號「if this then that」。
IF 「Google 助理聽到指令」 THAT 「執行 HTTP API URL」
關鍵字整理
- pets hoyo.idv.tw/mopcon2019
- pets reveal.js
- pets DanMuer
- pets 小米IoT开发者大会
- pets NodeMCU ESP8266
- pets Arduino
- pets Workerman
- pets Cordova
- pets IFTTT
一鍵三連、打開小鈴鐺
我們下次見,今天也乾爽的回家吧