如果您可以同时构建您的 IoT 硬件设备原型并构建您的云应用程序会怎样?好消息。我和我的团队花了几个月的时间在从嵌入式到云的旅程中跌跌撞撞。我们陷入了时间陷阱并发现了陷阱,因此您无需这样做!我们相信我们终于策划了一种理想的方式来让您开始开发自己的应用程序。
在GitHub 上查看我们完整的指导之旅
在这个项目中,您将获得对嵌入式设备(AVR-IoT或PIC-IoT板)进行编程以及使用 AWS 和 MQTT 发布/订阅消息传递协议构建云应用程序的实践经验。
在本教程结束时,您将能够从云中的开发板查看按钮按下信息。您还将创建一个应用程序,其中开发板的 LED 被配置为在云接收到有关按钮按下的信息时闪烁。
您可以使用一个或多个开发板进行跟进。如果您使用两个或更多,您将获得特殊待遇——当按下任何一个按钮时,云应用程序将使每个连接的开发板上的 LED 闪烁。也许您可以将一个给朋友,然后将闪烁的 LED 用作秘密消息系统?
CURIOSITY
驱动器,然后单击CLICK-ME.HTM
文件。如果您不熟悉 MPLAB X 集成开发人员环境 (IDE),可以查看以下指南:MPLAB® X IDE 和 Microchip 工具入门
如果您尚未从沙盒迁移到私有 AWS 账户,则需要使用 Microchip 的 IoT 配置工具来完成。如果您不确定,您可能还没有 - 请查看本教程以设置您的板到云连接。
在上述教程中,物联网板是使用物联网供应工具供应的。这会生成一个 AWS IoT Core 策略,用于确定董事会在与 AWS 资源交互时拥有哪些权限。默认情况下,此策略配置为仅授予 IoT 板发布和订阅包含板的事物名称的 MQTT 主题的权利。
在这个项目中,我们将通过主题发送和接收 MQTT 消息buttonPresses
。因此,我们必须扩展权限以包括此主题:
iot:Publish
和iot: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:Publish
和iot: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"
]
},
权限现已更新,板应该能够通过buttonPresses
MQTT 主题发送和接收数据。
我们的应用程序的起点是与您设备的微控制器系列兼容的未修改固件副本:
下载正确的存储库并在 MPLAB X 中打开PICIoT.X
和/或AVRIoT.X
项目。
我们将在接下来的几个步骤中对固件进行一些修改。如果遇到困难,可以在 GitHub 上查看这些完全修改后的固件版本:
我们希望在按下按钮时向 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
中,执行以下编辑:
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
设置中断处理程序:SW0
SYSTEM_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 中接收到消息:
buttonPresses
。SW0
板上的按键,观察按键按下在云端注册成功。现在我们已经成功地修改了我们的项目以向自定义主题发送消息,我们还必须找到订阅该主题的方法:
NUM_TOPICS_SUBSCRIBE
in 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();
}
如果您同时使用 AVR-IoT和PIC-IoT 设备:要同时使用来自两个不同设备系列的设备,有必要分别为 GitHub 上的 AVR-IoT 和 PIC-IoT 存储库完成本教程,并使用兼容的固件。
您的设备现在应该已正确配置。如果SW0
按下任何已配置 IoT 套件上的按钮,所有已配置 IoT 套件上的 LED 应闪烁两次。
有关如何将 IoT 板与 AWS 结合使用的更多教程,请查看GitHub 上的适用于 AWS 的 Microchip IoT 开发人员指南。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !