查看Cloud Of Smart Home的源代码
←
Cloud Of Smart Home
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 概述 == 专为智能家居而生的物联云 服务于各类爱好智能家居的宅男宅女,他们爱动手、爱思考、对隐私和家居安全敏感 === HOME === 一个 Home 下可有多个设备 (device) 和多个家庭成员 (member) Home 用一行描述,当前状态用一个 JSON 结构,包含所有member,controller,sensor 的状态,写在 stat 域里 家里新加的传感器、控制器、成员,可在APP里直接选择用 Home 的 UUID push 数据和状态,在参数里,写上name,type,数据等,云端首先遍历下级node列表,识别是否已有同名的设备,没有则为其创建新 node,并加到 node 列表里 家只关心,成员、控制器和传感器的状态,因此都写在 stat 域里即可。各下级node更新状态时要记得更新其在上级node之stat 域中的数据值 <source lang=bash> name, type, up_nodes, down_nodes, state, uuid, meta:{mac:"aa:bb:cc:dd", ip:"123.11.1.1"} </source> <br><br> === Device === 设备是传感器 (sensor) 和 控制器 (controller) 统称。客厅大灯是一个设备,当然他只是一个控制器,因其主要响应用户的控制行为。客厅的温湿度检测也是一个设备,实际他是一个传感器,因其主要负责收集数据。贴于门窗上的门磁也是一个传感器设备。 但悬挂于天花板的火灾烟幕报警器和安装在厨房的燃气泄漏报警器也是设备,但他们就既是传感器也是控制器 传感器的值、控制器的状态都写在 stat 域里,方便设备 check 以实现远程控制。每次push 的数据或状态则写在 datapoints 表里,带时间戳,方便呈现和日志检查 同时带有多个感应和多个控制的设备,也用一行描述,当前状态用一个 JSON 结构,写在 stat 域里 设备新加的传感器、控制器,可在APP里直接选择用 Device 的 UUID push 数据和状态,在参数里,写上name,type,数据等,云端首先遍历下级node列表,识别是否已有同名的设备,没有则为其创建新 node,并加到 node 列表里 <source lang=bash> name, type, up_nodes, down_nodes, state, uuid, pub_key, trigger:{} trigger: { wexin:{root:wx_user1, users:[wx_user1, wx_user2...]}, "166745":{msg:"家里大门开了", wexin:{root:wx_user1, users:[wx_user1, wx_user2...]}}, "139225":{msg:"客厅阳台门开了", weixin:{root:wx_user1, users:[wx_user2, wx_user3...]}} } state: { value: {x: 12, y: 12, z: 12, k: 22, l: 33}, deliver_to_device: 0 } </source> <br><br> === Member === 对于一个家庭成员追踪设备,则各人智能手机为感知端(用户可选择是否定时上传 GPS/GSM 数据),加一些虚拟控制器,比如 weibo 推发器 stat 描述有 member 的坐标、体重、心率、运动量等等数据。如新买一血氧的设备,想要关联到 member,可用member的 UUID 生成 Token 来 push 数据,在参数里,写上name,type,数据等。云端会首先向 datapoints 记录一条记录,然后取 member 行(位于 Node 表)的 stat,解析后,将新数据域加入。 微信可以抽象为控制器;微博也可以抽象为控制器 手表/手环的消息提醒,振动提醒等也可以抽象为控制器 <source lang=bash> name, type, up_nodes, down_nodes, state, meta:{email, password, weixin, weibo, mobile, imsi}, uuid, pub_key state:{ coords:{lat:123, lng:234}, cell:{mcc: 460, mnc: 0, lac: 123, cid: 456} } </source> <br><br> === Trigger === 每次 push 一个 state,云端检查一下相关的触发器,条件满足则执行相应的动作 注意:作为一个安全的云的必要设计,改控制器状态由家庭设备或家庭成员的手机完成,加密过后的数据,云端无法解读,因为加密在家庭设备端用私钥完成,云端无法解密,也就无法更改控制器状态 一个 Trigger 描述为: <source lang=cpp> trigger: { wexin:{root:wx_user1, users:[wx_user1, wx_user2...]}, "166745":{msg:"家里大门开了", wexin:{root:wx_user1, users:[wx_user1, wx_user2...]}, alarm: 1}, "139225":{msg:"客厅阳台门开了", weixin:{root:wx_user1, users:[wx_user2, wx_user3...]}, alarm: 1} } </source> <br><br> === Action Sets === <source lang=cpp> id, timestamp, action, processed action: { msg: 客厅阳台门开了, weixin: [u1, u2, u3 ...] } </source> <br><br> === Node === HOME, Device, Member 统一编号,皆可抽象为 Node (节点) 每个 Node 都有唯一的 UUID,用来与云端交互 每个 Node 带有 id, name, type, stat, up_node, down_node, uuid, ext1, ext2 Home 类型 为 0x10 Member 类型为 0x20 Sensor 类型为 0x40 Controller 类型为 0x80 Device 类型为 0xC0 <br><br> == 框架 == 首先在 Web UI 下创建 Home,生成密钥对(界面自动生成一对,也可本机开源工具生成,然后将公钥填入Web UI,此为社交需求,可授权云端解密给家庭信任的用户,也可不上传公钥,这样云端永远无法知道家庭的状态) 云端只存储家庭成员加密过的控制器状态、传感器值(可加密可不加密)和家庭成员定义的任务事件(触发器,外网相关,比如发微博,发微信,发邮件,发短信等。改控制器状态由家庭设备或家庭成员手机完成),加密过后的数据,云端无法解读,因为加密在家庭设备端完成,云端无法解密,也就无法更改控制器状态 家庭私钥只有用户自己保存,私钥不在公开的网络上传输,云端也不存储。没有私钥就不能产生加密的状态值,控制器也就无法改变状态 控制器设备只要每 1s 去取一下云端的控制器状态值,回来解密,检查是否需要响应家庭成员的要求 --- 设备、感知端、控制端 之间的关系为松耦合,即:一个设备可以只有一个感知端(只作数据呈现),或者只有一个控制端(只接受控制指令);一个感知端可用于多个设备,一个控制端也可为多个设备所用 简单如一个体重称,可作为只有一个传感器的设备 一个家庭灯光设备,可以有多个环境光强传感器,声控传感器(亦可作为其他设备的输入,比如窗帘控制设备),甚至手势传感器,控制器则对应各房间灯的开关 <br><br> == Open API == === Activate === ;;CamGo 的设计:(X1) 每个设备都有一个唯一的串号 SN,写在二维码里 扫描二维码,APP会获取 SN,APP自动生成一个密钥对,用私钥将 时间戳和SN 加密后,作为调用 Activate API 的一个参数,另一个参数是生成的公钥 x-key --- ;;mini 的设计是这样:(M1) 启动 APP,APP自动断开原WiFi的连接,搜索 miniCamGo 的AP,自动连接(内置密码),最好能做到将用户手机里存的AP直接配置给mini 配好后,APP自动生成一个密钥对,发给 mini,mini 收到后,保存,向用户返回 SN,APP用此生成一个微信二维码,供用户向家人分享 APP 断开和 mini 的连接,用私钥将时间戳和SN 加密后,作为调用 Activate API 的一个参数 Token,另一个参数是生成的公钥 x-key --- 首次调用activate接口的,拥有设备的最高权限,用户设置一个分享码(不设系统默认生成) 随后扫描的,需输入分享码,才能拥有这个设备的使用权(APP 如检测到其和拥有者使用相同的 AP 热点,可不用输入分享码) 激活时以路由的MAC地址为关键字,创建HOME且与SN关联;以用户手机的imsi为关键字,创建USER且与SN关联 <pre> /v2/device/activate </pre> <br><br> === Update State === <pre> /v2/device/state /v2/sensor/state /v2/controller/state /v2/member/state /v2/node/state </pre> <br><br> === ROM Update === <pre> /v2/device/rom/version /v2/device/rom/update?version=xxx </pre> <br><br> == DB Structure == 状态性控制器状态和数值型传感器的值分开,因其需不停查询也 对于状态性控制器最新状态,直接在 device/light 表里放着即可,查询每次到这来,一次完成,每次的操作记录在 controller 表中 <br><br> == Reference == * [[GitHub的Rails/Git架构]] http://www.ha97.com/1074.html * Comparison of Erlang Web Frameworks: https://github.com/ChicagoBoss/ChicagoBoss/wiki/Comparison-of-Erlang-Web-Frameworks <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br> <br><br>
返回到
Cloud Of Smart Home
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面