当前位置:   article > 正文

esp8266 mqtt接入阿里云_ESP8266_SDK连接阿里云

esp8266 mqtt 阿里云

陈拓 chentuo@ms.xab.ac.cn 2020/04/01-2020/04/10

1. 概述

  • 开发环境

先看《树莓派安装ESP8266_SDK开发环境》一文。https://zhuanlan.zhihu.com/p/122246166

熟悉项目的编译和烧写过程。

  • 官方例子

《Simple MQTT Client Demo》

https://gitee.com/chentuo2000/ESP8266_NONOS_SDK/tree/master/examples/esp_mqtt_proj

这个例子实现了:

MQTT发布消息

MQTT订阅主题

MQTT works with SSL/TLS

MQTT works with one-way anthentication

MQTT works with two-way anthentication

2. 阿里云平台准备

根据阿里官方文档,在阿里云平台创建产品,创建设备,同时自动产生 product key, product secert, device name, device secret。

具体操作请看文档《阿里云物联网平台基本设置-物模型》https://blog.csdn.net/chentuo2000/article/details/103559553

  • 创建产品,定义属性

2e9e408a2654398d17437cca576d49de.png
  • 添加设备

5c8914a44d0bab50c0da106b7898c7ec.png
  • “查看”证书

8857372a15dc8e78a7a4e5c3a1ddd7ca.png

