智能插座

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(注册验证)
(检查)
 
(未显示1个用户的35个中间版本)
第40行: 第40行:
  
 
{"type":"P1"}
 
{"type":"P1"}
 
+
#---------------------------------------------------
 
$ cat create-plug | nc cos.icamgo.com 998
 
$ cat create-plug | nc cos.icamgo.com 998
 
HTTP/1.0 200 OK
 
HTTP/1.0 200 OK
第59行: 第59行:
  
 
APP 第一次运行提示用户注册,输入 email 和 password,调用:
 
APP 第一次运行提示用户注册,输入 email 和 password,调用:
 +
  
 
API:
 
API:
第70行: 第71行:
 
</source>
 
</source>
  
返回 nodid (整个平台的唯一识别码 uuid):
+
返回 uuid (整个平台的唯一识别码):
  
 
<source lang=bash>
 
<source lang=bash>
{"nodid": "NODE_ID"}
+
{"uuid": "xxxxxxxxxxxxxxxxxx"}
 
</source>
 
</source>
 +
 +
 +
例子:
  
 
<source lang=bash>
 
<source lang=bash>
第85行: 第89行:
  
 
{"email":"comcat@icamgo.com","password":"12341234"}
 
{"email":"comcat@icamgo.com","password":"12341234"}
 +
#---------------------------------------------------
 
$ cat user-signup | nc cos.icamgo.com 998
 
$ cat user-signup | nc cos.icamgo.com 998
 
HTTP/1.0 200 OK
 
HTTP/1.0 200 OK
第92行: 第97行:
 
Content-Length: 32
 
Content-Length: 32
  
{"nodid":"comcat@icamgo.com00"}
+
{"uuid":"comcat@icamgo.com00"}
 
</source>
 
</source>
  
第103行: 第108行:
 
<br><br>
 
<br><br>
  
=== Token 生成 ===
+
=== 权限验证 ===
  
用户注册无需 Token,但后面的激活、控制等操作,就需要在 HTTP 的 header 里加入 Token 了,以下是一段Token 生成的 php 实现:
+
每次的请求,都会生成一个 Token,云端验证这个 Token 是否合法
 +
 
 +
用户注册无需 Token,但后面的激活、控制等操作,就需要在 HTTP 的 header 里加入 Token
 +
 
 +
==== PHP 实现 ====
  
 
<source lang=php>
 
<source lang=php>
define("NODID", "comcat@icamgo.com00");    # 用户用 email 注册后,生成的 nodid
+
define("UUID", "comcat@icamgo.com00");    # 用户用 email 注册后,生成的 nodid
 
define("PKEY", "12341234");                # 用户密码
 
define("PKEY", "12341234");                # 用户密码
  
第122行: 第131行:
  
 
     $iv = '12345678';
 
     $iv = '12345678';
     $ctx = sprintf("%s%08X", NODID, $ts);
+
     $ctx = sprintf("%s%08X", UUID, $ts);
  
 
     $td = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc','');
 
     $td = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc','');
第140行: 第149行:
 
     $token = gen_token();
 
     $token = gen_token();
 
     $con = curl_init('http://cos.icamgo.com:998/v2/node/activate');
 
     $con = curl_init('http://cos.icamgo.com:998/v2/node/activate');
     $body = '{"uuid":' . $sn . '"}';
