需求:
在温室大棚的物联网监控系统里,安装了带云台控制的摄像头,海康自带的app是可以实现云台控制(转动,放大缩小),但是嵌入网页的播放器,没有这个功能,而客户又希望通过网页去控制摄像头,捕捉特定的植物细节画面。
一开始我是想说,平台的摄像头播放器不支持这个功能,甲方爸爸,臣妾做不到呀。可是后来商务跟我说,这个平台功能这么少呀,看来还是要自己开发的系统才有自由度呀。听到这里我不服气了,作为阿里云物联网平台的粉丝,我表示,我试试看,结果零零碎碎做了2天的时间,居然让我实现了这个功能。
来看一下怎么实现的吧。
目录
1.从海康萤石开放平台找到API的接口资料
2.在物联网平台的界面中,获取accessToken
3.使用accessToken发送云台控制命令
4.甲方爸爸,你要的云台控制功能做好了
看了一会,明白了其中的控制逻辑:
1.通过账号的appKey和appSecret,来获取一个每7天变化一次的accessToken;
2.发送云台停止指令,
3.发送你想要的云台动作(操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距)
一开始我觉得是懵逼的,向一个网址发送一个报文,这对于一个嵌入式工程师来说,实在有点为难,难道要建立socket,拼装HTML报文,再发送?
但是对阿里云物联网平台的开放性怀有一种信仰般信心的我,去摸索了一下说明文档,发现这种发送报文的处理报文的事,已经是控件本身的一个功能了。话不多说,开搞。
萤石开发文档这样说:
获取accessToken请求地址
https://open.ys7.com/api/lapp/token/get
请求方式
POST
参数名 | 类型 | 描述 | 是否必选 |
---|---|---|---|
appKey | String | appKey | Y |
appSecret | String | appSecret | Y |
POST /api/lapp/token/get HTTP/1.1
Host: open.ys7.com
Content-Type: application/x-www-form-urlencoded
appKey=9mqitppidgce4y8n54ranvyqc9fjtsrl&appSecret=096e76501644989b63ba0016ec5776
{
"data": {
"accessToken": "at.7jrcjmna8qnqg8d3dgnzs87m4v2dme3l-32enpqgusd-1jvdfe4-uxo15ik0s",
"expireTime": 1470810222045
},
"code": "200",
"msg": "操作成功!"
}
也就是说,获取accessToken的要求是把appKey和appSecret拼在一起发过去。
appKey=9mqitppidgce4y8n54ranvyqc9fjtsrl&appSecret=096e76501644989b63ba0016ec5776
怎么拼我又开始想着字符串拼接的痛苦经历了,C,python,jason,java的拼接各不一样,要不要加“”要不要printtf()是不是直接+就可以,结果抱着试一试的心态,给我试成功了。
首先在界面放入一个文本框,点开它的数据源“配置数据源”。
按照图示设置
这里动态参数,就是拼接的地方,键和值会自动用=号连接在一起,然后参数和参数之间用&连接在一起(我的猜测,否则不能满足萤石的协议要求)。
问题来了:这些参数怎么来的?
在平台有个变量管理页面,在设置交互的地方选择变量,就会出现变量管理,我配置了几个全局变量,说到这里,这个界面又有点像一个程序,可以以配置的方式声明赋值变量。
然后点击,就发送成功了,有了一个返回值:
{
"msg": "操作成功!",
"code": "200",
"data": {
"expireTime": 1623480908331,
"accessToken": "at.3s4ualtw4b3tbtbscx1396q0a7pf5rpm-67w3tkhx63-10cz54n-9fx3orrs3"
}
}
然后我要把返回值提取出来,只保留accessToken,返回的结果是一串jason的字符串,需要通过数据过滤脚本来过滤(鬼知道我为什么知道可以有这种操作,完全是凭着对马云的信心)。试了好久终于知道了这个脚本配置的规则,已经不去管这种语法是java还是jason,能完成功能就可以。
提取出来两个参数,在数据表配置中,选择我要的accesToken,处理后结果,就是那串数据。
还可以定时刷新。
经过阿里云工单系统,我知道了控件的刷新规则,然后刷新后存入变量,这样操作就可以。设置文本框的交互事件,当“值改变”这事件发生时,把文本框的值写入变量。
弄好了之后,把这个文本框设置成透明就看不到它了,它的作用就是形成一个定时获取accessToken的功能。
以下是萤石开放平台对于停止云台控制的说明:
请求地址
https://open.ys7.com/api/lapp/device/ptz/stop
请求方式
POST
子账户token请求所需最小权限
"Permission":"Ptz"
"Resource":"Cam:序列号:通道号"
参数名 | 类型 | 描述 | 是否必选 |
---|---|---|---|
accessToken | String | 授权过程获取的access_token | Y |
deviceSerial | String | 设备序列号,存在英文字母的设备序列号,字母需为大写 | Y |
channelNo | int | 通道号 | Y |
direction | int | 操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距 |
N |
提示:建议停止云台接口带方向参数。
我们放置一个按钮,命名为“左转”,然后设置它的交互动作,包含两个动作,一个停止,一个左转。
我们先看下停止要怎么配置,同样的选择POST到指定的地址,发送的格式是:
accessToken=at.25ne3gkr6fa7coh34ys0fl1h9hryc2kr&deviceSerial=568261888&channelNo=1&direction=1
按照要求配置,其中accesToken我发现引用变量似乎不灵,总是说过期,就直接引用文本框的值,结果就可以了。
最后发送成功了。如果是各种错误都会返回错误码,这个是正确的返回值。
{
"msg": "设备不在线",
"code": "20007"
}
交互2也是按照1一样,只是发送的地址是Start地址,里面的内容有点不一样,看图。
其他的云台操作,跟左转是很相似的,把这个做好的按钮复制粘贴过去,改一下direction这个键的键值就可以了,我做了四个按钮: 2-左,3-右,8-放大,9-缩小。
因为多个摄像头都接入了NVR,而我控制的是NVR,所以控制不同的设备是,只要更改channelNo就可以了。
折腾了两天的时间,终于实现了云台控制的功能。
阿里云物联网平台实现快速的物联网系统开发,让我这个嵌入式系统工程师,望着做软件开发团队,露出了复杂的微笑,他们的去留似乎都掌握在我的手中……