如何使用X.509证书从树莓派向Azure IoT Hub发送数据
把树莓派发送数据到Azure IoT Hub的代码改为X.509证书认证
核心修改点:替换连接字符串为X.509证书初始化客户端
原代码用DeviceClient.fromConnectionString创建连接,我们要改成基于X.509证书的初始化方式,具体修改步骤如下:
1. 先准备好证书文件
确保树莓派上有这几个文件(路径可自行调整):
- 设备PEM格式证书:比如
device-cert.pem - 设备PEM格式私钥:比如
device-key.pem - 可选:CA根证书(如果IoT Hub使用自定义CA,或需要验证服务器证书)
2. 修改index.js的代码
2.1 引入文件读取模块
在文件开头添加fs模块,用来读取本地证书文件:
const fs = require('fs');
2.2 删除连接字符串,配置证书参数
删掉原来的connectionString变量,替换成你的IoT Hub主机名、设备ID和证书路径:
// 替换成你的实际信息 const iotHubHostname = '你的IoT Hub主机名,比如xxx.azure-devices.net'; const deviceId = '你的设备ID'; const deviceCertPath = './device-cert.pem'; // 你的设备证书路径 const deviceKeyPath = './device-key.pem'; // 你的设备私钥路径 // 可选:如果需要CA根证书,取消下面注释并填写路径 // const caCertPath = './AzureIoTHubCA.crt.pem';
2.3 替换客户端初始化代码
把原来用连接字符串创建客户端的代码,换成X.509证书的方式:
// 替换原Client.fromConnectionString这一行 const client = Client.fromX509Certificate( { hostName: iotHubHostname, deviceId: deviceId, x509: { cert: fs.readFileSync(deviceCertPath, 'utf-8'), key: fs.readFileSync(deviceKeyPath, 'utf-8') }, // 可选:需要CA根证书的话取消下面注释 // ca: fs.readFileSync(caCertPath, 'utf-8') }, Protocol );
3. 确保设备在IoT Hub已注册X.509证书
登录Azure门户,找到你的IoT Hub和对应设备,确认设备的认证方式为X.509,并且已经上传了对应的证书(自助签名或CA签名均可)。
完整修改后的代码片段参考
'use strict'; const fs = require('fs'); const Client = require('azure-iot-device').Client; const Message = require('azure-iot-device').Message; const Protocol = require('azure-iot-device-mqtt').Mqtt; // X.509认证配置 const iotHubHostname = 'your-hub-name.azure-devices.net'; const deviceId = 'your-device-id'; const deviceCertPath = './device-cert.pem'; const deviceKeyPath = './device-key.pem'; // 创建X.509客户端 const client = Client.fromX509Certificate( { hostName: iotHubHostname, deviceId: deviceId, x509: { cert: fs.readFileSync(deviceCertPath, 'utf-8'), key: fs.readFileSync(deviceKeyPath, 'utf-8') } }, Protocol ); // 原有连接和发送消息的逻辑完全保留 client.open((err) => { if (err) { console.error('连接失败: ' + err.message); } else { console.log('客户端已连接'); setInterval(() => { const temperature = 20 + (Math.random() * 15); const humidity = 60 + (Math.random() * 20); const data = JSON.stringify({ temperature: temperature, humidity: humidity }); const message = new Message(data); message.properties.add('temperatureAlert', (temperature > 30) ? 'true' : 'false'); console.log('发送消息: ' + message.getData()); client.sendEvent(message, (err) => { if (err) { console.error('发送消息出错: ' + err.message); } else { console.log('消息发送成功'); } }); }, 2000); } });
内容的提问来源于stack exchange,提问作者melain
相关产品推荐
相关产品推荐

