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);
  }
}


相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
物联网
Arduino中使用PubSubClient对接阿里云物联网平台
Arduino中使用PubSubClient对接阿里云物联网平台
2049 20
|
物联网 Python 网络性能优化
在ESP32上使用umqtt接入阿里云物联网平台
网络上已经有使用python 模拟设备接入阿里云,手里刚好有块ESP32的小板子,在上面跑过Alios Things,然后接入阿里云。但是终究感觉麻烦,有的时候只是做一个很简单的应用,跑os确实不太方便。
12671 1
|
传感器 存储 IDE
ESP32
ESP32是一系列低成本、低功耗的SoC微控制器,集成了Wi-Fi和双模蓝牙功能。ESP32系列采用Tensilica Xtensa LX6微处理器,包括双核和单核版本,也有Xtensa LX7双核微处理器或单核RISC-V微处理器,内置天线开关、射频平衡器、功率放大器、低噪声接收放大器、滤波器和电源管理模块。ESP32由上海的Espressif Systems公司创建和开发,使用台积电的40纳米工艺制造。它是ESP8266微控制器的后继产品。
1865 3
|
物联网
基于ESP32连接阿里云生活物联网平台的一些经验总结
基于ESP32连接阿里云生活物联网平台的一些经验总结
1423 1
|
物联网
(手把手)在华为云、阿里云搭建自己的物联网MQTT消息服务器,免费IOT平台
本文介绍如何在阿里云搭建自己的物联网MQTT消息服务器,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
3934 42
|
存储 网络协议 Java
【TCP 连接手段】C++编程视角下的TCP:短连接与长连接深度解析
【TCP 连接手段】C++编程视角下的TCP:短连接与长连接深度解析
640 1
EMQ
|
存储 安全 物联网
通过用户名密码认证保障 MQTT 接入安全
本文主要探讨MQTT中的认证机制,及其可以解决哪些安全风险。并详细介绍了基于用户名密码的认证方法。
EMQ
1254 65
|
缓存 运维 Docker
Docker清理磁盘空间
在日常运维当中,Docker会产生一些运行时的临时文件,我们需要定时的清理掉他们,不然将会对磁盘造成极大的压力。
808 0
|
关系型数据库 PostgreSQL
PostgreSQL 比较运算符
PostgreSQL 比较运算符
2489 0

相关产品

  • 物联网平台