pigeon是在之前的工作基础上,进行反思,并且学习参考了目前的物联网平台,像最近出现的amazon aws iot, samsung sami等等,初步构想出的一个大体轮廓的open source IoT Cloud platform,后面我会专门写一篇来详细介绍下我构思的IoT平台pigeon,现在我先介绍下developer portal。
developer portal背景,业务介绍
它是pigeon的其中一个服务,
功能在于提供给设备开发者来将他们开发的设备注册到pigeon平台,具体地说,就是把他们设备的元信息,保存到pigeon,这个服务的
目的在于给用户的控制设备请求和gateway(及具体devices接收指令进行自动操作)之间制定了通信规范,以及gateway的设备插件仓库(比如用户购买了camera设备,该款camera 在pigeon平台已注册,用户在user portal上搜索下载该camera插件到gateway, 这样就可以打通了
pigeon平台, gateway(agent), camera之间的通道,用户可以进行操控camera)
一个在pigeon保存的新添加的设备类型,包括两个部分:设备信息和设备属性元数据。
其中设备信息包含设备类型在pigeon平台唯一性的devtype, 该款设备的制造商manufacturer,版本信息version, 该款设备的用途和功能描述description;
而设备属性元数据meta:则是该类型设备的功能抽象,如灯light,它有属性power,值为on/off, colors属性,那么我们可以把light的meta简单抽象为
{"power":"boolean", "color":"int"}.以后对于light设备的控制操作,用户可以简单的通过get/set这两个属性请求来达到目的(当用户发送的控制请求到达pigeon云平台后,pigeon的内部服务可以检查该请求是否符合该设备类型存储在平台上的meta信息,若符合才发送给用户的gateway)
developer portal的设计和实现
以前习惯了用C/C++开发,花几天学习了html, javascript, nodejs, express, 才知道神马开发效率,这也是java, 和众多脚本语言大行其道的原因,在移动互联网时代,所谓的小步快跑,快速迭代,更是利器,当然C/C++在底层,和性能要求高的领域还是有其优势。采用了nodejs的express框架来实现,使用redis来存储,久闻大名,初次使用后的较深体会是由于keys的o(n)时间复杂度,需要自己创建索引,还有就是需要自己来做语义上的事务处理。
开发者账号信息及设备信息的redis存储模型设计
![](https://i-blog.csdnimg.cn/blog_migrate/124a2a419cd51ad923db5404494eba30.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9bbb4e71f81435a2027070b3e615fd38.png)
developer portal 创建和管理设备的接口
developer portal提供了REST APIs用来创建和管理设备,具体步骤如下:
1. 首先到developer portal注册开发者账号(sign up),然后在用户settings里面获取App Key, 后续的创建管理请求都要使用这个key做认证(在http 请求包添加自定义header: apikey,值为App Key)。
![](https://i-blog.csdnimg.cn/blog_migrate/245cecbaa8710c359b331d5adf562210.png)
2. 使用postman发送http请求包做测试。
![](https://i-blog.csdnimg.cn/blog_migrate/c356796478451f1f4b14b9e93c0ccbe3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/22c9e2c9d7973a962b8ba032d926abb4.png)
3.可以在devices里面看到自己创建的设备类型列表信息。
![](https://i-blog.csdnimg.cn/blog_migrate/bce9df9f0b62f3c67e908d0b1501f3cc.png)
创建和管理设备类型的REST API列表(下面是基本的接口,后续还需要增加api来更完整,方便管理设备类型):
-----------------------------------------------------------------------------------------------------------------
1. 创建设备类型
post /v0.1/iot/devices
请求格式:json,
eg: {"devtype":"q46", "manufacturer":"euputddfds", "version":"0.0.1", "description":"hi, eu"}
响应:
创建成功,返回状态码201
-----------------------------------------------------------------------------------------------------------------
2.查询指定设备类型信息
get /v0.1/iot/devices/<devtype>
响应格式:json
eg:{"manufacturer": null, "version": "0.0.1", "description": "hi, eu,new version come on now!\n"}
-----------------------------------------------------------------------------------------------------------------
3.获取自己创建的设备类型名列表
get /v0.1/iot/devices
响应格式:json
eg: [ "q56", "q66", "q46", "q36", "q6"]
-----------------------------------------------------------------------------------------------------------------
4.修改指定设备类型信息
put /v0.1/iot/devices/<devtype>
请求格式: json,
eg: {"manufacturer":"euputddfds", "version":"0.0.1", "description":"hi, eu"}
响应:
创建成功,返回状态码200
-----------------------------------------------------------------------------------------------------------------
5.创建指定设备类型的元数据信息
post /v0.1/iot/devices/<devtype>/meta
请求格式:json
eg:{"id":"string", "pos":"float"}
(设备类型q36的设备属性有两个字段id为string类型,pos为float类型)
响应:
创建成功,返回状态码201
-----------------------------------------------------------------------------------------------------------------
6. 修改指定设备类型的元数据信息
put /v0.1/iot/devices/<devtype>/meta
请求格式:json
eg:{"pos":"int"}
(设备类型q36的设备属性pos为int类型)
响应:
创建成功,返回状态码200
-----------------------------------------------------------------------------------------------------------------
7. 查询指定设备类型的元数据信息
get /v0.1/iot/devices/<devtype>/meta
响应格式:json
eg: {"id": "int", "pos": "float"}
-----------------------------------------------------------------------------------------------------------------
8. 删除指定设备类型的元数据信息
delete /v0.1/iot/devices/<devtype>/meta
响应:
删除成功,返回状态码200
-----------------------------------------------------------------------------------------------------------------
9.删除指定设备类型(它将删除所有关于指定设备类型的信息,包括meta)
delete /v0.1/iot/devices/<devtype>
响应:
删除成功,返回状态码200
-----------------------------------------------------------------------------------------------------------------
目前只是初步的实现,还有很多细节需要考虑,迭代,如设备类型信息目前仅devtype,manufacturer,version,description
四个字段,以及设备类型的属性元信息meta设计目前没有涉及具体的规范,仅以fieldname:type来设置,将来考虑将其修改成
形如{'properties':{fieldname:type, fieldname:type}, 'action':{...}}.
(即我在另外一篇文章物联网command原型设计提到的,同时支持属性设置和动作操作,同时可以参考
https://developer.samsungsami.io/sami/api-spec.html)
可以在
https://github.com/europelee/pigeon 看下提交的developer portal代码,欢迎交流!