Arduino ESP8266 MQTT 阿里 腾讯 连接示例

Arduino ESP8266 MQTT 阿里 腾讯 连接示例

 ESP8266基于Arduino IDE 快速搭建IoT还是很方便的,降低了很多门槛。官方的示例丰富的话,中小学生都能搞物联网了。真希望各大厂能开办这方面的平台,是素质教育平台,也是播种机,长远来看必有收益。

这里的内容就是实践物联网平台可能用到的代码,简单做个对比,抛砖引玉啦。

有兴趣的同学可以参看大厂官方的文档。

腾讯
设备基于 TCP 的 MQTT 接入
https://cloud.tencent.com/document/product/634/32546

 

void TENCENTIoTSDK::begin(Client& espClient,
                          const char* _productKey,
                          const char* _deviceName,
                          const char* _deviceSecret,
                          const char* _region,
                          long expr)
{
  //*
  mqttConnecting = false;
  if(client != NULL){
  delete  client;
  client=NULL;
  }
  client = new PubSubClient(espClient);
  productKey = _productKey;
  deviceName = _deviceName;
  deviceSecret = _deviceSecret;
  region = _region;
  long times = millis();

  //# 1. 生成 connid 为一个随机字符串,方便后台定位问题
  //connid  = "zzz"#RandomConnid(5)
  String connid = "zzz12";//#RandomConnid(5);
  //# 2. 生成过期时间,表示签名的过期时间,从纪元1970年1月1日 00:00:00 UTC 时间至今秒数的 UTF8 字符串
  //expiry  = 1234567890#int(time.time()) + 60 * 60
  String expiry = String(expr);//exp;
  //# 3. 生成 MQTT 的 clientid 部分, 格式为 ${productid}${devicename}
  //clientid = "{}{}".format(productID, devicename)
  String clientid = "";
  clientid += productKey ;
  clientid += deviceName;
  //# 4. 生成 MQTT 的 username 部分, 格式为 ${clientid};${sdkappid};${connid};${expiry}
  //username = "{};12010126;{};{}".format(clientid, connid, expiry)
  String username = clientid + ";12010126;" + connid + ";" + expiry;
  //# 5. 对 username 进行签名,生成token
  //secret_key = devicePsk.encode('utf-8')  # convert to bytes
  String secret_key = deviceSecret;//-----------------------------------
  //data_to_sign = username.encode('utf-8')  # convert to bytes
  //secret_key = base64.b64decode(secret_key)  # this is still bytes

  int inputStringLength = secret_key.length();
  char sk[inputStringLength + 1];
  for (size_t i = 0; i < inputStringLength; i++) {
    sk[i] = deviceSecret[i];
  }
  sk[inputStringLength] = 0;
  int decodedLength = Base64.decodedLength(sk, inputStringLength);
  char decodedString[decodedLength];

  Base64.decode(decodedString, sk, inputStringLength);

  String  data_to_sign = username;
  //secret_key = base64.b64decode(secret_key);
  //token = hmac.new(secret_key, data_to_sign, digestmod=hashlib.sha256).hexdigest()
  String token = hmac256(data_to_sign, decodedString, decodedLength);
  //# 6. 根据物联网通信平台规则生成 password 字段
  //password = "{};{}".format(token, "hmacsha256")
  String password = token + ";hmacsha256";
  //return {
  //"clientid" : clientid,
  //"username" : username,
  //"password" : password
  //}
  strcpy(mqttUsername, username.c_str());
  strcpy(mqttPwd, password.c_str());

  Serial.println(clientid);
  Serial.println(username);
  Serial.println(password);

  //设备属性上报
  //当设备需要向云端上报数据时,开发平台为设备设定了默认的 Topic:
  //上行请求 Topic: $thing/up/property/{ProductID}/{DeviceName}
  //上行响应 Topic: $thing/down/property/{ProductID}/{DeviceName}
  //设备订阅能收到下发命令zzz响应和下发是走订阅的同一个主题
  //$thing/down/property/7IL05FSCJ8/cp1

  sprintf(TCLINK_TOPIC_PROP_POST, "$thing/up/property/%s/%s", productKey, deviceName);
  sprintf(TCLINK_TOPIC_PROP_GET, "$thing/down/property/%s/%s", productKey, deviceName);
  sprintf(TCLINK_TOPIC_SERVICE_GET, "$thing/down/service/%s/%s", productKey, deviceName);
  sprintf(TCLINK_TOPIC_SHADOW_POST, "$shadow/operation/%s/%s", productKey, deviceName);
  sprintf(TCLINK_TOPIC_SHADOW_GET, "$shadow/operation/result/%s/%s", productKey, deviceName);
  sprintf(TCLINK_TOPIC_EVENT_POST, "$thing/up/event/%s/%s", productKey, deviceName);
  sprintf(TCLINK_TOPIC_EVENT_GET, "$thing/down/event/%s/%s", productKey, deviceName);
  sprintf(TCLINK_TOPIC_ACTION_POST, "$thing/up/action/%s/%s", productKey, deviceName);
  sprintf(TCLINK_TOPIC_ACTION_GET, "$thing/down/action/%s/%s", productKey, deviceName);

  //$shadow/operation/${productId}/${deviceName}



  //MQTT 服务器连接地址,广州域设备填入:${ ProductId }.iotcloud.tencentdevices.com,
  //这里 ${ ProductId } 为变量参数,用户需填入创建产品时自动生成的产品 ID,
  //例如 1A17RZR3XX.iotcloud.tencentdevices.com;端口:8883
  sprintf(domain, "%s.iotcloud.tencentdevices.com", productKey);
  Serial.println("setBufferSize:");
  bool bufok = client->setBufferSize(512);
  Serial.println(bufok);
  client->setServer(domain, MQTT_PORT); // 连接WiFi之后,连接MQTT服务器 //
  client->setCallback(callback);
  mqttCheckConnect();



  //*/
}

 阿里
