二十、W5100S/W5500+RP2040树莓派Pico<MQTT连接阿里云控制板载LED>

news2024/11/25 20:55:05

1. 前言

  物联网平台提供安全可靠的设备连接通信能力,支持设备数据采集上云,规则引擎流转数据和云端数据下发设备端。此外,也提供方便快捷的设备管理能力,支持物模型定义,数据结构化存储,和远程调试、监控、运维。本章讲解阿里云物联网平台的使用方法,并讲解使用设备连接阿里云物联网平台。

  在以太网应用中使用 W5500 + MQTT应用协议让用户可以更加方便地在设备之间实现阿里云远程连接和通信。本教程将介绍W5500以太网MQTT连接阿里云的应用以及注意事项,帮助读者更好地掌握这一技术。

2. 简介

2.1 初步了解阿里云物联网平台创建产品步骤

接着进入正题,如何在阿里云公共实例平台创建产品:

  1. 以aliyun账号直接进入IoT控制台,如果还没有开通阿里云物联网套件服务,则申请开通

  2. 开通完后,创建一个自定义产品类

    在这里插入图片描述

  3. 之后再添加一个测试设备

    在这里插入图片描述

  4. 添加好之后点进去查看设备,查看连接参数
    在这里插入图片描述

  5. 之后再去产品那边查看功能定义里添加物模型
    在这里插入图片描述

  6. 下面是查看发布和订阅主题,要将${deviceName}替换成上一个步骤获取的DeviceName然后保存
    在这里插入图片描述

  7. 设置遗嘱消息的发布主题

在这里插入图片描述

2.2 阿里云物模型讲解

  物模型是物理空间中的实体(如传感器、车载装置、楼宇、工厂等)在云端的数字化表示,从属性、服务和事件三个维度,分别描述了该实体是什么、能做什么、可以对外提供哪些信息。定义了物模型的这三个维度,即完成了产品功能的定义。

功能类型说明
属性(Property)用于描述设备运行时具体信息和状态。例如,环境监测设备所读取的当前环境温度、智能灯开关状态、电风扇风力等级等。属性可分为读写和只读两种类型。读写类型支持读取和设置属性值,只读类型仅支持读取属性值。
服务(Service)指设备可供外部调用的指令或方法。服务调用中可设置输入和输出参数。输入参数是服务执行时的参数,输出参数是服务执行后的结果。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,例如执行某项特定的任务。服务分为异步和同步两种调用方式。
事件(Event)设备运行时,主动上报给云端的信息,一般包含需要被外部感知和处理的信息、告警和故障。事件中可包含多个输出参数。例如,某项任务完成后的通知信息;设备发生故障时的温度、时间信息;设备告警时的运行状态等。事件可以被订阅和推送。

  物联网平台支持为产品定义多组功能(属性、服务和事件)。一组功能定义的集合,就是一个物模型模块。多个物模型模块,彼此互不影响。

3 WIZnet以太网芯片

  WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max.25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max.25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
  1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

4 示例概述

4.1 流程图

  程序的运行框图如下所示:

在这里插入图片描述

4.2 准备工作核心

软件

  • Visual Studio Code
  • WIZnet UartTool
  • 阿里云平台

硬件

  • W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • Micro USB 接口的数据线
  • TTL 转 USB
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)

  • 通过TTL串口转USB,连接UART0 的默认引脚:

    • RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040 进行接线时

    • RP2040 GPIO16 <----> W5100S MISO
    • RP2040 GPIO17 <----> W5100S CS
    • RP2040 GPIO18 <----> W5100S SCK
    • RP2040 GPIO19 <----> W5100S MOSI
    • RP2040 GPIO20 <----> W5100S RST
  • 通过PC和设备都通过网线连接路由器LAN口

4.4 主要代码概述

  我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。

第一步:mqtt_aliyun.c文件中加入对应的.h文件。

第二步:定义DHCP所要的宏和MQTT收发缓存buff的宏。

第三步:定义一个mqtt连接参数的结构体并进行定义,这里给结构体赋的值是阿里云上对应的连参数,以及发布和订阅主题和遗嘱主题的设置都是相对应的。

第四步: 初始化了库内部的参数。

第五步:网络信息的配置和mqtt初始的参数,以及标志位。

第六步:编写定时器回调处理函数,用于DHCP和MQTT 滴答定时器处理函数。