一键复制:

  1. {
  2. "ProductKey": "a10hJ4nAdAz",
  3. "DeviceName": "temperature001",
  4. "DeviceSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  5. }

这个设备证书也称为“设备三元组”。

  • 阿里云物联网平台的测试

为了测试MQTT客户端和服务端的通信协议,以及看懂后面的代码,需要先看看下面几篇文章:

《MQTTfx连接物联网云平台》https://blog.csdn.net/chentuo2000/article/details/104313968

《MQTT.fx脚本Scripts使用》https://blog.csdn.net/chentuo2000/article/details/104252690

《MQTT-TCP连接通信》

https://help.aliyun.com/document_detail/73742.html

sudo apt-get uninstall openssl

《自己写微信小程序MQTT模拟器》

https://blog.csdn.net/chentuo2000/article/details/102507560

3. ESP8266的SDK连接阿里云

3.1 修改官方的例子

在《树莓派安装ESP8266_SDK开发环境》一文中

https://blog.csdn.net/chentuo2000/article/details/105296166

我们已经将官方的例子esp_mqtt_proj复制到了工作目录中:

fa9ad29eca22a989706fd3fcaeff0a3a.png

并且通过修改这个例子做了2个小练习,下面我们继续通过修改这个例子来连接到阿里云。

3.2 修改头文件

  • 进入i_mqtt目录

cd i_mqtt

29897137b3eb66a2ccaf88ec2ff4207a.png
  • 编辑头文件mqtt_config.h

nano include/mqtt_config.h

5558aa443032a582294934d9c27998c1.png
  • mqtt_config.h代码

下面是改好的头文件代码,你可以和原来的头文件对比。

  1. #ifndef __MQTT_CONFIG_H__
  2. #define __MQTT_CONFIG_H__
  3. typedef enum{
  4. NO_TLS = 0, // 0: 禁用SSL/TLS,这是默认值,就用这个,因为我在阿里云上没有使用证书验证
  5. TLS_WITHOUT_AUTHENTICATION = 1, // 1: enable SSL/TLS, but there is no a certificate verify
  6. ONE_WAY_ANTHENTICATION = 2, // 2: enable SSL/TLS, ESP8266 would verify the SSL server certificate at the same time
  7. TWO_WAY_ANTHENTICATION = 3, // 3: enable SSL/TLS, ESP8266 would verify the SSL server certificate and SSL server would verify ESP8266 certificate
  8. }TLS_LEVEL;
  9. /*IMPORTANT: the following configuration maybe need modified*/
  10. /***********************************************************************************************************************/
  11. #define CFG_HOLDER 0x00FF55A5 /* 改变这个值,以保存配置,并在设备启动时装载保存的配置,我将0x00FF55A4改成0x00FF55A5 */
  12. /*DEFAULT CONFIGURATIONS*/
  13. /* 阿里云平台设备三元组 */
  14. #define PRODUCT_KEY "a10hJ4nAdAz"
  15. #define DEVICE_NAME "temperature001"
  16. #define DEVICE_SECRET "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  17. #define DEVICE_ID PRODUCT_KEY"."DEVICE_NAME
  18. #define REGION_ID "cn-shanghai"
  19. #define MQTT_HOST PRODUCT_KEY".iot-as-mqtt."REGION_ID".aliyuncs.com"
  20. #define MQTT_PORT 1883
  21. #define MQTT_CLIENT_ID DEVICE_ID"|securemode=3,signmethod=hmacsha1|"
  22. #define MQTT_USER DEVICE_NAME"&"PRODUCT_KEY
  23. #define MQTT_PASS "clientId"DEVICE_ID"deviceName"DEVICE_NAME"productKey"PRODUCT_KEY
  24. #define STA_SSID "HUAWEI-BAP55C" // your AP/router SSID to config your device networking
  25. #define STA_PASS "ABCDE12345" // your AP/router password
  26. #define DEFAULT_SECURITY NO_TLS // very important: you must config DEFAULT_SECURITY for SSL/TLS
  27. #define CA_CERT_FLASH_ADDRESS 0x77 // CA certificate address in flash to read, 0x77 means address 0x77000
  28. #define CLIENT_CERT_FLASH_ADDRESS 0x78 // client certificate and private key address in flash to read, 0x78 means address 0x78000
  29. /***********************************************************************************************************************/
  30. /*Please Keep the following configuration if you have no very deep understanding of ESP SSL/TLS*/
  31. #define CFG_LOCATION 0x79 /* Please don't change or if you know what you doing */
  32. #define MQTT_BUF_SIZE 1024
  33. #define MQTT_KEEPALIVE 120 /*心跳second*/
  34. #define MQTT_RECONNECT_TIMEOUT 5 /*second*/
  35. #define MQTT_SSL_ENABLE //* Please don't change or if you know what you doing */
  36. #define STA_TYPE AUTH_WPA2_PSK
  37. #define QUEUE_BUFFER_SIZE 2048
  38. //#define PROTOCOL_NAMEv31 /*MQTT version 3.1 compatible with Mosquitto v0.15*/
  39. #define PROTOCOL_NAMEv311 /*MQTT version 3.11 compatible with https://eclipse.org/paho/clients/testing/*/
  40. #endif // __MQTT_CONFIG_H__

3.3 修改主程序user_main.c

  • 确定POST_TOPIC

cffc60a40eb1b08a0d4d9124c2eb3971.png

POST_TOPIC:/sys/a10hJ4nAdAz/${deviceName}/thing/event/property/post

  • 确定GET_TOPIC

71a5409ecd855a2ea00d8db52d936079.png

GET_TOPIC:/a10hJ4nAdAz/temperature001/user/get

依此写出数据下行和上行topic的宏定义:

  1. #define GET_TOPIC "/a10hJ4nAdAz/temperature001/user/get"
  2. #define POST_TOPIC "/sys/a10hJ4nAdAz/temperature001/thing/event/property/post"

发送JSON格式的数据

注意单双引号的使用规则。

  1. long int id = 1;
  2. char jsonData[256]={0};
  3. void ICACHE_FLASH_ATTR getJsonData(long int id, char temp[]) {
  4. os_sprintf(jsonData, "{'id':'%d','params':{'temperature':%s},'method':'thing.event.property.post'}", id, temp);
  5. os_printf(" jsonData -> %srn", jsonData);
  6. }
  7. void mqttConnectedCb(uint32_t *args)
  8. {
  9. MQTT_Client* client = (MQTT_Client*)args;
  10. INFO("MQTT: Connectedrn");
  11. MQTT_Subscribe(client, GET_TOPIC, 0);
  12. char temp[6] = {'2', '3', '.', '4', '5', '0'};
  13. getJsonData(id, temp);
  14. // 函数原型 BOOL ICACHE_FLASH_ATTR MQTT_Publish(MQTT_Client *client, const char* topic, const char* data, int data_length, int qos, int retain);
  15. MQTT_Publish(client, POST_TOPIC, jsonData, os_strlen(jsonData), 0, 0);
  16. }
  • 阿里云密码加密

在入口函数void user_init(void)中有一个CFG_Load()函数需要修改。CFG_Load()函数定义在modules/config.c中实现,CFG_Load()使用了结构SYSCFG。SYSCFG在i_mqtt/include/modules/config.h中声明:

  1. typedef struct{
  2. uint32_t cfg_holder;
  3. uint8_t device_id[32];
  4. uint8_t sta_ssid[64];
  5. uint8_t sta_pwd[64];
  6. uint32_t sta_type;
  7. uint8_t mqtt_host[64] ;
  8. uint32_t mqtt_port;
  9. uint8_t mqtt_user[32] ;
  10. uint8_t mqtt_pass[32] ;
  11. uint32_t mqtt_keepalive;
  12. uint8_t security;
  13. } SYSCFG;

对比前面mqtt_config.h中#define定义的宏:

  1. device_id, MQTT_CLIENT_ID
  2. mqtt_host, MQTT_HOST
  3. mqtt_user, MQTT_USER
  4. mqtt_pass, MQTT_PASS

SYSCFG中对应声明的长度可能不够。下面我们重写对于这4个宏定义的处理。

在void user_init(void)前面声明一个结构i_mqtt_cfg。

在CFG_Load()函数的下面添加相关代码。

  • 修改主程序user_main.c

nano user/user_main.c

7b216e54b0067fd522c70852265c6ee8.png

将上面的修改项都写入程序。

下面是user_main.c代码,请和原来的代码对比。

  1. /* main.c -- MQTT client example */
  • 在Makefile文件中添加静态链接库libssl.a

ssl_hmac_sha1()方法已经在静态链接库libssl.a内置中内置了,它和其他的库文件都放在:ESP8266_NONOS_SDK/lib目录下:

b2bab0dbe9248403ea8c72ee6be4fc99.png

为了使用libssl.a,我们需要修改一下Makefile文件,添加libssl.a否则会出现链接错误。

nano Makefile

eb0064c72afee428e31cf51e4694c967.png

添加到这里就可以了。对于库libssl.a,只需要写-lssl,这是规则。

ssl_hmac_sha1()方法在代码中可以直接使用,不需要加头文件。

  • 加密结果验证

加密结果是否正确,可以到下面的网址进行验证:

http://iot-face.oss-cn-shanghai.aliyuncs.com/tools.htm

292f7a7b66f922437df01a1dac52ade5.png

3.4 编译项目

  • 编译项目

./gen_misc.sh

da6de9db00c06bbfcd0b96f256314a70.png

9685fa79aae4457b4aa2475123213357.png

输入5个参数,对于ESP8266-01/ESP8266-01S输入2 0 2 2 2

92cfc86266c8eec136c694544c49e391.png

编译成功。

3.5 烧写

  • 烧写Flash

■ 第一次烧写命令

esptool.py --port /dev/ttyAMA0 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin 0xfb000 blank.bin 0xfc000 esp_init_data_default_v08.bin 0xfe000 blank.bin

■ 之后的烧写命令

esptool.py --port /dev/ttyAMA0 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin

在上一篇文章中我们已经烧写过了,所以:

e7036fa70ae2ffb17eca5e777db6a2f8.png
  • 运行程序

烧写完成后ESP8266-01会自动运行。

3.6 看阿里云上设备状态的变化

  • 烧写之前阿里云上的设备状态

在烧写时区先看看阿里云上的设备状态:

0b3d1b1dcf6b72e11989875ff9e4a865.png

在设备未连接到阿里云之前,设备状态是“未激活”。

  • 再看看阿里云上的设备状态

烧写完成后ESP8266会自动运行程序,如果程序正常,刷新阿里云设备页面:

efd4d01c9e7f225d46253d2f4e2facb6.png

可以看到,设备已经“在线”了。

3.7 查看设备发送数据和阿里云接收数据

为了看到启动状态,可以让设备重新启动一次:

1) 断电

