【物联网】使用ESP8266(基于官方SDK2.0)接入阿里云物联网平台

1,291 阅读7分钟

提醒:本文写于2018年8月,由于ESP8266的SDK和阿里云平台更新迭代很快,可能有部分信息已经过时,以下方案仅做参考。

引言

作为物联网开发者,ESP8266应该一点都不陌生了。只需十几块钱淘宝一个小开发板,就可以连上Wi-Fi接入互联网,尽情享受从手机端或Web端控制设备的乐趣。ESP8266接入Wi-Fi是没问题,但是用户端不能直接设计成与ESP8266通信,还是需要一个中心服务器作为用户端和设备端的代理。一种方案是自己搭建设计这么一个中心服务器,只是费时费力;另一种方案,就是直接使用大厂提供的物联网平台服务,使设计方案PaaS化

上网搜寻物联网平台方案,百度、阿里、腾讯早就推出了自己的物联网平台了,同时也收集了一点其他公司的平台。之后我就对这三大平台以及一些常见的平台简单评估了一下。最后还是选择了阿里云物联网平台(以下简称阿里云IoT hub)深入了解。

那么,关于ESP8266和阿里云IoT hub,首先要告诉大家,乐鑫官方github上已经有了「ESP8266 对接阿里云」的repository了,github:github.com/espressif/e…

但是!当我下载下来并经过一阵焦头烂额的编译测试后,依旧没法成功编译!最最最关键的是,不支持安信可ESP8266 IDE,似乎是因为修改了顶层Makfile文件。

一气之下!我根据阿里云IoT hub提供的文档,首先使用Python脚本模拟设备对接阿里云IoT Hub,然后使用ESP8266尝试连接MQTT Broker,最后使用ESP8266基于官方SDK,自己弄了一个esp8266 app,接入了阿里云物联网平台。github:github.com/AngelLiang/…

适合读者

本文适合有ESP8266开发经验的读者阅读,如果熟悉安信可ESP8266 IDE更佳。熟悉阿里云IoT hub和开发环境的读者可以直接跳到「四、下载aliyun_mqtt_app并导入」小节。

一、获取阿里云IoT设备认证三元组

本小节主要讲如何获取阿里云IoT hub设备认证三元组,熟悉的读者可以跳过了。

第一步:开通平台

首先,需要进入阿里云IoT hub控制台进行操作,如果没有开通直接开通即可,免费。控制台连接:www.aliyun.com/product/iot

物联网平台

第二步:创建产品

开通后我们首先需要创建产品,产品名称随便输入即可,其他默认。

创建产品

第三步:创建设备

然后是创建设备,随便输入一个DeviceName即可。

创建设备

第四步:获取认证三元组

最后就得到了设备认证三元组:ProductKeyDeviceNameDeviceSecret

获取认证三元组

二、安信可ESP8266 IDE

下面是如何搭建安信可ESP8266 IDE环境的文档,熟悉的读者可以直接跳过了:

三、ESP8266官方SDK

最后是如何下载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_libexamplesthird_party三个文件夹压缩备份再删除,以免编译的时候出现干扰信息。

工程目录

四、下载aliyun_mqtt_app并导入

下载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

接入方式

根据文档,阿里云IoT hub至少支持三种设备接入方式:

  1. MQTT方式,包括基于TCP的MQTT和基于WebSocket的MQTT
  2. CoAP
  3. HTTP

其中对于ESP8266来说,最方便的还是基于MQTT-TCP方式。当然,阿里云IoT hub除了支持单一设备接入方式,也支持网关设备的接入

计费方面

目前开通平台是免费。收费方法是按消息数量收费,不过每月前100万条消息免费,对于我这种物联网爱好者随便玩玩足够了。

基础版和高级版

实际上,阿里云IoT hub分为两个版本:基础版和高级版。高级版在基础版所有功能的基础上,还多了一些实用功能,当然,高级版也是免费开通的,收费方面高级版则多了一个设备日活费用,0.01元/每日活设备/天,目前每个帐号有10个设备的免费额度。

高级版令我关注的有一点:设备的数据存储和查询功能。设备端只要根据阿里云IoT hub高级版的物模型和Alink协议上传数据,阿里云IoT hub就会存储相关数据,同时还可以通过云端API获取历史数据。

相关术语:

  • 物模型:阿里云IoT hub对设备在云端的功能描述,包括设备的属性、服务和事件。
  • Alink协议:阿里云定义的设备与云端之间的通信协议。

阿里云高级版示例

2019年4月1日更新:关于这个温湿度传感器程序太多人问了,这里特别说明一下。这个示例我在电脑上用Python(非MicroPython)写了MQTT客户端代码模拟设备,根据阿里云协议上传相关属性值就可以了。所以根本没有8266温湿度传感器程序!!! 没有8266温湿度传感器程序!!! 没有8266温湿度传感器程序!!! 不过这个回头有机会再更新吧,博主已经很久没有碰8266了。

那么有关阿里云IoT hub的介绍就到这里,下面是简单说下我写的aliyun_mqtt_app。

七、关于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,至于能玩出什么花样就要靠开发者的想象力了。话说,某平台是不是应该给我点软文费呢~?

相关资料