文章目录:
导语
开发背景
TencentOS Tiny 简介
Wi-Fi 探针技术简介
Demo 整体方案设计
开发环节
演示效果展示
TO-DO List
尾巴
总结
导语:
物联网是新一代信息技术的重要组成部分, 也是 "信息化" 时代的重要发展阶段. 世界上的万事万物只要嵌入一个微型芯片都能把它智能化, 借助物联网技术, 人们就可以和物体对话, 物体和物体之间进行交流.
物联网
开发背景:
在 iot 技术发达的未来, 越来越火的智能生活是否可以最大化地减少用户和硬件之间的交互, 让用户无感知来体验智能生活, 相信这样的方式是十分诱人的, 例如: 智能硬件不仅能感知家里是否有人, 还能感知主人在回家的路上, 又或者是已经离开家一会了, 进而在主人回到家之前和离开家之后, 帮助他完成一系列的日常操作, 如晚上开关灯, 夏天开关风扇, 空调, 冬天开关暖气或者热水器等, 这些操作对于用户是无感知的, 都由硬件自己来完成, 硬件在这里犹如充当了贴心管家的角色. 如果用户在家时需要改变硬件的状态, 就可以通过 App 或者语音交互的方式来操作. PS: 现在的技术应该还不能做到通过人的意念来控制设备.
在前不久华为发布了基于鸿蒙系统的荣耀智慧屏, 当时在网上也看了很多博主的体验视频, 印象最深的一个地方是当使用者对这荣耀智慧屏喊一声 "我回家了", 智慧屏就会自动开启窗帘, 电灯, 空气净化器等智能设备. 当时也为这一系列的智能化操作惊叹了许久, 但惊叹过后总感觉还是有一点遗憾, 因为感觉它与很多传统智能硬件相同, 依旧没有将方便用户生活做到极致, 可能荣耀智慧屏也在向这关键性的一步改进着.
因此, 为了实现 "无感体验" 这个想法, 在很荣幸拿到 TencentOS tiny 内测开发板后, 想结合之前实习时研究的 Wi-Fi 探针技术来实现一套用户 "无感知体验" 的智慧生活解决方案. PS: 说的有点高级, 其实只是个 demo, 也并不是完全的无感知, 哈哈. 下面我们开始进入正题.
TencentOS tiny 简介:
TencentOS tiny 是面向物联网领域开发的实时操作系统, 具有低功耗, 低资源占用, 模块化, 可裁剪等特性. TencentOS tiny 可以有效减少开发人员在任务管理, 硬件支持, 网络协议支持, 安全方案以及文件系统, KV 存储, 在线升级等常用功能组件相关的开发中所需要的时间和工作量, 并且能够快速高效的实现设备的低功耗运行, 提供强大的开发调试功能, 减少开发测试人力成本, 使客户的产品能够实现快速开发和快速上线交付. TencentOS tiny 由一个轻量级 RTOS 内核 + 多个物联网组件构成, 如下图所示.
Wi-Fi 探针技术简介:
Wi-Fi 探针是指基于 Wi-Fi 探测技术, 自动采集特定范围内已开启 Wi-Fi 功能的移动终端设备 (Android 或 iOS 智能手机, 手提电脑, 平板等) 并获取设备 Mac 层协议数据单元中的信息的一种硬件. 这样说可能有点抽象, 举个栗子: 我们平时使用的手机在与路由器进行无线通信过程中, 会发射和接收无数以 802.11 协议封装的数据报文, 当一个设备给另外一个设备通过无线网络发送这些报文时, 周围的其他同类设备都是能够收到这些信息的, Wi-Fi 探针技术就是基于这个原理.(关于 Wi-Fi 探针技术的原理讲解, 后面有时间单独写一篇文章来介绍)
Demo 整体方案设计:
该方案主要由三个部分组成:
基于 TencentOS tiny 开发板 (后面简称 tos 开发板) 的控制模块;
基于 ESP8266NodeMCU 的 MQTT 服务端 (Broke) 和 ESP-01 的 Wi-Fi 探针嗅探模块;
Android 平台 App 控制端;
Demo 方案
当探针嗅探模块探测到用户手机的无线数据包时, 会发送开灯指令给 tos 开发板, tos 开发板在收到指令后会根据指令内容来控制 LED 灯. 在用户离开家后, 3 分钟内探针嗅探不到用户的手机的无线数据包, 会发送关灯指令给 tos 开发板引导其关闭 LED 灯. 用户在家时, 可以通过 App 控制来改变硬件的状态, App 也是通过局域网接入到服务器. 三者之间的通信是在局域网内通过 MQTT 协议来实现.
开发环节:
需要的硬件:
TencentOS tiny 开发板
ESP8266NodeMCU 开发板
ESP-01 联网模块(探针)
控制模块和 LED 灯的实现:
控制模块开发板: EVB_MX 是腾讯物联网操作系统 TencentOS tiny 团队联合南京厚德物联网有限公司设计的一款物联网评估板, 用于 TencentOS tiny 基础内核和 IoT 组件功能体验和评估.
TencentOS Tiny 开发板
LED 灯源的选择: 为了缩短开发时间, 直接使用了开发套件提供的 E53_SC1 模块中的 LED 灯.
E53_SC1
控制 LED 灯, 可以通过控制 STM32(TOS 开发板的芯片属于 stm32 系列)芯片的 I/O 引脚电平的高低来实现. 在 STM32 芯片上, I/O 引脚可以被软件设置成各种不同的功能, 如输入或输出, 所以又被称为 GPIO. 而 GPIO 引脚又被分为 GPIOA,GPIOB,... 等不同的组, 每组端口分为 0-15 共 16 个不同的引脚. 在 E53_SC1 模块中, 想要控制其 LED 灯, 则可以通过控制 GPIO_PIN_9 引脚来实现.
首先进行 GPIO 引脚的初始化操作:
在代码清单中, 定义了一个名为 GPIO_InitStruct 的结构体, 结构体类型为 GPIO_InitTypeDef. 重点来看一下 GPIO_InitTypeDef 类型的三个成员, 分别为 uint16_t 类型的 GPIO_Pin,GPIOSpeed_TypeDef 类型的 GPIO_Speed 以及 GPIO_TypeDef 类型的 GPIO_Mode.
GPIO_Pin: 代码中我们为 GPIO_Pin 变量赋值为 GPIO_Pin_9, 表示我们选择了控制 GPIO 端口的第 9 个引脚.
GPIOSpeed_TypeDef 可用于标识 GPIO 引脚可以配置成的输出最高速度. 这个最高速度我们可以理解为输出驱动电路的最高频宽, 即一个驱动电路可以不失真地传输讯号的最大频率, GPIO 引脚的速度跟应用相匹配, 速度配置越高, 干扰会越大, 功耗越大. 这里只要到了 E52_SC1 模块中的小 LED 灯, 因此我们设置为低频即可.
GPIOMode_TypeDef 是一个枚举类型定义符, 有 8 种不同的值, 原型如下, 是用来帮助配置 GPIO 引脚的输入输出工作模式.
在 Demo 中, 只用到了引脚输出的高低电平来控制 LED 灯, 因此代码中选择了 GPIO_MODE_OUTPUT_PP 推挽输出的工作模式. 当然, 如果我们需要获取传感器采集的数据, 可以按需选择输入模式来工作.
LED 控制程序:
HAL_GPIO_WritePin:
开灯: 传入 GPIO_PIN_SET 标志位可以控制引脚输出高电平
关灯: 传入 GPIO_PIN_RESET 标志位可以控制引脚输出低电平
TencentOS Tiny 对 OLED 显示屏的操作进行了封装, 调用 OLED_Clear()可以将显示屏清空, 调用 OLED_ShowString()传入字符内容就在显示屏上显示出想要的文字内容.
MQTT 协议部分:
MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议), 是一种基于发布 / 订阅 (publish/subscribe) 模式的 "轻量级" 通讯协议, 该协议构建于 TCP/IP 协议上, 由 IBM 在 1999 年发布. MQTT 最大优点在于, 可以以极少的代码和有限的带宽, 为连接远程设备提供实时可靠的消息服务. 做为一种低开销, 低带宽占用的即时通讯协议, 使其在物联网, 小型设备, 移动应用等方面有较广泛的应用
Demo 中 Tos 开发板作为 MQTT 客户端来使用.
初始化并订阅控制信号 Topic:
监听接收到的数据包:
注: 这里处理方式并不完美, 后续会尝试使用多任务来实现
收到控制指令, 开发板改变完 LED 的状态后会回复已经操作的数据给 MQTT 的服务端(ESP8266 开发板), 程序清单如下:
探针嗅探模块和 MQTT 服务端的实现
ESP8266 是一块由乐鑫设计的 Wi-Fi 芯片, 虽然它的定位是个 Wi-Fi 网络解决方案, 但它更像一个物联网解决方案. 它不仅体积小 -- 大概 11*10 毫米左右, 而且造价便宜, 一个 ESP8266 的集成板只需要十几块. 相比之下, 在同等类似的芯片中, WRTNode 需要一百多, 而 Particle(Spark Core)则需要更多的花费. 目前用的比较多的 ESP8266 模块是 ESP-01 和 NodeMCU.
ESP-01 的体积很小, 而且为直插式, 复用性也很好, 只是它引出了 8 个脚, 使得针脚的资源十分紧张. 对于编写好的新固件, 要自己准备 USB 转串口烧录工具来烧录, 同时烧录的过程中要注意 CH_PD 引脚置 3.3v 高电平, GPIo0 引脚置低电平. 新手建议直接入手 NodeMCU 模块, 可以直接通过 usb 线来烧录.
NodeMCU 是一款基于 ESP8266 的开源快速硬件原型平台, 包括固件和开发板, 借助于官方封装好的 SDK, 开发者能快速开发物联网应用.
Demo 中, 主要借助 ESP-01 实现探针嗅探模块, NodeMCU 来实现 MQTT 协议的服务端模块, 同时 NodeMCU 可以通过串口接收 ESP-01 探针嗅探并匹配到的用户的数据, 从而进一步通过局域网来远程控制 Tos 开发板.
代码清单:
发布到 tos 开发板和订阅来自 tos 开发板的 Topic:
NodeMCU MQTT 服务端初始化并处理数据回调逻辑:
LazyBox 终端 App 实现
如果只是实现前面的几个环节, 硬件已经初步具备了 "无感体验" 的能力, 但它是不完整的, 因为无法满足使用者在家手动改变设备状态这个需求. 这时, 可以借助终端 App 来实现.
终端 App 具备的能力:
帮助 NodeMCU 模块智能配网(通过 SmartConfig 方式)
远程控制改变 LED 灯的状态(亮度, 定时模式, 睡眠模式, 闪烁模式)
检测联网设备状态(是否在线, 离线时辅助重连)
支持控制更多设备(由于时间关系目前只实现了控制 LED)
设备最终形态:
演示效果展示:
运行日志:
NodeMCU MQTT 服务端 Log:
Tos 开发板 Log:
视频演示:
- https://www.bilibili.com/video/av65660874
- TO-DO List:
接入腾讯云物联网通信 IoT Hub 平台, 实现非局域网内控制设备(因为时间关系, 虽然运行了官方的 Demo, 但没来得及接入)
探针支持通过 App 配置目标用户 Mac 地址(多个)
设备状态改变时 PUSH 到 App 端
引入更多设备, 如小风扇, 智能插座等
性能强大的 Tos 开发板用来当控制模块确实有点大材小用了, 后面深入学习后会考虑与 NodeMCU 的角色互换
改进设备配网方式, SmartConfig 有点慢
尾巴:
相信大家看完文章后会有很多疑问, OK, 请继续往下看...
有问有答
1, 为什么会选择 Wi-Fi 探针技术来尝试? 用红外或其他传感器辅助不行吗?
答: 我们以 "无感体验" 开关灯的例子来对比分析一下使用红外传感器会有什么缺点: 首先要确保安装的位置对准用户常出现的地方, 如果用户在家里走动, 还要安装多个传感器保证时刻感知到用户的存在, 不然会导致灯突然被熄灭. 而使用 Wi-Fi 探针无需顾虑这么多因素, 只要用户出现在探针的嗅探范围内(半径 10 米), 并且手机打开了 Wi-Fi 功能, 不管用户有没有连接上路由器, 他的无线数据包都能被探测到, 从而进行网络通信实现控制操作(据观察, 大部分用户手机的 Wi-Fi 功能出门或者回家很少会手动关闭, 当然打游戏除外). 当然, 使用探针来实现并不是完美的方案, 个人觉得通过 gps 加地图的地理围栏技术来实现也许会更好, 但是能想到的限制也不少, 首先是 gps 数据如果从自己开发的硬件来, 那就得让用户时刻携带着设备了, 然后如果是从手机的 gps 数据来, 那用户的手机需要安转必备的 App 来发送 gps 心跳包, 而且 Android 用户还要确保应用不被强杀后台. 两个数据来源都是为了 gps 数据正常传输, 不然无感体验都会失效. 大家看到这里, 如果有新的无感体验 idea, 欢迎留言.
2, 如果手机在家没有开启 Wi-Fi 功能, 3 分钟后灯是不是会自动熄灭?
答: 是的, 因为探针的工作原理是基于接收到 802.11 协议无线数据包并解析其中的 Mac 地址内容来识别用户的, 关闭了 Wi-Fi 功能等同于手机就不再发出此类型数据包.
所以无感设备就无法正常工作了.
3, 只有手机连接上了路由器, 无感设备才能正常工作吗?
答: 这个不是必须的, 平时我们的智能手机只要开启了 Wi-Fi 功能, 它就会不间断地发送无线数据包与周围的路由器通信, 尝试建立连接. 感兴趣的小伙伴可以 Google 搜索 802.11 协议的 probe 帧
4, 文章围绕了无感体验四个字来展开的, 但是看完了之后没有感觉到无感体验在哪里体现在出来?
答: 请注意, 文章中的无感体验使用了双引号来括住, 所以这里说的无感体验并不是真正意义上的无感. 我来说一下日常使用的测试场景和感受: 外出上班离开家, 家里面的探针在一定的时间段内暂时捕获不到我的无线数据包. 因为探针的数据包会上传到服务端, 由服务端进行处理, 这时服务端在一定时间段内未 match 到用户, 然后随即下发断电指令至家里面的无线控制终端, 如 Tos 开发板控制 LED 灯, 终端收到后执行关闭操作; 然后是用户下班回家, 在未进家门时 (可能还在楼道里) 探针会优先捕获到用户的无线数据包并发送到服务端, 服务端处理并识别到用户后随即下发通电指令给控制终端, 控制终端收到后执行打开操作. 当你打开门的一瞬间, 就会发现, 家里的智能设备已经按部就班地工作了.
总结:
笔者是一名 STM32 MCU 开发小白, 本着会一点 ESP8266 开发的勇气申请了 Tos 开发板的内测资格. 没想到运气还不错, 居然命中了. 不过在拿到开发板后, 看着做工精良, 布局工整的板子, 当时一脸蒙逼的我真不知从何下手, 还好官方提供了详细的文档以及基础的入门案例, 便愉快的学了起来. 由于时间关系, 还没有深入的学习, 文章中对 Tos 开发板的分析也只是浮于表面, 简单讲了自己使用的一小部分功能. 当然, 甩出来的 todo list 的锅自己还是会背的. 后面有时间我们再会.
开发花絮
来源: https://www.qcloud.com/developer/article/1494345