为什么客户不直接控制智能家居网关,而要使用云服务器做中转?

在通常的智能家居场景中,我们可以很方便地从口袋中掏出手机,打开app应用,点击几下,启动家里的热水器,这样下班回家后,马上就可以洗个热水澡。
在这点击的零点几秒的时间内,internet网上的控制报文是如下传输的。
①客户手机连接到云服务器发出热水器的控制指令
②云服务器把控制指令转发给家中智能家居网关,控制热水器开关
③热水器响应控制指令,将结果反馈给云服务器
④云服务器再将结果反馈给客户app,app显示设置成功
大家可能会问一个问题,为什么客户app不直接控制智能家居网关,而使用云服务器做中转?
答案:智能家居设备是躲在家用路由器的后面,它的ip地址并不是公网地址,因此用户手机是无法访问到智能家居设备。同理,云服务器也无法访问到智能家居设备。
因此智能家居设备需要主动向云服务器发起连接,并建立好连接。这样客户app就可以就随时登录到云端,通过云端对智能家居进行控制。
我们拿在internet世界最常用的http协议来实现智能家居网关和云服务器的交互控制。http协议非常简单,客户端发起一个request,服务器回一个response。
大家注意,服务器是不能主动发起请求的,这是因为http协议必须是客户端发起的。因此如果要控制智能家居设备,智能家居设备需要不停的向服务器发起询问,查看云服务器是否对它下控制命令。
设备不停地对服务器请求会造成以下问题:
1、无论设备还是云服务器,cpu很忙,设备性能下降
2、占用带宽,特别是云服务器的带宽资源是比较昂贵的
好,我们现在请出websocket协议来替换http协议的实现,设备和服务器的请求变成下面的对话:
这样就明显合理多了,因此websocket协议有如下几个优点:
1、更小的控制开销。建立连接后,用于协议控制的数据包头部相对较小,在不扩展的情况下,只有2-10个字节。相对于http请求每次都要带完整的头部,开销要小很多
2、更强的实时性,协议是双工的。客户端和服务器端都可以随时发起请求。
正因为websocket有这些优点,它当前被大量使用在如下领域:
1、社交聊天,如果websocket早一些出来,qq和微信聊天的协议估计就是它了
2、弹幕
3、多玩家游戏
4、协同编辑,比如google docs,允许多人在线同时编辑相同一篇文档
5、股票基金报价
6、基于位置的应用
7、智能家居
可以看出来,需要实时性的场景都会使用websocket。
websocket vs http
下图是websocket和http协议层次模型:
从图上可以看出,http和websocket有一些交集,我们通过下面一个典型的websocket握手请求来展示:
客户端请求
get/webfin/websocket/ http/1.1host: localhostupgrade: websocket
connection:upgradesec-websocket-key: xqbt3imnzjbyqrinxeflkg==origin: http://服务器地址sec-websocket-version: 13
服务器回应
http/1.1101 switching protocolsupgrade: websocketconnection: upgradesec-websocket-accept: k7djldlooiwig/mopvwfb3y3fe8=
可以看出来,websocket建立连接是使用http协议进行握手的,握手完成之后,websocket就和http没有关系了,真正的数据传输阶段是不需要http协议参与的。
websocket和http是独立的协议,那么为什么websocket协议借用了http的协议来建立连接而不是自建一套独立的协议呢?
在前几年的时候,在大多数公司里,it为了让大家安心工作,在公司的防火墙上把qq的端口号封了,这样既解决了大家可以正常上网,但不能上网qq聊天。如果qq改用websocket来实现,websocket使用和http相同的80端口,it就没法限制了,除非把web浏览也禁掉。因此websocket协议借用了http的协议来建立连接,使用http的端口号,可以绕过大多数防火墙的限制。有web的地方,websocket就可以通行无阻。
浏览器的兼容性
由于websocket协议是在2011年最终定稿,因此一些旧款的浏览器还无法支持websocket,比如ie10以前的版本。下面是实现了websocket的浏览器(最终版本rfc6455):
web世界日新月异,但ie的对新技术的支持总要慢一拍,所以现在ie的份额也在逐年下降。来自net market share 2016年7月份的统计,google的chrome浏览器(48.65%)已经超越 ie(31.65%)的市场份额。这里提醒,还在用ie老版本的朋友们,赶快升级吧。
websocket之前
大家可能会有疑问,2011年websocket才最终定稿,那么之前如何实现像聊天室之类的实时应用呢?答案是:使用tcp编程。所以像qq这样的聊天程序,腾讯需要自己开发私有的sdk来实现。如果今天开发qq聊天程序,直接拿websocket来用就好了,浏览器、客户端程序、服务器程序、各种编程语言都已经开发了现成的websocket库函数,可以直接调用。底层的通信协议和实现细节不用再考虑了。
http和websocket的编程对应于osi七层协议中的第七层,而tcp编程在第三层。从编程角度来说,层次越高,编码越简单。原理类似于,程序员用c语言编程还是python编程一样,python写几句话,c可能需要写几页的程序。
总结
在web开发之前是没有保持长链接的协议,websocket的诞生使其从无到有,全双工、实时、高效,websocket迎合了实时通讯的需求。


俄罗斯西伯利亚地区伊尔库茨克市的市民都在使用加密货币矿机取暖
电力晶体管(GTR)
启用蔚来ES8自动辅助驾驶发生事故,美一好创始人去世
葡萄美酒夜光杯之智能变色杯垫DIY
4610-050-060加速度计在旋转机器中的应用
为什么客户不直接控制智能家居网关,而要使用云服务器做中转?
PCB压合问题解决方法
AI治理怎样做到趋利避害
iPad的新对手到来,小米平板5即将亮相
电池修复技术之“绝色双胶”粘固技术篇!
赛腾微推动新能源汽车电控SoC芯片产业化,力争实现国产替代
丰田CUE类人机器人创造了新记录 连续执行篮球罚球次数最多
联想最新推出AnyPen触控技术
饲料厂环境非洲猪瘟病毒检测方案
什么是独石电容,它的工作原理是什么?电容引脚折断的处理方法
多线程常见锁策略+CAS介绍
服务器数据恢复-RAID5常见故障有哪些?如何恢复数据?
机器视觉技术会推动工业自动化的不断创新吗
智能是传感器的未来发展方向
单片机蜂鸣器控制程序和驱动电路典型设计案例