从一个WiFi模块谈起

WiFi模块可以说是在目前物联网产品中使用较多的模块。这篇文章从一个小小的WiFi模块开始,去一步一步摸索物联网的万物皆文件的特性,是我对前面一篇文章的进一步思考。本文展示的是一种思路,思路是清晰的,但可能表达的不是很好,有待于后续的整理与补充。

WiFi模块目前发挥的作用:
目前WiFi模块内部主要是MCU,微控制器,价格比较低廉,比较知名的有乐鑫的esp8266。这种MCU为主控的注定了模块一般不会去做处理器的重活,而且一般MCU我们主要侧重点是control(驱动、外设)、connect。MCU不是DSP,一般也没有NPU等核,频率也不高,存储容量也不大,算法全放在MCU上跑是比较吃力的,而且容易达到其上限。

对于WiFi模块,我们主要关注的是control、data transfer。而且目前可以看到的是,很多WiFi模块在项目中起到的作用还是串口数据透传,没有充分挖掘WiFi模块能够提供的能力。

一般WiFi模块的使用:
control:
in - sensor
out - controller
in/out - 其他device

data transfer:
could service: wifi -> internet -> webservice
webservice: 一些拿mcu wifi模块自己做的云、开放的物联网平台等。

wireless data transfer:
other device.

对于我们个人开发者来说,除了利用WiFi模块完成项目里所需要的功能后,往往还会考虑一个问题:WiFi模块还可以用来做什么?

思考:
wifi模块可以用来做什么?
绝大部分是硬件处理后的数据传输,交互。

如果像windows电脑的设备管理器一样,WiFi模块能够管理所有局域网内的设备?
what if device tree managered by wireless connect?

怎么做

1.从头开始:
第一阶段:
moblie app:
第一小步:
移动版的串口调试助手
uart data transfer through wifi or bt,
like uart asistant on pc.
(基本功能)
串口收发数据,ascii、hex
receive and send uart data.
用途:
发送指令,send control code
获取传感器信息, get sensor status
甚至解析摄像头传过来的图像数据,
或者调试系统,系统的console:协议、图像、指令
特点:
移动端上功能全面,性能出色,使用方便的调试助手。

第二小步:
增强链接,传感器增强:
1.移动端可以使用指令调用板子上的传感器资源,以及控制设备。
2.模块端可以使用指令调用移动端上的资源,比如手机上的传感器:陀螺仪、gps等,手机摄像头拍照,数据网,短信,电话等。
用途:
1.移动端可以方便的获取板子传感器数据以及控制板子上设备的功能。
2.以一个便宜的WiFi/蓝牙模块就可以调用手机上丰富的功能,极具性价比。

第三小步:
直接远程输入执行脚本(lua)
在node mcu中本身就可以通过串口执行各种脚本。
两个方式:
1.WiFi接收的数据透传到uart,让接着串口的系统可以执行脚本运行程序(本身串口调试助手就可以)
2.在node mcu的基础做支持WiFi远程执行lua脚本的功能。
调用比第二小步中的指令执行更加灵活。实际上串口传输的是字符串,然后本地解释器解释执行。不会有函数返回结果,相当于远程console。

第四小步:
Over-the-Air Upgrade (OTAU)
The OTAU bootloader is able to load an application image, which has been received by the application over the air and saved in an external memory device, and program it into the internal flash memory.
level 1:
application:script code (lua、python)
level 2:
firmware,中间件,协议栈更新
level 3:
系统更新
system image update

第五小步:
RPC 是远程过程调用
Remote Procedure Call
RPC 是指计算机 A 上的进程,调用另外一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行,当值返回给 A 时,A 进程继续执行。调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。
在移动端上运行的程序的函数是调用WiFi模块的,通过远程过程调用进行无缝调用。

2.设备文件系统雏形
第二阶段:
第一小步:
WiFi模块只要连接接到手机,或者与手机在同一个局域网下。手机端可以视WiFi模块为一个设备文件系统。
WiFi模块里所有可用资源,如外部传感器、接口、io、控制器、甚至自己的文件系统、自定义的数据处理、加解密的算法、功能、与控制逻辑等,都以文件的形式可被手机访问到。只要手机有合适的权限,那么像访问文件一样,只要挂载上,就可以远程调用任何支持的资源。(WiFi模块对于手机的查看就相当于window的设备管理器)
比如,一个WiFi网络内的一个模块的设备树:
根:192.168.1.10/esp_wifi_device
硬件层:
./esp_wifi_device/hardware/sensor1
./esp_wifi_device/hardware/sensor2
./esp_wifi_device/hardware/control1
./esp_wifi_device/hardware/control2
./esp_wifi_device/hardware/uart1
./esp_wifi_device/hardware/spi
系统层:
./esp_wifi_device/system/http
./esp_wifi_device/system/wifi
./esp_wifi_device/system/encrypt
./esp_wifi_device/system/embeded function1
./esp_wifi_device/system/embeded function2
./esp_wifi_device/system/status
应用层:
./esp_wifi_device/app/application1
./esp_wifi_device/app/application2

lua脚本,可远程调用函数执行。

第二小步:
wifi模块同样可以视手机为一个设备文件系统,只要有合适的权限,可以使用手机设备文件抽象出的各种功能:
例如:一个wifi网络内的手机的设备树:
根:192.168.1.11/android_phone
硬件层:
./android_phone/gps
./android_phone/sms
./android_phone/sensor1
./android_phone/sensor2
./android_phone/camera1
./android_phone/camera2
./android_phone/bluetooth
./android_phone/wifi
./android_phone/mobiledata
./android_phone/nfc

系统层:
./android_phone/console
./android_phone/adb
./android_phone/system_app1

框架(库)层:
./android_phone/python
./android_phone/opencv
./android_phone/tensor_flow

软件层:
./android_phone/app1
./android_phone/app2
./android_phone/app3

最终效果:
包括计算机在内的一系列设备,甚至一些专用仪器都可以使用这套框架。该框架可以集成在IOT系统中作为一个基础设施存在,同时对于目前已有的物联网云来说,整个结构都需要重新设计,以适应这种面向文件操控而不是数据操控的访问方式。
最终实现万物皆文件,最廉价的底性能设备也可以有能力去操控高性能的设备。

以智能音箱为例,廉价的小音箱在上述设计的firmware与protocol的基础上,可以以一个低成本的解决方案去控制、管理网络下的各种设备,设备联系更加紧密,使用更加人性化。