很庆幸成为腾讯云TencentOS嵌入式操作系统的试用者,能够尝鲜使用腾讯云“嵌入式操作系统 IOT开发板 腾讯云IOT服务”的全套开发套件。本文结合这次试用的IOT设备以及日常工作的项目经历和生活中碰到的问题,以一个小系统作为尝试,体验和学习TencentOS和IOT设备。
一、 场景及方案:
试想几个场景,刚刚过去的炎热的夏天,每当我们从外面回到家中难免会大汗淋漓,即使你家的空调很智能可以声控,那等屋子里面凉快了,也需要忍受比较久的闷热;另外,随着大家环保意识的增强,部分家庭会选择在主人离家时关闭一些高耗能电器的电源,在回家时再打开使用。但是在一些电器上会造成一些不便,比如热水器,它是一个耗能较高、使用频次较低的电器,但是每次想洗澡又需要较长的烧水的时间。因此很多人为了嫌麻烦(每次进出门要开关电源)同时为了方便使用,就长时间开启一些高功耗电器,耗能的同时也埋下了一些安全隐患(电路起火)。
本文的设备,利用嵌入式设备“携带方便”、“功耗极低”的特性,将本文的系统设备定位成“智能助手”的身份,给予人们随身的关怀和帮助。同时,作为一个“秘书”随时与家中的智能家居设备联系并汇报主人的信息,给智能家居设备提供更广的服务空间。本文所描述的“物联网智能家居系统”期望将家居智能设备的生命周期延长。从人处于居家的场景,拓展至人处于家外的场景。给各个家居设备提供更广阔的服务空间和能力支撑。
作为使用者,我们也从“服务的发起方”变成“服务的享受者”。你只需要和平常一样生活,“秘书”会默默帮你把你即将需要的服务送到你身边。
二、 系统概述:
IOT嵌入式设备作为用户的随身秘书,伴随人(或置于用户车中等)作为人们的“户外智能枢纽”。同时用户家中部署一个智能设备中枢作为“家居智能枢纽”。以此二者的信息交互,拓展智能家居的服务场景空间。
“户外智能枢纽”通过集成各种传感器,识别用户的行为和习惯(如手环识别用户的健身、游泳行为等),并将其随时与“家居智能枢纽”通信交互,使家居设备给予响应的服务响应,如准备打开热水器,方便健身完的主人回家后洗澡(为了节约能源,可以通过识别用户位置处于家附近的1km以内时开始启动热水器电源)。
“家居智能枢纽”作为家庭服务器,为“户外智能枢纽”提供Internet服务。同时,作为家庭电器设备的统一接入智能枢纽,提供智能指令的输出并对各设备进行管理。
因此,后文主要以一个简单的场景,围绕“户外智能枢纽”和“居家智能枢纽”来介绍一个典型的系统,实现一个简单的“回家问候”的功能来表征二者的交互逻辑和系统架构。
系统的软件架构如下:
三、 客户端(嵌入式开发板):
1. 硬件及HAL:
系统采用TencentOS Tiny(腾讯IOT嵌入式操作系统开发板)作为硬件载体。其中主要包含一颗STM32L4的MCU,以及WIFI8266、OLED以及模块扩展槽等。
操作系统中通过HAL对硬件进行抽象,从源码中看已经适配了多种设备。
2. 操作系统:
IOT设备采用TencentOS Tiny操作系统。TencentOS tiny是腾讯面向物联网领域开发的实时终端操作系统,具有低功耗,低资源占用,模块化,可裁剪等特性。TencentOS tiny提供最精简的RTOS内核,内核组件可裁剪可配置,可灵活移植到多种终端MCU上。而且,基于RTOS内核,提供了COAP/MQTT/TLS/DTLS等常用物联网协议栈及组件,同时腾讯云IoT Hub接入能力,方便应用开发方快速接入。其整体架构如下图所示:
3. 业务层:
在TencentOS Tiny中内置了MQTT/CoAP等常用的物联网协议栈。Wywan在内核的TCP协议栈的基础上,开发扩展了一个简单的Http的协议组件,使得设备可以以更加简洁的方式与后台系统交互数据及服务。当然,通过MQTT等协议接入腾讯云IOT Hub将是更加通用的方案,但是本系统立足与智能家居的智能枢纽服务器进行交互,因此额外引入了Http协议开发工作。由于只是实现了协议比较基础的逻辑,相关代码也比较简单,不在文中赘述,简单的使用方式如下图,设备通过Http回传自身位置信息(25996d60m3.wicp.vip是家中服务器的外网域名,稍后介绍)。
从上图的使用不难发现,其请求逻辑相对比较简单。设备通过GPS模块获取用户实际位置,并结合WIFI模块及TCP&Http协议栈将数据回传给服务端,有服务端进行相关的业务逻辑处理后将结果返回。在终端设备上以OLED模块以及LED进行相关状态的输出和展示。
四、 服务端(猫窝....不是,树莓派):
1. 设备:
采用一台树莓派作为服务器,树莓派搭载Ubuntu操作系统。这里我专门重新刷的Ubuntu,但是使用体验其实远不如Raspberry操作系统的体验好,原本的GPIO的驱动也不能用了,本来可以基于树莓派的GPIO展现一些更为复杂的智能家居逻辑的。这里后面的展示说明用另外的方式来补救了一下,后述。
2. 服务器网络:
由于系统的使用场景中,IOT设备处于外网环境,这要求服务端具备外网可访问的能力。因此借助树莓派平台在家中搭建一个具有外网访问环境的服务器系统。由于目前手中只有一个树莓派设备,因此下述架构的所有模块均同机部署,整体架构如下图所示:
- NAT穿越:由于家中的网络不具备公网IP,和运营商协商的成本较高可行性较差。因此系统采用NATP打洞的方式,部署外网域名并穿越回家中的服务器。该NAT打洞实现的穿越有诸多成熟的系统方案,本系统也是直接套用现有穿越系统结构,不做赘述了(可能有广告嫌疑)。
- Nginx反向代理和负载均衡:系统采用Nginx实现Http接入的反向代理和负载均衡,具体的部署和配置无需赘述。其实以当前项目而言,系统对这一层级的系统部署要求不高(业务复杂度和性能要求均较低)。
- Server:实际业务处理服务。该服务运行于一个Wywan之前学习框架时练习自建的一个小的多线程网络框架,很不严谨但是能够粗略的实现一些服务能力。框架中的部分模块源码取自Taf-Cpp。该网络框架支持Http的应用层协议,处理“IOT设备”发送的Http请求并给予简单的回应。
3. 服务端业务逻辑:
所谓地理围栏是指是LBS的一种新应用,就是用一个虚拟的栅栏围出一个虚拟地理边界。当移动设备进入、离开某个特定地理区域,或在该区域内活动时,手机可以接收自动通知和警告。有了地理围栏技术,位置社交网站就可以帮助用户在进入某一地区时触发相关的服务逻辑。
本文介绍的系统由于时间比较紧(一周左右完成)且只是处于demo阶段,所实现的地理围栏算法非常简单,也并未使用一些地理围栏领域比较成熟的Gis算法优化,只是简单处理了点和多边形的关系(射线法)。同时地理围栏的边界数据也是直接HardCode到服务代码中。
4. 效果展示部分:
前面章节说了一下重刷系统导致驱动不可用的尴尬,由于录制视频已经临近任务提交,因此当时重新刷回Raspberry并调试服务端的整个接入逻辑时间浪费比较多(懒了。。)。因此我额外接入了笔记本作为智能家居部分的效果展示,系统结构如下图。
如图所示可以看出,在原本“IOT-Raspberry Pi”的二元CS结构外新增了一个Mac的模块用于展示。该模块的作用主要就是为了在视频拍摄过程中,当IOT设备触发地理围栏时候,能够在音视两个维度展现效果,详细的可以参见演示视频的效果。
实际的使用中,其实并不需要Mac这样浮夸的展现效果,通常树莓派直接操控智能设备即可(操作市电要注意安全,可以通过一些中间件设备操控,如成熟商用的可编程智能插座),如果需要音视效果,也可以直接让树莓派连接音响和屏幕输出。由于我家里没有可用的外接音箱和屏幕,所以就绕了一圈,在IOT设备进入地理围栏时,树莓派touch一下Mac上面运行的服务,Mac直接触发音视频效果。
五、 演示视频:
由于文内只能嵌入腾讯视频的链接,所以演示视频请移步下面的链接。
YouTube:https://youtu.be/m0_hujOQp7I
Bilibili:https://www.bilibili.com/video/av65561146
六、 小彩蛋:
前文介绍服务端结构时,为了本项目搭建了一个极简地理围栏的可供外网使用的服务。突然想到可以形成一个小游戏:猜位置。
服务域名和请求格式如下,参数采用lon(经度)lat(维度)表示当前位置(乘以10^5)。如果参数位于演示中的地理围栏以外则返回HelloWorld,如果在小区的范围内则返回home。大家可以尝试变换参数点击,如果命中围栏可联系Wywan领一个小小红包(前3个)。
本来想改改服务,每次猜测后给予提示(往左,往右等),后来觉得其实前面的介绍中已经基本透露了具体位置了,因此应该比较简单哈。
http://25996d60m3.wicp.vip/?lon=11627390&lat=4003996