【微信小程序控制硬件⑧ 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!(附带Demo)

微信小程序控制硬件第1篇 】 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件!
微信小程序控制硬件第2篇 】 开始微信小程序之旅,导入小程序Mqtt客户端源码,实现简单的验证和通讯于服务器!
微信小程序控制硬件第3篇 】 从软件到硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,为面试职位和比赛项目加分!
微信小程序控制硬件第4篇 】 深度剖析微信公众号配网 Airkiss 原理与过程,esp8266如何自定义回调参数给微信,实现绑定设备第一步!
微信小程序控制硬件第5篇 】理清接下来必须走的架构思想,学习下 JavaScript 的观察者模式,在微信小程序多页面同时接收到设备推送事件!
微信小程序控制硬件第6篇 】服务器如何集成七牛云存储SDK,把用户自定义设备图片存储在第三方服务器!
微信小程序控制硬件第7篇 】动起来做一个微信小程序Mqtt协议控制智能硬件的框架,为自己心里全栈工程师梦想浇水!!
微信小程序控制硬件第8篇 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!
微信小程序控制硬件第9篇 】巧借阿里云物联网平台的免费连接,从微信小程序颜色采集控制 esp8266 输出七彩灯效果,中秋节来个直播如何?!
微信公众号控制硬件 第10篇 】如何在微信公众号网页实现连接mqtt服务器教程!!
微信小程序控制硬件 第11篇 】全网首发,微信小程序ble蓝牙控制esp32,实现无需网络也可以控制亮度开关。



一、前言;


            今天是6月12号,高考过完刚刚不久,我也想起五年前那个夏天了。虽没有汗流浃背备考,但也有面对未来的种种幻想以及迷茫。

            回想到现在工作了,自己学到的东西很多,还真的应了课本的一句话 “人的一生都是在学习中!学习如逆水行舟,不进则退!”,当我看到身边的一些人懒懒散散的,看博文学习不动手做小项目,我的心是有点 “嫌弃”的,我也希望在一个优秀的团队,可以彼此进步,不管是大型企业或者小公司!当身边的人优秀,你也会一定反思自己,有所行动。

            感悟最深的是 ”学会投资自己“ ,不管在生活的衣食住行中,买些舒服的衣服,抑或是每天每周做些美食犒劳自己,还是在职业生涯中,买教程,买课本,消化知识,提升自己。总结我在网上买了几乎几千块的视频,其中也有些乏味的教学视频,也有很多实实在在的干货,的确耐人寻味,那是一种心灵上的快心。


二、微信小程序 websocket;


            微信小程序都不陌生了,一句话:依靠在微信客户端的一个小程序,其开发语言不是原生的,而是采用 html+JavaScript+css 这样类似的前端代码,接近原生体验!

            既然是一种类似 ”寄生虫“ 附属在微信客户端 ”宿主“ 里生存,那就不得不按照 ”宿主“ 的生存习惯,所以必须对于在微信小程序上实现 websocket连接阿里云IOT物联网平台服务器,那就必须遵循以下重要的准则:

  1. 连接的端口号必须是 443 ,必须是 https协议;这里采用原生的即可。
  2. websocket之上再实现 mqtt 协议数据发送和接受,即可实现以 mqtt 协议通讯;而我这里采用的是这个很出名的库:https://github.com/mqttjs/MQTT.js 来实现对数据的处理。