2) 启动minicom

47fb454117ae8b96afc64a3c6e90cfc3.png

有关minicom的设置和操作请看《树莓派串口的使用》

https://blog.csdn.net/chentuo2000/article/details/104711494

3) 上电

888b5aabe9b3c61a9f36be84c74ecabb.png

每隔120秒可以看到心跳消息:

bedb9bedd3f408474a065fcf3af5dc9b.png

这是在文件include/mqtt_config.h中设置的:

#define MQTT_KEEPALIVE 120 /*心跳second*/

查看云端日志:

19576ce9345c2f7e5e63a9d30951f258.png

061e0e8a9bd3c6c9f5f4475ffe823c2f.png

查看云端接收到的数据:

e0b5ff11d518bd186882d65fa58ed2fb.png

3.8 云端发送消息到客户端(客户端订阅服务端消息)

  • 找到用户自定义Topic:/a10hJ4nAdAz/temperature001/user/get

2870bd3021f73b6db5240d8567b54841.png

点击“发布消息”:

654aa583eceea3a2094ed34bb2d32c20.png

点击“确认”,看minicom收到的消息:

94886445db500ff3da0b675db0c15fdd.png

收到topic: /a10hJ4nAdAz/temperature001/user/get的消息,数据: hello,your device t

  • 显示的数据不全

