项目四-基于 OneNET 的智慧小区安全防护系统及其可视化

任务一:创建智慧小区安全防护系统产品设备

1.1实训目的

  1、通过中移OneNET物联网开放平台新建产品(MQTT);
  2、根据项目场景创建产品物模型;
  3、创建基于MQTT的云平台设备;
  4、查看设备运行状态及数据。

1.2实训步骤

  1.2.1创建基于 MQTT 协议的产品
  步骤1 通过中移物联网首页的“全部产品服务”菜单进入 “物联网开放平台”功能页

物联网开放平台

  步骤2 创建产品,展开左侧菜单“产品开发”功能,点击“创建产品”按钮,进行产品添加。

产品开发

  添加必要的产品信息。选择产品品类(不一定必须一致,符合项目任务背景即可),智能化方式为“设备接入”方式,其中“节点类型”选择“直连设备”,“接入协议”选择“MQTT”,“数据协议”选择“OneJson”,“联网方式”选“Wi-Fi”,“开发方案”选择“自定义方案”。其他信息字段,对本次任务实际完成效果没有影响。

产品详情

  1.2.2根据项目场景创建产品物模型步骤
  步骤1 进入产品开发详情页面

image.png

  步骤2 点击页面右侧的“设置物模型”按钮,进入物模型管理页面,按下述步骤添加系统功能点和自定义功能点。

设置物模型

  步骤3 在弹出的添加页面中,选择如下图所示的系统功能点,点击右下角的“添加”按钮完成添加。

添加系统功能点

添加系统功能点

  步骤4 点击“添加自定义功能点”

自定义功能点

  在弹出的添加页面中,按如下各个字段内容,添加项目场景所需的功能点信息。多个自定义功能点,需每次新增后,再次点击添加。(标识符字段输入内容请保持下图内容一致)

距离物模型
蜂鸣器物模型

  步骤5 检查并保存创建的物模型

保存物模型

  检查页面上添加的物模型各功能点信息无误后,点击“保存”按钮,并点击弹出的确认提示“确定”。则创建的物模型在 OneNET 平台上生效。

确认保存

1.2.3 创建基于 MQTT 的设备

  步骤1 进入设备管理页面
  当我们完成上一步骤返回产品列表页面时,可在刚建立产品列表的操作项中点击“设备管理”,页面即进入设备列表管理页面。我们也可以点击左侧菜单的“设备接入管理”,进入下一级菜单“设备管理”,同样进入该管理页面。

设备管理

  步骤2 添加一个设备的信息,用于真实设备接入
  目前刚创建的产品,当前设备数为 0,我们点击右侧的“添加设备”按钮:

添加设备

  在弹出的添加设备页面中,添加单个设备,所属产品则选择刚建立的产品名称,设备名称输入Controller

真实设备Controller

  步骤3 再添加一个设备的信息,用于模拟工具接入
  再次点击“添加设备”,该设备名称输入Simulator(同样请按此信息输入,确保与后续实训任务相呼应),产品依旧选择刚建立的产品名称,最后点击“确定”保存当前设备的信息。

模拟设备Simulator

1.2.4 设备状态及信息查看

  步骤1 查看设备运行状态
  点击左侧菜单“设备管理”,显示设备列表页面,其中“设备状态”列展示了对应设备的运行状态。

设备状态

  步骤2 查看设备详细信息
  点击设备列表右侧操作项“详情”,在设备详情页面,查看设备及归属产品的详细信息。这里的信息,后续任务步骤中会使用到。

设备详情

1.3 拓展实训部分

  1.3.1 设备分组管理
  步骤1 创建设备分组支持设备分组功能,可以将不同产品下的不同设备组合在一起,即增加一个跨产品的自定义设备组合。

设备分组

  点击左侧“设备分组”子菜单进入分组管理页面,点击右侧“添加分组”,在弹出的页面中填写分组名称,点击“新建”完成分组创建。

添加分组

  点击创建好的分组信息列表操作列中的“详情”,进入当前设备分组信息页面。

进入分组

  步骤2 为分组添加设备初始时没有设备存在于该分组中,列表显示为空白。注意分组信息展示的内容,分组也有自己的key,这个 key 可用于按分组方式接入 OneNET 平台的方式时,计算 Token 的授权凭据。

