×

用于PIC IoT和AVR IoT的AWS应用程序

消耗积分:0 | 格式:zip | 大小:1.54 MB | 2022-11-25

分享资料个

描述

如果您可以同时构建您的 IoT 硬件设备原型并构建您的云应用程序会怎样?好消息。我和我的团队花了几个月的时间在从嵌入式到云的旅程中跌跌撞撞。我们陷入了时间陷阱并发现了陷阱,因此您无需这样做!我们相信我们终于策划了一种理想的方式来让您开始开发自己的应用程序。

在GitHub 上查看我们完整的指导之旅

在这个项目中,您将获得对嵌入式设备(AVR-IoTPIC-IoT板)进行编程以及使用 AWS 和 MQTT 发布/订阅消息传递协议构建云应用程序的实践经验。

在本教程结束时,您将能够从云中的开发板查看按钮按下信息。您还将创建一个应用程序,其中开发板的 LED 被配置为在云接收到有关按钮按下的信息时闪烁。

您可以使用一个或多个开发板进行跟进。如果您使用两个或更多,您将获得特殊待遇——当按下任何一个按钮时,云应用程序将使每个连接的开发板上的 LED 闪烁也许您可以将一个给朋友,然后将闪烁的 LED 用作秘密消息系统?

pYYBAGOAH92AJbR3AACSB2YTcz4473.png
本项目中的数据流图解
 

在你开始之前

  • 查看 IoT 板附带的沙盒演示,方法是将其连接到您的计算机,打开CURIOSITY驱动器,然后单击CLICK-ME.HTM文件。
  • 下载并安装最新版本的MPLAB X IDE。
  • 下载并安装最新版本的XC8 (AVR-IoT) 和/或XC16 (PIC-IoT) 编译器。
如果您不熟悉 MPLAB X 集成开发人员环境 (IDE),可以查看以下指南:MPLAB® X IDE 和 Microchip 工具入门

第 1 步:配置您的 IoT 板

如果您尚未从沙盒迁移到私有 AWS 账户,则需要使用 Microchip 的 IoT 配置工具来完成。如果您不确定,您可能还没有 - 请查看本教程以设置您的板到云连接。

上述教程中,物联网板是使用物联网供应工具供应的。这会生成一个 AWS IoT Core 策略,用于确定董事会在与 AWS 资源交互时拥有哪些权限。默认情况下,此策略配置为仅授予 IoT 板发布和订阅包含板的事物名称的 MQTT 主题的权利。

在这个项目中,我们将通过主题发送和接收 MQTT 消息buttonPresses因此,我们必须扩展权限以包括此主题:

  • 在 AWS 中打开IoT Core模块,然后在左侧菜单中选择Secure -> Policies 。
  • 打开zt_policy并向下滚动到Policy 文档部分。
  • 单击编辑策略文档并执行如下所述的更改:
  • 更新iot:Publishiot:Receive权限以包含buttonPresses主题,如下所示。请注意,############以下代码中是您唯一的 AWS 资源标识符的占位符。请记住将其替换为原始保单文档中的标识符。
{
  "Effect": "Allow",
  "Action": [
    "iot:Publish",
    "iot:Receive"
  ],
  "Resource": [
    "arn:aws:iot:us-east-2:############:topic/${iot:Connection.Thing.ThingName}/*",
    "arn:aws:iot:us-east-2:############:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*",
    "arn:aws:iot:us-east-2:############:topic/buttonPresses"
  ]
},
  • 更新iot:Publishiot:Receive权限以包含buttonPresses主题,如下所示。请注意,############以下代码中是您唯一的 AWS 资源标识符的占位符。请记住将其替换为原始保单文档中的标识符。
{
  "Effect": "Allow",
  "Action": [
    "iot:Subscribe"
  ],
  "Resource": [
    "arn:aws:iot:us-east-2:############:topicfilter/${iot:Connection.Thing.ThingName}/*",
    "arn:aws:iot:us-east-2:############:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/*",
    "arn:aws:iot:us-east-2:############:topicfilter/buttonPresses"
  ]
},
  • 单击另存为新版本

权限现已更新,板应该能够通过buttonPressesMQTT 主题发送和接收数据。

第 2 步:下载预装固件的副本

