当前位置:   article > 正文

ESP8266采用AT指令连接华为云服务器(MQTT固件)_esp8266连接华为云

esp8266连接华为云

一、前言

本篇文章主要介绍3个内容:

(1)ESP8266-WIFI模块常用的AI指令功能介绍

(2)ESP8266烧写MQTT固件连接华为云IOT服务器。

(3)介绍华为云IOT服务器的配置过程。

ESP8266是一款功能强大的物联网芯片,它集成了处理器、Wi-Fi网络连接和TCP/IP协议栈,提供了简单而强大的无线网络连接能力,被广泛应用于各种物联网设备中。支持AT指令集,可以通过串口与其他设备进行通信,可以降低设备间的通信难度。

以下是ESP8266模块的主要特点和功能:

(1)小巧而强大:ESP8266模块的尺寸小,但它搭载了一个高性能的32位Tensilica L106 RISC处理器,时钟频率为80MHz,可以通过软件进行固件升级。

(2)Wi-Fi连接:ESP8266支持802.11 b/g/n标准,能够实现快速而稳定的无线网络连接。它可以作为Wi-Fi客户端连接到现有的Wi-Fi网络,也可以作为Wi-Fi接入点(AP)提供无线网络服务。

(3)TCP/IP协议栈:ESP8266集成了TCP/IP协议栈,可以通过Wi-Fi与其他设备进行通信,包括传输数据、发送HTTP请求、执行WebSocket通信等。

(4)GPIO引脚:ESP8266模块具有多个通用GPIO引脚,可用于连接和控制外部设备,如传感器、继电器、LED等。

(5)低功耗:ESP8266在待机模式下的功耗非常低,适用于需要长时间运行的低功耗应用。

(6)开发环境:ESP8266的开发可以使用多种编程语言和开发平台,如Arduino IDE、MicroPython、Lua等。这使得开发人员可以选择最适合他们的工具进行开发。

image-20231214095551151

image-20231214095534811

二、下载固件

ESP8266默认的固件不支持MQTT协议,需要重新下载固件。

链接:https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB

三、常用的AT指令

【1】基础AT指令

AT:测试 AT 启动

AT+RST:重启模块

AT+GMR:查看版本信息

AT+CMD:查询当前固件支持的所有命令及命令类型

AT+GSLP:进⼊ Deep-sleep 模式

ATE:开启或关闭 AT 回显功能

AT+RESTORE:恢复出厂设置

AT+SAVETRANSLINK:设置开机 透传模式 信息

AT+TRANSINTVL:设置 透传模式 模式下的数据发送间隔

AT+UART_CUR:设置 UART 当前临时配置,不保存到 flash

AT+UART_DEF:设置 UART 默认配置, 保存到 flash

AT+SLEEP:设置 sleep 模式

AT+SYSRAM:查询当前剩余堆空间和最小堆空间

AT+SYSMSG:查询/设置系统提示信息

AT+SYSMSGFILTER:启用或禁用 系统消息 过滤

AT+SYSMSGFILTERCFG:查询/配置 系统消息 的过滤器

AT+SYSFLASH:查询或读写 flash 用户分区

AT+SYSMFG:查询或读写 manufacturing nvs 用户分区

AT+RFPOWER:查询/设置 RF TX Power

AT+SYSROLLBACK:回滚到以前的固件

AT+SYSTIMESTAMP:查询/设置本地时间戳

AT+SYSLOG:启用或禁用 AT 错误代码提示

AT+SLEEPWKCFG:设置 Light-sleep 唤醒源和唤醒 GPIO

AT+SYSSTORE:设置参数存储模式

AT+SYSREG:读写寄存器
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

【2】Wi-Fi AT 命令集

AT+CWINIT:初始化/清理 Wi-Fi 驱动程序

AT+CWMODE:查询/设置 Wi-Fi 模式 (Station/SoftAP/Station+SoftAP)

AT+CWSTATE:查询 Wi-Fi 状态和 Wi-Fi 信息

AT+CWJAP:连接 AP

AT+CWRECONNCFG:查询/设置 Wi-Fi 重连配置

AT+CWLAPOPT:设置 AT+CWLAP 命令扫描结果的属性

AT+CWLAP:扫描当前可用的 AP

AT+CWQAP:断开与 AP 的连接