分组详情

  点击页面右侧“添加设备”按钮,弹出的页面展示了左右两栏设备列表。左侧列出了所有产品下的待添加设备,已加入到某个分组的设备则不会显示。选择左侧之前创建好的设备,右侧会自动出现该设备信息,表示已被选择加入到当前分组中。点击下面的“确定”按钮完成将设备加入到分组的操作。

添加设备

1.5 实训笔记

  MQTT协议是一个基于发布/订阅模式的轻量级通讯协议,MQTT数据包由固定头、可变头和负载三部分构成,其最大的优点是可以以极少的网络带宽和代码量,为远程设备提供实时可靠的消息服务。
  MQTT通过客户端和服务器端的交互实现消息传递。客户端可以是消息的发布者或订阅者,而服务器则负责消息的路由和转发。消息由主题(Topic)和负载(Payload)两部分组成,其中主题用于区分消息类别,负载则是具体的消息内容。

  物模型是在物联网平台中用于描述产品功能的数据模型,它从属性、服务和事件三个维度描述,属性描述设备的状态和信息,服务代表设备可以执行的操作,事件则是设备主动上报的信息,这些维度共同描述了设备的功能和行为,是设备与应用之间沟通的桥梁。
  为了统一不同设备的功能描述,物模型引入了标准参数概念。每个品类的设备都有一套标准参数,便于开发者理解和使用,通过标准化设备的能力表达和交互方式,降低了物联网应用开发的复杂度和成本。

任务二:智慧小区安全防护系统模拟设备接入

2.1 实训目的

  1、通过模拟工具调试设备接入;
  2、通过模拟设备,实现属性上报;
  3、OneNET 平台下发属性值(命令)到模拟设备;

2.2.1 模拟设备接入OneNET 平台

  步骤1 获取产品、设备的必要信息
  1、产品 ID,设备名称,设备密匙

产品,设备信息

  步骤2 使用官方 Token 计算工具,获得验证 token 信息
  res:products/产品ID/devices/设备名称
  et:用在线时间戳工具,计算生成一个 5 天后时间点,得到一串形如填写示例的数字。
  key:设备密匙
  其余信息与图中一致

token计算

  步骤3 安装并配置 MQTT.fx 工具模拟设备信息

模拟设备配置

  (1) 设置 Profile Name:可设置一个便于记忆的名字,如“某产品某设备接入模拟”
  (2) 设置 Broker Address:mqtts.heclouds.com (MQTT 设备接入平台网址)
  (3) 设置 Broker 端口:1883 (本次实训任务采用非 TLS 加密的 MQTT 连接)
  (4) 设置 Client ID:{设备名称}(前一个步骤中确定的设备名称填入此处)

在下方的第一个选项页“General”中,设置:
  (5) MQTT 协议版本号:取消默认勾中,确保下方版本选择下拉框可选,并选择为 3.1.1

模拟设备配置

点击 “User Credentials”选项页,继续设置:
  (6) 设置 User Name:{产品 ID}(前一个步骤中确定的产品 ID)
  (7) 设置 Password:{token} (前一个步骤中计算得到的 token)

模拟设备配置

  点击OK 保存连接配置。

  步骤4 使用 MQTT.fx 工具模拟设备接入
  运行 MQTT.fx 工具,点击选择刚刚保存的连接配置列表项,点击“Connect”,如果一切正常,工具将很快登陆接入OneNET 平台,此时 Connect 按钮变灰,右侧 Disconnect 按钮处于激活状态。

设备接入

  当工具显示正常连接后,稍等一会手动刷新,查看OneNET 平台中当前模拟的设备在页面显示为在线状态

设备状态

2.2.2 模拟设备接入OneNET 平台实现属性上报

  步骤1 订阅属性上报结果通知消息
点击模拟工具的“Subscribe”选项页表头,在其中的输入框填写属性上报结果通知topic。
  $sys/产品 ID/设备名称/thing/property/post/reply
  其中产品 ID、设备名称内容,根据实际创建的产品和设备信息替换,将替换后完整的 topic,填入模拟工具“Subscribe”选项页中的输入框,如下图所示:

属性上报

  点击“Subscribe”按钮向平台订阅该主题,平台返回成功后,工具左侧中的已订阅主题列表会有一条记录,且该主题下当前消息数为 0。