我们的应用程序的起点是与您设备的微控制器系列兼容的未修改固件副本:

下载正确的存储库并在 MPLAB X 中打开PICIoT.X和/或AVRIoT.X项目。

我们将在接下来的几个步骤中对固件进行一些修改。如果遇到困难,可以在 GitHub 上查看这些完全修改后的固件版本:

第 3 步:向云端发送消息

我们希望在按下按钮时向 AWS 发送一条消息,我们将使用中断来检测。SW0

AVR-IoT 板的程序的第一部分与 PIC-IoT 板的程序有些不同。请按照以下适用于您设备的微控制器系列的程序进行操作:

AVR-IoT 板卡流程

在 MPLAB X 项目中,打开(Source Files -> MCC Generated Files)并在函数调用application_manager.c之后添加以下代码:SYSTEM_Initialize()application_init

SW0_EnableInterruptForFallingEdge();
PORTF_SW0_SetInterruptHandler(sendButtonPressToCloud);

第一行为AVR-IoT 板上的按钮启用下降沿中断检测,然后在第二行上分配此中断的函数处理程序。SW0

PIC-IoT板的程序

pin_manager.c中,执行以下编辑:

  • 在函数中,为按钮(连接到 RA7)PIN_MANAGER_initialize启用中断并通过包括以下两行来清除其中断标志:SW0
IOCNAbits.IOCNA7 = 1;     //Pin : RA7
IOCFAbits.IOCFA7 = 0;     //Pin : RA7
  • 在变量下面添加另一个变量INT_InterruptHandler来存储SW0硬件按钮的中断处理程序:
void (*SW0_InterruptHandler)(void) = NULL;
  • 添加一个设置我们刚刚创建的变量的函数(将它放在INT_SetInterruptHandler函数之后):
void SW0_SetInterruptHandler(void (* InterruptHandler)(void))
{
    IEC1bits.IOCIE = 0; //Disable IOCI interrupt
    SW0_InterruptHandler = InterruptHandler;
    IEC1bits.IOCIE = 1; //Enable IOCI interrupt
}

修改_IOCInterrupt中断服务程序以处理SW0按钮按下(中断服务程序位于 155 行附近pin_manager.c)。下面提供了完全修改的中断服务程序。要么全部复制并替换_IOCInterrupt,要么将第二个嵌套if语句添加到您的项目中。

void __attribute__ (( interrupt, no_auto_psv )) _IOCInterrupt ( void )
{
    if(IFS1bits.IOCIF == 1)
    {
        // Clear the flag
        IFS1bits.IOCIF = 0;
        if(IOCFAbits.IOCFA12 == 1)
        {
            IOCFAbits.IOCFA12 = 0;  //Clear flag for Pin - RA12
            if(INT_InterruptHandler)
            {
                INT_InterruptHandler();
            }
        }

        // Handle SW0 button presses
        if(IOCFAbits.IOCFA7 == 1)
        {
            IOCFAbits.IOCFA7 = 0;  //Clear flag for Pin - RA7
            if(SW0_InterruptHandler)
            {
                SW0_InterruptHandler();
            }
        }
    }
}

pin_manager.h中,添加SW0_SetInterruptHandler我们刚刚添加的函数的声明,使其在其他文件中可用,例如在INT_SetInterruptHandler函数声明之后:

void SW0_SetInterruptHandler(void (* InterruptHandler)(void));

在中,函数调用之后application_manager.c设置中断处理程序SW0SYSTEM_Initialize()application_init

// Set interrupt handler for button presses
SW0_SetInterruptHandler(sendButtonPressToCloud);

AVR-IoT 和 PIC-IoT 板的程序

上述过程确保只要按下 PIC-IoT 或 AVR-IoT 板上的按钮,sendButtonPressToCloud就会调用该函数。SW0

IoT 板使用 MQTT 协议与 AWS 通信,该协议使用发布-订阅模型。消息不直接在设备之间发送,而是发布到特定主题。设备可以订阅各种主题,AWS 会跟踪消息的分发方式。

让我们声明一个变量来跟踪我们将使用的 MQTT 主题。将以下声明添加到application_manager.c(例如,在mqttSubscribeTopic变量声明下方):

