PubSubClient连接物联网平台

简介: Arduino中使用设备三元组连接阿里云物联网平台

之前的 例子 是使用username,password,clientid连接物联网平台的,但是阿里云物联网平台提供productKey,deviceName,deviceSerect来连接平台的,下面的例子是使用设备三元组计算出userName,passWord,clientId后再连接平台的,这样只要替换设备三元组信息就可以了。使用到的库是:PubSubClient,Crypto。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SHA256.h>
#define MQTT_PORT (1883)
#define SHA256HMAC_SIZE (32)
#define ALINK_CLIENTID_FORMAT "%s.%s|securemode=2,signmethod=hmacsha256,timestamp=%s|"
// Update these with values suitable for your network.
const char* ssid = "***";
const char* password = "***";
const char *mqtt_server = "***.iot-as-mqtt.cn-shanghai.aliyuncs.com";
const char *productKey = "***";
const char *deviceName = "***";
const char *deviceSecret = "***";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
int value = 0;
void setup_wifi() {
  delay(10);
  //We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}
String hmac256(const String &signcontent, const String &ds)
{
    byte hashCode[SHA256HMAC_SIZE];
    SHA256 sha256;
    const char *key = ds.c_str();
    size_t keySize = ds.length();
    sha256.resetHMAC(key, keySize);
    sha256.update((const byte *)signcontent.c_str(), signcontent.length());
    sha256.finalizeHMAC(key, keySize, hashCode, sizeof(hashCode));
    String sign = "";
    for (byte i = 0; i < SHA256HMAC_SIZE; ++i)
    {
        sign += "0123456789ABCDEF"[hashCode[i] >> 4];
        sign += "0123456789ABCDEF"[hashCode[i] & 0xf];
    }
    return sign;
}
void reconnect() {
  //Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    long times = millis();
    String timestamp = String(times);
    char mqtt_clientId[256] = "";
    sprintf(mqtt_clientId, ALINK_CLIENTID_FORMAT, productKey, deviceName, timestamp.c_str());
    char mqtt_user[100] = "";
    sprintf(mqtt_user, "%s&%s", deviceName, productKey);
    String signcontent = "clientId";
    signcontent += productKey;
    signcontent += ".";
    signcontent += deviceName;
    signcontent += "deviceName";
    signcontent += deviceName;
    signcontent += "productKey";
    signcontent += productKey;
    signcontent += "timestamp";
    signcontent += timestamp;      
    String pwd  = hmac256(signcontent, deviceSecret); 
    char mqtt_pwd[100] = "";
    strcpy(mqtt_pwd, pwd.c_str());
    // Attempt to connect
    if (client.connect(mqtt_clientId, mqtt_user, mqtt_pwd)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(12000);
    }
  }
}
void setup() {
  //pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, MQTT_PORT);
  client.setCallback(callback);
}
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  unsigned long now = millis();
  if (now - lastMsg > 5000) {
    lastMsg = now;
    ++value;
    char topic[50] = "";
    char msg[100] = "";
    sprintf(topic, "/%s/%s/user/update", productKey, deviceName);
    sprintf(msg, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish(topic, msg);
  }
}


