[应用相关] STM32F103ZE+ESP8266+云物联网平台+微信小程序

[复制链接]
 楼主| 自动化陈稳 发表于 2021-5-29 23:34 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:35 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:36 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:43 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:45 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:45 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:46 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:48 | 显示全部楼层
四、生成腾讯物联网平台的设备登录信息
使用MQTT协议登录需要一些参数信息,需要使用官网提供的方式生成。
 楼主| 自动化陈稳 发表于 2021-5-29 23:48 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:50 | 显示全部楼层
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. import base64
  4. import hashlib
  5. import hmac
  6. import random
  7. import string
  8. import time
  9. import sys
  10. # 生成指定长度的随机字符串
  11. def RandomConnid(length):
  12.     return  ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(length))
  13. # 生成接入物联网通信平台需要的各参数
  14. def IotHmac(productID, devicename, devicePsk):
  15.      # 1. 生成 connid 为一个随机字符串,方便后台定位问题
  16.      connid   = RandomConnid(5)
  17.      # 2. 生成过期时间,表示签名的过期时间,从**1970年1月1日 00:00:00 UTC 时间至今秒数的 UTF8 字符串
  18.      expiry   = int(time.time()) + 30*24*60 * 60
  19.      # 3. 生成 MQTT 的 clientid 部分, 格式为 ${productid}${devicename}
  20.      clientid = "{}{}".format(productID, devicename)
  21.      # 4. 生成 MQTT 的 username 部分, 格式为 ${clientid};${sdkappid};${connid};${expiry}
  22.      username = "{};12010126;{};{}".format(clientid, connid, expiry)
  23.      # 5. 对 username 进行签名,生成token
  24.      secret_key = devicePsk.encode('utf-8')  # convert to bytes
  25.      data_to_sign = username.encode('utf-8')  # convert to bytes
  26.      secret_key = base64.b64decode(secret_key)  # this is still bytes
  27.      token = hmac.new(secret_key, data_to_sign, digestmod=hashlib.sha256).hexdigest()
  28.      # 6. 根据物联网通信平台规则生成 password 字段
  29.      password = "{};{}".format(token, "hmacsha256")
  30.      return {
  31.         "clientid" : clientid,
  32.         "username" : username,
  33.         "password" : password
  34.      }
  35. if __name__ == '__main__':
  36.     # 参数分别填入: 产品ID,设备名称,设备密匙
  37.     print(IotHmac("6142CX41XE", "SmartAgriculture","20Y/aAcmj+y6SDDh+ANR9g=="))
Python示例代码:
 楼主| 自动化陈稳 发表于 2021-5-29 23:52 | 显示全部楼层
  1. {'clientid': '6142CX41XESmartAgriculture', 'username': '6142CX41XESmartAgriculture;12010126;HUA2G;1624271589',
  2. 'password': 'a8aadebe9721f70e6f9e14fe56ff1d2b5cac9625fa1f96af2f0e0098597fe78b;hmacsha256'}
输出的登录参数,用于MQTT协议填参数:
 楼主| 自动化陈稳 发表于 2021-5-29 23:53 | 显示全部楼层
五、使用MQTT软件测试
MQTT客户端软件下载地址: https://download.csdn.net/download/xiaolong1126626497/18784012

该软件采用QT开发,源码地址: https://blog.csdn.net/xiaolong11 ... e/details/116779490
 楼主| 自动化陈稳 发表于 2021-5-29 23:56 | 显示全部楼层
 楼主| 自动化陈稳 发表于 2021-5-29 23:56 | 显示全部楼层
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sb25nMTEyNjYyNjQ5Nw==,size_16,color_FFFFFF,t_70.jpg 设备主题发布与定义的格式:
 楼主| 自动化陈稳 发表于 2021-5-31 21:35 | 显示全部楼层
设备消息数据上传格式:
  1. {"method":"report","clientToken":"123","params":{"light":78.4,"temperature":21.4,"humidity":60.8,"motor":1}}
 楼主| 自动化陈稳 发表于 2021-5-31 21:39 | 显示全部楼层