使用MQTT.fx接入物联网平台

https://help.aliyun.com/document_detail/86706.html?spm=a2c4g.11186631.6.791.3cc43a20M64Pa1

void ALIIoTSDK::begin(Client &espClient,
                          const char *_productKey,
                          const char *_deviceName,
                          const char *_deviceSecret,
                          const char *_region)
{
  mqttConnecting = false;
  if(client != NULL){
  delete  client;
  client=NULL;
  }
  client = new PubSubClient(espClient);
  productKey = _productKey;
  deviceName = _deviceName;
  deviceSecret = _deviceSecret;
  region = _region;
  long times = millis();
  String timestamp = String(times);

  //sprintf(clientId, "%s|securemode=3,signmethod=hmacsha256,timestamp=%s|", deviceName, timestamp.c_str());
  sprintf(clientId, "%s|securemode=3,signmethod=hmacsha256,timestamp=%s|", deviceName, timestamp.c_str());
  String signcontent = "clientId";
  signcontent += deviceName;
  signcontent += "deviceName";
  signcontent += deviceName;
  signcontent += "productKey";
  signcontent += productKey;
  signcontent += "timestamp";
  signcontent += timestamp;
  //sprintf(clientId, "%s|securemode=3,timestamp=%s,signmethod=hmacsha256|", deviceName, timestamp.c_str());

  String pwd = hmac256(signcontent, deviceSecret);
  //sprintf(clientId, "xNhylKuXAG775N3GyTyn|securemode=3,timestamp=1610292470098,signmethod=hmacsha1|");
  //String pwd = hmacSHA1(signcontent, deviceSecret);
  //String pwd = "4B00863263E64F77280AA23D22AE291EAFCF5238";
  strcpy(mqttPwd, pwd.c_str());
  Serial.println(clientId);
  Serial.println(signcontent);
  Serial.println(deviceSecret);
  Serial.println(pwd);

  sprintf(mqttUsername, "%s&%s", deviceName, productKey);
  sprintf(ALINK_TOPIC_PROP_POST, "/sys/%s/%s/thing/event/property/post", productKey, deviceName);
  sprintf(ALINK_TOPIC_PROP_SET, "$thing/up/property/%s/%s", productKey, deviceName);
  sprintf(ALINK_TOPIC_EVENT, "/sys/%s/%s/thing/event", productKey, deviceName);

  sprintf(domain, "%s.iot-as-mqtt.%s.aliyuncs.com", productKey, region);
  client->setServer(domain, MQTT_PORT); // 连接WiFi之后,连接MQTT服务器
  client->setCallback(callback);

  mqttCheckConnect();
}