三、阿里云IOT物联网平台 websocket;


            阿里云IOT物联网平台支持基于WebSocket的MQTT协议。您可以首先使用WebSocket建立连接,然后在WebSocket通道上,使用 MQTT 协议进行通信,即MQTT over WebSocket

  1. 证书准备。

            WebSocket可以使用ws和wss两种方式,ws就是普通的WebSocket连接,wss就是增加了TLS加密。如果使用wss方式进行安全连接,需要使用和TLS直连一样的根证书。而我本次提供给大家的不需要根证书的。

  1. 连接说明:

    使用WebSocket方式进行连接,区别主要在MQTT连接URL的协议和端口号,MQTT连接参数和TCP直接连接方式完全相同,其中要注意securemode参数,使用wss方式连接时securemode=2,使用ws方式连接时 securemode=3。

    • 连接域名(服务器地址),华东2节点(即上海节点):
      ${YourProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:443

      其中 ${YourProductKey} 是个变量,请替换为您的产品key。

      Connect指令中需要设置 Keep Alive(保活时间)。保活心跳时间取值范围为30至1200秒。如果心跳时间不在此区间内,物联网平台会拒绝连接。建议取值300秒以上。如果网络不稳定,将心跳时间设置高一些。

      设备端在保活时间间隔内,至少需要发送一次报文,包括 PING 请求。

      如果物联网平台在保活时间内无法收到任何报文,物联网平台会断开连接,设备端需要进行重连。

    • MQTT连接参数参数如下:

      
      mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
      mqttUsername: deviceName+"&"+productKey
      mqttPassword: sign_hmac(deviceSecret,content)sign签名需要把以下参数按字典序排序后,再根据signmethod加签。
      content=提交给服务器的参数(productKey,deviceName,timestamp,clientId), 按照字母顺序排序, 然后将参数值依次拼接
      

      其中,

      • clientId:表示客户端ID,建议mac或sn,64字符内。
      • timestamp:表示当前时间毫秒值,可选。
      • mqttClientId:格式中||内为扩展参数。
      • signmethod:表示签名算法类型。
      • securemode:表示目前安全模式,可选值有2 (wss协议)和3(ws协议)。
        参考示例,如果预置前提如下:
    clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret
    
    • 使用ws方式

      • 连接域名

        ws://pk.iot-as-mqtt.cn-shanghai.aliyuncs.com:443
        
      • 连接参数

        
        mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789|
        mqttUsername=device&pk
        mqttPasswrod=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString(); 
        
    • 使用wss方式

      • 连接域名

        wss://pk.iot-as-mqtt.cn-shanghai.aliyuncs.com:443
        
      • 连接参数

        mqttclientId=12345|securemode=2,signmethod=hmacsha1,timestamp=789|
        mqttUsername=device&pk
        mqttPasswrod=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();
        

四、如何移植和封装使用;


            因为我做过设备端的 Mqtt协议连接阿里云物联网平台,对协议比较熟悉,所以对于怎么实现在微信小程序上是非常简单的。

            上面已经详细地说明了阿里云物联网平台 websocket 的协议,那么总的来说就是一个 加密算法,因为我之前已经开源了一个在微信小程序上实现 Mqtt协议连接服务器,这只要拿到了连接的一些参数,那就不成问题了!

            上面反复提到 hmacsha1 加密算法,那我就去找一个呗。还好,去官网 GitHub找了一个:点击访问 , 拿到了加密算法文件,按照上面说明,分别生成:mqttclientId、mqttUsername、mqttPasswrod、port端口号、url域名,就可以实现链接啦!


4.1 为了简单实用,降低耦合,我一度封装起来生成的算法,其封装源码如下:


exports.getAliyunIotMqttClient = function(opts) {

    //是否传入三元组
    if (!opts || !opts.productKey || !opts.deviceName || !opts.deviceSecret) {
        throw new Error('options need productKey,deviceName,deviceSecret');
    }

    if (opts.protocol === 'mqtts' && !opts.ca) {
        throw new Error('mqtts need ca ');
    }
    //是否传入区域
    if (!opts.host && !opts.regionId) {
        throw new Error('options need host or regionId (aliyun regionId)');
    }

    const deviceSecret = opts.deviceSecret;
    delete opts.deviceSecret;

    let secureMode = (opts.protocol === 'mqtts') ? 3 : 2;

    var options = {
        productKey: opts.productKey,
        deviceName: opts.deviceName,
        timestamp: Date.now(),
        clientId: Math.random().toString(36).substr(2)
    }
    let keys = Object.keys(options).sort();
    // 按字典序排序
    keys = keys.sort();
    const list = [];
    keys.map((key) => {
        list.push(`${key}${options[key]}`);
    });
    const contentStr = list.join('');
    //加密算法生成 password
    opts.password = crypto.hex_hmac_sha1(deviceSecret, contentStr);
    opts.clientId = `${options.clientId}|securemode=${secureMode},signmethod=hmacsha1,timestamp=${options.timestamp}|`;
    opts.username = `${options.deviceName}&${options.productKey}`;

    opts.port = opts.port || 1883;
    //生成域名
    opts.host = opts.host || `${opts.productKey}.iot-as-mqtt.${opts.regionId}.aliyuncs.com`;
    
    return (opts); //返回给上层
}

4.2 如何使用呢?


            非常简单,只需要调用 getAliyunIotMqttClient(option) 传进一些参数即可获取全部东西;

            option 对象的定义如下:

参数含义
productKey三元组信息 productKey
deviceName三元组信息 deviceName
deviceSecret三元组信息 deviceSecret
regionId可选域,目前国内仅支持上海,所以是 cn-shanghai
port443 不可修改,唯一!

            返回的对象的定义如下:

参数含义
clientId连接参数
password连接参数
username连接参数
host连接的域名
  • 示范:


 data: {
    aliyunInfo: {
      productKey: 'a1o3SXAACTs23', 
      deviceName: 'rgb2812',
      deviceSecret: 'RurAqmlt0duwMilKv6Oa856WDcQ279685a', 
      regionId: 'cn-shanghai', 
    }
  }
  
    var that = this
    
    //传进去三元组等信息,拿到mqtt连接的各个参数
    let clientOpt = aliyunOpt.getAliyunIotMqttClient({
      productKey: that.data.aliyunInfo.productKey,
      deviceName: that.data.aliyunInfo.deviceName,
      deviceSecret: that.data.aliyunInfo.deviceSecret,
      regionId: that.data.aliyunInfo.regionId,
      port: that.data.aliyunInfo.port,
    });

    //得到连接域名
    let host = 'wxs://'+clientOpt.host;
    this.setData({
      'options.clientId': clientOpt.clientId,
      'options.password': clientOpt.password,
      'options.username': clientOpt.username,
    })
 
    //开始连接
    this.data.client = mqtt.connect(host, this.data.options);
    this.data.client.on('connect', function(connack) {
      wx.showToast({
        title: '连接成功'
      })
    })

五、其他;


            看起来是不是非常简单呢?对的,下面我已经传到了我 GitHub 仓库了,欢迎大家给个星星啦!是对我最大的支持! 我将一直维护:https://github.com/xuhongv/WeChatMiniEsp8266

            更多的使用技巧,你需要具备一定的微信小程序开发经验哦!结合我的代码,让你轻松连接阿里云IOT物联网平台!与你共勉!!


  • 很多人怎么联系我一起学习进步,下面打个小小公告和干货无偿分享:

玩转esp8266 & esp32带你飞、加群付费QQ群,干货多多,提供免费Mqtt服务器,提高门槛,不喜的朋友勿喷勿加:434878850
esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32

<think>好的,我现在需要帮助用户解决如何使用STM32和ESP8266采集数据并上传到新版OneNET物联网平台,同时在微信小程序中显示信息和发送指令的问题。首先,我需要回顾用户的问题,确保理解所有需求。 用户的主要需求包括: 1. 使用STM32和ESP8266进行数据采集。 2. 将采集的数据上传到新版OneNET物联网平台。 3. 在微信小程序中显示这些数据。 4. 通过微信小程序发送指令到设备。 接下来,我需要分解每个步骤,并考虑可能的解决方案。首先,硬件部分:STM32作为主控制器,ESP8266用于Wi-Fi连接。用户可能需要连接传感器到STM32的ADC或数字接口,然后通过ESP8266的AT指令或SDK进行网络通信。 关于OneNET平台,新版可能使用MQTT协议或其他协议。需要确认用户使用的是哪种协议。根据引用[^1],用户之前可能参考过MQTT的实现,所以可能需要指导如何配置ESP8266连接到OneNET的MQTT服务器,包括设备注册、产品ID、API密钥等步骤。 数据上传部分,需要构造符合OneNET数据格式的JSON报文,并通过HTTP或MQTT发送。例如,温度数据可能需要封装成特定的JSON结构,然后通过POST请求上传。 微信小程序方面,需要与OneNET平台进行数据交互。小程序可以通过HTTP API从OneNET获取设备数据,并显示在界面上。发送指令的话,可能需要通过API下发命令到设备,或者使用MQTT订阅主题来接收指令。 可能需要注意的问题包括: - ESP8266的固件是否支持MQTT,是否需要更新AT固件。 - STM32与ESP8266的串口通信,包括AT指令的发送和响应处理。 - OneNET平台上的设备鉴权信息是否正确配置。 - 微信小程序的网络请求权限,以及如何解析返回的数据。 此外,用户可能需要代码示例,比如STM32如何通过串口发送AT指令,ESP8266如何连接Wi-Fi,如何构造HTTP/MQTT请求。微信小程序部分可能需要展示如何调用wx.request接口获取数据,以及使用WebSocketMQTT.js库实时接收数据。 需要验证每个步骤的可行性,例如,确保OneNET的API调用方式正确,避免常见的错误如鉴权失败、数据格式错误等。同时,考虑网络稳定性,比如断线重连机制、数据重传策略等。 可能的相关问题包括如何优化数据传输以减少功耗,如何处理多传感器数据,如何保证通信的安全性,以及如何实现微信小程序的实时更新等。需要准备好这些扩展问题的答案,以帮助用户更全面地理解和实施项目。</think>### STM32+ESP8266数据采集与OneNET平台接入指南 #### 一、硬件连接与配置 1. **硬件接线** - STM32的USART3连接ESP8266模块 - 传感器通过ADC/I2C/SPI接口连接STM32 - 示例接线: ``` STM32 PA2(TX) -> ESP8266 RX STM32 PA3(RX) <- ESP8266 TX VCC 3.3V -> ESP8266 3.3V GND -> ESP8266 GND ``` 2. **ESP8266固件配置** ```c // 发送AT指令配置WiFi HAL_UART_Transmit(&huart3, "AT+CWMODE=1\r\n", 13, 1000); // Station模式 HAL_UART_Transmit(&huart3, "AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n", 30, 5000); ``` #### 二、OneNET平台设置 1. **创建产品与设备** - 登录[OneNET控制台](https://open.iot.10086.cn/) - 创建MQTT协议产品,记录产品ID和API Key - 添加设备,获取设备ID和鉴权信息 2. **MQTT连接参数** ```c #define ONENET_HOST "mqtts.heclouds.com" // 加密端口8883 #define CLIENT_ID "设备ID" #define USERNAME "产品ID" #define PASSWORD "鉴权信息" ``` #### 三、STM32数据上传实现 1. **MQTT连接协议栈** ```c // 建立TCP连接 HAL_UART_Transmit(&huart3, "AT+CIPSTART=\"SSL\",\"mqtts.heclouds.com\",8883\r\n", 45, 2000); // MQTT CONNECT报文 char mqtt_connect[] = { 0x10, 0x25, // 固定头 0x00,0x04,0x4d,0x51,0x54,0x54, // 协议名 0x04, // 协议级别 0xC2, // 连接标志 0x00,0x3C, // 保活时间 0x00,0x0A, // 客户端ID长度 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30 // 设备ID }; ``` 2. **数据点上传格式** ```json { "id": 123, "dp": { "temperature": [{ "v": 25.5 }], "humidity": [{ "v": 60 }] } } ``` #### 四、微信小程序开发 1. **数据获取接口** ```javascript wx.request({ url: 'https://api.heclouds.com/devices/设备ID/datapoints', header: { 'api-key': '产品API_KEY' }, success(res) { console.log(res.data.data) } }) ``` 2. **指令下发实现** ```javascript // 使用WebSocket建立长连接 const socket = wx.connectSocket({ url: 'wss://mqtts.heclouds.com:8884' }) // 发送JSON格式指令 socket.send({ data: JSON.stringify({ type: "cmd", device_id: "设备ID", cmd: "LED_ON" }) }) ``` #### 五、关键问题解决方案 1. **ESP8266断线重连** ```c void check_network() { if(HAL_GetTick() - lastHeartbeat > 60000) { send_AT("AT+CIPSTATUS\r\n"); if(!strstr(response, "CONNECTED")) { reconnect_mqtt(); } } } ``` 2. **数据加密传输** ```c // 使用mbedTLS库实现SSL加密 mbedtls_ssl_init(&ssl); mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); ``` [^1]: 微信小程序与OneNET的MQTT接口对接可参考官方文档《OneNET MQTT物联网套件开发指南》
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半颗心脏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值