查看: 1829|回复: 5

[教程] 使用ESP8266(基于官方SDK)接入阿里云物联网平台

[复制链接]

主题

好友

650

积分

举人

  • TA的每日心情

    2018-11-20 13:41
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-2-14 16:20:25 |显示全部楼层
    作为物联网开发者,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设备认证三元组
    本小节主要讲如何获取阿里云IoT hub设备认证三元组,熟悉的读者可以跳过了。

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

    1.png


    第二步:创建产品
    开通后我们首先需要创建产品,产品名称随便输入即可,其他默认。
    2.png


    第三步:创建设备
    然后是创建设备,随便输入一个DeviceName即可。
    3.png


    第四步:获取认证三元组
    最后就得到了设备认证三元组:ProductKey、DeviceName和DeviceSecret。
    4.png


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



    三、ESP8266官方SDK
    最后是如何下载ESP8266官方SDK,可以到乐鑫官网或github或者下载。熟悉的读者也可以直接跳过。本人开发所使用的SDK是目前最新的版本:ESP8266_NONOS_SDK-2.2.1,aliyun_mqtt_app理论上支持SDK 2.0+。

    下载官方SDK后,把driver_lib、examples和third_party三个文件夹压缩备份再删除,以免编译的时候出现干扰信息。
    5.png


    四、下载aliyun_mqtt_app并导入
    下载aliyun_mqtt_app(github:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app)并拷贝aliyun_mqtt_app文件夹过去。

    编辑app/include/user_config.h文件,修改下面信息,然后编译下载并重启ESP8266,最后应该就能在控制台看到设备上线了。
    1. #define PRODUCT_KEY     "PRODUCT_KEY"
    2. #define DEVICE_NAME     "DEVICE_NAME"
    3. #define DEVICE_SECRET   "DEVICE_SECRET"

    4. #define WIFI_SSID       "WIFI_SSID"
    5. #define WIFI_PASS       "WIFI_PASS"
    复制代码

    五、接入成功
    编译、下载、重启,观察串口打印的信息,感觉没有异常后在看看控制台,可以看到设备已经接入成功了!
    6.png


    然后到设备的topic列表,可以看到 update topic 消息数加1了,那是因为我在代码里面写了只要连接成功就发布一条「hello」消息。

    7.png


    然后尝试一下对get topic发布消息!
    8.png


    可以看到串口打印如下:
    1. TCP: data received 45 bytes
    2. Receive topic: /PRODUCT_KEY/esp8266_test/get, data: hello wolrd!
    复制代码
    此时说明「设备主动上报数据到平台」和「平台下发指令到设备」这两个功能均测试成功!

    六、关于阿里云IoT hub

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

    • MQTT方式,包括基于TCP的MQTT和基于WebSocket的MQTT
    • CoAP
    • HTTP


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


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


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

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

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


    9.png


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

    七、关于aliyun_mqtt_app
    自然,我在引言已经提到弄出这么一个app工程的原因了。下面是对这个app简单介绍一下。

    由于ESP8266官方SDK中已经有了MQTT示例工程,所以我是在此工程的基础上补充了一点自己的代码。其中最麻烦的是阿里云IoT hub设备认证问题,直接使用MQTT示例工程填写有关MQTT的配置信息也可以,只是mqtt password要先在电脑生成好才行,直接拼接设备认证三元组还做不到。那就干脆一点,我直接让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,至于能玩出什么花样就要靠开发者的想象力了。话说,某平台是不是应该给我点软文费呢~?


    相关资料
    esp8266 aliyun mqtt app:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app
    阿里云物联网平台文档:https://help.aliyun.com/product/30520.html
    阿里云IoT hub - MQTT-TCP连接通信:https://help.aliyun.com/document_detail/73742.html

    作者:阏男秀
    來源:简书




    回复

    使用道具 举报

    主题

    好友

    80

    积分

    童生

  • TA的每日心情
    开心
    2019-1-31 11:36
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-2-20 09:17:57 |显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    主题

    好友

    98

    积分

    童生

  • TA的每日心情
    慵懒
    2017-10-20 08:33
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2019-2-22 08:12:18 |显示全部楼层
    谢谢分享!
    回复

    使用道具 举报

    主题

    好友

    516

    积分

    举人

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 41 天

    连续签到: 21 天

    [LV.5]常住居民I

    发表于 2019-3-1 17:18:37 |显示全部楼层
    详细研究,谢谢分享。
    回复

    使用道具 举报

    主题

    好友

    18

    积分

    白丁

    该用户从未签到

    发表于 2019-3-2 12:42:52 |显示全部楼层
    谢谢楼主分享! 请教一下,我怎么才能按自己需要发数据到Topic呢? 试了下自己做了个定时器在里面用
    MQTT_Publish(&mqttClient, UPDATE_TOPIC, "{\"deviceName\":\"test_device\",\"data\":\"123456\"}", 44, 0, 0);
    这样会引起wifi模块崩溃,连不上wifi了。
    可是在您写的callback里用这句就没事的。我已经做了些延时,等MQTT连上了再发数据的。
    回复

    使用道具 举报

    主题

    好友

    18

    积分

    白丁

    该用户从未签到

    发表于 2019-3-2 12:47:15 |显示全部楼层
    谢谢楼主分享! 请教一下,我怎么才能按自己需要发数据到Topic呢? 试了下自己做了个定时器在里面用
    MQTT_Publish(&mqttClient, UPDATE_TOPIC, "{\"deviceName\":\"test_device\",\"data\":\"123456\"}", 44, 0, 0);
    这样会引起wifi模块崩溃,连不上wifi了。
    可是在您写的callback里用这句就没事的。我已经做了些延时,等MQTT连上了再发数据的。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条

    手机版|爱板网

    GMT+8, 2019-3-25 19:09 , Processed in 0.214122 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部