这只是minicom的设置问题,minicom默认不会自动换行,minicom启动后用下面的命令设置一下就好了。

Ctrl+A W:当显示的内容超过一行之后自动换行。

f39ec477d2471c03c2e91bba6e35a67c.png
  • 服务端发送中文消息给客户端

cc27ab5c4ca89eb165d8d03ab2b8c2e5.png

Minicom显示的是乱码:

ef048b4a9434245d5ed7c609f1b2824f.png

用下面的命令启动minicom:

sudo env LANG=en_US minicom

2c6e0a62041d5c32da24947dbd9e86f7.png

中文显示正常了。

不要忘了用Ctrl+A W将自动换行打开。

  • 简化minicom启动

为了显示中文,每次运行minicom的时候输入会很麻烦,我们修改一下.bashrc文件,在.bashrc里面加上如下代码:

alias minicom='sudo env LANG=en_US minicom'

下次直接用别名minicom启动就可以了。

参考文档:

  1. 电脑连接树莓派3B+https://blog.csdn.net/chentuo2000/article/details/103332186
  2. 树莓派安装ESP8266_SDK开发环境https://blog.csdn.net/chentuo2000/article/details/105296166
  3. 使用ESP8266(基于官方SDK)接入阿里云物联网平台https://blog.csdn.net/yannanxiu/article/details/81334230
  4. 自己写微信小程序MQTT模拟器https://blog.csdn.net/chentuo2000/article/details/102507560
  5. 阿里云物联网平台基本设置-物模型https://blog.csdn.net/chentuo2000/article/details/103559553
  6. 微信小程序MQTT模拟器 阿里云物联网平台测试https://blog.csdn.net/chentuo2000/article/details/102216865
  7. 树莓派连接阿里云物联网平台-属性(nodejs)https://blog.csdn.net/chentuo2000/article/details/103705694
  8. 树莓派连接阿里云物联网平台-服务(nodejs)https://blog.csdn.net/chentuo2000/article/details/103754860
  9. 树莓派连接阿里云物联网平台-订阅(nodejs)https://blog.csdn.net/chentuo2000/article/details/103769449
  10. 树莓派连接阿里云物联网平台-事件(nodejs)https://blog.csdn.net/chentuo2000/article/details/103805559
  11. MQTTfx连接物联网云平台https://zhuanlan.zhihu.com/p/101104351https://blog.csdn.net/chentuo2000/article/details/104313968
  12. MQTT.fx脚本Scripts使用https://blog.csdn.net/chentuo2000/article/details/104252690
  13. MQTT.fx - HiveMQ MQTT Toolbox https://www.hivemq.com/blog/mqtt-toolbox-mqtt-fx/
  14. Linking the ESP8266 to a Raspberry Pi through MQTThttps://www.penninkhof.com/2015/05/linking-the-esp8266-a-raspberry-pi-through-mqtt/
  15. mqttfx-manualhttps://github.com/Jerady/mqttfx-manual
  16. linux minicom 中文乱码问题https://blog.csdn.net/dongchangc/article/details/78773210?utm_source=blogxgwz6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/391409
推荐阅读
相关标签
  

闽ICP备14008679号