通过 MQTT 使用 C/C++ 和 Wi-Fi 网关发送和接收消息,将 W5500-EVB-Pico 连接到 Azure IoT Hub 的过程。
转发: W5500-EVB-Pico and WizFi360 Azure IoT Gateway
项目介绍
W5500/W5100S-EVB-Pico 通过 MQTT 使用 C/C++ 和 Gateway 发送和接收消息的过程。
您还可以使用 W5500/W5100S 或 Ethernet HAT+WizFi360-EVB-Pico 构建以下 HW 类型。
我对 IoT 中心使用了 SAS 令牌身份验证方法。
1.硬件
W5500 和 WizFi360 PIN 连接的详细信息
WizFi 的 TDX 和 RDX 跳线将 UART 数据发送到 UART W5500-EVB-Pico 引脚。
1. 1 WizFi360引脚图
1. 2 W5500-EVB-Pico 引脚图
W5100S-EVB-Pico | WIZnet Document System
创建 Azure 物联网中心
创建Azure IoT Hub的方式有很多种,比如Azure portal、Azure CLI、REST API等,一开始我们主要使用通过Azure portal创建的方式。
可以在下面的链接中找到说明。
请遵循本指南: Azure IoT cloud monitored and controlled Raspberry Pi Pico - Hackster.io
2.2 RP2040 C/C++开发环境
W5100S-EVB-Pico C/C++ Windows Development Environment
2.3.1 建造
构建操作使用了 Raspberry Pi C/C++ 环境。
W5100S-EVB-Pico C/C++ Windows Development Environment
下载并安装集成开发环境的程序
Release v0.3.4 · ndabas/pico-setup-windows · GitHub
2.3.2 存储库克隆
Raspberry Pi Pico W5x00 Azure IoT SDK 示例
RP2040 - W5100S 或 W5500 网络示例 - Azure IoT 云功能、Azure IoT SDK、Azure IoT 设备客户端和服务器。
构建 W5100S-EVB-Pico 设备固件
我将RP2040(W5500/W5100和WizFi360)网关设备代码上传到下面的链接,通过WiFi物联网设备的MAC地址进行控制。
已从 RP2040-HAT-AZURE-C 添加和修改 Azure IoT 中心网关内容:original example code.
克隆包含子模块的存储库并检索子模块。
git clone https://github.com/Wiznet/RP2040-HAT-AZURE-C.git
cd RP2040-HAT-AZURE-C
git submodule update --init
该网关执行以太网线程和 Wi-Fi 服务器线程。 当客户端物理连接到 AP 时,我们称之为连接状态。 在Wi-Fi驱动中采用; 我修改了 CMSIS WiFi 驱动程序 WiFi_WizFi360.h 和 WiFi_WizFi360.c 来管理连接信息。 (对于这个项目,我更新了从这个项目管理的客户端的 MAC 地址:IoT Gateway : W5500 + Raspberry Pi Pico + WizFi360 - Hackster.io)
typedef struct {
uint8_t conn_mac[8];
uint8_t conn_ip[4];
} CONNECTED_MAC_IP_s;
当客户端逻辑连接到 AP 的服务器时,我们称为链路连接。 因此网关管理着两个独立的客户端的 IP 和 MAC 地址数据。 网关通过区分物联网设备的 MAC 地址在 Azure 物联网中心和物联网设备之间发送和接收每个物联网设备的数据。 我们称其为链接的 MAC 地址。
/* ------------------------------------------------------------------------
* WizFi360 added for IoT Devices
* Station Connection Event Declaration
: to update/delete Mac Address for distinguishing IoT Devices
* -----------------------------------------------------------------------*/
void update_connected_macIp(uint8_t macAddr[6], uint8_t ipAddr[4]);
void update_linked_mac(void);
int update_unliked_mac(uint8_t macAddr[6]);
CONNECTED_MAC_IP_s ConnSta[4]; // Station's mac address connected to AP
uint8_t LinkedMac[5][6] = {0, }; // Client's mac address connected to Server
在以下 RP2040-HAT-AZURE-C/examples/main.c source 文件中,找到与此类似的行并根据需要替换它: RP2040-HAT-AZURE-C/examples/main.c
(...)
// The application you wish to use should be uncommented
//
#define APP_TELEMETRY
//#define APP_C2D
//#define APP_CLI_X509
//#define APP_PROV_X509
// The application you wish to use DHCP mode should be uncommented
#define _DHCP
static wiz_NetInfo g_net_info =
{
.mac = {0x00, 0x08, 0xDC, 0x12, 0x34, 0x56}, // MAC address
.ip = {192, 168, 11, 2}, // IP address
.sn = {255, 255, 255, 0}, // Subnet Mask
.gw = {192, 168, 11, 1}, // Gateway
.dns = {8, 8, 8, 8}, // DNS server
#ifdef _DHCP
.dhcp = NETINFO_DHCP // DHCP enable/disable
#else
// this example uses static IP
.dhcp = NETINFO_STATIC
#endif
};
从 Azure 门户复制并粘贴正确的连接字符串和键值到RP2040-HAT-AZURE-C/examples/sample_certs.c:
/* Paste in your IoT hub connection string */
const char pico_az_connectionString[] = "[device connection string]";
const char pico_az_x509connectionString[] = "[device connection string]";
const char pico_az_x509certificate[] =
"-----BEGIN CERTIFICATE-----""\n"
"-----END CERTIFICATE-----";
const char pico_az_x509privatekey[] =
"-----BEGIN PRIVATE KEY-----""\n"
"-----END PRIVATE KEY-----";
const char pico_az_id_scope[] = "[ID Scope]";
const char pico_az_COMMON_NAME[] = "[custom-hsm-device]";
const char pico_az_CERTIFICATE[] =
"-----BEGIN CERTIFICATE-----""\n"
"-----END CERTIFICATE-----";
const char pico_az_PRIVATE_KEY[] =
"-----BEGIN PRIVATE KEY-----""\n"
"-----END PRIVATE KEY-----";
1. 构建并运行应用程序
运行 VS Code 或 VS 2019 的 Developer 命令提示符并构建应用程序。 将 main.uf2 文件复制到 Raspberry Pi Pico 板中。
2.5 固件上传
将固件上传到设备。
进入启动模式
如果在按住BOOTSEL键的同时按下RUN键,则进入开机模式,无需重新上电。
3. 设置 Azure 物联网中心
有多种获取信息的方法,其中,我使用了 IoT Explorer。
在 Azure 环境中安装 PC 库。
从 IoT Explorer 获取设备信息
您需要获取连接到 Azure IoT 中心的信息并将其写入您的代码。
请参阅 Azure IoT 中心指南:使用 MQTT 协议与您的 IoT 中心通信,了解与 MQTT 通信时每个字段的要求: Azure IoT Hub Guide: Communicate with your IoT hub using the MQTT protocol
对于示例代码,应获取以下数据。
如果查看代码,它会解析连接字符串以获取主机名、设备 ID 和共享访问键值。
首先,需要授予访问权限,以便 IoT Explorer 可以访问 IoT 中心。
在默认权限中,iothubowner 权限(包括所有权限)将授予 IoT Explorer。
单击 iothubonwer,单击主连接字符串右侧的按钮,复制值,然后将其粘贴到在 IoT Explorer 中单击添加连接并保存时出现的窗口中。
设备创建
如果一开始只设置一次此设置,则可以在该工具中执行 IoT 中心和设备的大部分任务。
创建设备后,得到如图所示的信息值。
简单遥测测试:使用设备自己的 MAC 地址接收来自物联网设备的消息
物联网设备的接收消息日志
Sending message 1 to IoTHub
Message:
iotSocketRecv data is 123
Sending message 7 to IoTHub
Message:
-> 08:18:48 PUBLISH | IS_DUP: false | RETAIN: 0 | QOS: DELIVER_AT_LEAST_ONCE | TOPIC_NAME: devices/wiznetGateway/messages/events/display_message=Hello_RP2040_W5100S&%24.cid=CORE_ID&%24.mid=MSG_ID&%24.ct=application%252fjson&%24.ce=utf-8 | PACKET_ID: 9 | PAYLOAD_LEN: 53
<- 08:18:50 PUBACK | PACKET_ID: 9
Confirmation callback received for message 7 with result IOTHUB_CLIENT_CONFIRMATION_OK
iotSocketRecv data is wiznet device1
<- 07:42:36 PUBLISH | IS_DUP: false | RETAIN: 0 | QOS: DELIVER_AT_LEAST_ONCE | TOPIC_NAME: devices/wiznetGateway/messages/devicebound/%24.mid=080d3e1f-e25e-437e-b15b-5525878f9439&%24.to=%2Fdevices%2FwiznetGateway%2Fmessages%2Fdevicebound&mac=48%3A60%3A5F%3A2F%3A76%3AC8 | PACKET_ID: 5 | PAYLOAD_LEN: 9
Received Binary message
Message ID: 080d3e1f-e25e-437e-b15b-5525878f9439
Correlation ID:
Data: <<>> & Size=9
Message Properties:
Key: mac Value: 48:60:5F:2F:76:C8
macstr: 48:60:5F:2F:76:C85h en = 26
Received C-to-D Message: Power Off
MQTT Subsribed the msg to client: Power Off, idx = 1
Message Call Count is 4:
-> 07:42:37 PUBACK | PACKET_ID: 5
iotSocketSend data is Power Off
如何组成远程物联网设备
您可以设置它,以便 Azure IoT Hub 可以通过此网关控制 IoT 设备(客户端),请参阅下文。
TCP 客户端 LED 开/关参考和示例:
TCP Client LED ON & OFF for Raspberry Pi Pico with WizFi360