查看智能插座的源代码
←
智能插座
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 概述 == SN: 字符串,19个字符,唯一编号,对应一个插座 KEY: 字符串,8个字符,注意保护,用于生成每次通信的 Token MAC: 6字节,12个字符,MAC地址 云端入口: <source lang=bash> http://cos.icamgo.com:998 </source> 测试、联调先用这个入口: <source lang=bash> http://cos.icamgo.com:999 </source> <br><br> == 制造 == 工具脚本批量生成 SN, 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> SN, KEY, MAC 同时需要写入插座 WiFi 模块的 Flash 中,用以完成和云端的接口认证 <br><br> == 模块与云通信 == === 概述 === 模块固件从 flash 中读出 SN 和 KEY,SN + 当前时间戳用 KEY 加密(AES) 运算后生成的串作为 Token 云端验证 SN 和 Token <br><br> === 检查 === /v2/node/state 模块 1s GET 一次,取回的数据为一个 JSON 结构,解析得到 value (on/off, 55/99),与本地状态不一致,就改变自己的状态、 APP 通过写 (POST) 这个值,来完成远程控制 APP 也需要定时 (2s ?) GET 一下,以防其他用户改变该值导致插座状态改变而与另一个用户APP状态不一致 <br><br> == APP 与云通信 == === 注册验证 === APP 第一次运行提示用户注册,输入 email 和 password,调用: /v2/node <source lang=bash> {"email": "EMAIL", "password": "PASSWORD"} </source> 返回 nodid (整个平台的唯一识别码): <source lang=bash> {"nodid": "NODE_ID"} </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 {"nodid":"comcat@icamgo.com00"} </source> 用户 nodid 的生成算法:用户 email 地址作为 nodid,19位,不够补0,多了截掉。如:jiankemeng@gmail.com,nodid 为:jiankemeng@gmail.co 注册成功后,APP 加密 email 和 password 并存入本地,下次启动APP,首先检查本地,如有缓存,直接进入 APP,无需再输入 email 和 password <br><br> === Token 生成 === 用户注册无需 Token,但后面的激活、控制等操作,就需要在 HTTP 的 header 里加入 Token 了,以下是一段Token 生成的 php 实现: <source lang=php> define("NODID", "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", NODID, $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 = '{"devsn":' . $sn . '"}'; $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> === 激活 === 用户关联(添加)插座,视为激活插座 一个用户可能有多个插座,把插座的 SN 生成为条形码或者二维码,添加插座时,建议实现为:直接在 APP 里扫码添加。 APP 扫描二维码后,解析出 SN ,作为调用如下 cloud api 的参数: /v2/node/activate <source lang=bash> $ cat user-add-dev POST /v2/node/activate HTTP/1.1 Accept: */ * nodid: jiankemeng@gmail.co token: 8412F7A4870744127266E7C289EB5A3EBCE72E70781C00139BB2F48D12ECF73C Content-Length: 31 Content-Type: text/html Connection: close {"devsn":"77499F93A32683076NQ"} $ cat user-add-dev | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Sun, 26 Apr 2015 10:09:57 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 获取用户所有插座: <source lang=bash> </source> <br><br> === 控制 === /v2/node/state ;;APP 改变插座状态: <source lang=bash> $ cat user-ctrl-dev # HTTP 请求体 POST /v2/node/state HTTP/1.1 Accept: */ * nodid: jiankemeng@gmail.co token: 8412F7A4870744127266E7C289EB5A3ED64D5AD7DB2DE2561FC32BFB84C549CD Content-Length: 42 Content-Type: text/html Connection: close {"devsn":"E1D0275ED8FC0ACAMWI","value":55} $ cat user-ctrl-dev | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Sun, 26 Apr 2015 11:44:07 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-state-devsn # HTTP 请求体 GET /v2/node/state HTTP/1.1 Accept: */ * nodid: jiankemeng@gmail.co token: 8412F7A4870744127266E7C289EB5A3ED64D5AD7DB2DE256C7E8E6647EE26A81 Content-Length: 31 Content-Type: text/html Connection: close {"devsn":"E1D0275ED8FC0ACAMWI"} $ cat user-check-dev-state-devsn | nc cos.icamgo.com 998 HTTP/1.0 200 OK Date: Sun, 26 Apr 2015 11:47:17 GMT Server: HTTP::Server::PSGI Content-Type: text/html; charset=utf-8 X-Catalyst: 5.90075 Content-Length: 47 {"timestamp":"2015-04-26T19:44:07","value":55} </source> <br><br> === 计划任务 === /v2/node/state <source lang=bash> POST /v2/node/state HTTP/1.1 Accept: */ * nodid: comcat@icamgo.com00 token: 15F7E14203AD318B0AB05514A6BD5B072830A076267C66E2X Content-Length: 26 Content-Type: text/html Connection: close {"devsn":"SN","timer":"xxxxxxxx"} </source> <br><br> == 微信公众号 == === 扫描配置WiFi === 用户手机和插座在同一无线路由下,直接使用微信 airkiss 为插座配置上无线路由的SSID和密码 <br><br> === 注册验证 === 用户扫一扫带参二维码即完成注册且关联插座的过程 <br><br> === 控制 === 微信菜单“控制”,系统自动呈现出当前用户关联的控制端设备(一个动态HTML页面),插座自动呈现为带当前状态的切换按钮 <br><br> === 计划任务 === 微信菜单“控制”,系统自动呈现出当前用户关联的控制端设备(一个动态HTML页面),点插座,进入设置计划任务界面(定时设置) [[文件:Task.jpg]] <br><br> === 用户管理 === 第一个扫二维码的是主帐号(管理员),后面扫的是普通用户 [[文件:Users.jpg]] <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br>
返回到
智能插座
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面