使用阿里云物联网平台IoT Studio控制海康摄像头旋转

需求:

在温室大棚的物联网监控系统里,安装了带云台控制的摄像头,海康自带的app是可以实现云台控制(转动,放大缩小),但是嵌入网页的播放器,没有这个功能,而客户又希望通过网页去控制摄像头,捕捉特定的植物细节画面。

一开始我是想说,平台的摄像头播放器不支持这个功能,甲方爸爸,臣妾做不到呀。可是后来商务跟我说,这个平台功能这么少呀,看来还是要自己开发的系统才有自由度呀。听到这里我不服气了,作为阿里云物联网平台的粉丝,我表示,我试试看,结果零零碎碎做了2天的时间,居然让我实现了这个功能。

来看一下怎么实现的吧。

目录

1.从海康萤石开放平台找到API的接口资料

2.在物联网平台的界面中,获取accessToken

3.使用accessToken发送云台控制命令

4.甲方爸爸,你要的云台控制功能做好了


1.从海康萤石开放平台找到API的接口资料

看了一会,明白了其中的控制逻辑:

1.通过账号的appKey和appSecret,来获取一个每7天变化一次的accessToken;

2.发送云台停止指令,

3.发送你想要的云台动作(操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距)

一开始我觉得是懵逼的,向一个网址发送一个报文,这对于一个嵌入式工程师来说,实在有点为难,难道要建立socket,拼装HTML报文,再发送?

但是对阿里云物联网平台的开放性怀有一种信仰般信心的我,去摸索了一下说明文档,发现这种发送报文的处理报文的事,已经是控件本身的一个功能了。话不多说,开搞。

2.在物联网平台的界面中,获取accessToken

萤石开发文档这样说:

  • 获取accessToken请求地址

    https://open.ys7.com/api/lapp/token/get

  • 请求方式

    POST

  • 请求参数
参数名类型描述是否必选
appKeyStringappKeyY
appSecretStringappSecretY
  • HTTP请求报文
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的功能。

3.使用accessToken发送云台控制命令

以下是萤石开放平台对于停止云台控制的说明:

  • 请求地址

    https://open.ys7.com/api/lapp/device/ptz/stop

  • 请求方式

    POST

  • 子账户token请求所需最小权限

    "Permission":"Ptz" "Resource":"Cam:序列号:通道号"

  • 请求参数
参数名类型描述是否必选
accessTokenString授权过程获取的access_tokenY
deviceSerialString设备序列号,存在英文字母的设备序列号,字母需为大写Y
channelNoint通道号Y
directionint操作命令: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就可以了。

4.甲方爸爸,你要的云台控制功能做好了

折腾了两天的时间,终于实现了云台控制的功能。        

阿里云物联网平台实现快速的物联网系统开发,让我这个嵌入式系统工程师,望着做软件开发团队,露出了复杂的微笑,他们的去留似乎都掌握在我的手中……

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员熊子峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值