AT+CWSAP:配置 ESP32 SoftAP 参数

AT+CWLIF:查询连接到 ESP32 SoftAP 的 station 信息

AT+CWQIF:断开 station 与 ESP32 SoftAP 的连接

AT+CWDHCP:启用/禁用 DHCP

AT+CWDHCPS:查询/设置 ESP32 SoftAP DHCP 分配的 IPv4 地址范围

AT+CWAUTOCONN:上电是否自动连接 AP

AT+CWAPPROTO:查询/设置 SoftAP 模式下 802.11 b/g/n 协议标准

AT+CWSTAPROTO:设置 Station 模式下 802.11 b/g/n 协议标准

AT+CIPSTAMAC:查询/设置 ESP32 Station 的 MAC 地址

AT+CIPAPMAC:查询/设置 ESP32 SoftAP 的 MAC 地址

AT+CIPSTA:查询/设置 ESP32 Station 的 IP 地址

AT+CIPAP:查询/设置 ESP32 SoftAP 的 IP 地址

AT+CWSTARTSMART:开启 SmartConfig

AT+CWSTOPSMART:停止 SmartConfig

AT+WPS:设置 WPS 功能

AT+MDNS:设置 mDNS 功能

AT+CWJEAP:连接 WPA2 企业版 AP

AT+CWHOSTNAME:查询/设置 ESP32 Station 的主机
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

【3】TCP/IP AT 命令

AT+CIPV6: 启用/禁用 IPv6 网络 (IPv6)

AT+CIPSTATE:查询 TCP/UDP/SSL 连接信息

AT+CIPSTATUS (弃用):查询 TCP/UDP/SSL 连接状态和信息

AT+CIPDOMAIN:域名解析

AT+CIPSTART:建立 TCP 连接、UDP 传输或 SSL 连接

AT+CIPSTARTEX:建立自动分配 ID 的 TCP 连接、UDP 传输或 SSL 连接

[仅适用数据模式] +++: 退出 数据模式

AT+SAVETRANSLINK:设置 Wi-Fi 开机 透传模式 信息

AT+CIPSEND:在 普通传输模式 或 Wi-Fi 透传模式 下发送数据

AT+CIPSENDL:在 普通传输模式 下并行发送长数据

AT+CIPSENDLCFG:设置 AT+CIPSENDL 命令的属性

AT+CIPSENDEX:在 普通传输模式 下采用扩展的方式发送数据

AT+CIPCLOSE:关闭 TCP/UDP/SSL 连接

AT+CIFSR:查询本地 IP 地址和 MAC 地址

AT+CIPMUX:启用/禁用多连接模式

AT+CIPSERVER:建立/关闭 TCP 或 SSL 服务器

AT+CIPSERVERMAXCONN:查询/设置服务器允许建立的最大连接数

AT+CIPMODE:查询/设置传输模式

AT+CIPSTO:查询/设置本地 TCP 服务器超时时间

AT+CIPSNTPCFG:查询/设置时区和 SNTP 服务器

AT+CIPSNTPTIME:查询 SNTP 时间

AT+CIPSNTPINTV:查询/设置 SNTP 时间同步的间隔

AT+CIPFWVER:查询服务器已有的 AT 固件版本

AT+CIUPDATE:通过 Wi-Fi 升级固件

AT+CIPDINFO:设置 +IPD 消息详情

AT+CIPSSLCCONF:查询/设置 SSL 客户端配置

AT+CIPSSLCCN:查询/设置 SSL 客户端的公用名 (common name)

AT+CIPSSLCSNI:查询/设置 SSL 客户端的 SNI

AT+CIPSSLCALPN:查询/设置 SSL 客户端 ALPN

AT+CIPSSLCPSK:查询/设置 SSL 客户端的 PSK

AT+CIPRECONNINTV:查询/设置 Wi-Fi 透传模式 下的 TCP/UDP/SSL 重连间隔

AT+CIPRECVTYPE:查询/设置套接字接收模式

AT+CIPRECVDATA:获取被动接收模式下的套接字数据

AT+CIPRECVLEN:查询被动接收模式下套接字数据的长度

AT+PING:ping 对端主机

AT+CIPDNS:查询/设置 DNS 服务器信息

AT+CIPTCPOPT:查询/设置套接字选项
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

【4】MQTT AT 命令集