相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
4月前
|
传感器 监控 安全
物联网与智能家居:连接未来的无限可能
随着科技的不断进步,物联网(IoT)正逐渐渗透到我们的生活中。智能家居作为物联网的重要应用领域,正在改变我们的生活方式。本文将探讨物联网在智能家居中的应用,以及它对我们日常生活的影响。
|
4月前
|
传感器 物联网 智能硬件
连接家居的未来:物联网在智能家居中的革命性应用
随着物联网技术的迅猛发展,智能家居正成为我们生活中不可忽视的一部分。本文将探讨物联网在智能家居领域的创新和应用,包括智能设备的互联互通、家庭自动化、能源管理等方面的进展,以及其对我们日常生活的影响与未来发展的前景。
138 0
|
5月前
|
数据采集 监控 物联网
物联网时代的电脑行为监控软件:代码实现与设备连接
随着物联网技术的飞速发展,电脑行为监控软件在日常生活和商业领域中变得愈发重要。这种软件通过对电脑用户行为的监测,提供了有益的数据,有助于改善用户体验、增强安全性,甚至在一些场景中实现自动化操作。本文将探讨物联网时代的电脑行为监控软件的代码实现与设备连接,并重点介绍监控到的数据如何自动提交到网站。
275 0
|
6月前
|
物联网 5G 定位技术
智能物联网远程应用连接系统
智能物联网远程应用连接系统
119 0
|
8月前
|
物联网 开发工具 网络架构
基于AT模组连接阿里云物联网平台
本实验主要介绍基于AT模组,通过AT指令将端侧设备快速连接到阿里云物联网平台,助力设备智能化改造。
523 0
|
9月前
|
传感器 边缘计算 人工智能
物联网:连接世界的智能革命
物联网正在引领着智能化的时代,连接各种设备、传感器和对象,实现信息共享和智能化的革命。从家居到工业,物联网的应用正在改变着我们的生活和工作方式。在未来,我们可以期待物联网将在更多领域带来新的机遇和创新。
123 3
|
9月前
|
安全 物联网 物联网安全
物联网安全:保护连接世界的数字边界
本篇深入研究了物联网中的安全问题,包括物联网安全挑战与威胁,设备安全与通信安全,以及身份认证与访问控制。我们介绍了物联网安全面临的常见问题,如数据泄露和隐私侵犯,并通过代码示例展示了数据加密的基本原理。同时,我们探讨了如何保护物联网设备的安全,包括固件更新和漏洞修复。此外,我们讨论了通信安全的重要性,介绍了使用TLS/SSL协议保护数据传输的方法。最后,我们演示了如何使用JWT进行身份认证和访问控制,通过示例代码展示了JWT的生成和验证过程。通过这些内容,读者将更深入了解如何在物联网环境中保护连接和数据的安全,为实现可靠的物联网应用提供了有益的指导。
145 0
|
9月前
|
传感器 IDE 物联网
物联网操作系统与开发:连接智能世界的编程之旅
本篇深入研究了物联网中的操作系统选择与比较,嵌入式软件开发环境,以及物联网应用程序的开发与调试。我们比较了常见的物联网操作系统,并通过Zephyr操作系统的示例代码展示了如何控制LED灯。读者将了解嵌入式开发环境的设置,包括交叉编译器和IDE的配置,以及如何开发物联网应用程序,从传感器数据采集到与云平台通信。通过本篇内容,读者将更加了解物联网操作系统与应用开发的关键知识,为连接智能世界的编程之旅奠定了基础。
133 0
|
9月前
|
传感器 监控 物联网
探索物联网传感器与执行器:连接万物的感知与控制
本篇详细介绍了物联网中传感器与执行器的关键概念与应用。我们探讨了传感器的原理与分类,包括温度、湿度、光照、运动传感器等的实际应用。同时,我们还研究了执行器的作用,并通过Python代码示例展示了如何控制LED灯作为执行器。这些知识有助于读者深入了解物联网中感知与控制的基础,为创造智能化应用奠定了基础。
286 0
|
9月前
|
消息中间件 传感器 安全
物联网通信技术与协议:连接万物的无限可能
本篇深入探讨了物联网中的通信技术和协议。我们介绍了无线通信技术,包括Wi-Fi、蓝牙、LoRa和NB-IoT,以及通信协议如MQTT、CoAP和HTTP。重点强调了通信安全的重要性,并通过代码示例展示了如何使用加密技术确保数据传输的安全性。这些知识帮助读者了解如何在物联网应用中选择适合的通信方式,并保护数据免受未经授权的访问和篡改。
197 0

热门文章

最新文章

相关产品

  • 物联网平台