登录成功之后,就可以看到设备在线: 8807860b4e71bdbc8d.png
 楼主| 自动化陈稳 发表于 2021-5-31 21:41 | 显示全部楼层
打开微信小程序可以查看到设备上传的数据:
6533960b4e7855e139.png
 楼主| 自动化陈稳 发表于 2021-5-31 21:43 | 显示全部楼层
六、编写STM32设备端代码
8607760b4e7fbb438b.png
6015160b4e80cefcee.png
 楼主| 自动化陈稳 发表于 2021-5-31 21:49 | 显示全部楼层
6.1 main.c代码
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "key.h"
  5. #include "usart.h"
  6. #include <string.h>
  7. #include "timer.h"
  8. #include "esp8266.h"
  9. #include "mqtt.h"
  10. #include "oled.h"
  11. #include "fontdata.h"
  12. #include "bh1750.h"
  13. #include "iic.h"
  14. #include "sht3x.h"

  15. /*
  16. 硬件连接方式:
  17. ESP8266串口WIFI模块与STM32的串口3相连接。
  18. PB10--RXD 模块接收脚
  19. PB11--TXD 模块发送脚
  20. GND---GND 地
  21. VCC---VCC 电源(3.3V~5.0V)
  22. OLED接线:
  23. D0----SCK-----PB14
  24. D1----MOSI----PB13
  25. RES—复位(低电平有效)—PB12
  26. DC---数据和命令控制管脚—PB1
  27. CS---片选引脚-----PA7
  28. 微型直流电机:  PB8
  29. 紫光灯:        PB9
  30. LED硬件连接: PB5 PE5
  31. KEY硬件连接:PE3 PE4
  32. */

  33. #define ESP8266_WIFI_AP_SSID  "CMCC-Cqvn"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符
  34. #define ESP8266_AP_PASSWORD "99pu58cb"     //将要连接的路由器密码


  35. //腾讯物联网服务器的设备信息
  36. #define MQTT_ClientID "6142CX41XESmartAgriculture"
  37. #define MQTT_UserName "6142CX41XESmartAgriculture;12010126;HUA2G;1624271589"
  38. #define MQTT_PassWord "a8aadebe9721f70e6f9e14fe56ff1d2b5cac9625fa1f96af2f0e0098597fe78b;hmacsha256"

  39. //订阅与发布的主题
  40. #define SET_TOPIC  "$thing/down/property/6142CX41XE/SmartAgriculture"  //订阅
  41. #define POST_TOPIC "$thing/up/property/6142CX41XE/SmartAgriculture"  //发布


  42. char mqtt_message[200];//上报数据缓存区
  43. char OLED_ShowBuff[100];
  44. u8 ESP8266_Stat=0;


  45. /*
  46. 函数功能: 温湿度\光强度显示
  47. */
  48. void ShowTemperatureAndHumidity(float temp,float humi,float light)
  49. {
  50.     sprintf(OLED_ShowBuff,"T: %.2f",temp);
  51.         OLED_ShowString(40,16*0,16,OLED_ShowBuff);
  52.     sprintf(OLED_ShowBuff,"H: %.2f%%",humi);
  53.         OLED_ShowString(40,16*1,16,OLED_ShowBuff);
  54.     sprintf(OLED_ShowBuff,"L: %.2f%%",light);
  55.         OLED_ShowString(40,16*2,16,OLED_ShowBuff);
  56. }

  57. /*
  58. 函数功能: ESP8266显示页面
  59. */
  60. void ESP8266_ShowPageTable(void)
  61. {
  62.     if(ESP8266_Stat)OLED_ShowString(0,16*0,16,"WIFI STAT:ERROR");
  63.     else OLED_ShowString(0,16*0,16,"WIFI STAT:OK");

  64.     //显示字符串
  65.     sprintf((char*)OLED_ShowBuff,"%s",ESP8266_WIFI_AP_SSID);
  66.     OLED_ShowString(0,16*1,16,OLED_ShowBuff);       
  67.    
  68.     sprintf((char*)OLED_ShowBuff,"%s",ESP8266_AP_PASSWORD);   
  69.     OLED_ShowString(0,16*2,16,OLED_ShowBuff);   
  70. }


  71. int main()
  72. {
  73.    u32 time_cnt=0;
  74.    u32 i;
  75.    u8 key;
  76.    u8 page=0;
  77.    float temp=0;
  78.    float humi=0;
  79.    float light=0;
  80.    u8 motor_state=0;
  81.    float Humidity;
  82.    float Temperature;
  83.    
  84.    delay_ms(1000);
  85.    delay_ms(1000);
  86.    
  87.    LED_Init();
  88.    KEY_Init();
  89.    IIC_Init();
  90.    
  91.     //OLED初始化
  92.    OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示;
  93.      //清屏
  94.    OLED_Clear(0);
  95.    
  96.    USART1_Init(115200);
  97.    TIMER1_Init(72,20000); //超时时间20ms

  98.    USART3_Init(115200);//串口-WIFI
  99.    TIMER3_Init(72,20000); //超时时间20ms
  100.    
  101.    Init_SHT30();
  102.    
  103.    USART1_Printf("正在初始化WIFI请稍等.\n");
  104.    
  105.    if(ESP8266_Init())
  106.    {
  107.       ESP8266_Stat=1;
  108.       USART1_Printf("ESP8266硬件检测错误.\n");  
  109.    }
  110.    else
  111.    {
  112.       //非加密端口
  113.       USART1_Printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(ESP8266_WIFI_AP_SSID,ESP8266_AP_PASSWORD,"106.55.124.154",1883,1));
  114.    }
  115.    
  116.     //2. MQTT协议初始化       
  117.     MQTT_Init();
  118.    
  119.     //3. 连接腾讯云IOT服务器        
  120.     while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))
  121.     {
  122.         USART1_Printf("服务器连接失败,正在重试...\n");
  123.         delay_ms(500);
  124.     }
  125.     USART1_Printf("服务器连接成功.\n");
  126.    
  127.    
  128.     //3. 订阅主题
  129.     if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
  130.     {
  131.         USART1_Printf("主题订阅失败.\n");
  132.     }
  133.     else
  134.     {
  135.         USART1_Printf("主题订阅成功.\n");
  136.     }        
  137.         
  138.     while(1)
  139.     {   
  140.         //按键可以测试开锁和关锁
  141.         key=KEY_Scan(0);
  142.         if(key==1)
  143.         {
  144.             //清屏
  145.             OLED_Clear(0);
  146.             
  147.             //翻页
  148.             if(page>=1)
  149.             {
  150.                 page=0;
  151.             }
  152.             else
  153.             {
  154.                  page++;
  155.             }         
  156.         
  157.             LED1=!LED1;  //LEd状态灯
  158.         }
  159.         else if(key==2)
  160.         {
  161.             LED1=!LED1;  //LEd状态灯
  162.             time_cnt=0;
  163.             //电机状态改变
  164.             MOTOR_DEV=!MOTOR_DEV;
  165.             //电机状态
  166.             motor_state=MOTOR_DEV;
  167.             //补光灯
  168.             LIGHT_DEV=!LIGHT_DEV;      
  169.         }  
  170.         
  171.         //微信小程序开锁方式: 接收WIFI返回的数据
  172.         if(USART3_RX_FLAG)
  173.         {
  174.             USART3_RX_BUFFER[USART3_RX_CNT]='\0';
  175.             
  176.             //向串口打印微信小程序返回的数据
  177.             for(i=0;i<USART3_RX_CNT;i++)
  178.             {
  179.                 USART1_Printf("%c",USART3_RX_BUFFER[i]);
  180.             }
  181.             
  182.             //如果是下发了属性,判断是开锁还是关锁
  183.             if(USART3_RX_CNT>5)
  184.             {
  185.                 //使用字符串查找函数
  186.                 if(strstr((char*)&USART3_RX_BUFFER[5],""motor":1"))
  187.                 {
  188.                      LED1=0;  //亮灯
  189.                      MOTOR_DEV=1; //开电机
  190.                      motor_state=1;
  191.                 }
  192.                 else if(strstr((char*)&USART3_RX_BUFFER[5],""motor":0"))
  193.                 {
  194.                     LED1=1;  //灭灯
  195.                     MOTOR_DEV=0; //关电机
  196.                     motor_state=0;
  197.                 }
  198.             }
  199.            
  200.             USART3_RX_CNT=0;
  201.             USART3_RX_FLAG=0;
  202.         }
  203.               
  204.         //定时与保持与微信小程序的同步--1秒一次
  205.         delay_ms(10);
  206.         time_cnt++;
  207.         if(time_cnt==50)
  208.         {
  209.             time_cnt=0;
  210.             
  211.             //状态灯 --表示程序还活着
  212.             LED2=!LED2;
  213.             
  214.             //读取光强度
  215.             light=Read_BH1750_Data();
  216.            
  217.             //读取温湿度
  218.             SHT3x_ReadData(&Humidity,&Temperature);
  219.             humi=Humidity;
  220.             temp=Temperature;
  221.             
  222.             //上传数据
  223.              sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"temperature":%f,"humidity":%f,"motor":%d,"light":%f}}",
  224.             temp,humi,motor_state,light);
  225.             MQTT_PublishData(POST_TOPIC,mqtt_message,0);
  226.             //根据湿度自动灌溉
  227.             if(humi<50.0)  //小于50自动灌溉
  228.             {
  229.                  motor_state=1; //电机状态更新
  230.                  MOTOR_DEV=1;  //开电机
  231.             }
  232.         }
  233.          
  234.         //OLED显示屏
  235.         if(page==0)
  236.         {
  237.             ShowTemperatureAndHumidity(temp,humi,light);
  238.         }
  239.         else if(page==1)
  240.         {
  241.             ESP8266_ShowPageTable();
  242.         }
  243.     }
  244. }
 楼主| 自动化陈稳 发表于 2021-5-31 22:03 | 显示全部楼层