AT+MQTTUSERCFG:设置 MQTT 用户属性

AT+MQTTLONGCLIENTID:设置 MQTT 客户端 ID

AT+MQTTLONGUSERNAME:设置 MQTT 登陆用户名

AT+MQTTLONGPASSWORD:设置 MQTT 登陆密码

AT+MQTTCONNCFG:设置 MQTT 连接属性

AT+MQTTALPN:设置 MQTT 应用层协议协商(ALPN)

AT+MQTTSNI:设置 MQTT 服务器名称指示(SNI)

AT+MQTTCONN:连接 MQTT Broker

AT+MQTTPUB:发布 MQTT 消息(字符串)

AT+MQTTPUBRAW:发布长 MQTT 消息

AT+MQTTSUB:订阅 MQTT Topic

AT+MQTTUNSUB:取消订阅 MQTT Topic

AT+MQTTCLEAN:断开 MQTT 连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

四、ESP8266-AT指令连接华为云IOT

下面是STM32的实际代码,通过串口发送AT指令控制ESP8266连接华为云IOT服务器、

void ESP8266_Init(void)
{
//====================================================实现设备在线==================================================
    //【1】复位ESP8266
    printf("AT+RST\r\n");//第一步
    delay_ms(2000);
    //【2】设置为STA模式
    printf("AT+CWMODE=1\r\n");//第二步
    delay_ms(1500);
    //【3】设置连接的WIFI热点
    // 格式: AT+CWJAP="填写wifi名称","填写WiFi密码"
    printf("AT+CWJAP=\"123\",\"12345678\"\r\n");//第四步
    delay_ms(1500);
    //【4】设置MQTT的登录名和密码
    // 格式: AT+MQTTUSERCFG=0,1,"NULL","填写用户名","填写密码",0,0,""
    printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"65620a943668046d0e31568c_room1\",\"a83d06a34631b72d1b35bae5ef5e23c7ea723952c33796faa47410b107e7f4b7\",0,0,\"\"\r\n");//第五步
    delay_ms(1500);
    //【5】设置MQTT的ClientID
    // 格式: AT+MQTTCLIENTID=0,"填写ClientID"
    printf("AT+MQTTCLIENTID=0,\"65620a943668046d0e31568c_room1_0_0_2023112515\"\r\n");//第6步  客户端ID
    delay_ms(1500);
    // 【6】设置MQTT接入地址
    // 格式: AT+MQTTCONN=0,"填写MQTT接入的地址",1883,1
    printf("AT+MQTTCONN=0,\"124.70.218.131\",1883,1\r\n");//第7步
    delay_ms(2000);
    
}



void ESP8266_data_publish(char *att)
{
    //	char publish_command[256];
    printf("%s",att);//第2步
    //printf("AT+MQTTPUB=0,\"$oc/devices/65620a943668046d0e31568c_room1/sys/properties/report\",\"{\\\"services\\\":[{\\\"service_id\\\":\\\"stm32\\\",\\\"properties\\\":{\\\"%s\\\":%d}}]}\",0,0\r\n", att, data);
    //	printf("%s", publish_command);
}


