美文网首页智能硬件(Arduino、树莓派等)
将ESP8266通过MQTT协议链接阿里云IoT物联网平台

将ESP8266通过MQTT协议链接阿里云IoT物联网平台

作者: interboy | 来源:发表于2019-06-19 13:25 被阅读0次

    1 申请阿里云IoT平台

    登录阿里云,申请开通IoT平台。https://iot.console.aliyun.com/lk/summary

    1.1 注册产品和设备

    在【设备管理】-【产品】中创建产品。


    创建产品

    在【设备管理】-【设备】中创建设备,其中DeviceName可以自动生成。


    创建设备

    1.2 添加产品的属性

    在【设备管理】-【产品】-【功能定义】


    功能定义

    在自定义功能中添加属性。


    添加属性

    1.3 获取产品和设备信息

    在【设备管理】-【设备】-【设备详情】可以找到DeviceName,DeviceSecret,ProductKey等信息,后续在接入时会需要。


    设备详情

    如果需要ProductSecret可以在【设备管理】-【产品】-【产品详情】中找到。

    2 ESP8266设备端使用arduino开发

    实现需要准备好ESP8266的开发板和Arduino开发环境,详细参考另一篇文章。https://www.jianshu.com/p/d236f8983871

    2.1 获取MQTT的sample

    事先在【Tools】- 【Manage Libraries】中安装PubSubClient库。
    可以参考【File】-【Samples】-【PubSubClient】中的mqtt-esp8266例子。

    2.2 支持MQTT协议

    导入PubSubClient库,实现MQTT协议的传输。
    修改例子中的Server地址,端口,用户名,以及命令的BODY和TOPIC。

    #define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
    #define MQTT_PORT         1883
    #define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEY
    
    #define ALINK_BODY_FORMAT         "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
    #define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
    

    2.3 集成阿里云IoT接入鉴权函数

    参考MQTT连接签名示例,推荐直接引用里面的函数实现鉴权过程。
    https://help.aliyun.com/document_detail/116333.html?spm=a2c4g.11186623.6.652.d9f63f86nJPMqY
    参考链接的响应码,如果error为-4,就是鉴权失败。

    iotx_dev_meta_info_t meta_info;
    iotx_sign_mqtt_t sign_mqtt;
    
    memset(&meta_info, 0, sizeof(iotx_dev_meta_info_t));
    memcpy(meta_info.product_key, PRODUCT_KEY, strlen(PRODUCT_KEY));
    memcpy(meta_info.product_secret, PRODUCT_SECRET, strlen(PRODUCT_SECRET));
    memcpy(meta_info.device_name, DEVICE_NAME, strlen(DEVICE_NAME));
    memcpy(meta_info.device_secret, DEVICE_SECRET, strlen(DEVICE_SECRET));
    
    IOT_Sign_MQTT(IOTX_CLOUD_REGION_SHANGHAI, &meta_info, &sign_mqtt);
    

    2.4 发送设备状态和云端设置状态命令的实现

    sprintf(param, "{\"idle\":%d}", digitalRead(SENSOR_PIN));
    sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
    boolean bRet = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
    Serial.println(bRet ? "OK" : "NG");
    

    事先在【Tools】- 【Manage Libraries】中安装ArduinoJson库。
    导入ArduinoJson库,实现Json串的解析。

    StaticJsonDocument<MQTT_MAX_PACKET_SIZE> doc;
    DeserializationError error = deserializeJson(doc, (char *)payload);  
    
    if (!error) //检查反序列化是否成功
    {
        //读取json节点
        Serial.println(doc["id"].as<char*>());
        boolean isIdle = doc["params"]["idle"];
        Serial.println(isIdle);
    }
    

    3 调试

    3.1 云端调试

    利用阿里云的在线调试功能,可以接收设备Post的信息,也可以发送set命令给设备。
    在【监控运维】-【在线调试】中选择设备后,选择调试的功能和方法,修改值发送指令给设备。

    云端调试set命令

    3.2 设备端调试

    利用Arduino中的Serial Monitor监控串口的调试信息输出。

    ESP8266相关文章阅读

    《利用USB转TTL链接mini ESP8266进行开发和调试》 https://www.jianshu.com/p/2207a44dedc5
    《ESP8266在线升级OTA的Arduino IDE实现方法之WebServer》 https://www.jianshu.com/p/b54b18f56d6a
    《ESP8266串口数据错误不准确问题的解决》https://www.jianshu.com/p/7ddefcfc2acd
    《如何利用Arduino IDE开发ESP8266程序?》https://www.jianshu.com/p/d236f8983871
    《将ESP8266通过MQTT协议链接阿里云IoT物联网平台》 https://www.jianshu.com/p/4d6e216c2280

    相关文章

      网友评论

        本文标题:将ESP8266通过MQTT协议链接阿里云IoT物联网平台

        本文链接:https://www.haomeiwen.com/subject/jzaafctx.html