+
     $body = '{"uuid":' . $uuid . '"}';
 
     $header = array(
 
     $header = array(
 
         "Accept: */ *",
 
         "Accept: */ *",
第166行: 第175行:
 
一个用户可能有多个插座,把插座的 UUID 生成为条形码或者二维码,添加插座时,建议实现为:直接在 APP 里扫码添加。
 
一个用户可能有多个插座,把插座的 UUID 生成为条形码或者二维码,添加插座时,建议实现为:直接在 APP 里扫码添加。
  
APP 扫描二维码后,解析出 UUID ,作为调用如下 cloud api 的参数:
+
APP 扫描二维码后,解析出 UUID ,作为调用如下 cloud api 的参数
 +
 
 +
 
 +
API:
  
 
   /v2/node/activate
 
   /v2/node/activate
 +
 +
参数:
 +
 +
  {"uuid":"xxxxxxxxxxxxxxxxxxx"}
 +
 +
 +
例子:
  
 
<source lang=bash>
 
<source lang=bash>
$ cat user-add-dev
 
 
POST /v2/node/activate HTTP/1.1
 
POST /v2/node/activate HTTP/1.1
 
Accept: */ *
 
Accept: */ *
nodid: jiankemeng@gmail.co
+
nodid: comcat@icamgo.com00
token: 8412F7A4870744127266E7C289EB5A3EBCE72E70781C00139BB2F48D12ECF73C
+
token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F
Content-Length: 31
+
Content-Length: 30
 
Content-Type: text/html
 
Content-Type: text/html
 
Connection: close
 
Connection: close
  
{"uuid":"77499F93A32683076NQ"}
+
{"uuid":"88F6D02F5246F1EE0YL"}
 
+
#---------------------------------------------------
$ cat user-add-dev | nc cos.icamgo.com 998
+
$ cat user-activate-dev | nc cos.icamgo.com 998
 
HTTP/1.0 200 OK
 
HTTP/1.0 200 OK
Date: Sun, 26 Apr 2015 10:09:57 GMT
+
Date: Thu, 30 Jul 2015 05:52:24 GMT
 
Server: HTTP::Server::PSGI
 
Server: HTTP::Server::PSGI
 
Content-Type: text/html; charset=utf-8
 
Content-Type: text/html; charset=utf-8
第198行: 第216行:
  
 
APP 获取当前用户名下的所有插座的 UUID (设备唯一串号):
 
APP 获取当前用户名下的所有插座的 UUID (设备唯一串号):
 +
 +
API:
  
 
   /v2/node/downnodes
 
   /v2/node/downnodes
 +
 +
参数:
 +
 +
  无
 +
 +
 +
例子:
  
 
<source lang=bash>
 
<source lang=bash>
$ cat user-dev-list
+
$ cat user-dev-list  
 
GET /v2/node/downnodes HTTP/1.1
 
GET /v2/node/downnodes HTTP/1.1
 
Accept: */ *
 
Accept: */ *
nodid: jiankemeng@gmail.co
+
nodid: comcat@icamgo.com00
token: 8412F7A4870744127266E7C289EB5A3E36A94D391C9DBC1367B72ABC2F099551
+
token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F
 
Content-Length: 0
 
Content-Length: 0
 
Content-Type: text/html
 
Content-Type: text/html
 
Connection: close
 
Connection: close
  
$ cat user-dev-list | nc cos.icamgo.com 999
+
#---------------------------------------------------
 +
$ cat user-dev-list | nc cos.icamgo.com 998
 
HTTP/1.0 200 OK
 
HTTP/1.0 200 OK
Date: Sun, 26 Apr 2015 17:09:33 GMT
+
Date: Thu, 30 Jul 2015 06:04:35 GMT
 
Server: HTTP::Server::PSGI
 
Server: HTTP::Server::PSGI
 
Content-Type: text/html; charset=utf-8
 
Content-Type: text/html; charset=utf-8
 
X-Catalyst: 5.90075
 
X-Catalyst: 5.90075
Content-Length: 46
+
Content-Length: 24
  
["E1D0275ED8FC0ACAMWI","77499F93A32683076NQ"]
+
["88F6D02F5246F1EE0YL"]
 
</source>
 
</source>
  
第225行: 第253行:
  
 
=== 控制 ===
 
=== 控制 ===
 +
 +
;;这部分需要类似 PUSH 的实时消息同步,主要在设备和 APP 间
 +
 +
API:
  
 
   /v2/node/state
 
   /v2/node/state
  
 +
 +
例子:
  
 
;;APP 改变插座状态:
 
;;APP 改变插座状态:
  
 
<source lang=bash>
 
<source lang=bash>
$ cat user-ctrl-dev   # HTTP 请求体
+
$ cat user-ctrl-dev  
 
POST /v2/node/state HTTP/1.1
 
POST /v2/node/state HTTP/1.1
 
Accept: */ *
 
Accept: */ *
nodid: jiankemeng@gmail.co
+
nodid: comcat@icamgo.com00
token: 8412F7A4870744127266E7C289EB5A3ED64D5AD7DB2DE2561FC32BFB84C549CD
+
token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F
 
Content-Length: 42
 
Content-Length: 42
 
Content-Type: text/html
 
Content-Type: text/html
 
Connection: close
 
Connection: close
 
+
{"uuid":"E1D0275ED8FC0ACAMWI","value":55}
+
{"uuid":"88F6D02F5246F1EE0YL","value":55}
 
+
#---------------------------------------------------
$ cat user-ctrl-dev | nc cos.icamgo.com 998
+
$ cat user-ctrl-dev | nc cos.icamgo.com 998
 
HTTP/1.0 200 OK
 
HTTP/1.0 200 OK
Date: Sun, 26 Apr 2015 11:44:07 GMT
+
Date: Thu, 30 Jul 2015 06:11:21 GMT
 
Server: HTTP::Server::PSGI
 
Server: HTTP::Server::PSGI
 
Content-Type: text/html; charset=utf-8
 
Content-Type: text/html; charset=utf-8
第258行: 第292行:
  
 
<source lang=bash>
 
<source lang=bash>
$ cat user-check-dev-state-uuid  # HTTP 请求体
+
$ cat user-check-dev  
 
GET /v2/node/state HTTP/1.1
 
GET /v2/node/state HTTP/1.1
 
Accept: */ *
 
Accept: */ *
nodid: jiankemeng@gmail.co
+
nodid: comcat@icamgo.com00
token: 8412F7A4870744127266E7C289EB5A3ED64D5AD7DB2DE256C7E8E6647EE26A81
+
token: EE9B1A53F2F2EAF355DF9B772F7DBC3849896A38A7A081D480FF504E5AFDD54F
Content-Length: 31
+
Content-Length: 30
 
Content-Type: text/html
 
Content-Type: text/html
 
Connection: close
 
Connection: close
  
{"uuid":"E1D0275ED8FC0ACAMWI"}
+
{"uuid":"88F6D02F5246F1EE0YL"}
 
+
#---------------------------------------------------
$ cat user-check-dev-state-uuid | nc cos.icamgo.com 998
+
$ cat user-check-dev | nc cos.icamgo.com 998
 
HTTP/1.0 200 OK
 
HTTP/1.0 200 OK
Date: Sun, 26 Apr 2015 11:47:17 GMT
+
Date: Thu, 30 Jul 2015 06:16:51 GMT
 
Server: HTTP::Server::PSGI
 
Server: HTTP::Server::PSGI
 
Content-Type: text/html; charset=utf-8
 
Content-Type: text/html; charset=utf-8
第277行: 第311行:
 
Content-Length: 47
 
Content-Length: 47
  
{"timestamp":"2015-04-26T19:44:07","value":55}
+
{"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>
 
</source>
  
第284行: 第352行:
 
=== 计划任务 ===
 
=== 计划任务 ===
  
   /v2/node/task
+
API:
 +
 
 +
   /v2/node/state
 +
 
 +
参数:
  
 
<source lang=bash>
 
<source lang=bash>
第291行: 第363行:
  
 
<br><br>
 
<br><br>
 
  
 
== 模块与云通信 ==
 
== 模块与云通信 ==
第306行: 第377行:
  
 
;;1. Polling 方案
 
;;1. Polling 方案
 +
 +
API:
  
 
   /v2/node/state
 
   /v2/node/state
 +
  
 
模块 1s GET 一次,取回的数据为一个 JSON 结构,解析得到 value (on/off, 55/99),与本地状态不一致,就改变自己的状态、
 
模块 1s GET 一次,取回的数据为一个 JSON 结构,解析得到 value (on/off, 55/99),与本地状态不一致,就改变自己的状态、
第314行: 第388行:
  
 
APP 也需要定时 (2s ?) GET 一下,以防其他用户改变该值导致插座状态改变而与另一个用户APP状态不一致
 
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 长链接方案
 
;;2. TCP 长链接方案
 +
 +
TBD
  
 
<br><br>
 
<br><br>
  
 
=== 心跳 ===
 
=== 心跳 ===
 +
 +
;;选择性实现,实际设备和云间只要保持长链接或者每 polling 一次就有心跳
 +
 +
API:
  
 
   /v2/node/beacon
 
   /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>

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页面),点插座,进入设置计划任务界面(定时设置)

Task.jpg



[编辑] 5.5 用户管理

第一个扫二维码的是主帐号(管理员),后面扫的是普通用户

Users.jpg



[编辑] 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 中,用以完成和云端的接口认证















个人工具
名字空间

变换
操作
导航
工具箱