int main()
{
    //【7】上传数据
               // 格式: AT+MQTTPUB=0," 发布的主题 ","上报的json数据",0,0
               // $oc/devices/64047c741eaf704179abaa58_Temp_test/sys/properties/report ","{\"services\":[{\"service_id\":\"esp8266_data\"\,\"properties\":{\"temp\": 100}}]}

               //
               //组合上传的数据0---上传单个
               sprintf(MQTT_buff,"AT+MQTTPUB=0,\"$oc/devices/65620a943668046d0e31568c_room1/sys/properties/report\",\"{\"services\":[{\"service_id\":\"stm32\",\"properties\":{\"Temp\":%d}}]}\",0,0\r\n",
               temperature);
               
               //组合上传的数据--上传多个
               //sprintf(MQTT_buff,"AT+MQTTPUB=0,\"$oc/devices/65620a943668046d0e31568c_room1/sys/properties/report\",\"{\"services\": [{\"service_id\": \"stm32\",\"properties\":{\"Temp\":%d,\"Humi\":%d,\"Fire\":%d,\"MQ-135\":%d,\"Water\":%d,\"SPO2\":%d,\"HR\":%d}}]}\",0,0\r\n",
               //temperature,humidity,Fire,z,Water,SPO2,HR);
               
               
               //上传数据
               ESP8266_data_publish(MQTT_buff);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

五、华为云IOT服务器部署过程

在华为云IOT平台上,需要进行设备接入、数据模型定义、规则引擎配置和应用开发等四个核心模块的开发。其中,设备接入模块包括设备注册、获取设备证书、建立连接等步骤,以保障设备与云平台之间的安全通信;数据模型定义模块需要根据实际需求定义相应的数据模型,包括上传数据格式、设备属性和服务等。规则引擎配置模块需要完成实时消息推送、远程控制和告警等功能。应用开发模块则是将完整的智能井盖系统进行打包,为用户提供统一的操作接口。

华为云官网: https://www.huaweicloud.com/

打开官网,搜索物联网,就能快速找到 设备接入IoTDA

image-20221204193824815

5.1 物联网平台介绍

华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。

使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。

物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。

设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。

业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。

img

5.2 开通物联网服务

地址: https://www.huaweicloud.com/product/iothub.html

image-20221204194233414

开通标准版免费单元。

image-20230420181306316

image-20230420181322092

开通之后,点击总览,查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。

image-20230423111235524

总结:

端口号:   MQTT (1883)| MQTTS (8883)	
接入地址: a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com
  • 1
  • 2

根据域名地址得到IP地址信息:

Microsoft Windows [版本 10.0.19044.2846]
(c) Microsoft Corporation。保留所有权利。

C:\Users\11266>ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com

正在 Ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字节的数据:
来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31
来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31
来自 121.36.42.100 的回复: 字节=32 时间=36ms TTL=31
来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31

121.36.42.100 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 36ms,最长 = 37ms,平均 = 36ms

C:\Users\11266>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

image-20230423111213624

MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。

5.3 创建产品

(1)创建产品

点击右上角创建产品。

image-20230420181503524

(2)填写产品信息

根据自己产品名字填写,设备类型选择自定义类型。

(3)添加自定义模型

产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。

image-20230420181615129

模型简单来说: 就是存放设备上传到云平台的数据。比如:环境温度、环境湿度、环境烟雾浓度、火焰检测状态图等等,这些我们都可以单独创建一个模型保存。

5.4 添加设备

产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。

(1)注册设备

点击右上角注册设备。

image-20230421091842025

(2)根据自己的设备填写

在弹出的对话框里填写自己设备的信息。根据自己设备详细情况填写。

(3)保存设备信息

创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。

5.5 MQTT协议主题订阅与发布

(1)MQTT协议介绍

当前的设备是采用MQTT协议与华为云平台进行通信。

MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。

MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。

华为云的MQTT协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

img

业务流程:

img

(2)华为云平台MQTT协议使用限制

描述限制
支持的MQTT协议版本3.1.1
与标准MQTT协议的区别支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msg
MQTTS支持的安全等级采用TCP通道基础 + TLS协议(最高TLSv1.3版本)
单帐号每秒最大MQTT连接请求数无限制
单个设备每分钟支持的最大MQTT连接数1
单个MQTT连接每秒的吞吐量,即带宽,包含直连设备和网关3KB/s
MQTT单个发布消息最大长度,超过此大小的发布请求将被直接拒绝1MB
MQTT连接心跳时间建议值心跳时间限定为30至1200秒,推荐设置为120秒
产品是否支持自定义Topic支持
消息发布与订阅设备只能对自己的Topic进行消息发布与订阅
每个订阅请求的最大订阅数无限制

(3)主题订阅格式

帮助文档地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

image-20221207153310037

对于设备而言,一般会订阅平台下发消息给设备 这个主题。

设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。

(4)主题发布格式

对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。

这个操作称为:属性上报。

帮助文档地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

image-20221207153637391

5.6 MQTT三元组

MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。

接下来介绍,华为云平台的MQTT三元组参数如何得到。

(1)MQTT服务器地址

要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。

帮助文档地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home

image-20230411141412090

MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。

根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)

华为云的MQTT服务器地址:121.36.42.100
华为云的MQTT端口号:1883
  • 1
  • 2

(2)生成MQTT三元组

华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。

下面是打开的页面:

image-20221207154917230

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/699283
推荐阅读
相关标签
  

闽ICP备14008679号