VSCode+PlatformIo IDE实现Wemos D1 Mini(ESP8266)接入阿里云物联网平台

阿里云物联网平台端设置

云端设备接入整体流程图

这个图我是上传的原图,如果看不清可以下载后放大查看细节。或者ctrl+"+"来放大屏幕查看。查看完只需ctrl+"0"即可复原。
在这里插入图片描述

账号注册

阿里云物联网IOT平台网址

  • 因为是阿里的产品,所以注册时候挺方便,可以直接用淘宝账号登录。
  • 点击产品->物联网->物联网设备接入
    在这里插入图片描述
  • 点击立即开通,进如控制台。
    在这里插入图片描述

新建产品

  • 在控制台左侧菜单选择设备管理->产品标签。因为之前我已经建立过产品并进行了测试,所以我的这个页面会显示之前创建的产品。如果你是第一次进入,则这个位置中产品的列表栏应该是空的。
    在这里插入图片描述
  • 点击右侧创建产品按钮,对你所要创建的产品名称等信息进行设置。填写完毕,点击完成后,产品创建完成。在之前的产品列表页面就会显示出你刚创建的这个产品
    在这里插入图片描述

产品的功能定义

  • 在产品列表中选择你刚创建的产品,点击查看按钮,进入刚刚创建的产品的详情页。
    在这里插入图片描述
  • 在上述操作进入的新界面中,选择功能定义标签,在自定义功能一栏中点击添加功能按钮。
    在这里插入图片描述
  • 这个上云的实验是通过一个开关量来控制板载灯的亮灭。开光是布尔型的。功能名称是自己命名的(当然阿里云里提供了很多默认的功能名称供选择)。
    在这里插入图片描述
  • 上述操作完成后,在定义功能区就会增加一个新的属性,后续如果需要对该属性进行修改,点击该属性右侧编辑按钮即可。至此,产品的创建完成。
    在这里插入图片描述
  • 设备的设置

产品设置完成后,需要创建设备来关联之前的产品。

  • 点击控制台左侧的设备标签。在设备列表的右侧点击添加设备按钮。
    在这里插入图片描述
  • 添加设备对话框中,你需要关联一个你之前创建的产品。
    在这里插入图片描述
  • DeviceName这一项可以不填,由阿里为你默认生成,点击“确认”按钮后,完成设备的添加。
    在这里插入图片描述
  • 这个部分要特别注意,设备添加后,如果从未接入过云,则会显示“未激活”。只有在第一次连通成功后,才会切换成“在线/离线”状态。我的应为已经创建过了,所以缺少一个初次创建时显示的设备三码(ProduntKey、DeviceName、DeviceSecret)页面。那个不是很重要。因为上云用的三码可以通过设备右侧的查看按钮随时得到。
    在这里插入图片描述
  • 点击查看按钮后的页面显示。下图中的三码,后续Wemos D1 Mini中还要使用。到这里,WemosD1Mini上云的云端设置就完成了,接下来进入代码编写阶段。
    在这里插入图片描述

VSCode(hacklab)端设置

程序端流程图

这个思维导图是边测试边记录下来的,怕自己会忘记整体流程。在最初完成的时候,Wemos D1 Mini始终无法连上阿里云,串口显示aliyunMqqt连接失败。重新粘贴设备的三码,并没有问题,找不到问题的症结在哪里。所以考虑下载一个支持aliyunMqqt的独立Mqtt客户端测试下,但是下载下来还没有用,忽然意识到是我对josn的内存没有进行设置。在platform.ini中增加了相关的设置后。Wemos D1Mini成功上云。我觉得这是个不错的测试思路。所以在思维导图中保留这个部分的思考过程。
在这里插入图片描述

在VSCode里新建一个Arduino工程

  • 上一篇文章中已经介绍了关于 Vscode+PlatformIod基本环境搭建、使用,包括库搜索的初探。如果对这个部分不是很熟悉,可以参见上一篇帖子,这里就不重复描述了。下面是电梯可以直达。
    VSCode+PlatformIo IDE实现arduino IOT嵌入式编程—Wemos D1 Mini点亮板载LED灯
  • 打开VSCode,点击左侧小蚂蚁图标,在新打开的页面中选择“+New Project”
    在这里插入图片描述
    -新建一个工程,放在了默认路径。你也可以通过去掉Location位置的选项来将程序存入你自己指定的路径。点击完成进入新的空工程。
    在这里插入图片描述

platform.ini文件中添加库

  • 在新建的空工程中选择platformio.ini文件。之后我们添加的各种库需要粘贴在这里。
    在这里插入图片描述

添加ArduinoJson库

  • 搜索打开ArduinoJson库。
    在这里插入图片描述
  • 找到ArduinoJosn库的安装信息
    在这里插入图片描述
  • 复制ArduinoJosn库的安装信息
    三种方式中选择一种进行复制即可。但是在上云过程中,发现使用最新版的库有个变量的名称改变了。所以最终选择了官方示例中的[email protected]版本。在这里插入图片描述

添加AliyunMqttArduino