订阅主题

  步骤2 发送属性上报消息
  点击“Publish”选项页表头,切换到消息发送页,在输入框中填入属性上报 topic 主题,该 topic为:
  $sys/产品 ID/设备名称/thing/property/post

上报topic主题

  在下空白编辑区中,输入如下内容:

{
   "id": "123",
   "version": "1.0",
   "params": {
       "distance": {
           "value": 28.88,//上报的属性值,填入一个合适的数字即可,如 28.88
           "time": 1599534283111//属性值上报时间,该参数可删除不填,如果填写,需用时间戳计算工具获得当前时刻的时间戳(单位ms)
       }
   }
}

  输入并检查无误后,点击“Publish”按钮。

属性上报

  步骤3 查看属性上报结果
  点击“Subscribe”选项页表头,查看之前订阅的属性上报结果通知消息 topic 下,收到的消息如下图示例:
  可以看到最新的一条消息,标识了消息的 id 和 code,其中 id 的值为发送时的 id 值,code 值为 200表示该条消息成功送达 OneNET 平台。

上报结果信息

  步骤4 OneNET 平台中查看设备的属性最新值
  回到 OneNET 平台中设备管理页面,进入“Simulator”设备详情,查看当前设备各个属性的最新数据,确认显示出通过模拟工具上报来的 value 值:

属性最新数据

2.2.3 OneNET 平台下发属性值到模拟工具

  步骤1 订阅接收平台下发属性数据的 topic
  设备侧如需要收到平台下发的数据,需要订阅接收平台下发数据的 topic,该 topic 为:
  $sys/产品 ID/设备名称/thing/property/set
  点击模拟工具的“Subscribe”选项页表头,在其中的输入框填写平台下发属性数据的 topic。点击“Subcribe”按钮完成订阅,如下所示,成功后订阅列表会多一个新的订阅频道,当前消息数为 0。

订阅topic

  步骤2 OneNET 平台下发属性数据
  在“设备管理”中选择要下发属性的设备(本任务中选择前面任务中创建的产品和Simulator 设备),点击详情进入设备信息页面,切换功能为“设备调试”

平台下发属性数据

  在下方显示页面中选择“应用模拟器”,勾中属性功能点距离 distance,并填写一个具体数值,如 33.3,点击页面下方的 “属性设置”按钮,完成发送。可以在页面右侧的调试日志中看到下发的日志信息。

  步骤3 模拟设备中查看收到的属性数据值
  点击模拟工具的“Subscribe”选项页表头,可以看到已订阅列表中,关于平台下发属性数据的topic, 当前消息数是 1。点击右侧消息列表最下方一条消息,可以看到其中的内容信息,收到的值与前一步骤中下发的值相同。

模拟接收属性数据

2.3 拓展实训部分

2.3.1 仿真设备信息上传

  步骤1 进入设备调试功能
  在“设备管理”中选择要下发上报信息的设备(本任务中选择前面任务中创建的产品和 Simulator 设备),点击详情进入设备信息页面,切换功能为“设备调试”。

设备模拟器

  步骤2 启动设备模拟器
  注:如果此时页面提示设备已经登陆,需要先检查,之前模拟工具是否还处于连接状态中,如是则点击模拟工具中的“Disconnect”按钮,并等待一定时间再次刷新页面,直到页面显示可以启动调试。

设备模拟器

  点击“启动调试”按钮。启动后,属性上报 Tab 页展示了当前设备可以上报的数据点

启动调试

  步骤3 输入当前设备的WiFi定位信息上报
  向下浏览或通过输入关键字搜索定位到“WiFi定位”属性数据点,勾中前面的选框,并点击右侧下拉展开箭头,在该数据点下的“热点mac信息”输入框中输入某个WiFi热点的mac地址信息,如F4-6A-DD-E9-2C-0F。点击下方的“属性上报”。

WiFi定位信息上报

  观察页面右侧显示的数据上报及平台回应信息,确认数据成功上报。

数据成功上报

  步骤4 在设备详情页面查看设备上报的热点位置信息数据
  返回设备详情页面,切换“属性”页面,查看设备属性点的数据信息,已经有数据记录。

热点位置信息数据

2.4 实训笔记

  MQTT模拟设备接入的原理是基于发布/订阅模式的轻量级消息传输协议,通过模拟器作为客户端与物联网平台进行交互,实现设备的快速验证和测试。其步骤如下:
  首先在物联网平台中创建产品并注册设备,获取必要的连接参数如产品ID、设备名称和设备密钥等;
  使用支持MQTT的客户端模拟器,如MQTT.fx、MQTTX等,配置MQTT客户端,填入接入平台网址、端口、MQTT 协议版本号、产品ID,Token等信息;
  连接建立后,客户端根据需求订阅相关主题,以便接收来自其他设备或应用的消息。客户端可以向指定主题发布消息,模拟设备的数据上传过程

任务三:基于真实设备接入 OneNET 平台

3.1 实训目的

  1、基于真实设备,搭建软硬件环境,接入 OneNET 平台并实现设备属性上报;
  2、通过OneNET 平台的“设备调试”实现设备属性下发;
  3、通过OneNET 平台的“API 调试”实现设备属性下发;
  4、直接基于API 方式实现设备属性下发;

3.2 实训步骤

3.2.1 真实设备接入OneNET 平台实现属性上报

  步骤1 基于 OneNET 物联网实验箱搭建实训项目终端硬件平台
  选取 OneNET 物联网实验箱“核心模块”以及“Wifi 模块”、“蜂鸣器模块”、 “超声波模块”进行搭建

  步骤2 修改设备程序的 OneNET 平台网络接入配置参数
  修改如下几处代码,让工程具备正确的网络访问以及 OneNET 平台接入验证和适配本次实训任务所需的物模型数据属性上报、写入能力。具体代码文件在工程中的位置如下图所示

代码文件位置

  A. 工程相对路径/device/src/net_device.c 约 677 行处,将{wifi}、{password}替换为设备所在 Wifi 网络用户名和密码(将{}括号一起替换,下同);

修改热点信息

  B. 工程相对路径/onenet/src/onenet.c 约 56 行处,依次修改{设备密钥}、{产品 id}、{设备名称}为之前步骤中在 OneNET 平台 中所创建的产品、设备相关信息,本例中设备名称就是之前步骤中创建的“Controller”设备,并对应填入其设备密钥;

修改设备信息

  步骤3 编译工程,连接下载器烧写程序到设备中
  下载器的连接以及烧写过程略。下载成功后设备重新加电,等待一定时间,进入下一步。

  步骤4 OneNET 平台侧查看设备状态
  登录 OneNET 平 台 ,查看“Controller”设备运行状态为在线,具体操作与前述步骤中查看设备状态相同,图略。若此时设备显示为不在线,则排查前面关于网络接入、OneNET 鉴权等代码修改处是否有误。

设备在线

  步骤5 OneNET 平台侧查看设备上报数据信息
  进入设备详情页面,查看属性表格页展示的各个数据点显示的信息。(下图仅为示例参考)

属性数据

3.2.2 下发属性在终端设备上执行生效(设备调试)

  步骤1 通过 OneNET平台 的设备调试方式进行属性下发
  打开设备管理列表页面,选择之前步骤中创建的MQTT产品下的“Controller”设备,点击“详情”进入设备详情页面,并点击 “设备调试”选项,进入 OneNET 平台 的设备调试功能页面。本任务中,需要切换调试方式为“应用模拟器”,下方页面展示了可以设置的属性(物模型中可写的属性功能点)。

设备调试
属性设置

  先勾选一个功能点,然后设置下发的数值。(以蜂鸣器为例,这是一个 bool 型功能点,勾选后,可设置值为 true、false 两个之一,本次任务选择 true 作为下发数值)点击页面下方的“属性设置”按钮,右侧调试日志展示了下发的报文,设备端也同时将该数值执行生效。

调试日志

3.2.3 下发属性在终端设备上执行生效(API 调试)

  步骤2 进入“API 调试”功能页面
  点击“运维监控”菜单下“API 调试”子菜单,并展开工作页面左列显示的大类调试类别中的“物模型使用”下拉列表,选择“设置设备属性”API项,如下图所示:

物模型使用

  在中间页面展示的必填参数中,填写页面中输入必要的参数,如下图所示,本次任务中,填入真实接入的设备“Controller”所对应的相关信息:

设置设备属性

  其中的params内容填写要设置的属性标识符以及对应设置值,本次任务中设置蜂鸣器状态为true,文本示例参考如下:

{
 "beep": true
}

  点击下方的“执行”按钮,等待一会儿后,设备端执行下发的属性值(蜂鸣器响),同时右侧列页面刷新显示出调用结果,也就是整个API 模拟调用的报文交互结果。几个红色框强调处,是api 调用的关键信息。实际的API 接口调用能否正确,需要这几处关键信息填写正确。

调用结果

3.2.4 基于API 方式实现设备属性下发

  步骤1 填入必要参数
  1、根据API文档的信息,确定设备属性设置的请求方式、请求 url ,填入到 Postman 工具url填写栏,将 Postman工具url填写栏前面的下拉选项改为“POST”。

填入参数

  2、确定请求 body 内容及格式,以蜂鸣器属性值(beep)下发为例, product_id为产品ID,device_name为设备名称,params 为需要下发的结构化数据,同时包含了要下发的“beep”属性点的值,示例中为 true 数据。以键值对形式将上述需要设置的具体参数组装为 body 报文内容,最终填入 Postman 工具的 Body 选项页内。

{
"product_id": "84qVvid4b5",
"device_name": "Controller",
"params":
{
 "beep": true
}
}

  3、确定请求的 Header 内容,这里需要一个向 OneNET 平台鉴权所需的必要信息字段,就是“authorization ”信息,res 参数须以“userid/ 用户 ID”的格式填入,版本号须为“2022-05-01”,字段具体内容根据实际情况进行填入。

Token计算

  步骤2 发起 API 请求,查看结果
  发起请求前确认当前真实设备已在线,以蜂鸣器属性值(beep)下发为例,通过 postman 发起请求, 通过平台鉴权后,该请求会下发到对应的真实设备,打开蜂鸣器开关,蜂鸣器会按照程序里预置的逻辑进行鸣响。

API请求

3.2.5 基于OneNET 云平台的场景联动

  步骤 1 进入 OneNET 平台 场景联动管理功能
  进入 OneNET 平台 控制台页面,点击“数据流转”菜单下“场景联动”子菜单,进入场景联动管理功能页面。

场景联动

  步骤2 创建场景联动规则
  点击页面右上角“新建场景”,填写场景名称,这里我们需要一个“距离太近告警”的场景,点击添加进入下一步。

新建场景

  步骤3 编辑距离探测告警的联动规则
  1、触发方式:“设备触发”
  2、选择产品分组:“选择产品”
  3、选择具体产品:选择之前实训任务中创建的MQTT产品名称
  4、选择设备: 选择该产品下的Controller设备
  5、选择信息源类型:“设备功能点”
  6、选择功能:选择该产品下的“距离”数据点
  7、修改关系运算符:“<”
  8、数值:填入 "5"

创建规则

  其次点击增加“执行动作”,在“动作一”内容中,依次选择:
  1、选择动作类型:“设备执行”
  2、选择产品分组:“选择产品”
  3、选择具体产品:选择之前实训任务中创建的MQTT产品名称
  4、选择设备: 选择该产品下的Controller设备
  5、选择功能:选择该产品下的“蜂鸣器”
  6、数据值选择 "1"。

创建规则

  点击“确定”创建好改场景信息,并修改其启用状态为“开”。

打开启用

  步骤4 再新增一个联动规则,实现距离安全时取消告警
  参考步骤3 描述,再新增一个联动规则,名称可以为“距离安全取消告警”。该规则的具体条件及动作与步骤3大部分相同,除了其中的条件部分,距离逻辑判断修改为“>”,数值为“20”,执行动作部分,蜂鸣器的数值改为“0”。最后点击“确认”按钮,并同样将该条场景规则的启用状态改为“开”

创建规则

  步骤5 设备上线,观察场景实现效果
  近距离遮挡超声波模块的距离探测器探头,稍等一定时间后,蜂鸣器模块鸣叫,移开超声波模块遮挡, 再稍等一定时间后,蜂鸣器模块停止鸣叫。
注:如设备未按场景联动的规则逻辑执行,可通过场景列表该条场景的“查询日志”进入查看场景联动日志,分析具体原因。

查询日志

3.3实训笔记

  红外距离探测器主要依靠红外光的发射与接收来确定距离。当红外光照射到物体上时,会根据物体的性质反射回一部分光线。这些反射回来的光线被探测器捕捉并转换为电信号,经过处理后用于计算发射点与物体之间的距离。

任务四:安全防护系统的可视化实现

4.1 实训目的

  1、学会OneNET 平台数据可视化编辑器的使用;
  2、能够进行可视化数据源的配置;
  3、对智慧小区安全防护系统进行可视化展现。

4.2 实训步骤

4.2.1 物联网云平台可视化组件配置运用

  步骤1 创建一个可视化项目

数据可视化

  首先新增一个可视化项目,在弹出的模板选择页面,选择一个 2D 项目模板下的“空白模板”作为本次项目可视化的基础模板,填写位于右侧的项目名称、项目描述后,点击“确定”完成可视化项目创建。

新建项目

  可以选择具有一定页面效果的模板比如“模板-智慧园区“,后续根据需要删减部分控件。

新建项目

  步骤2 增加数据源模板
  点击左侧菜单“数据管理”下“数据源模板”子菜单,右侧页面中,点击“创建数据源模板”,预先为界面展示距离的变化图表建立一个数据来源模板。

创建数据源模板

  在展开的配置项中,先设定第一项的“数据类 ”型为“物联网平台”,这时页面会切换为配置从“物联网平台”抓取数据所需的必要信息。依次填写带“*”的所有项:

填写模板信息

  步骤3 编辑可视化页面及各个组件

编辑可视化页面

  选择一个合适的图表,若是空白模板,则添加一个图表

添加图表

  步骤4 设置图表的数据来源
  保持折线图处于选择状态(可再次双击折线图,右侧出现属性修改页),现在切换到“数据”属性 Tab页。选择“数据绑定方式”为“数据源”,此时“数据源选择”下拉列表为“请选择”状态,点击“管理数据源”按钮,弹出“数据源管理”页面。

管理数据源

  点击“数据源模板”Tab 页,展示目前所有的数据源模板,可以看到一条在之前步骤中已经创建好的记录(名称为 distance),点击该记录操作列中最右图标:“以此模板创建数据源”。关闭窗口回到视图编辑页面。

复制数据源模板

  此时“数据源选择”下拉列表会出现一条可选的记录,形如“distance_XXXX”,代表以“distance” 模板生成的记录,平台自动追加后缀加以命名。选择该条记录作为折线图的数据源。

数据源选择

  步骤5 设置不使用数据过滤器
  点击 “使用数据过滤器”前面的勾选框,去掉勾选,即不使用数据过滤器。点击“数据处理结果”按钮,查看弹出的窗口中展示的数据,这些数据就是设备定时上报的属性点形成的(图例中的 value对应的值,就是上报的间隔距离值)。关闭弹出窗口继续下一步。

数据处理结果

  步骤6 设置图表的横轴列展示字段名与数据提供字段相匹配
  现在切换回“样式”属性 Tab 页。展开“数据系列”的节点,修改列字段名为“value”,保持与数据源中提供的数值字段“value”相一致。

设置字段名

  步骤7 预览可视化视图并回到编辑状态迭代优化视图效果
  编辑视图界面,可以看到折线图已显示出实际的折线数据图表,可以点击右上角“预览”按钮,在全页面状态下查看整个可视化视图的效果。

预览页面

  步骤8 保存视图,完成可视化项目
完成视图编辑后,点击顶部的“保存”按钮(编辑状态和预览状态均可),完成项目保存。

保存页面
最终效果

4.3 实训笔记

  物联网平台的可视化页面是一种用户界面,它允许用户以图形化的方式查看和分析连接到物联网平台的数据。它通过一个易于使用的界面展示来自各种设备和传感器的实时数据,使得用户能够监控和管理他们的物联网设备和系统。这些页面通常由图表、地图、控制面板等组件构成,它们可以展示设备状态、历史数据、实时警报和其他关键信息。
  其工作步骤大致为创建可视化项目编辑页面调用提前创建好的数据源,完成编辑后可先预览,无误后保存。
  可视化项目通过图形化的编辑器,用户无需具备编程技能即可设计和实现复杂的应用逻辑和用户界面,提供多种预定义的页面模板和可视化组件,如柱状图、饼图、地图等,支持连接多种数据源,包括云数据库、第三方APIs等,实现数据的实时更新和展示。

版权声明:
作者:dingding
链接:https://www.techfm.club/p/128626.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>