【IoT迷你赛】基于Tos开发板和Wi-Fi探针技术实现“无感体验”iot生活

2019-08-28 12:59:06 浏览数 (1)

文章目录:

  1. 导语
  2. 开发背景
  3. TencentOS Tiny简介
  4. Wi-Fi探针技术简介
  5. Demo整体方案设计
  6. 开发环节
  7. 演示效果展示
  8. TO-DO List
  9. 尾巴
  10. 总结

导语:

物联网是新一代信息技术的重要组成部分,也是“信息化”时代的重要发展阶段。世界上的万事万物只要嵌入一个微型芯片都能把它智能化,借助物联网技术,人们就可以和物体对话,物体和物体之间进行交流。

物联网物联网

开发背景:

在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探测技术,自动采集特定范围内已开启wifi功能的移动终端设备(Android或IOS智能手机、手提电脑、平板等)并获取设备MAC层协议数据单元中的信息的一种硬件。这样说可能有点抽象,举个栗子: 我们平时使用的手机在与路由器进行无线通信过程中,会发射和接收无数以802.11协议封装的数据报文,当一个设备给另外一个设备通过无线网络发送这些报文时,周围的其他同类设备都是能够收到这些信息的,WiFi探针技术就是基于这个原理。(关于Wi-Fi探针技术的原理讲解,后面有时间单独写一篇文章来介绍)

Demo整体方案设计:

该方案主要由三个部分组成:

  1. 基于TencentOS tiny开发板(后面简称tos开发板)的控制模块;
  2. 基于ESP8266NodeMCU的MQTT服务端(Broke)和ESP-01的Wi-Fi探针嗅探模块;
  3. Android平台APP控制端;
Demo方案Demo方案

当探针嗅探模块探测到用户手机的无线数据包时,会发送开灯指令给tos开发板,tos开发板在收到指令后会根据指令内容来控制LED灯。在用户离开家后,3分钟内探针嗅探不到用户的手机的无线数据包,会发送关灯指令给tos开发板引导其关闭LED灯。用户在家时,可以通过APP控制来改变硬件的状态,APP也是通过局域网接入到服务器。三者之间的通信是在局域网内通过MQTT协议来实现。

开发环节:

需要的硬件:

  1. TencentOS tiny开发板
  2. ESP8266NodeMCU开发板
  3. ESP-01联网模块(探针)

控制模块和LED灯的实现:

控制模块开发板:EVB_MX是腾讯物联网操作系统TencentOS tiny 团队联合南京厚德物联网有限公司设计的一款物联网评估板,用于 TencentOS tiny 基础内核和 IoT 组件功能体验和评估。

TencentOS Tiny开发板TencentOS Tiny开发板

LED灯源的选择:为了缩短开发时间,直接使用了开发套件提供的E53_SC1模块中的LED灯。

E53_SC1E53_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是一块由乐鑫设计的 wifi 芯片,虽然它的定位是个 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具备的能力:

  1. 帮助NodeMCU模块智能配网(通过SmartConfig方式)
  2. 远程控制改变LED灯的状态(亮度,定时模式,睡眠模式,闪烁模式)
  3. 检测联网设备状态(是否在线,离线时辅助重连)
  4. 支持控制更多设备(由于时间关系目前只实现了控制LED)

设备最终形态:

演示效果展示:

运行日志:

NodeMCU MQTT服务端Log:

Tos开发板Log:

视频演示:

https://www.bilibili.com/video/av65660874

TO-DO List:

  1. 接入腾讯云物联网通信IoT Hub平台,实现非局域网内控制设备(因为时间关系,虽然运行了官方的Demo,但没来得及接入)
  2. 探针支持通过APP配置目标用户MAC地址(多个)
  3. 设备状态改变时PUSH到APP端
  4. 引入更多设备,如小风扇,智能插座等
  5. 性能强大的Tos开发板用来当控制模块确实有点大材小用了,后面深入学习后会考虑与NodeMCU的角色互换
  6. 改进设备配网方式,SmartConfig有点慢

尾巴:

相信大家看完文章后会有很多疑问,OK,请继续往下看。。。

有问有答

1,为什么会选择WiFi探针技术来尝试?用红外或其他传感器辅助不行吗?

答: 我们以“无感体验“开关灯的例子来对比分析一下使用红外传感器会有什么缺点:首先要确保安装的位置对准用户常出现的地方,如果用户在家里走动,还要安装多个传感器保证时刻感知到用户的存在,不然会导致灯突然被熄灭。而使用wifi探针无需顾虑这么多因素,只要用户出现在探针的嗅探范围内(半径10米),并且手机打开了WiFi功能,不管用户有没有连接上路由器,他的无线数据包都能被探测到,从而进行网络通信实现控制操作(据观察,大部分用户手机的WiFi功能出门或者回家很少会手动关闭,当然打游戏除外)。当然,使用探针来实现并不是完美的方案,个人觉得通过gps加地图的地理围栏技术来实现也许会更好,但是能想到的限制也不少,首先是gps数据如果从自己开发的硬件来,那就得让用户时刻携带着设备了,然后如果是从手机的gps数据来,那用户的手机需要安转必备的app来发送gps心跳包,而且Android用户还要确保应用不被强杀后台。两个数据来源都是为了gps数据正常传输,不然无感体验都会失效。大家看到这里,如果有新的无感体验idea,欢迎留言。

2,如果手机在家没有开启WiFi功能,3分钟后灯是不是会自动熄灭?

答:是的,因为探针的工作原理是基于接收到802.11协议无线数据包并解析其中的mac地址内容来识别用户的,关闭了WiFi功能等同于手机就不再发出此类型数据包。

所以无感设备就无法正常工作了。

3,只有手机连接上了路由器,无感设备才能正常工作吗?

答:这个不是必须的,平时我们的智能手机只要开启了WiFi功能,它就会不间断地发送无线数据包与周围的路由器通信,尝试建立连接。感兴趣的小伙伴可以Google搜索 802.11协议的probe帧

4,文章围绕了无感体验四个字来展开的,但是看完了之后没有感觉到无感体验在哪里体现在出来?

答:请注意,文章中的无感体验使用了双引号来括住,所以这里说的无感体验并不是真正意义上的无感。我来说一下日常使用的测试场景和感受:外出上班离开家,家里面的探针在一定的时间段内暂时捕获不到我的无线数据包。因为探针的数据包会上传到服务端,由服务端进行处理,这时服务端在一定时间段内未match到用户,然后随即下发断电指令至家里面的无线控制终端,如Tos开发板控制LED灯,终端收到后执行关闭操作;然后是用户下班回家,在未进家门时(可能还在楼道里)探针会优先捕获到用户的无线数据包并发送到服务端,服务端处理并识别到用户后随即下发通电指令给控制终端,控制终端收到后执行打开操作。当你打开门的一瞬间,就会发现,家里的智能设备已经按部就班地工作了。

总结:

笔者是一名STM32 MCU开发小白,本着会一点ESP8266开发的勇气申请了Tos开发板的内测资格。没想到运气还不错,居然命中了。不过在拿到开发板后,看着做工精良,布局工整的板子,当时一脸蒙逼的我真不知从何下手,还好官方提供了详细的文档以及基础的入门案例,便愉快的学了起来。由于时间关系,还没有深入的学习,文章中对Tos开发板的分析也只是浮于表面,简单讲了自己使用的一小部分功能。当然,甩出来的todo list的锅自己还是会背的。后面有时间我们再会。

开发花絮开发花絮

0 人点赞