智能插座
(→注册验证) |
(→检查) |
||
(未显示1个用户的144个中间版本) | |||
第1行: | 第1行: | ||
== 概述 == | == 概述 == | ||
− | + | UUID: 字符串,19个字符,唯一编号,对应一个插座 | |
KEY: 字符串,8个字符,注意保护,用于生成每次通信的 Token | KEY: 字符串,8个字符,注意保护,用于生成每次通信的 Token | ||
第8行: | 第8行: | ||
− | + | 云端入口: | |
+ | <source lang=bash> | ||
+ | http://cos.icamgo.com:998 | ||
</source> | </source> | ||
<br><br> | <br><br> | ||
− | == | + | == 创建设备 == |
− | + | API: | |
− | + | /v2/node | |
− | + | 参数: | |
+ | {"type":"P1"} | ||
− | + | type:P1 对应智能插座 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | |||
− | + | 示例: | |
− | + | <source lang=bash> | |
+ | $ cat create-plug | ||
+ | POST /v2/node HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | Content-Length: 13 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
− | + | {"type":"P1"} | |
+ | #--------------------------------------------------- | ||
+ | $ cat create-plug | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Thu, 30 Jul 2015 01:43:39 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 61 | ||
− | + | {"id":1106,"uuid":"88F6D02F5246F1EE0YL","pubkey":"1H8BKJ30"} | |
− | + | </source> | |
<br><br> | <br><br> | ||
第48行: | 第59行: | ||
APP 第一次运行提示用户注册,输入 email 和 password,调用: | APP 第一次运行提示用户注册,输入 email 和 password,调用: | ||
+ | |||
+ | |||
+ | API: | ||
/v2/node | /v2/node | ||
+ | |||
+ | 参数: | ||
<source lang=bash> | <source lang=bash> | ||
− | {" | + | {"email": "EMAIL", "password": "PASSWORD"} |
</source> | </source> | ||
+ | 返回 uuid (整个平台的唯一识别码): | ||
+ | |||
+ | <source lang=bash> | ||
+ | {"uuid": "xxxxxxxxxxxxxxxxxx"} | ||
+ | </source> | ||
+ | |||
+ | |||
+ | 例子: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ cat user-signup | ||
+ | POST /v2/node HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | Content-Length: 52 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | {"email":"comcat@icamgo.com","password":"12341234"} | ||
+ | #--------------------------------------------------- | ||
+ | $ cat user-signup | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Sun, 26 Apr 2015 02:42:26 GMT | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 32 | ||
+ | |||
+ | {"uuid":"comcat@icamgo.com00"} | ||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | 用户 nodid 的生成算法:用户 email 地址作为 nodid,19位,不够补0,多了截掉。如:jiankemeng@gmail.com,nodid 为:jiankemeng@gmail.co | ||
注册成功后,APP 加密 email 和 password 并存入本地,下次启动APP,首先检查本地,如有缓存,直接进入 APP,无需再输入 email 和 password | 注册成功后,APP 加密 email 和 password 并存入本地,下次启动APP,首先检查本地,如有缓存,直接进入 APP,无需再输入 email 和 password | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | === 权限验证 === | ||
+ | |||
+ | 每次的请求,都会生成一个 Token,云端验证这个 Token 是否合法 | ||
+ | |||
+ | 用户注册无需 Token,但后面的激活、控制等操作,就需要在 HTTP 的 header 里加入 Token 了 | ||
+ | |||
+ | ==== PHP 实现 ==== | ||
+ | |||
+ | <source lang=php> | ||
+ | define("UUID", "comcat@icamgo.com00"); # 用户用 email 注册后,生成的 nodid | ||
+ | define("PKEY", "12341234"); # 用户密码 | ||
+ | |||
+ | function gen_token() | ||
+ | { | ||
+ | static $ts = 0; | ||
+ | $tmp = time(); | ||
+ | if ($tmp > $ts) { | ||
+ | $ts = $tmp; | ||
+ | } else { | ||
+ | $ts += 1; | ||
+ | } | ||
+ | |||
+ | $iv = '12345678'; | ||
+ | $ctx = sprintf("%s%08X", UUID, $ts); | ||
+ | |||
+ | $td = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc',''); | ||
+ | |||
+ | mcrypt_generic_init($td, PKEY, $iv); | ||
+ | $encrypted = mcrypt_generic($td, $ctx); | ||
+ | mcrypt_generic_deinit($td); | ||
+ | |||
+ | $token = unpack("H*", $encrypted); | ||
+ | return $token[1]; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ;用法示例: | ||
+ | |||
+ | <source lang=php> | ||
+ | $token = gen_token(); | ||
+ | $con = curl_init('http://cos.icamgo.com:998/v2/node/activate'); | ||
+ | $body = '{"uuid":' . $uuid . '"}'; | ||
+ | $header = array( | ||
+ | "Accept: */ *", | ||
+ | "nodid: " . NODID, | ||
+ | "token: " . $token, | ||
+ | "Content-Type: text/html", | ||
+ | "Content-Length: " . strlen($body), | ||
+ | "Connection: close" | ||
+ | ); | ||
+ | curl_setopt($con, CURLOPT_RETURNTRANSFER, 1); | ||
+ | curl_setopt($con, CURLOPT_HTTPHEADER, $header); | ||
+ | curl_setopt($con, CURLOPT_POST, 1); | ||
+ | curl_setopt($con, CURLOPT_POSTFIELDS, $body); | ||
+ | curl_setopt($con, CURLOPT_TIMEOUT, 6); | ||
+ | |||
+ | $ret = curl_exec($con); | ||
+ | </source> | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | === 激活 === | ||
+ | |||
+ | 用户关联(添加)插座,视为激活插座 | ||
+ | |||
+ | 一个用户可能有多个插座,把插座的 UUID 生成为条形码或者二维码,添加插座时,建议实现为:直接在 APP 里扫码添加。 | ||
+ | |||
+ | APP 扫描二维码后,解析出 UUID ,作为调用如下 cloud api 的参数 | ||
+ | |||
+ | |||
+ | API: | ||
+ | |||
+ | /v2/node/activate | ||
+ | |||
+ | 参数: | ||
+ | |||
+ | {"uuid":"xxxxxxxxxxxxxxxxxxx"} | ||
+ | |||
+ | |||
+ | 例子: | ||
+ | |||
+ | <source lang=bash> | ||
+ | POST /v2/node/activate HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | nodid: comcat@icamgo.com00 | ||
+ | token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F | ||
+ | Content-Length: 30 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | {"uuid":"88F6D02F5246F1EE0YL"} | ||
+ | #--------------------------------------------------- | ||
+ | $ cat user-activate-dev | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Thu, 30 Jul 2015 05:52:24 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 25 | ||
+ | |||
+ | User add device success! | ||
+ | </source> | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | === 用户的所有插座 === | ||
+ | |||
+ | APP 获取当前用户名下的所有插座的 UUID (设备唯一串号): | ||
+ | |||
+ | API: | ||
+ | |||
+ | /v2/node/downnodes | ||
+ | |||
+ | 参数: | ||
+ | |||
+ | 无 | ||
+ | |||
+ | |||
+ | 例子: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ cat user-dev-list | ||
+ | GET /v2/node/downnodes HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | nodid: comcat@icamgo.com00 | ||
+ | token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F | ||
+ | Content-Length: 0 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | #--------------------------------------------------- | ||
+ | $ cat user-dev-list | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Thu, 30 Jul 2015 06:04:35 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 24 | ||
+ | |||
+ | ["88F6D02F5246F1EE0YL"] | ||
+ | </source> | ||
<br><br> | <br><br> | ||
=== 控制 === | === 控制 === | ||
+ | |||
+ | ;;这部分需要类似 PUSH 的实时消息同步,主要在设备和 APP 间 | ||
+ | |||
+ | API: | ||
/v2/node/state | /v2/node/state | ||
+ | |||
+ | |||
+ | 例子: | ||
+ | |||
+ | ;;APP 改变插座状态: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ cat user-ctrl-dev | ||
+ | POST /v2/node/state HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | nodid: comcat@icamgo.com00 | ||
+ | token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F | ||
+ | Content-Length: 42 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | {"uuid":"88F6D02F5246F1EE0YL","value":55} | ||
+ | #--------------------------------------------------- | ||
+ | $ cat user-ctrl-dev | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Thu, 30 Jul 2015 06:11:21 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 16 | ||
+ | |||
+ | Pushed success! | ||
+ | </source> | ||
+ | |||
+ | |||
+ | ;;APP 获取插座状态: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ cat user-check-dev | ||
+ | GET /v2/node/state HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | nodid: comcat@icamgo.com00 | ||
+ | token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F | ||
+ | Content-Length: 30 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | {"uuid":"88F6D02F5246F1EE0YL"} | ||
+ | #--------------------------------------------------- | ||
+ | $ cat user-check-dev | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Thu, 30 Jul 2015 06:16:51 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 47 | ||
+ | |||
+ | {"timestamp":"2015-07-30T14:11:21","value":55} | ||
+ | </source> | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | === 心跳检查 === | ||
+ | |||
+ | API: | ||
+ | |||
+ | /v2/node/beacon | ||
+ | |||
+ | 参数: 无 | ||
+ | |||
+ | 例子: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ cat user-check-beacon | ||
+ | GET /v2/node/beacon HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | nodid: comcat@icamgo.com00 | ||
+ | token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F | ||
+ | Content-Length: 30 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | {"uuid":"88F6D02F5246F1EE0YL"} | ||
+ | $ cat user-check-beacon | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Thu, 30 Jul 2015 09:44:19 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 33 | ||
+ | |||
+ | {"beacon":"2015-07-30T17:19:46"} | ||
+ | </source> | ||
<br><br> | <br><br> | ||
=== 计划任务 === | === 计划任务 === | ||
+ | |||
+ | API: | ||
/v2/node/state | /v2/node/state | ||
+ | |||
+ | 参数: | ||
+ | |||
+ | <source lang=bash> | ||
+ | {"uuid":"xxxxxxxxxxxx","timer":"xxxxxxxx"} | ||
+ | </source> | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | == 模块与云通信 == | ||
+ | |||
+ | === 概述 === | ||
+ | |||
+ | 模块固件从 flash 中读出 UUID 和 KEY,UUID + 当前时间戳用 KEY 加密(AES) 运算后生成的串作为 Token | ||
+ | |||
+ | 云端验证 UUID 和 Token | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | === 检查 === | ||
+ | |||
+ | ;;1. Polling 方案 | ||
+ | |||
+ | API: | ||
+ | |||
+ | /v2/node/state | ||
+ | |||
+ | |||
+ | 模块 1s GET 一次,取回的数据为一个 JSON 结构,解析得到 value (on/off, 55/99),与本地状态不一致,就改变自己的状态、 | ||
+ | |||
+ | APP 通过写 (POST) 这个值,来完成远程控制 | ||
+ | |||
+ | APP 也需要定时 (2s ?) GET 一下,以防其他用户改变该值导致插座状态改变而与另一个用户APP状态不一致 | ||
+ | |||
+ | |||
+ | 设备主动检查 state 例子: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ cat dev-check-state | ||
+ | GET /v2/node/state HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | nodid: 88F6D02F5246F1EE0YL | ||
+ | token: 15F7E14203AD318B0AB05514A6BD5B072830A076267C66E2X | ||
+ | Content-Length: 0 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | $ cat dev-check-state | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Thu, 30 Jul 2015 09:47:09 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 47 | ||
+ | |||
+ | {"timestamp":"2015-07-30T14:11:21","value":55} | ||
+ | </source> | ||
+ | |||
+ | |||
+ | ;;2. TCP 长链接方案 | ||
+ | |||
+ | TBD | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | === 心跳 === | ||
+ | |||
+ | ;;选择性实现,实际设备和云间只要保持长链接或者每 polling 一次就有心跳 | ||
+ | |||
+ | API: | ||
+ | |||
+ | /v2/node/beacon | ||
+ | |||
+ | 例子: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ cat dev-beacon | ||
+ | POST /v2/node/beacon HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | nodid: 88F6D02F5246F1EE0YL | ||
+ | token: 15F7E14203AD318B0AB05514A6BD5B072830A076267C66E2X | ||
+ | Content-Length: 0 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | $ cat dev-beacon | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Thu, 30 Jul 2015 09:45:46 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 28 | ||
+ | |||
+ | Pushed node beacon success! | ||
+ | </source> | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | === 激活 === | ||
+ | |||
+ | API: | ||
+ | |||
+ | /v2/node/activate | ||
+ | |||
+ | 例子: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ cat dev-activate | ||
+ | POST /v2/node/activate HTTP/1.1 | ||
+ | Accept: */ * | ||
+ | nodid: 88F6D02F5246F1EE0YL | ||
+ | token: 15F7E14203AD318B0AB05514A6BD5B072830A076267C66E2X | ||
+ | Content-Length: 14 | ||
+ | Content-Type: text/html | ||
+ | Connection: close | ||
+ | |||
+ | {"activate":1} | ||
+ | $ cat dev-activate | nc cos.icamgo.com 998 | ||
+ | HTTP/1.0 200 OK | ||
+ | Date: Fri, 31 Jul 2015 03:23:47 GMT | ||
+ | Server: HTTP::Server::PSGI | ||
+ | Content-Type: text/html; charset=utf-8 | ||
+ | X-Catalyst: 5.90075 | ||
+ | Content-Length: 18 | ||
+ | |||
+ | Activate success! | ||
+ | </source> | ||
<br><br> | <br><br> | ||
第107行: | 第520行: | ||
<br><br> | <br><br> | ||
+ | |||
+ | == 批量制造 == | ||
+ | |||
+ | 批量制造工具,批量生成 UUID, KEY, MAC | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ ./nodid -t p1 -k -m -n 100 > P1000100 | ||
+ | $ head -n 3 P1000100 | ||
+ | DFA4E18D228D5771FKA SGP8M5R2 18FE343A2480 | ||
+ | 206758F4D4042DC2AZP OQUBTVFX 18FE3443A6E7 | ||
+ | 10C1D47FB8390A5DB5K RGCB962D 18FE3481DF4E | ||
+ | </source> | ||
+ | |||
+ | |||
+ | 通过专用接口批量导入云端: | ||
+ | |||
+ | <source lang=bash> | ||
+ | $ ./push_nodes -i P1000100 -o P1000100.pushed -t P1 -q | ||
+ | Re-type key: | ||
+ | Manufacture Smart Plug (P1) OK! | ||
+ | </source> | ||
+ | |||
+ | |||
+ | UUID, KEY, MAC 同时需要写入插座 WiFi 模块的 Flash 中,用以完成和云端的接口认证 | ||
+ | |||
+ | <br><br> | ||
+ | |||
<br><br> | <br><br> | ||
<br><br> | <br><br> |
2015年9月20日 (日) 11:43的最后版本
目录 |
[编辑] 1 概述
UUID: 字符串,19个字符,唯一编号,对应一个插座
KEY: 字符串,8个字符,注意保护,用于生成每次通信的 Token
MAC: 6字节,12个字符,MAC地址
云端入口:
http://cos.icamgo.com:998
[编辑] 2 创建设备
API:
/v2/node
参数:
{"type":"P1"}
type:P1 对应智能插座
示例:
$ cat create-plug POST /v2/node HTTP/1.1 Accept: */ * Content-Length: 13 Content-Type: text/html Connection: close {"type":"P1"} #--------------------------------------------------- $ cat create-plug | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Thu, 30 Jul 2015 01:43:39 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 61 {"id":1106,"uuid":"88F6D02F5246F1EE0YL","pubkey":"1H8BKJ30"}
[编辑] 3 APP 与云通信
[编辑] 3.1 注册验证
APP 第一次运行提示用户注册,输入 email 和 password,调用:
API:
/v2/node
参数:
{"email": "EMAIL", "password": "PASSWORD"}
返回 uuid (整个平台的唯一识别码):
{"uuid": "xxxxxxxxxxxxxxxxxx"}
例子:
$ cat user-signup POST /v2/node HTTP/1.1 Accept: */ * Content-Length: 52 Content-Type: text/html Connection: close {"email":"comcat@icamgo.com","password":"12341234"} #--------------------------------------------------- $ cat user-signup | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Sun, 26 Apr 2015 02:42:26 GMT Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 32 {"uuid":"comcat@icamgo.com00"}
用户 nodid 的生成算法:用户 email 地址作为 nodid,19位,不够补0,多了截掉。如:jiankemeng@gmail.com,nodid 为:jiankemeng@gmail.co
注册成功后,APP 加密 email 和 password 并存入本地,下次启动APP,首先检查本地,如有缓存,直接进入 APP,无需再输入 email 和 password
[编辑] 3.2 权限验证
每次的请求,都会生成一个 Token,云端验证这个 Token 是否合法
用户注册无需 Token,但后面的激活、控制等操作,就需要在 HTTP 的 header 里加入 Token 了
[编辑] 3.2.1 PHP 实现
define("UUID", "comcat@icamgo.com00"); # 用户用 email 注册后,生成的 nodid define("PKEY", "12341234"); # 用户密码 function gen_token() { static $ts = 0; $tmp = time(); if ($tmp > $ts) { $ts = $tmp; } else { $ts += 1; } $iv = '12345678'; $ctx = sprintf("%s%08X", UUID, $ts); $td = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc',''); mcrypt_generic_init($td, PKEY, $iv); $encrypted = mcrypt_generic($td, $ctx); mcrypt_generic_deinit($td); $token = unpack("H*", $encrypted); return $token[1]; }
- 用法示例:
$token = gen_token(); $con = curl_init('http://cos.icamgo.com:998/v2/node/activate'); $body = '{"uuid":' . $uuid . '"}'; $header = array( "Accept: */ *", "nodid: " . NODID, "token: " . $token, "Content-Type: text/html", "Content-Length: " . strlen($body), "Connection: close" ); curl_setopt($con, CURLOPT_RETURNTRANSFER, 1); curl_setopt($con, CURLOPT_HTTPHEADER, $header); curl_setopt($con, CURLOPT_POST, 1); curl_setopt($con, CURLOPT_POSTFIELDS, $body); curl_setopt($con, CURLOPT_TIMEOUT, 6); $ret = curl_exec($con);
[编辑] 3.3 激活
用户关联(添加)插座,视为激活插座
一个用户可能有多个插座,把插座的 UUID 生成为条形码或者二维码,添加插座时,建议实现为:直接在 APP 里扫码添加。
APP 扫描二维码后,解析出 UUID ,作为调用如下 cloud api 的参数
API:
/v2/node/activate
参数:
{"uuid":"xxxxxxxxxxxxxxxxxxx"}
例子:
POST /v2/node/activate HTTP/1.1 Accept: */ * nodid: comcat@icamgo.com00 token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F Content-Length: 30 Content-Type: text/html Connection: close {"uuid":"88F6D02F5246F1EE0YL"} #--------------------------------------------------- $ cat user-activate-dev | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Thu, 30 Jul 2015 05:52:24 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 25 User add device success!
[编辑] 3.4 用户的所有插座
APP 获取当前用户名下的所有插座的 UUID (设备唯一串号):
API:
/v2/node/downnodes
参数:
无
例子:
$ cat user-dev-list GET /v2/node/downnodes HTTP/1.1 Accept: */ * nodid: comcat@icamgo.com00 token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F Content-Length: 0 Content-Type: text/html Connection: close #--------------------------------------------------- $ cat user-dev-list | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Thu, 30 Jul 2015 06:04:35 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 24 ["88F6D02F5246F1EE0YL"]
[编辑] 3.5 控制
- 这部分需要类似 PUSH 的实时消息同步,主要在设备和 APP 间
API:
/v2/node/state
例子:
- APP 改变插座状态:
$ cat user-ctrl-dev POST /v2/node/state HTTP/1.1 Accept: */ * nodid: comcat@icamgo.com00 token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F Content-Length: 42 Content-Type: text/html Connection: close {"uuid":"88F6D02F5246F1EE0YL","value":55} #--------------------------------------------------- $ cat user-ctrl-dev | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Thu, 30 Jul 2015 06:11:21 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 16 Pushed success!
- APP 获取插座状态:
$ cat user-check-dev GET /v2/node/state HTTP/1.1 Accept: */ * nodid: comcat@icamgo.com00 token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F Content-Length: 30 Content-Type: text/html Connection: close {"uuid":"88F6D02F5246F1EE0YL"} #--------------------------------------------------- $ cat user-check-dev | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Thu, 30 Jul 2015 06:16:51 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 47 {"timestamp":"2015-07-30T14:11:21","value":55}
[编辑] 3.6 心跳检查
API:
/v2/node/beacon
参数: 无
例子:
$ cat user-check-beacon GET /v2/node/beacon HTTP/1.1 Accept: */ * nodid: comcat@icamgo.com00 token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F Content-Length: 30 Content-Type: text/html Connection: close {"uuid":"88F6D02F5246F1EE0YL"} $ cat user-check-beacon | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Thu, 30 Jul 2015 09:44:19 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 33 {"beacon":"2015-07-30T17:19:46"}
[编辑] 3.7 计划任务
API:
/v2/node/state
参数:
{"uuid":"xxxxxxxxxxxx","timer":"xxxxxxxx"}
[编辑] 4 模块与云通信
[编辑] 4.1 概述
模块固件从 flash 中读出 UUID 和 KEY,UUID + 当前时间戳用 KEY 加密(AES) 运算后生成的串作为 Token
云端验证 UUID 和 Token
[编辑] 4.2 检查
- 1. Polling 方案
API:
/v2/node/state
模块 1s GET 一次,取回的数据为一个 JSON 结构,解析得到 value (on/off, 55/99),与本地状态不一致,就改变自己的状态、
APP 通过写 (POST) 这个值,来完成远程控制
APP 也需要定时 (2s ?) GET 一下,以防其他用户改变该值导致插座状态改变而与另一个用户APP状态不一致
设备主动检查 state 例子:
$ cat dev-check-state GET /v2/node/state HTTP/1.1 Accept: */ * nodid: 88F6D02F5246F1EE0YL token: 15F7E14203AD318B0AB05514A6BD5B072830A076267C66E2X Content-Length: 0 Content-Type: text/html Connection: close $ cat dev-check-state | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Thu, 30 Jul 2015 09:47:09 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 47 {"timestamp":"2015-07-30T14:11:21","value":55}
- 2. TCP 长链接方案
TBD
[编辑] 4.3 心跳
- 选择性实现,实际设备和云间只要保持长链接或者每 polling 一次就有心跳
API:
/v2/node/beacon
例子:
$ cat dev-beacon POST /v2/node/beacon HTTP/1.1 Accept: */ * nodid: 88F6D02F5246F1EE0YL token: 15F7E14203AD318B0AB05514A6BD5B072830A076267C66E2X Content-Length: 0 Content-Type: text/html Connection: close $ cat dev-beacon | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Thu, 30 Jul 2015 09:45:46 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 28 Pushed node beacon success!
[编辑] 4.4 激活
API:
/v2/node/activate
例子:
$ cat dev-activate POST /v2/node/activate HTTP/1.1 Accept: */ * nodid: 88F6D02F5246F1EE0YL token: 15F7E14203AD318B0AB05514A6BD5B072830A076267C66E2X Content-Length: 14 Content-Type: text/html Connection: close {"activate":1} $ cat dev-activate | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Fri, 31 Jul 2015 03:23:47 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 18 Activate success!
[编辑] 5 微信公众号
[编辑] 5.1 扫描配置WiFi
用户手机和插座在同一无线路由下,直接使用微信 airkiss 为插座配置上无线路由的SSID和密码
[编辑] 5.2 注册验证
用户扫一扫带参二维码即完成注册且关联插座的过程
[编辑] 5.3 控制
微信菜单“控制”,系统自动呈现出当前用户关联的控制端设备(一个动态HTML页面),插座自动呈现为带当前状态的切换按钮
[编辑] 5.4 计划任务
微信菜单“控制”,系统自动呈现出当前用户关联的控制端设备(一个动态HTML页面),点插座,进入设置计划任务界面(定时设置)
[编辑] 5.5 用户管理
第一个扫二维码的是主帐号(管理员),后面扫的是普通用户
[编辑] 6 批量制造
批量制造工具,批量生成 UUID, KEY, MAC
$ ./nodid -t p1 -k -m -n 100 > P1000100 $ head -n 3 P1000100 DFA4E18D228D5771FKA SGP8M5R2 18FE343A2480 206758F4D4042DC2AZP OQUBTVFX 18FE3443A6E7 10C1D47FB8390A5DB5K RGCB962D 18FE3481DF4E
通过专用接口批量导入云端:
$ ./push_nodes -i P1000100 -o P1000100.pushed -t P1 -q Re-type key: Manufacture Smart Plug (P1) OK!
UUID, KEY, MAC 同时需要写入插座 WiFi 模块的 Flash 中,用以完成和云端的接口认证