前面,我们在 MYS-6ULX-IOT 开发板上成功地驱动了 RTL8188 WiFi 模块,也为 MYS-6ULX-IOT 的系统增加了 curl 命令。接下来,我们就来通过这个 WiFi 模块连接云端实现一个最简单的物联网应用。
在本示例中,我的 web 服务器部署在阿里云上,大家也可以通过局域网内的服务器进行实验。
Web 服务器实现了 HTTP 和相关的 TCP 连接处理,同时具有 web 资源管理等功能。常见的 Web 服务器有 Nginx、Apache、IIS(Windows),而嵌入式领域则通常采用轻量级的 lighttpd、thttpd、minihttpd 等等。
这里,我们实现一个物联网的点灯实验。在我的服务器上创建了一个 JSON API,它的内容如下:
{
"led": true
}
在 MYS-6ULX-IOT 端,我们尝试用 curl 去获取这个 API:
# curl http://www.luckydarcy.top/2018/iot/api.json
{
"led": true
}
很棒,看起来已经获取到云端数据了!
实际上,上述的 api.json 为我们提供的是 LED 的状态信息,我们的目的是让设备通过 Web API 实现 LED 的亮/灭操作。因此,我们要编写程序实现 HTTP 请求,并从中解析 LED 的状态。
MYS-6ULX-IOT 的 Base 系统已经包含了 Python2.7,那么简单起见,我们这里用 Python 来实现。示例程序如下:
# cat led.py
import urllib2
import json
import os, time
while True:
results = urllib2.urlopen('http://www.luckydarcy.top/2018/iot/api.json').read()
status = json.loads(results)['led']
if status == True:
print "Light ON"
os.system("echo 1 > /sys/class/leds/user/brightness")
else:
print "Light OFF"
os.system("echo 0 > /sys/class/leds/user/brightness")
time.sleep(3)
首先使用 urllib2.urlopen 发起 HTTP 请求;然后使用 json.loads 解析 api.json,获取 LED 状态值;最后通过 os.system 调用本地 Shell 命令,对 LED 的文件 I/O 进行操作。为了降低请求频率,对每次请求增加了3秒的延时。
好啦,我们在 MYS-6ULX-IOT 开发板运行 python led.py
看看。
很遗憾,出现了 “ImportError: No module named json” 这样的错误,显然是因为当前系统没有 json 模块所造成的。然而,也没有 pip,所以我们需要手动安装 json 模块了。
登录 https://pypi.org/ 查找 json 模块,这里我们安装的是 simplejson,选择下载源代码 simplejson-3.15.0.tar.gz。
在 MYS-6ULX-IOT 开发板上解压缩 simplejson-3.15.0.tar.gz,进入目录 simplejson-3.15.0,然后执行以下命令安装即可:
python setup.py install
别忘了,我们还要将 import json
修改为 import simplejson as json
。
然后再次执行,可以看到终端打印“Light ON”,并且 MYS-6ULX-IOT 开发板上的蓝色 USER LED 亮起来了。登录服务器将 api.json 修改为 "led": false
,此时终端打印“Light OFF”,并且 LED 灭。
# python led.py
Light ON
Light ON
Light ON
Light OFF
Light OFF
嗯哈!这样,我们就实现了一个简单的物联网应用啦~