个人觉得使用腾讯平台开发省一些,毕竟微信啊,小程序啊这么的易上手。能免掉开发app的大工程。

 

### 回答1: 我可以帮助你使用STM32和ESP8266连接腾讯云。您可以参考腾讯云文档中提供的示例程序,学习如何将STM32和ESP8266连接腾讯云。你好! 如果你想让STM32和ESP8266连接腾讯云,以下是一些基本的步骤: 1. 在腾讯云上创建一个物联网通信产品,然后创建设备并记录设备证书信息。 2. 在ESP8266上安装适当的固件,如NodeMCU,并使用Arduino IDE编写程序以连接到WiFi网络并连接腾讯云的MQTT服务器。 3. 在STM32上使用HAL库编写程序以连接ESP8266的串口,并使用AT命令控制ESP8266连接到WiFi网络和腾讯云的MQTT服务器。 4. 通过MQTT协议,在ESP8266和STM32之间进行双向通信。 希望这可以帮助你开始。 ### 回答2: STM32和ESP8266作为嵌入式开发平台,在物联网领域有着广泛应用。它们可以进行通信、数据传输和互动,但要连接腾讯云的话还需要一些配置和设置。 一、硬件搭建 首先需要将ESP8266模块连接到STM32的串口,这里以PA9和PA10为例。通过串口控制ESP8266的AT命令,将其连接到WiFi网络。连接成功后,即可连接腾讯云。 二、注册腾讯云账号并创建设备 注册腾讯云账号,并选择物联网平台进行创建。在物联网平台中创建一个新的产品,选择适配的设备,填写设备名称以及设备的sn码,并获取设备的密钥信息。 三、下载tencentOS-tiny SDK 在腾讯云官网下载tencentOS-tiny SDK,并解压到STM32开发板上。同时需要下载对应的STM32 HAL库,将其与SDK库文件合并。 四、编写代码 在MDK中创建一个工程,添加需要的头文件和库文件。首先,将需要用到的头文件包括HAL库头文件和tencentOS-tiny库头文件加入工程中,并将HAL库文件和SDK库文件加入到工程中。 然后,在main函数中进行初始化操作,包括串口、WiFi以及腾讯云设备的初始化工作。依次执行连接WiFi、连接腾讯云、上报数据等操作。 五、测试运行 将代码烧录到STM32开发板中,并将ESP8266连接到WiFi网络,然后通过串口上位机工具查看是否能够成功连接腾讯云,并上报数据。 总之,STM32和ESP8266连接腾讯云需要完成硬件搭建、平台注册、SDK下载、代码编写等一系列操作。只有做好这些工作,才能实现设备与云端之间的高效通信。 ### 回答3: STM32和ESP8266联接腾讯云服务可以实现智能物联网应用,这种连接方式可以基于MQTT协议,主要是通过互联网通信实现STM32和ESP8266之间的消息传递,使之成为了智能物联网终端的一部分。 首先,在平台上创建一个腾讯云账户,并在控制台中打开物联网平台的功能,确保所需服务已经开启。其次,在STM32和ESP8266电路上面连接好串口通信以及电源等所需的硬件,接着编写应用程序。 在使用C语言编写的STM32控制程序中,通过使用MQTT API,实现利用串口向ESP8266发送MQTT数据包的功能。ESP8266将接收到数据包进行解析后将其传送到MQTT server上,实现客户端与服务器的连接。最后,针对不同的智能设备,服务器以指定的信息格式将数据推送至阿里云上,实现智能物联网终端运行和参数得到实时应用。 连接腾讯云的STM32开发板和ESP8266节点能够极大地推动智能化厂商设备的应用,为工业领域的智能化提供了更大的拓展空间。而且,这种连接方式也可以用于智能房屋和智能车库等领域,不仅推动了物联网的发展,而且也让我们的生活变得更加的便捷化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值