第七步:主函数先是对串口和SPI的初始化,然后写入W5100S的网络配置参数,初始化DHCP后开始DHCP获取IP,获取到就打印获取到的IP,获取次数超过最大获取次数时就使用静态IP,DNS解析域名,之后初始化MQTT,然后主循环是一个状态机的轮询,状态机先是进入到连接状态,当连接成功之后状态才开始进行发布和订阅,然后到订阅遗嘱消息,然后阿里云进行数据的下发和接收。

void network_init(wiz_NetInfo *conf_info);
bool repeating_timer_1ms_callback(struct repeating_timer *t);
bool repeating_timer_1s_callback(struct repeating_timer *t);
void mqtt_init(void);
void messageArrived(MessageData *md);
void do_dns(uint8_t *domain_name, uint8_t *remote_ip);
void json_decode(uint8_t *msg);

int main()
{
    /* Variable definition */
    int ret;
    struct repeating_timer timer_1s;
    struct repeating_timer timer_1ms;
    MQTTMessage pubmessage = {0};

    /*mcu init*/
    stdio_init_all();     /*Initialize the serial port*/
    wizchip_initialize(); /*Initialize the SPI*/

    /* LED init */
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);

    /*timer init*/
    add_repeating_timer_ms(1000, repeating_timer_1s_callback, NULL, &timer_1s); // Add DHCP and DNS 1s Tick Timer handler
    add_repeating_timer_ms(1, repeating_timer_1ms_callback, NULL, &timer_1ms);  // Add MQTT 1ms Tick Timer handler

    /*dhcp init*/
    DHCP_init(SOCK_DHCP, ethernet_buf); // DHCP initialization

    /*dns init*/
    DNS_init(SOCK_DNS, ethernet_buf);

    /* Set the network address information */
    printf("wiznet chip mqtt of aliyun example.\r\n");
    network_init(&net_info);              // Configuring Network Information
    print_network_information(&get_info); // Read back the configuration information and print it

    /* Resolve mqtt broker domain names using dns */
    do_dns(mqtt_params.mqttHostUrl, mqtt_params.server_ip);

    /*mqtt init*/
    mqtt_init();

    while (true)
    {
        switch (run_status)
        {
        case CONN:
        {
            ret = MQTTConnect(&c, &data); /* Connect to the MQTT server */
            printf("Connect to the MQTT server: %d.%d.%d.%d:%d\r\n", mqtt_params.server_ip[0], mqtt_params.server_ip[1], mqtt_params.server_ip[2], mqtt_params.server_ip[3], mqtt_params.port);
            printf("Connected:%s\r\n\r\n", ret == SUCCESSS ? "success" : "failed");
            if (ret != SUCCESSS)
            {
                run_status = ERROR;
            }
            else
            {
                run_status = SUB;
            }
            break;
        }
        case SUB:
        {
            ret = MQTTSubscribe(&c, mqtt_params.subtopic, mqtt_params.subQoS, messageArrived); /* Subscribe to Topics */
            printf("Subscribing to %s\r\n", mqtt_params.subtopic);
            printf("Subscribed:%s\r\n\r\n", ret == SUCCESSS ? "success" : "failed");
            if (ret != SUCCESSS)
            {
                run_status = ERROR;
            }
            else
            {
                run_status = PUB_ONLINE;
            }
            run_status = PUB_ONLINE;
            break;
        }
        case PUB_ONLINE:
        {
            pubmessage.qos = 0;
            pubmessage.payload = "W5100S online!";
            pubmessage.payloadlen = strlen(pubmessage.payload);
            ret = MQTTPublish(&c, mqtt_params.willtopic, &pubmessage); /* Publish message */
            if (ret != SUCCESSS)
            {
                run_status = ERROR;
            }
            else
            {
                printf("publish:%s,%s\r\n\r\n", mqtt_params.willtopic, pubmessage.payload);
                run_status = PUB_MESSAGE;
            }
            break;
        }
        case PUB_MESSAGE:
        {
            pubmessage.qos = 0;
            pubmessage.payload = "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{\"CurrentTemperature\":26.6,},\"method\":\"thing.event.property.post\"}";
            pubmessage.payloadlen = strlen(pubmessage.payload);
            ret = MQTTPublish(&c, (uint8_t *)&(mqtt_params.pubtopic), &pubmessage); /* Publish message */
            if (ret != SUCCESSS)
            {
                run_status = ERROR;
            }
            else
            {
                printf("publish:%s,%s\r\n\r\n", mqtt_params.pubtopic, pubmessage.payload);
                run_status = KEEPALIVE;
            }
            break;
        }
        case KEEPALIVE:
        {
            if (MQTTYield(&c, 30) != SUCCESSS) /* keepalive MQTT */
            {
                run_status = ERROR;
            }
            sleep_ms(100);
            break;
        }
        case ERROR: /* Running error */
            printf("system ERROR!");
            sleep_ms(1000);
            break;

        default:
            break;
        }
    }
}