这个库的添加方式和上述的ArduinoJosn库安装雷同,只是这个选择最新的版本即可。

platformio.ini文件内容。

但是在初次编译上传后,WemosD1Mini始终更无法连接上Ali的mqtt。报255错误。后来上网查到别人的代码中还有一段对于MQTT内存大小的设置。将那部分代码加入后,上云成功。

lib_deps =
[email protected]
[email protected]
#设定MQTT包的参数
-D MQTT_MAX_PACKET_SIZE=512
-D MQTT_KEEPALIVE=60

main.c文件中添加应用程序


#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>

// Wifi名称和密码,你WemosD1Mini上网时需要接入的Wifi账号和密码
#define WIFI_SSID "xxxxxxxxxxx"
#define WIFI_PASSWD "xxxxxxxxxxxx"

// LP的设备三元组(PK/DN/DS)根据你云端创建的设备三码进行更改
#define PRODUCT_KEY "xxxxxxxxxxxxxx"
#define DEVICE_NAME "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#define DEVICE_SECRET "xxxxxxxxxxxxxxxxxxxxxx"

// Alink协议格式和Topic定义 这个部分是固定格式不用进行修改
#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
#define ALINK_TOPIC_PROP_POSTRSP "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post_reply"
#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
#define ALINK_METHOD_PROP_POST "thing.event.property.post"

// 创建WiFiClient实例
WiFiClient espClient;

//创建MqttClient实例
PubSubClient mqttClient(espClient);

//连接Wifi
void initWifi(const char *ssid, const char *password)
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("WiFi does not connect, try again ...");
    delay(3000);
  }

  Serial.println("Wifi is connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


 //监听云端下发的指令 
void callback(char *topic, byte *payload, unsigned int length)
{
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    payload[length] = '\0';
    Serial.println((char *)payload);

    if (strstr(topic, ALINK_TOPIC_PROP_SET))
    {
        StaticJsonBuffer<200> jsonBuffer;
        JsonObject &root = jsonBuffer.parseObject(payload);
        if (!root.success())
        {
            Serial.println("parseObject() failed");
        } else {
            Serial.println("parseObject() success");
            //下一步对收到的云端指令进行处理
        }
    }
}

//连接Mqtt
void mqttCheckConnect()
{
    bool connected = connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
    if (connected) {
        Serial.println("MQTT connect succeed!");
        // client.subscribe(ALINK_TOPIC_PROP_POSTRSP);
        mqttClient.subscribe(ALINK_TOPIC_PROP_SET); // 订阅属性设置Topic
        Serial.println("subscribe done");
    }
}

void setup() {
    Serial.begin(115200);

    initWifi(WIFI_SSID, WIFI_PASSWD); // 连接Wifi

    mqttClient.setCallback(callback); // 设置回调监听云端下发的指令
}

void loop() {
    mqttCheckConnect(); // MQTT上云
    mqttClient.loop();

    delay(3000); // 每1秒连接一次
}

程序编译上传到设备

  • 编译程序
  • 初次运行的时候,系统会自动安装库。以后就不会有下面的提示了。在这里插入图片描述
  • 编译成功
    在这里插入图片描述
  • 上传程序
    在这里插入图片描述
    在这里插入图片描述
  • 修改VSCode+platformio 默认串口波特率
    上传程序成功后,IDE会默认打开串口监视器。但是其中显示的信息却是乱码。观察发现,原来IDE内嵌的串口波特率默认为9600。而程序中则采用的115200。查阅相关文献,发现需要在platformio.ini文件中增加相关代码:

monitor_baud = 115200
在这里插入图片描述

上云成功

打开阿里物联网控制台,发现之前的设备已经激活,并显示在线,设备上云成功。后续的文章将会完善这个设备的功能。

  1. 在云端添加mqtt的相关topic功能
  2. 添加CallBack中的代码来实现对云端命令的处理。
  3. 增加相应的App开发。实现手机通过阿里云控制WemosD1Mini端板载灯的亮灭。
    估计下个帖子就可以文成上述内容。敬请期待。
    在这里插入图片描述

参考文献

【1】mqtt客户端
http://www.jensd.de/apps/mqttfx/1.7.0/
【2】mqttfx使用说明
https://yq.aliyun.com/articles/592279
【3】如何更改VSCode+platformio中的串口波特率
http://cn.voidcc.com/question/p-qspluxbj-ue.html
【4】阿里物联网5月10日最新更新文档
https://help.aliyun.com/document_detail/117458.html?spm=5176.11485173.0.0.379559afQuC1Gf
【5】创建产品设备的官方教程
https://help.aliyun.com/document_detail/73728.html?spm=a2c4g.11186623.6.560.795d42a4qTAgBx
【6】hacklab官网说明
https://gaic.alicdn.com/doc/hacklab/bx0tqw.html
【7】阿里云IOT开发者社区
https://dev.iot.aliyun.com/demo
【8】【起源计划】使用IoT Studio开发一个简单的端到端物联网应用解决方案(温湿度监控)
https://dev.iot.aliyun.com/demo/detail/734642

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章