作为物联网开发者,ESP8266应该一点都不陌生了。只需十几块钱淘宝一个小开发板,就可以连上Wi-Fi接入互联网,尽情享受从手机端或Web端控制设备的乐趣。ESP8266接入Wi-Fi是没问题,但是用户端不能直接设计成与ESP8266通信,还是需要一个中心服务器作为用户端和设备端的代理。一种方案是自己搭建设计这么一个中心服务器,只是费时费力;另一种方案,就是直接使用大厂提供的物联网平台服务,使设计方案PaaS化。
上网搜寻物联网平台方案,百度、阿里、腾讯早就推出了自己的物联网平台了,同时也收集了一点其他公司的平台。之后我就对这三大平台以及一些常见的平台简单评估了一下。最后还是选择了阿里云物联网平台(以下简称阿里云IoT hub)深入了解。
那么,关于ESP8266和阿里云IoT hub,首先要告诉大家,乐鑫官方github上已经有了「ESP8266 对接阿里云」的repository了,github:https://github.com/espressif/esp8266-aliyun-demo
但是!当我下载下来并经过一阵焦头烂额的编译测试后,依旧没法成功编译!最最最关键的是,不支持安信可ESP8266 IDE,似乎是因为修改了顶层Makfile文件。
一气之下!我根据阿里云IoT hub提供的文档,首先使用Python脚本模拟设备对接阿里云IoT Hub,然后使用ESP8266尝试连接MQTT Broker,最后使用ESP8266基于官方SDK,自己弄了一个esp8266 app,接入了阿里云物联网平台。github:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app
本文适合有ESP8266开发经验的读者阅读,如果熟悉安信可ESP8266 IDE更佳。熟悉阿里云IoT hub和开发环境的读者可以直接跳到「四、下载aliyun_mqtt_app并导入」小节。
本小节主要讲如何获取阿里云IoT hub设备认证三元组,熟悉的读者可以跳过了。
首先,需要进入阿里云IoT hub控制台进行操作,如果没有开通直接开通即可,免费。控制台连接:https://www.aliyun.com/product/iot
开通后我们首先需要创建产品,产品名称随便输入即可,其他默认。
然后是创建设备,随便输入一个DeviceName即可。
最后就得到了设备认证三元组:ProductKey、DeviceName和DeviceSecret。
下面是如何搭建安信可ESP8266 IDE环境的文档,熟悉的读者可以直接跳过了:
最后是如何下载ESP8266官方SDK,可以到乐鑫官网或github或者下载。熟悉的读者也可以直接跳过。本人开发所使用的SDK是目前最新的版本:ESP8266_NONOS_SDK-2.2.1 ,aliyun_mqtt_app理论上支持SDK 2.0+。
(2018-11-02更新:github已经更新到基于SDKv3.0.0版本,SDKv2.0和SDKv3.0不兼容,如果编译报错请参考这篇博客。)
下载官方SDK后,把driver_lib
、examples
和third_party
三个文件夹压缩备份再删除,以免编译的时候出现干扰信息。
下载aliyun_mqtt_app并拷贝aliyun_mqtt_app文件夹过去。
编辑app/include/user_config.h
文件,修改下面信息:
#define PRODUCT_KEY "PRODUCT_KEY"
#define DEVICE_NAME "DEVICE_NAME"
#define DEVICE_SECRET "DEVICE_SECRET"
#define WIFI_SSID "WIFI_SSID"
#define WIFI_PASS "WIFI_PASS"
编译、烧写、重启ESP8266,观察串口打印的信息,感觉没有异常后在看看阿里云IoT Hub控制台,可以看到设备已经接入成功了!
然后到设备的topic列表,可以看到 update topic 消息数加1了,那是因为我在代码里面写了只要连接成功就发布一条「hello」消息。
然后尝试一下对get topic发布消息!
可以看到串口打印如下:
TCP: data received 45 bytes
Receive topic: /PRODUCT_KEY/esp8266_test/get, data: hello wolrd!
此时说明「设备主动上报数据到平台」和「平台下发指令到设备」这两个功能均测试成功!
根据文档,阿里云IoT hub至少支持三种设备接入方式:
其中对于ESP8266来说,最方便的还是基于MQTT-TCP方式。当然,阿里云IoT hub除了支持单一设备接入方式,也支持网关设备的接入。
目前开通平台是免费。收费方法是按消息数量收费,不过每月前100万条消息免费,对于我这种物联网爱好者随便玩玩足够了。
实际上,阿里云IoT hub分为两个版本:基础版和高级版。高级版在基础版所有功能的基础上,还多了一些实用功能,当然,高级版也是免费开通的,收费方面高级版则多了一个设备日活费用,0.01元/每日活设备/天,目前每个帐号有10个设备的免费额度。
高级版令我关注的有一点:设备的数据存储和查询功能。设备端只要根据阿里云IoT hub高级版的物模型和Alink协议上传数据,阿里云IoT hub就会存储相关数据,同时还可以通过云端API获取历史数据。
相关术语:
2019年4月1日更新:关于这个温湿度传感器程序太多人问了,这里特别说明一下。这个示例我在电脑上用Python(非MicroPython)写了MQTT客户端代码模拟设备,根据阿里云协议上传相关属性值就可以了。所以根本没有8266温湿度传感器程序!!!
没有8266温湿度传感器程序!!!
没有8266温湿度传感器程序!!!
不过这个回头有机会再更新吧,博主已经很久没有碰8266了。
那么有关阿里云IoT hub的介绍就到这里,下面是简单说下我写的aliyun_mqtt_app。
自然,我在引言已经提到弄出这么一个app工程的原因了。下面是对这个app简单介绍一下。
由于ESP8266官方SDK中已经有了MQTT示例工程,所以我是在此工程的基础上补充了一点自己的代码。其中最麻烦的是阿里云IoT hub设备认证问题,直接使用MQTT示例工程填写有关MQTT的配置信息也可以,只是mqtt password要先在PC端生成好才行,使用字符串拼接方式静态生成设备认证三元组似乎还做不了。那就干脆一点,让ESP8266能动态生成阿里云的mqtt password就可以了,也就是一个hmacmd5签名。
mqtt password生成的核心代码在 user/aliyun_mqtt.c/gen_mqtt_password() 函数里。
之后,就是加了点辅助功能,比如可以使用smartconfig配置Wi-Fi,这样就可以不用把Wi-Fi信息写死到代码了。同时,阿里云IoT hub大多是使用JSON格式传输数据,给app上cJSON解析的工作以后有空就考虑考虑(ESP8266使用cJSON解析器已经有了,在我的ESP8266工程示例集合仓库里)。
自此,洋洋洒洒长篇大论有话没话写了那么多,本文简而言之就介绍了如何使用ESP8266接入阿里云IoT hub,至于能玩出什么花样就要靠开发者的想象力了。话说,某平台是不是应该给我点软文费呢~?