4.5 结果演示

在这里插入图片描述

1.打开WIZ UartTool,填入参数,获取到IP之后解析mqtt服务器域名,然后进行阿里云的连接,连接成功后会打印订阅和发布的主题,并对服务器发送信息,同时上传模拟的物模型数据。

在这里插入图片描述

2.可以看到板子上LED灯是灭的,接下来我们通过阿里云来将灯给打开。

在这里插入图片描述

3.可以看到设备已经上线,并且物模型以及获取到开发板发布的数据,然后我们看到LED是关闭状态。进入到在线调试进行设置灯的状态。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.可以看到当阿里云设置完灯的状态时,串口打印出接收到数据,并通过json解析出开启LED灯,然后开发板将灯开启。至此测试结束。

5 注意事项

  • 发布和订阅不要弄反了 ,弄反会导致收不到消息。
  • 把阿里云的物模型主题复制过来时,需要把{devicename}替换成设备名
  • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:

​ (1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。

​ (2)在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

6 相关链接

WIZnet官网

WIZnet官方库链接

本章例程链接

想了解更多,评论留言哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1188940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mindspore mindcv图像分类算法;模型保存与加载

参考&#xff1a; https://www.mindspore.cn/tutorials/en/r1.3/save_load_model.html https://github.com/mindspore-lab/mindcv/blob/main/docs/zh/tutorials/finetune.md 1、mindspore mindcv图像分类算法 import os from mindcv.utils.download import DownLoad import o…

举个栗子!Tableau 技巧(259):文本表中省市县数据的灵活逐级下钻「方法一」

之前&#xff0c;我们分享过 &#x1f330;&#xff1a;实现地图中的省市县逐级下钻。有数据粉提出问题&#xff1a;如果不是地图&#xff0c;而是文本表&#xff0c;有什么办法可以像这样&#xff0c;实现地理位置逐级下钻呢&#xff1f; 文本表也是可以的。但是&#xff0c;…

Count-based exploration with neural density models论文笔记

Count-based exploration with neural density models[J]. International Conference on Machine Learning,International Conference on Machine Learning, 2017. 基于计数的神经密度模型探索 0、问题 这篇文章的关键在于弄懂pseudo-count的概念&#xff0c;以及是如何运用…

【Leetcode】202. 两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

Java 身份证号校验,根据身份证号识别出生地

Java 身份证号校验&#xff1a; import org.apache.commons.lang.StringUtils;import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.Map;/*** desc 身份证工具类* auth llp* date 2022/7/7 16:13*/ public class IdCardNum…

Java算法(三): 判断两个数组是否为相等 → (要求:长度、顺序、元素)相等

Java算法&#xff08;三&#xff09; 需求&#xff1a; 1. 定义一个方法&#xff0c;用于比较两个数组是否相同2. 需求&#xff1a;长度&#xff0c;内容&#xff0c;顺序完全相同package com.liujintao.compare;public class SameArray {public static void main (String[] a…

JAVA微信端医院3D智能导诊系统源码

医院智能导诊系统利用高科技的信息化手段&#xff0c;优化就医流程。让广大患者有序、轻松就医&#xff0c;提升医疗服务水平。 随着人工智能技术的快速发展&#xff0c;语音识别与自然语言理解技术的成熟应用&#xff0c;基于人工智能的智能导诊导医逐渐出现在患者的生活视角中…

小红书达人投放比例是多少合适?品牌方必看

品牌做小红书种草推广想要产生更好的效果&#xff0c;是需要素人和达人按照一定比例去进行投放的&#xff0c;素人铺量可以让产品产生迅速曝光的效果&#xff0c;少量达人投放可以让产品产生更好的转化效果。 小红书达人投放具有较高的互动性和口碑传播效果。达人通过自身的影…

打开pr提示找不到vcomp100.dll无法继续执行代码怎么办?5种dll问题解决方案全解析

vcomp100.dll是一个由Microsoft开发的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它对于许多基于图形的应用程序&#xff08;如Photoshop&#xff09;和多个游戏&#xff08;如《巫师3》&#xff09;至关重要。以下是关于vcomp100.dll的属性介绍以及找不到vcomp100…

小程序如何部署SSL证书

微信小程序开发前提必须拥有一本SSL证书&#xff0c;办理SSL证书之前确保好指定的微信小程序开发接口使用的域名&#xff0c;如果没有域名的提前申请好&#xff0c;并且到国内服务器提供商去办理备案。 了解微信小程序使用SSL证书的作用&#xff0c;包括以下三个方面&#xff1…

[C语言基础]文件读取模式简析

文件操作 打开方式介绍r / rb模式w / wb模式 打开方式介绍 函数fopen可打开一个文件&#xff0c;返回值是文件指针FILE * 第一个参数是文件路径&#xff0c;第二个参数是打开方式mode 参数可为以下几种&#xff1a; r/w/a/r/w/a/rb/wb/ab/rb/wb/ab 其中&#xff0c; r 为只读&…

求臻医学MRD产品喜获北京市新技术新产品(服务)证书

近日&#xff0c;北京市科学技术委员会、中关村科技园区管理委员会、北京市发展和改革委员会等五大部门联合公示了2023年度第一批&#xff08;总第十八批&#xff09;北京市新技术新产品&#xff08;服务&#xff09;名单。凭借领先的技术能力、产品创新能力及质量可靠性等优势…

大数据毕业设计选题推荐-河长制大数据监测平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

VM虚拟机安装

想编译一个 c 代码 windows 转成 linux 安装一个vm 准备一个虚拟机安装包&#xff0c;双击&#xff0c;开始安装 下一步 缸盖安装位置路径&#xff0c;添加PATH&#xff0c;下一步 下一步 添加到桌面&#xff0c;加入开始菜单&#xff0c;下一步 打开桌面的软件图标&#…

Panorama SCADA平台的警报通知功能配置详解

1. 前言 SCADA系统的主要目标是采集与监控工业过程数据&#xff0c;以确保工业生产正常运行。通过实时警报通知功能&#xff0c;操作人员可以立即获取有关潜在问题的信息&#xff0c;从而能够快速采取行动解决问题&#xff0c;防止进一步的损害或生产中断。因此&#xff0c;及…

小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核

小程序版本审核未通过&#xff0c;需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path&#xff0c;请设置后再提交代码审核 因小程序尚未发布&#xff0c;订单中心不能正常打开查看&#xff0c;请先发布小程序后再提交订单中心PATH申请 初次提交…

03【远程协作开发、TortoiseGit、IDEA绑定Git插件的使用】

上一篇&#xff1a;02【Git分支的使用、Git回退、还原】 下一篇&#xff1a;【已完结】 目录&#xff1a;【Git系列教程-目录大纲】 文章目录 一、远程协作开发1.1 远程仓库简介1.1.1 Github1.1.2 Gitee1.1.3 其他托管平台 1.2 发布远程仓库1.2.1 创建项目1&#xff09; 新…

deeplog中输出某个 event 的概率

1 实现之后效果 # import DeepLog and Preprocessor import numpy as np from deeplog import DeepLog import torch# Create DeepLog object deeplog DeepLog(input_size 10, # Number of different events to expecthidden_size 64 , # Hidden dimension, we suggest 64…

K8s----资源管理

目录 一、Secret 1、创建 Secret 1.1 用kubectl create secret命令创建Secret 1.2 内容用 base64 编码&#xff0c;创建Secret 2、使用方式 2.1 将 Secret 挂载到 Volume 中&#xff0c;以 Volume 的形式挂载到 Pod 的某个目录下 2.2 将 Secret 导出到环境变量中 二、Co…

大数据之LibrA数据库系统告警处理(ALM-12033 慢盘故障)

告警解释 系统每一秒执行一次iostat命令&#xff0c;监控磁盘I/O的系统指标&#xff0c;如果在60s内&#xff0c;svctm大于100ms的周期数大于30次则认为磁盘有问题&#xff0c;产生该告警。 更换磁盘后&#xff0c;告警自动恢复。 告警属性 告警ID 告警级别 可自动清除 1…