6.1 main.c代码
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "key.h"
  5. #include "usart.h"
  6. #include <string.h>
  7. #include "timer.h"
  8. #include "esp8266.h"
  9. #include "mqtt.h"
  10. #include "oled.h"
  11. #include "fontdata.h"
  12. #include "bh1750.h"
  13. #include "iic.h"
  14. #include "sht3x.h"

  15. /*
  16. 硬件连接方式:
  17. ESP8266串口WIFI模块与STM32的串口3相连接。
  18. PB10--RXD 模块接收脚
  19. PB11--TXD 模块发送脚
  20. GND---GND 地
  21. VCC---VCC 电源(3.3V~5.0V)
  22. OLED接线:
  23. D0----SCK-----PB14
  24. D1----MOSI----PB13
  25. RES—复位(低电平有效)—PB12
  26. DC---数据和命令控制管脚—PB1
  27. CS---片选引脚-----PA7
  28. 微型直流电机:  PB8
  29. 紫光灯:        PB9
  30. LED硬件连接: PB5 PE5
  31. KEY硬件连接:PE3 PE4
  32. */

  33. #define ESP8266_WIFI_AP_SSID  "CMCC-Cqvn"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符
  34. #define ESP8266_AP_PASSWORD "99pu58cb"     //将要连接的路由器密码


  35. //腾讯物联网服务器的设备信息
  36. #define MQTT_ClientID "6142CX41XESmartAgriculture"
  37. #define MQTT_UserName "6142CX41XESmartAgriculture;12010126;HUA2G;1624271589"
  38. #define MQTT_PassWord "a8aadebe9721f70e6f9e14fe56ff1d2b5cac9625fa1f96af2f0e0098597fe78b;hmacsha256"

  39. //订阅与发布的主题
  40. #define SET_TOPIC  "$thing/down/property/6142CX41XE/SmartAgriculture"  //订阅
  41. #define POST_TOPIC "$thing/up/property/6142CX41XE/SmartAgriculture"  //发布


  42. char mqtt_message[200];//上报数据缓存区
  43. char OLED_ShowBuff[100];
  44. u8 ESP8266_Stat=0;


  45. /*
  46. 函数功能: 温湿度\光强度显示
  47. */
  48. void ShowTemperatureAndHumidity(float temp,float humi,float light)
  49. {
  50.     sprintf(OLED_ShowBuff,"T: %.2f",temp);
  51.         OLED_ShowString(40,16*0,16,OLED_ShowBuff);
  52.     sprintf(OLED_ShowBuff,"H: %.2f%%",humi);
  53.         OLED_ShowString(40,16*1,16,OLED_ShowBuff);
  54.     sprintf(OLED_ShowBuff,"L: %.2f%%",light);
  55.         OLED_ShowString(40,16*2,16,OLED_ShowBuff);
  56. }

  57. /*
  58. 函数功能: ESP8266显示页面
  59. */
  60. void ESP8266_ShowPageTable(void)
  61. {
  62.     if(ESP8266_Stat)OLED_ShowString(0,16*0,16,"WIFI STAT:ERROR");
  63.     else OLED_ShowString(0,16*0,16,"WIFI STAT:OK");

  64.     //显示字符串
  65.     sprintf((char*)OLED_ShowBuff,"%s",ESP8266_WIFI_AP_SSID);
  66.     OLED_ShowString(0,16*1,16,OLED_ShowBuff);       
  67.    
  68.     sprintf((char*)OLED_ShowBuff,"%s",ESP8266_AP_PASSWORD);   
  69.     OLED_ShowString(0,16*2,16,OLED_ShowBuff);   
  70. }


  71. int main()
  72. {
  73.    u32 time_cnt=0;
  74.    u32 i;
  75.    u8 key;
  76.    u8 page=0;
  77.    float temp=0;
  78.    float humi=0;
  79.    float light=0;
  80.    u8 motor_state=0;
  81.    float Humidity;
  82.    float Temperature;
  83.    
  84.    delay_ms(1000);
  85.    delay_ms(1000);
  86.    
  87.    LED_Init();
  88.    KEY_Init();
  89.    IIC_Init();
  90.    
  91.     //OLED初始化
  92.    OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示;
  93.      //清屏
  94.    OLED_Clear(0);
  95.    
  96.    USART1_Init(115200);
  97.    TIMER1_Init(72,20000); //超时时间20ms

  98.    USART3_Init(115200);//串口-WIFI
  99.    TIMER3_Init(72,20000); //超时时间20ms
  100.    
  101.    Init_SHT30();
  102.    
  103.    USART1_Printf("正在初始化WIFI请稍等.\n");
  104.    
  105.    if(ESP8266_Init())
  106.    {
  107.       ESP8266_Stat=1;
  108.       USART1_Printf("ESP8266硬件检测错误.\n");  
  109.    }
  110.    else
  111.    {
  112.       //非加密端口
  113.       USART1_Printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(ESP8266_WIFI_AP_SSID,ESP8266_AP_PASSWORD,"106.55.124.154",1883,1));
  114.    }
  115.    
  116.     //2. MQTT协议初始化       
  117.     MQTT_Init();
  118.    
  119.     //3. 连接腾讯云IOT服务器        
  120.     while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))
  121.     {
  122.         USART1_Printf("服务器连接失败,正在重试...\n");
  123.         delay_ms(500);
  124.     }
  125.     USART1_Printf("服务器连接成功.\n");
  126.    
  127.    
  128.     //3. 订阅主题
  129.     if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
  130.     {
  131.         USART1_Printf("主题订阅失败.\n");
  132.     }
  133.     else
  134.     {
  135.         USART1_Printf("主题订阅成功.\n");
  136.     }        
  137.         
  138.     while(1)
  139.     {   
  140.         //按键可以测试开锁和关锁
  141.         key=KEY_Scan(0);
  142.         if(key==1)
  143.         {
  144.             //清屏
  145.             OLED_Clear(0);
  146.             
  147.             //翻页
  148.             if(page>=1)
  149.             {
  150.                 page=0;
  151.             }
  152.             else
  153.             {
  154.                  page++;
  155.             }         
  156.         
  157.             LED1=!LED1;  //LEd状态灯
  158.         }
  159.         else if(key==2)
  160.         {
  161.             LED1=!LED1;  //LEd状态灯
  162.             time_cnt=0;
  163.             //电机状态改变
  164.             MOTOR_DEV=!MOTOR_DEV;
  165.             //电机状态
  166.             motor_state=MOTOR_DEV;
  167.             //补光灯
  168.             LIGHT_DEV=!LIGHT_DEV;      
  169.         }  
  170.         
  171.         //微信小程序开锁方式: 接收WIFI返回的数据
  172.         if(USART3_RX_FLAG)
  173.         {
  174.             USART3_RX_BUFFER[USART3_RX_CNT]='\0';
  175.             
  176.             //向串口打印微信小程序返回的数据
  177.             for(i=0;i<USART3_RX_CNT;i++)
  178.             {
  179.                 USART1_Printf("%c",USART3_RX_BUFFER[i]);
  180.             }
  181.             
  182.             //如果是下发了属性,判断是开锁还是关锁
  183.             if(USART3_RX_CNT>5)
  184.             {
  185.                 //使用字符串查找函数
  186.                 if(strstr((char*)&USART3_RX_BUFFER[5],""motor":1"))
  187.                 {
  188.                      LED1=0;  //亮灯
  189.                      MOTOR_DEV=1; //开电机
  190.                      motor_state=1;
  191.                 }
  192.                 else if(strstr((char*)&USART3_RX_BUFFER[5],""motor":0"))
  193.                 {
  194.                     LED1=1;  //灭灯
  195.                     MOTOR_DEV=0; //关电机
  196.                     motor_state=0;
  197.                 }
  198.             }
  199.            
  200.             USART3_RX_CNT=0;
  201.             USART3_RX_FLAG=0;
  202.         }
  203.               
  204.         //定时与保持与微信小程序的同步--1秒一次
  205.         delay_ms(10);
  206.         time_cnt++;
  207.         if(time_cnt==50)
  208.         {
  209.             time_cnt=0;
  210.             
  211.             //状态灯 --表示程序还活着
  212.             LED2=!LED2;
  213.             
  214.             //读取光强度
  215.             light=Read_BH1750_Data();
  216.            
  217.             //读取温湿度
  218.             SHT3x_ReadData(&Humidity,&Temperature);
  219.             humi=Humidity;
  220.             temp=Temperature;
  221.             
  222.             //上传数据
  223.              sprintf(mqtt_message,"{"method":"report","clientToken":"123","params":{"temperature":%f,"humidity":%f,"motor":%d,"light":%f}}",
  224.             temp,humi,motor_state,light);
  225.             MQTT_PublishData(POST_TOPIC,mqtt_message,0);
  226.             //根据湿度自动灌溉
  227.             if(humi<50.0)  //小于50自动灌溉
  228.             {
  229.                  motor_state=1; //电机状态更新
  230.                  MOTOR_DEV=1;  //开电机
  231.             }
  232.         }
  233.          
  234.         //OLED显示屏
  235.         if(page==0)
  236.         {
  237.             ShowTemperatureAndHumidity(temp,humi,light);
  238.         }
  239.         else if(page==1)
  240.         {
  241.             ESP8266_ShowPageTable();
  242.         }
  243.     }
  244. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部