char tutorialMqttTopic[SUBSCRIBE_TOPIC_SIZE];

通过添加以下代码来实现上述函数处理程序application_manager.c

static void sendButtonPressToCloud(){
    // Ensure that we have a valid cloud connection
    if (shared_networking_params.haveAPConnection)
    {
        static char tutorialPayload[PAYLOAD_SIZE];
        int tutorialLen = 0;

        // Set MQTT topic
        memset((void*)tutorialMqttTopic, 0, sizeof(tutorialMqttTopic));
        sprintf(tutorialMqttTopic, "buttonPresses");

        // Construct payload
        tutorialLen = sprintf(tutorialPayload,"{\"thing_name\":\"%s\"}", cid);

        // Publish data to cloud
        CLOUD_publishData((uint8_t*)tutorialMqttTopic ,(uint8_t*)tutorialPayload, tutorialLen);
    }
}

该函数与sendToCloud我们之前提到的函数非常相似,会将 MQTT 消息发布到buttonPresses主题。消息的内容将是一个 JSON 对象,其中包含发送消息的事物/设备的名称。

编译修改的项目并使用 MPLAB X 将其编程到器件上。这通过单击 MPLAB X 工具栏上的Make and Program Device Main Project按钮来完成。

验证消息是否已成功发送到 AWS

当设备编程成功后,让我们确保我们在 AWS 中接收到消息:

  • 登录 AWS 管理控制台并选择 IoT Core 服务。
  • 在左侧菜单中选择测试
  • 订阅主题字段中,输入buttonPresses
  • 单击订阅主题按钮。
  • 按下SW0板上的按键,观察按键按下在云端注册成功。
验证是否已在 AWS IoT Core 中成功接收消息
 

第 4 步:接收来自云端的消息

现在我们已经成功地修改了我们的项目以向自定义主题发送消息,我们还必须找到订阅该主题的方法:

  • 更改NUM_TOPICS_SUBSCRIBEin mqtt_config.h(Header Files -> MCC Generated Files -> config) 的定义,以允许最多同时订阅两个 MQTT 主题:
#define NUM_TOPICS_SUBSCRIBE 2
  • 编辑subscribeToCloud函数以包含对该主题application_manager.c的订阅。buttonPresses下面提供了完全修改后的功能。复制并替换整个subscribeToCloud函数,或者在 MPLAB X 项目中添加以下代码的最后两行。
static void subscribeToCloud(void)
{
   sprintf(mqttSubscribeTopic, "$aws/things/%s/shadow/update/delta", cid);
   CLOUD_registerSubscription((uint8_t*)mqttSubscribeTopic,receivedFromCloud);
   sprintf(tutorialMqttTopic, "buttonPresses");
   CLOUD_registerSubscription((uint8_t*)tutorialMqttTopic,receiveButtonPressFromCloud);
}
CLOUD_registerSubscription函数的第二个参数是一个处理程序,它指示接收到指定主题的消息时将运行哪个函数。因此,我们需要实现该receiveButtonPressFromCloud函数来处理任何接收到的消息。
  • 将以下函数定义添加到application_manager.c(函数上方的某个subscribeToCloud位置)以使设备的 LED 在收到消息时闪烁两次:
static void receiveButtonPressFromCloud(uint8_t *topic, uint8_t *payload){
    LED_test();
    LED_test();
}
  • 编译项目并在 MPLAB X 中对器件进行编程。如果您有多个可用的 AVR-IoT 或 PIC-IoT 器件,您可以尝试使用同一个项目对所有器件进行编程。
如果您同时使用 AVR-IoTPIC-IoT 设备要同时使用来自两个不同设备系列的设备,有必要分别为 GitHub 上的 AVR-IoT 和 PIC-IoT 存储库完成本教程,并使用兼容的固件。

您的设备现在应该已正确配置。如果SW0按下任何已配置 IoT 套件上的按钮,所有已配置 IoT 套件上的 LED 应闪烁两次。

成功!按下 SW0 按钮时,两个板都在闪烁!
 

下一步去哪里?

有关如何将 IoT 板与 AWS 结合使用的更多教程,请查看GitHub 上的适用于 AWS 的 Microchip IoT 开发人员指南


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !