亚马逊云科技 Build On -AIOT从基础到深度实操教程

亚马逊云科技 Build On -AIOT从基础到深度实操教程

背景介绍

前言

  • 第一部分本实验将带领大家进行由Raspberry Pi Zero 2 W树莓派以及AWS cloud9远程操控云服务器进行视频推流(cloud9为模拟实时视频推流,树莓派是实时传输摄像头拍摄图像)

  • 第二部分结合Amazon KVS Amazon Rekognition Streaming Video Events这两项都是AWS的服务结合进行智能模式识别(根据用户预设配置分析视频中的数据,并将结果响应到您的邮件中)

    AIOT是人工智能于物联网结合,由物理硬件树莓派拍摄视频,通过AWS软件 Kinesis Video Streams C Producer SDK 进行一个实时流式传输到云端KVS等等服务,最后通过一系列AWS服务进行人工智能图像识别分析图像信息保存至S3桶

注:KVS是Kinesis Video Streams的简称

应用行业

安防行业、物流行业、家居行业、制造业、娱乐直播、游戏等行业

应用场景

想象一下,出门在外,担忧家里是否被偷窃,或者回家被人尾随进门发出警报,物流机械判断快递货物进行传输等等应用常场景这就是AIOT的部分应用场景

AWS KVS github项目地址

AWS KVS github 项目地址

AWS 实验文档手册

AWS树莓派和cloud9模拟推流实现文档

这个github项目地址不仅提供了树莓派的实现还提供了docker amazonlinux2的实现说明文档就在github的这个超链接里面(目前由于网络原因并未跑通,但是经过部分验证是没有问题的,说明文档有效),

准备工作

基于安全考虑,所有实验将在IAM账户进行,地区为爱尔兰

  1. 登录AWS根账户
  2. 控制台搜索IAM,选择用户栏选项后添加用户,建议创建时取消重置密码选项,看不懂翻译中文
  3. 选择直接附加现有策略,勾选策略 AdministratorAccess并下一步继续创建
  4. 创建完成后,重新进入IAM用户界面,点击你所创建的为蓝色字体的用户名进入用户详细信息
  5. 点击安全证书,安全证书下登录凭证栏摘要里面直接从控制台登录链接里面登录
  6. 得知了控制台登录链接,直接复制到浏览器进入登录就行,账户ID会自动输入的,账号就是自己所创建的密码也是
  7. 登录IAM账号后更换地区为爱尔兰
使用树莓派进行摄像头采集视频并推流到KVS

树莓派图片解析

树莓派参数以及摄像头型号

  1. 配置 2.4G Wifi(硬件不支持5GHZ只支持2.4)

  2. 需要一张SD卡以及读卡器,将树莓派镜像烧录进SD卡

  3. 电脑下载树莓派最新的官方镜像https://www.raspberrypi.org/downloads/下载地址

  4. 选择Raspberry Pi OS (other)镜像,再选择Raspberry Pi OS(64-bit)

  5. 右下角点击配置进行主机名,SSH,以及 WIFI 的配置,以便在启动后通过 SSH 远程方式连接。

  6. 烧录完成后将SD卡插入树莓派并插上电源

  7. 稍等一会通过ssh连接

    ssh 用户名@主机名
    
  8. 配置树莓派 更换镜像源以及构建KVS CPP程序进行推流

    sudo vi /etc/apt/sources.list
    #用以下内容替代
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    #然后替换
    sudo vi /etc/apt/sources.list.d/raspi.list
    #用以下内容取代
    deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
    
  9. 编译环境

    sudo apt-get update
    
    sudo apt-get upgrade
    #以下代码是一行代码 安装多个包
    sudo apt-get install libssl-dev libcurl4-openssl-dev liblog4cplus-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools cmake
    
  10. 克隆项目地址并创建工作目录

    cd
    
    git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
    
    mkdir -p ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
  11. 最后进行构建KVS CPP应用

    cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF && make
    
  12. 创建KVS(简称,可以直接控制台搜索创建),名称为kvs-workshop-stream,其他选项默认

  13. 配置环境变量导入安全凭证

    这里的 ACCESS_KEY 和 SECRET_KEY 都是你创建IAM账号生成的凭证,需要自行修改

由于只有创建的时候可以看见和保存,所以这里可以在IAM账号用户里面的安全证书里面重新新建访问密钥如下图
创建访问密钥

export AWS_DEFAULT_REGION="eu-west-1"

export AWS_ACCESS_KEY_ID="你的ACCESS KEY"

export AWS_SECRET_ACCESS_KEY="你的 SECRET KEY"

export GST_PLUGIN_PATH=$HOME/amazon-kinesis-video-streams-producer-sdk-cpp/build

export LD_LIBRARY_PATH=$HOME/amazon-kinesis-video-streams-producer-sdk-cpp/open-source/local/lib
  1. 进入工作目录进行推流
cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build

libcamera-vid -n -t 0 -o - | gst-launch-1.0 -v fdsrc do-timestamp=TRUE ! h264parse config-interval=1 ! video/x-h264,stream-format=avc,alignment=au ! kvssink stream-name="kvs-workshop-stream"
  1. 最后进入KVS服务查看是否有视频流如果有视频流可以进入命令行停止传输
cloud9模拟kvs producer推流到KVS stream
  1. 进入控制台搜索cloud9创建cloud9环境

  2. 选择配置

    • Environment type:选择 Create a new EC2 instance for environment (direct access)

    • Instance type:选择 t3.small

    • Platform:选择 Ubuntu Server 18.04 LTS

    • Cost-saving setting:选择 After four hours

    • 单击屏幕底部的 Next step

  3. 点击创建 等待一段时间后会出现一个命令行终端,接下来都将在命令行终端里面进行操作

  4. 安装库

    sudo apt update
    sudo apt upgrade
    
    sudo apt install -y cmake gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools libgstreamer-plugins-base1.0-dev
    
  5. 磁盘空间扩展

    wget https://awsj-iot-handson.s3-ap-northeast-1.amazonaws.com/kvs-workshop/resize_volume.sh
    
    chmod +x resize_volume.sh
    
    ./resize_volume.sh
    
  6. 请等到实例重新启动,因为您将在实例重新启动时看到 Connecting…

  7. 实例重新启动后,右上角会有一个红框加下划线的link点击 link 后,在终端中运行以下命令以检查磁盘空间

    df -h
    

    如下图所示磁盘扩展成功
    磁盘扩展

  8. 安装 Amazon Kinesis Video Streams Producer SDK C++ 在您的 Cloud9 环境中

  9. 下载并构建SDK

    cd      # 进入家目录
    
    git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git      # 克隆仓库
    
    mkdir -p ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
    
    cmake -DBUILD_GSTREAMER_PLUGIN=ON ..  && make
    

    构建会等待一段时间

  10. 创建KVS,如果前面已经创建了则忽略(注意KVS名字必须是kvs-workshop-stream)默认配置就行

  11. 创建好KVS之后 回到cloud9命令行

    • 您将使用预下载的视频,而不是 USB 相机。

    • 在 Cloud9 终端中运行以下命令下载视频剪辑

    cd
    
    wget https://awsj-iot-handson.s3-ap-northeast-1.amazonaws.com/kvs-workshop/sample.mp4
    
  12. 接下来需要一个AWS凭证

    可以自行下载 AWS CLI在自己终端中使用 也可以使用cloudshell使用其自带的AWS CLI进行凭证配置,注:如果是使用自己的设备而不是AWS的云服务器进行推流则使用自己设备的AWSCLI

    CLI 完成安装后,在自己的电脑终端进行以下操作:(或者直接进入cloudshell)

    下面的账号ID和KEY 是IAM账号的安全证书里面的访问密钥

    aws configure       # 配置 aws 临时凭证
    AWS Access Key ID [None]: [输入自己账号的 AWS Access Key ID]
    AWS Secret Access Key [None]: [输入自己账号的 AWS Secret Access Key]
    Default region name [None]: eu-west-1
    Default output format [None]: json
    

    接下来在自己的电脑终端中运行以下命令。

    aws sts get-session-token
    

    您将获得以下结果,因此我们将此值设置为 Cloud9 的环境变量。

    {
        "Credentials": {
            "AccessKeyId": "...",
            "SecretAccessKey": "...",
            "SessionToken": "...",
            "Expiration": "2020-01-01T00:00:01Z"
        }
    }
    

接下来,打开 Cloud9 终端并执行以下命令来设置环境变量。
注意这里的 ACCESS_KEY 和 SECRET_KEY与SESSION_TOKEN 都是上一步 json 返回获得的,需要自行修改

export AWS_DEFAULT_REGION="eu-west-1"

export AWS_ACCESS_KEY_ID="上一步Json中的AccessKeyId的值"

export AWS_SECRET_ACCESS_KEY="上一步Json中的SecretAccessKey的值"

export AWS_SESSION_TOKEN="上一步Json中的SessionToken的值"

**在本实验中,AWS CLI 用于获取 IAM 用户的临时凭据,以简化过程,但每次在真正的相机设备上都很难做到这一点。在现实世界的用例中,您可以使用 AWS IoT 管理的客户端证书来获取凭据。如何使用 AWS IoT 凭据提供商消除设备中对硬编码 AWS 凭据的需求

**将视频上传到视频流(步骤 10)
在 Cloud9 终端中运行以下命令来设置环境变量。

export GST_PLUGIN_PATH=$HOME/amazon-kinesis-video-streams-producer-sdk-cpp/build

export LD_LIBRARY_PATH=$HOME/amazon-kinesis-video-streams-producer-sdk-cpp/open-source/local/lib

然后运行以下命令上传视频。

cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build

while true; do ./kvs_gstreamer_file_uploader_sample kvs-workshop-stream ~/sample.mp4 $(date +%s) audio-video && sleep 10s; done

注意: 如果您收到错误,请确保已将 AWS 凭据设置为环境变量,并且流名称(kvs-workshop-stream)正确无误。
此视频流将用于以下步骤,保持命令运行,或在您运行下一步时重新运行它

最后 检查视频流 有视频可停止cloud9里面的推流
至此模拟producer SDK推流完成

准备Rekognition Streaming Video Events 需要的资源

Rekognition Streaming Video Events是一个服务,会对推流的一个视频进行处理并将结果存储到S3桶以及发送邮件通知

s3,sns,iamrole,iam策略等等是一个服务,都会有对应的arn 这些服务可以在控制台左上角搜索框搜索到

  1. 创建 S3 Bucket,Bucket Name 命名为:video-event-analytics-账户 ID,创建 S3 bucket 时的其他参数都保证默认配置,

  2. 创建 S3 Bucket 成功后,在 bucket 里创建文件夹 video-result

  3. 创建 SNS 并配置邮件订阅,在 Amazon SNS(Simple Notification Service)里创建 Topic,选型类型为:Standard类型,Topic 名称命名为:video-event-sns

  4. 创建topic后 创建 SNS Topic 的订阅(配置为主题arn选择上一步你创建的主题对应ARN,协议选择电子邮件,终端节点填写自己的邮箱,创建完成后会发送一封确认邮件至你的邮箱,需要你自行点进邮件进行确认,建议翻译成中文看懂内容再点击确认)
    邮件确认成功后如下图
    邮件确认状态结果图

  5. 创建 Rekognition Service Role,进入iam策略,先进行策略配置

    • 首先创建 IAM 策略 **策略名:**Rekognition_call_s3_kvs_policy,授予访问 KVS、SNS、S3 的必要权限

    • **(不要用可视化编辑器请使用json编辑)**在 JSON 里面用下面的 json 代码覆盖后(其中 KinesisVideoStream-名字、SNS-arn、S3-arn 需要修改为您自己的实验环境中创建的资源。)再点击下一步

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "KinesisVideoPermissions",
                  "Effect": "Allow",
                  "Action": [
                      "kinesisvideo:GetDataEndpoint",
                      "kinesisvideo:GetMedia"
                  ],
                  "Resource": [
                      "arn:aws:kinesisvideo:eu-west-1:::stream/你的kvsStreamName/*"
                  ]
              },
              {
                  "Sid": "SNSPermissions",
                  "Effect": "Allow",
                  "Action": [
                      "sns:Publish"
                  ],
                  "Resource": [
                      "arn:aws:sns:eu-west-1:这里修改为你的账号id:video-event-sns"
                  ]
              },
              {
                  "Sid": "S3Permissions",
                  "Effect": "Allow",
                  "Action": [
                      "s3:PutObject"
                  ],
                  "Resource": [
                      "arn:aws:s3:::video-event-analytics-同样这里修改为你的账号ID/*"
                  ]
              }
          ]
      }
      
    • 至此策略创建完成

  6. 左边策略的上面有一个角色,接下来创建角色并赋予对应角色刚刚配置的策略

    • 创建角色时选择 Trusted Entity Type为AWS Service ,选择支持的 AWS 服务的场景为 Rekognition,记录角色的ARN并在权限里面,将上一步创建的 IAM 策略关联到 Rekognition Service Role。
      附加策略如下图
      在这里插入图片描述
  7. 至此 准备工作完成

启动Rekognition Streaming Video Events
  1. 启动之前需要创建 rekognition-stream-processor服务以及启动

  2. 创建 rekognition-stream-processor服务以及启动分别需要两个json文件

  3. 创建名为createstreamprocessor.json的文件上传至cloud9 的/home/ubuntu/environment/目录
    cloud9创建文件方式
    cloud9创建文件
    在这里插入图片描述

    文件内容为: (部分内容需自行替换)

    {
        "DataSharingPreference": { 
          "OptIn":true
        },
        "Input": {
          "KinesisVideoStream": {
            "Arn": "你的kvs ARN值"
          }
        },
        "Name": "video_event_stream_processor",
        "Output": {
          "S3Destination": {
            "Bucket": "你的桶名",
            "KeyPrefix": "video-result"
          }
        },
        "NotificationChannel": {
          "SNSTopicArn": "你的SNS ARN值"
        },
        "RoleArn": "你的IAM角色ARN值",
        "Settings": {
          "ConnectedHome": {
            "Labels": [
              "PERSON"
            ],
          "MinConfidence": 80
          }
        },
        "RegionsOfInterest": [
          {
            "BoundingBox": {
              "Top": 0.11,
              "Left": 0.22,
              "Width": 0.33,
              "Height": 0.44
            }
          },
          {
            "Polygon": [
              {
                "X": 0.11,
                "Y": 0.11
              },
              {
                "X": 0.22,
                "Y": 0.22
              },
              {
                "X": 0.33,
                "Y": 0.33
              }
            ]
          }
        ]
    }
    
  4. 创建名为startstreamprocessor.json文件至至cloud9 的/home/ubuntu/environment/目录

    文件内容为

    {
       "Name": "video_event_stream_processor",
       "StartSelector": {
          "KVSStreamStartSelector": {
             "ProducerTimestamp": 1651702500
          }
       },
       "StopSelector": {
          "MaxDurationInSeconds": 30
       }
    }
    
  5. 创建完成后输入命令进行创建

    aws rekognition create-stream-processor --region eu-west-1 --cli-input-json file:///home/ubuntu/environment/createstreamprocessor.json 
    
  6. 启动命令

    aws rekognition start-stream-processor --region eu-west-1 --cli-input-json file:///home/ubuntu/environment/startstreamprocessor.json
    
  7. 这时你的邮箱将会收到两封邮件,其中一封包含s3桶结果内容,只需看关键字s3就行,同时我们也经过命令进行查询结果

  8. cloud9运行如下命令

    aws s3 ls video-event-analytics-你的账号ID --recursive
    
  9. 检查返回的json是否有结果以及是否收到邮件,邮件是否有内容 如果有则下一步

  10. 到此,Rekognition Streaming Video Events流程完成

下面是关于 Rekognition Streaming Video Events 需要用到主要参数可以学习看看(参考)

  • Stream-Processor Request 主要参数说明
    以下为 Rekognition Streaming Video Events 需要用到主要参数
No.NameRequiredDefaultDescription
2InputYesN/A目前支持KVS的视频流
3OutputYesN/A对应Rekognition streaming video events检测结果的输出,目前仅支持s3作为输出
4S3DestinationYesN/A用于保存推理结果,BucketName必选,ObjectKeyPrefix可选
5RoleArnYesN/AIAM Role ARN,赋予stream-processor操作kvs、s3和SNS的权限
6NotificationsChannelYes(for New feature)N/A发送视频分析结果通知的通道,目前仅支持SNS
7KMSKeyIdYes(for New feature)N/A用于对保存到s3中处理结果进行加密的KMS Key
8SettingsYesN/ASecurityMonitoring : 用于使用者指定需要检测的对象类型,目前支持的类型有: PERSON, PET, PACKAGE, ALL.FaceSearch: 在实时视频的场景使用者用于设置人脸搜索的设置
9HomeSecurityMonitoringObjectDetectionYes(for New feature)N/ARekognition streaming video events场景下设置视频标签检测的类型
10ObjectClassesToDetectYes(for New feature)Rekognition streaming video events场景设置需要检测的标签
11MinConfidenceNo50设置视频标签检测的最小置信度
12RegionsOfInterestNoEmpty检测全部视频帧设置视频帧相应标签检测的区域
13DataSharingPreferencesNoTrue for optIn flag设置是否容许Rekognition将视频用于的模型训练

最后进行实验资源的删除,cloud9,s3,sns,kvs,iam。
后面会为大家提供一种实验性的实现方式,利用docker-amazonlinux2完成实验
简单来说就是使用docker完成视频的推流,注意将不会使用USB摄像头,而是使用网络摄像头

使用docker容器进行视频推流

由于需要访问AWS的一些资源 需要开启代理并设置代理
实验来源

AWS github docker项目

  1. 在本机创建工作目录 docker-awslinux

  2. 进入docker-awslinux命令行运行git clone https://github.com/aws-samples/amazon-kinesis-video-streams-demos 克隆仓库

  3. 克隆后进入此路径命令行amazon-kinesis-video-streams-demos\producer-cpp\docker-amazonlinux

  4. 有一个dockerfile文件以及一个说明文档

  5. 启动docker 运行

    docker pull amazonlinux:2
    

    命令拉取镜像

  6. 然后运行

    docker run -it -d --net=host --name aiot amazonlinux:2
    
  7. docker exec -it  aiot /bin/bash
    
  8. 进入容器后 运行

    yum install -y \
    	autoconf \
    	automake  \
    	bison \
    	bzip2 \
    	cmake3 \
    	curl \
    	diffutils \
    	flex \
    	gcc \
    	gcc-c++ \
    	git \
    	gmp-devel \
    	gstreamer1* \
    	libcurl-devel \
    	libffi \
    	libffi-devel \
    	libmpc-devel \
    	libtool \
    	make \
    	m4 \
    	mpfr-devel \
    	pkgconfig \
    	vim \
    	wget \
    	xz && \
        yum clean all
    
    export KVS_SDK_VERSION=v3.2.0
    
    cd /opt/
    git config --global https.proxy 'http://127.0.0.1:你的代理端口' 
    git config --global http.sslVerify false
    

    下面运行

    git clone --depth 1 --branch $KVS_SDK_VERSION https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
    

    再创建build目录

    mkdir -p /opt/amazon-kinesis-video-streams-producer-sdk-cpp/build/
    cd /opt/amazon-kinesis-video-streams-producer-sdk-cpp/build/
    

    最后构建SDK应用

    cmake3 .. -DBUILD_GSTREAMER_PLUGIN=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON && \
        make 
    

    最后设置环境变量

    export LD_LIBRARY_PATH=/opt/amazon-kinesis-video-streams-producer-sdk-cpp/open-source/local/lib
    export GST_PLUGIN_PATH=/opt/amazon-kinesis-video-streams-producer-sdk-cpp/build/:$GST_PLUGIN_PATH
    

    最后使用以下命令流式传输(KVSname 密钥等等需要自行替换)

    gst-launch-1.0 v4l2src do-timestamp=TRUE device=/dev/video0 ! videoconvert ! video/x-raw,format=I420,width=640,height=480,framerate=30/1 ! omxh264enc control-rate=2 target-bitrate=512000 inline-header=FALSE periodicty-idr=20 ! h264parse ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1,profile=baseline ! kvssink stream-name="YOURSTREAMNAME" access-key=YOURACCESSKEY secret-key=YOURSECRETKEY
    

结语以及BUG解决

####希望能认真看文档和日志,避免出现错误
或许完成过程中会出现一些BUG,从cloud9开始吧

  1. cloud9运行第一行代码sudo apt update 有可能会报错,部分包无法更新,进程被锁,这是因为创建环境后,还需要一些自动初始化的进程占用了所需更新包的资源,所以占用的那部分无法更新,需要运行
sudo apt upgrade
  1. 磁盘扩容报错,就是前面的wget 下载的那个.sh文件出错
wget https://awsj-iot-handson.s3-ap-northeast-1.amazonaws.com/kvs-workshop/resize_volume.sh
  1. 可以从sudo apt update开始重新开始运行尝试
  2. 如果没有网络,获取不到文件以及创建cloud9失败则可能是地区不对,检查一下地区以及删除cloud9重新创建
  3. 在命令的结果中,确保/为 20GB
  4. 运行以下命令 如果报错
cmake -DBUILD_GSTREAMER_PLUGIN=ON .. && make

并且报错日志为 no cmake等等 则需要重新运行

sudo apt install -y cmake gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools libgstreamer-plugins-base1.0-dev
  1. 如果运行以下代码无法获取
wget https://awsj-iot-handson.s3-ap-northeast-1.amazonaws.com/kvs-workshop/sample.mp4

网络原因或地区不对,需要检查地区和重新创建cloud9
无法上传视频流,则可能是AWS凭证错误, 注意AWS凭证是需要在AWSCLI里面进行配置,可以自己电脑下载AWSCLI 也可以在cloudshell里面运行进行重新配置,
注:export配置的其实是环境变量 可以覆盖
8. 最后进行创建名为createstreamprocessor的json文件运行命令后报错或者没有返回json数据,则是json文件的配置有错误 再仔细检查
9. 创建启动文件startstreamprocessor.json 并且运行命令后仅仅没有收到邮件或者报错则是策略或邮件是否确认订阅问题
10.如果最后观测结果S3桶没有结果则检查角色是否附加策略, 以及arn等等json配置是否正确

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

玉江仙。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值