快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

ios传感器开发,苹果手机研究传感器

iOS传感器

iOS传感器篇:CoreMotion初探

成都创新互联是一家集网站建设,武义企业网站建设,武义品牌网站建设,网站定制,武义网站建设报价,网络营销,网络优化,武义网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

Core Motion

加速计程序,螺旋仪,步数计,环境相关的事件

iOS传感器篇:CoreMotion使用

目录索引

Core Motion报告了来自iOS设备的硬件和环境相关的数据,包括 加速度计 、 陀螺仪 、 计步器 、 磁力计 和 气压计 。你可以使用这个框架来访问硬件生成的数据,这样你就可以在你的应用中使用它。例如,游戏可以使用加速计和陀螺仪数据来控制屏幕上的游戏行为。

这个框架的许多服务允许您访问硬件记录的原始值和这些值的处理版本。处理过的值不包括可能会对如何使用该数据产生负面影响的数据偏移。例如,一个处理过的加速度计值只反映了用户造成的加速度,而不是由重力引起的加速度。

重要提示

在10.0 以后,为了保护用户隐私,必须在info.plist文件增加描述,错误的描述导入或未填写将会引起App崩溃。参考 NSMotionUsageDescription

需要在info.plist 新增NSMotionUsageDescription(Privacy - Motion Usage Description) 键值对,并进行说明。

这个键值对支持7.0+的版本。

CMMotionManager

启动和管理动作服务的对象。

您使用CMMotionManager对象来访问加速计数据、旋转速率数据、磁力计数据和其他设备运动数据。这些类型的数据来源于一个设备的加速度计和(在一些模型上)它的磁计和陀螺仪。在创建了CMMotionManager的实例之后,应用程序可以使用它来接收四种类型的运动:

原始的加速度计数据

原始的陀螺仪数据

原始的磁力计数据

设备运动数据(包括加速计、旋转速率和属性测量值)。

由核心运动的传感器融合算法提供的处理设备运动数据提供了设备的姿态、旋转速率、校准的磁场、重力方向以及用户在设备上的加速度。

重要提示

应用程序应该只创建CMMotionManager类的一个实例。这个类的多实例可以影响从加速计和陀螺仪接收数据的速率。

在接收运动数据时,应用程序可以采用两种方法中的一种

指定的更新间隔

定期对运动数据进行采样

用这两种方法,应用程序应该调用适当的停止方法

stopAccelerometerUpdates 停止加速计更新

stopGyroUpdates 停止陀螺仪更新

stopMagnetometerUpdates停止磁强计更新

stopDeviceMotionUpdates 停止设备运动更新

完成处理加速度计,转速、磁强计,或者设备运动数据。

处理设备更新和指定间隔

为了在特定的时间间隔接收移动数据,应用程序调用一个“start”方法,该方法使用一个操作队列(NSOperationQueue实例)和一个特定类型的block处理程序来处理这些更新。移动数据被传递到block处理程序中。更新的频率是由interval属性的值决定的。

1. 加速计 Accelerometer

1. 设置accelerometerUpdateInterval属性来指定更新间隔。

2. 调用startAccelerometerUpdatesToQueue:withHandler:方法

3. 加速计数据通过 block 中CMAccelerometerHandler 类型的CMAccelerometerData类获取。

2. 陀螺仪 Gyroscope

设置gyroUpdateInterval属性来指定更新间隔。

2. 调用startGyroUpdatesToQueue:withHandler:方法

陀螺仪数据通过 block 中CMGyroHandler 类型的CMGyroData类获取。

3. 磁强计 Magnetometer

1. 设置magnetometerUpdateInterval属性来指定更新间隔。

2. 调用startMagnetometerUpdatesToQueue:withHandler:方法

3. 加速计数据通过 block 中CMMagnetometerHandler 类型的CMMagnetometerData类获取。

4. 设备动作 Device motion

1. 设置deviceMotionUpdateInterval属性来指定更新间隔。

2. 调用startDeviceMotionUpdatesUsingReferenceFrame:或startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:或 startDeviceMotionUpdatesToQueue:withHandler:方法

3. 加速计数据通过 block 中CMDeviceMotionHandler 类型的CMDeviceMotion类获取。

周期性获取数据

为了通过周期性采样来处理运动数据,该应用程序调用一个“star”方法,不带参数,并周期性地访问给定类型的运动数据所持有的运动数据。这种方法是游戏等应用程序的推荐方法。在一个block块中处理加速计数据会带来额外的开销,大多数游戏应用只对最新的运动数据感兴趣,当它们渲染一个帧时。

1. 加速计 Accelerometer

调用startAccelerometerUpdates开始更新和定期访问CMAccelerometerData类的accelerometerData属性

2. 陀螺仪 Gyroscope

调用startGyroUpdates开始更新和定期访问CMGyroData类的gyroData属性

3. 磁强计 Magnetometer

调用startMagnetometerUpdates开始更新和定期访问CMMagnetometerData类的magnetometerData属性

4. 设备动作 Device motion

调用startDeviceMotionUpdatesUsingReferenceFrame: 或 startDeviceMotionUpdates开始更新和定期访问CMDeviceMotion类的 deviceMotion属性。startDeviceMotionUpdatesUsingReferenceFrame:方法(iOS 5.0中的新特性)允许您指定一个参考帧用于估计的属性。

硬件的可用性和状态

如果硬件特性(例如陀螺仪)在设备上是不可用的,那么调用与该特性相关的启动方法就没有效果。通过检查适当的属性,您可以了解硬件特性是否可用;例如,对于陀螺仪数据,您可以检查gyroAvailable或gyroActive属性的值。

确定服务的可用性 【Determining the Availability of Services】

1. deviceMotionAvailable 属性

一个布尔值来表明设备的“设备姿态”服务是否可用

2. accelerometerAvailable 属性

一个布尔值来表明设备的“加速计”服务是否可用

gyroAvailable 属性

一个布尔值来表明设备的“陀螺仪”服务是否可用

magnetometerAvailable 属性

一个布尔值来表明设备的“磁强计”服务是否可用

确定哪些服务是活跃的 【Determining Which Services Are Active】

deviceMotionActive 属性

一个布尔值来表明应用程序是否接收来自“设备姿态”服务的更新。

accelerometerActive 属性

一个布尔值指示是否正在进行“加速计”更新。

gyroActive 属性

一个布尔值用来表明“陀螺仪”更新是否正在进行

magnetometerActive 属性

一个布尔值用来表明“磁强计”更新是否正在进行

管理设备姿态更新 【Managing Device Motion Updates】

1. showsDeviceMovementDisplay

控制设备移动显示是否显示。

deviceMotionUpdateInterval

以秒为间隔,为block块处理程序提供设备移动更新

3. - startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:

在操作队列上启动设备移动更新,并使用指定的引用帧和block块处理程序

- startDeviceMotionUpdatesToQueue:withHandler:

在操作队列上启动设备移动更新,并使用指定的block块处理程序。

- startDeviceMotionUpdatesUsingReferenceFrame:

使用一个引用框架启动设备移动更新,但是没有block块处理程序。

- startDeviceMotionUpdates

在没有block块处理程序的情况下启动设备移动更新。

- stopDeviceMotionUpdates

停止设备运动更新。

deviceMotion

最新的设备移动数据样本。

管理加速计更新 【Managing Accelerometer Updates】

1. accelerometerUpdateInterval

以秒为间隔,为block块处理程序提供加速计更新。

- startAccelerometerUpdatesToQueue:withHandler:

启动加速计在一个操作队列上的更新和一个指定的处理程序。

- startAccelerometerUpdates

在没有处理程序的情况下启动加速计更新。

- stopAccelerometerUpdates

停止加速表更新。

accelerometerData

最新的加速度计数据样本。

管理陀螺仪更新【Managing Gyroscope Updates】

1. gyroUpdateInterval

以秒为间隔,为block块处理程序提供陀螺仪更新。

- startGyroUpdatesToQueue:withHandler:

启动陀螺仪在一个操作队列上的更新和一个指定的处理程序。

- startGyroUpdates

在没有处理程序的情况下启动陀螺仪更新。

- stopGyroUpdates

停止陀螺仪更新

gyroData

最新的陀螺仪数据样本。

管理磁强计更新【Managing Magnetometer Updates】

1. magnetometerUpdateInterval

以秒为间隔,为block块处理程序提供磁强计更新。

- startMagnetometerUpdatesToQueue:withHandler:

启动磁强计在一个操作队列上的更新和一个指定的处理程序。

- startMagnetometerUpdates

在没有处理程序的情况下启动磁强计更新。

- stopMagnetometerUpdates

停止磁强计更新

magnetometerData

最新的磁强计数据样本。

常量

1. CMAccelerometerHandler

处理回调加速计block数据

CMGyroHandler

处理回调陀螺仪block数据

CMMagnetometerHandler

处理回调磁强计block数据

CMDeviceMotionHandler

处理回调设备姿态block数据

CMErrorDomain

Core Motion 的错误域名

CMError

定义一个管理ColorSync 结果码的类型

CMLogItem

所有设备关联数据类的基类

1. timestamp

日志记录项有效的时间。

Device Motion 【设备姿态】

CMDeviceMotion

封装测量设备的姿态、旋转速率和加速度。

得到处理的设备运动数据

1. attitude

设备属性,包括角度倾斜值等等

2. rotationRate

设备的旋转速率。

3. gravity

重力加速度矢量在设备的参考系.

4. userAcceleration

用户给设备的加速度。

5. magneticField

在设备上返回磁场矢量。

6. heading

相对于当前的参考帧,起始角度(以度数测量)。

7. CMCalibratedMagneticField

校准的磁场数据,并估计校准的准确性。

8. CMMagneticFieldCalibrationAccuracy

指示磁场估计的校准精度

CMAttitude

该设备的朝向,相对于已知的参考帧,在某个时间点上的方位。

Core Motion输出一个方向余弦矩阵(DCM)——基本上是一个从上一个“old”方向到设备新方向的旋转。

1. roll

设备转动的弧度

2. pitch

设备倾斜的弧度

3. yaw

设备偏航的弧度

4. rotationMatrix

返回一个代表设备姿势的旋转矩阵

5. quaternion

返回一个代表设备姿势的四元数

6. - multiplyByInverseOfAttitude:

以一种特定的姿势产生的改变

常量

1. CMRotationMatrix

代表旋转矩阵的结构体类型

2. CMQuaternion

四元组的类型表示一种姿势的测量。

3. CMAttitudeReferenceFrame

用于表示引用的所有姿势示例的引用框架的枚举常量

Accelerometers 【加速计】

为设备的所有三个轴提供加速度计数据。

获得原始加速计事件

CMAccelerometerData

来自该设备的三轴加速计的数据样本。

if([CMSensorRecorderisAccelerometerRecordingAvailable]) {CMSensorRecorder* recorder = [[CMSensorRecorderalloc] init];  [recorder recordAccelerometerForDuration:(20*60)];// Record for 20 minutes}

1.acceleration

加速度有加速计计算得出

常量

1.CMAcceleration

一种包含3轴加速度值的结构类型

CMRecordedAccelerometerData

一个由设备记录的加速度计数据。

1. startDate

当传感器样品被记录时,已经经过的时间

2. identifier

加速计数据唯一的标识符

CMSensorRecorder

从设备中收集和检索加速度计数据。

1. + isAccelerometerRecordingAvailable

返回一个布尔值来表明当前设备加速计是否支持记录。

2. - recordAccelerometerForDuration:

开始指定时间并周期性记录加速计数据

3. - accelerometerDataFromDate:toDate:

检索在指定日期之间收集的加速计数据

4. - accelerometerDataSince:

为同一批处理中的条目检索加速计数据。

5. + authorizationStatus

授权状态

CMSensorDataList

系统记录的加速计数据列表

-(void)processSamplesFromDate:(NSDate*)start toDate:(NSDate)end {CMSensorRecorder* recorder = [[CMSensorRecorderalloc] init];CMSensorDataList* list = [recorder accelerometerDataFrom:start to:end];for(CMRecordedAccelerometerData* datainlist) {// Process the data.NSLog(@"Sample: (%f, %f, %f)", data.acceleration.x,              data.acceleration.y, data.acceleration.z);  }}

Gyroscopes

原始的陀螺仪数据。

获得原始陀螺仪数据事件

CMGyroData

一种测量设备转速的方法。

1. rotationRate

由设备陀螺仪测量的旋转速率。

常量

1.CMRotationRate

由设备陀螺仪测量的旋转速率的结构体类型

Pedometer

提供来自内置的处理器来获取计步数据

CMPedometer

一个取得系统生成实时行走数据

1. + isStepCountingAvailable

返回一个布尔值,指示在当前设备上是否可以使用计步计数。

2. + isDistanceAvailable

返回一个布尔值,指示在当前设备上是否可以使用距离估算。

3. + isFloorCountingAvailable

返回一个布尔值,指示当前设备上是否可以使用楼层计数。

4. + isPaceAvailable

返回一个布尔值,该值指示当前设备上是否可速度信息。

5. + isCadenceAvailable

返回一个布尔值,指示当前设备上是否有可用的步调信息

6. + isPedometerEventTrackingAvailable

返回一个布尔值,指示是否计步器事件是当前设备上可用。

7. - startPedometerUpdatesFromDate:withHandler:

将最近与行人相关的数据发送到你的应用

8. - stopPedometerUpdates

停止向你的应用发送最近的步行数据更新。

9. -startPedometerEventUpdatesWithHandler:

开始向你的应用程序发送计步器事件。

10. -stopPedometerEventUpdates

停止向你的应用程序提交计步器事件

11. -queryPedometerDataFromDate:toDate:withHandler:

查询在指定时间段的数据

12. CMPedometerHandler

处理计步器关联数据的block

13. CMPedometerEventHandler

处理计步器事件的block

14. + authorizationStatus

授权状态

CMPedometerData

关于用户步行的距离的信息。

1. startDate

计步器开始时间

2. endDate

计步器结束时间

3. numberOfSteps

用户所采取的步数

4. distance

用户移动的估计的距离(米)

5. averageActivePace

用户的平均速度,以秒为单位。

6. currentPace

用户的当前速度,以秒为单位。

7. currentCadence

用户当前的步调频率,以秒为单位

8. floorsAscended

步行的楼层大概有几层楼 升序。

9. floorsDescended

步行的楼层大概有几层楼 降序。

CMPedometerEvent

用户的步行活动发生了变化。

1. date

记录计步器事件的日期。

2. type

发生的变化类型。

常量

1. CMPedometerEventType

显示用户的步行活动发生的变化的常量。

Magnetometer

提供定向数据和原始磁量数据。

CMMagnetometerData

测量地球磁场相对于设备的尺寸。

1. magneticField

返回磁力仪测量的磁场。

2. CMMagneticField

包含3轴磁力仪的结构

Altitude

提供基于气压传感器信息的高度数据。

CMAltimeter

一个初始化与高海拔相关的变化的对象。

1. + isRelativeAltitudeAvailable

返回一个布尔值,指示当前设备是否支持生成相对高度变化的数据。

2. - startRelativeAltitudeUpdatesToQueue:withHandler:

开始向指定的处理程序块发送高度数据。

3. - stopRelativeAltitudeUpdates

停止对高度计对象的高度数据传输

4. + authorizationStatus

授权状态

常量

1. CMAltitudeHandler

接收高度计数据的block

CMAltitudeData

记录海拔高度变化的数据。

1.relativeAltitude

自上次报告事件以来,海拔(米)的变化。

2. pressure

有记录的压力值(千帕 hpa)

Historical Data

提供记录的运动事件来帮助你分析运动模式。

CMMotionActivityManager

用来管理设备存储的运动数据的对象。

1. + isActivityAvailable

返回一个布尔值,指示当前设备上是否可用移动数据。

2. - startActivityUpdatesToQueue:withHandler:

启动当前移动数据更新到你的应用程序。

3. - stopActivityUpdates

停止向你的应用发送动态更新

4. - queryActivityStartingFromDate:toDate:toQueue:withHandler:

收集并返回指定时间段的历史运动数据

5. + authorizationStatus

授权状态

常量

1. CMMotionActivityHandler

一个能报告与设备相关的当前运动的block

2. CMMotionActivityQueryHandler

它报告在指定的查询间隔之间发生的动作更新的block

CMMotionActivity

单个动作更新事件的数据。

1. stationary

一个布尔指示设备是否是静止的。

2. walking

一个布尔指示设备是否在行走。

3. running

一个布尔指示设备是否在一个正在奔跑。

4. automotive

一个布尔指示设备是否在汽车中。

5. cycling

一个布尔指示设备是否在骑自行车

6. unknown

一个布尔指示设备不知道的类型

7. startDate

动作发生的开始时间

confidence

对运动类型的评估的信任

常量

1. CMMotionActivityConfidence

运动数据是准确常量

iOS 传感器(一):总的介绍和距离传感器

关于传感器(Sensor),Apple官方好像并没有专门列出来介绍过,我只能从前辈的文章寻找,很多文章中都给iOS传感器进行过很详细的分类介绍,但有的传感器只是有过介绍,没有介绍使用方法或API,当然也有可能是我没搜索到,比如湿度传感器很多文章都提到,但详细使用方式就未曾看到过,还有这边的湿度传感器是指iPhone内部的?还是指iPhone所在外部环境的?

iPhone的传感器是经过长时间不停的变化和改进的,因为传感器一听名字就知道这种变化和改进十之八九是要与硬件有关系的。知乎中有一遍文章介绍的很详细, iPhone这十年在传感器上的演进- 知乎专栏 。

我姑且按照我查看的资料对iOS传感器进行一个不精确分类。

知乎知友 Hi-iD 的 答案 介绍过这两个传感器的关系,本人简单总结如下:

距离传感器的使用的使用相对简单:

现在对iPhone顶部中心一个孔进行遮挡,就能感受的距离传感器。

Core Motion 是关于accelerometers(加速计), gyroscopes(陀螺仪), pedometers(步数计), magnetometers( 磁力计), and barometers(气压计)等5个传感器使用的框架, 暂时就按照字面意思翻译成核心运动框架。官方文档的介绍:

之后的文章就学习 Core Motion 的使用。????

ios如何使用声波传感器

ios使用的声波传感器应用如下:

1) 影像传感器

简单说就是相机镜头,由于只牵涉到微光学与微电子,没有机械成份在里头,即便加入马达、机械驱动的镜头,这类的机械零件也过大,不到「微」的地步,所以此属于光电半导体,属于光学、光电传感器。

2) 亮度传感器

外界并不清楚iPhone 4用何种方式感应环境光亮度,而最简单的实现方式是用一个光敏电阻,或者,iPhone 4直接用影像传感器充当亮度侦测,也是可行。无论如此,此亦不带机械成份,属于光电类传感器,甚至可能不是微型的,只是一般光学、光电传感器。

3) 磁阻传感器

简单讲就是感测地磁,这样讲还是太学名,感应地磁就是指南针原理,将这种地磁感应电子化、数字化,就称为数字指南针(Digital Compass)。老实说,数字指南针技术比较偏玩具性,因为用来感测地磁的磁阻传感器,很容易受环境影响(如高压电塔旁、马达旁),必须时时校正才有用。

磁阻传感器目前没有被视为热门的MEMS组件,有些MEMS组件会追加整合磁阻感测能力(如ADI的产品,且目标应用是鱼雷用途),但一般而言磁阻传感器尚无迫切微型化的迹象。

4) 近接传感器

近接传感器的实现技术非常多种,可以是红外线(例如便利商店的自动门、男生公共厕所的自动冲水器)、可以是超音波、雷射等,太多太多。同样的,Apple没讲,我们只能乱猜或尽可能网搜,不过,近接传感器也没有迫切微型化的需要,不在热门MEMS组件之列。

5) 声波传感器

学名声波传感器,俗名麦克风。是的,iPhone 4 为了强化声音质量,使用2组麦克风与相关运算来达到降噪(降低噪音)的效果,这种技术称为数组麦克风(Array MIC),事实上早在Apple实行之前,2004年Wintel就已经在PC上提出过,差别是Apple用于手机,Wintel用于PC。

麦克风需要微型化吗?是的,需要,相当需要,且使用一个以上的麦克风,麦克风的体积缩小需求就更迫切,麦克风也牵涉到机械(声波会使微型机械振动),并将机械振动转换成电子信号,因此微型化的麦克风,是个不折不扣的MEMS传感器。

6) 加速度传感器

俗称加速规、G-Sensor,可以感应物体的加速度性。事实上加速度传感器的实现方式也是许多种,MEMS只是手法之一,用MEMS实现加速度传感器确实是目前的趋势。

加速度传感器一般有「X、Y两轴」与「X、Y、Z三轴」两种,两轴多用于车、船等平面移动为多,三轴多用于飞弹、飞机等飞行物。而不用多说,Wii遥控器也是用三轴,iPhone可以感应实体翻转而自动对应翻转画面,也是靠这个传感器。

7) 角加速度传感器

更简单讲就是陀螺仪,陀螺仪实现技术有机械式与光学(红外线、雷射)式,第六项的加速度传感器比较能感测平移性,但对于物体有个轴心,进行角度性的移动,则其感应效果不如陀螺仪好,所以许多应用多半是混何使用加速度传感器与陀螺仪,而今iPhone 4也从善如流。

iOS传感器的介绍

1.传感器的定义:传感器是一种感应、检测装置

2.传感器的作用:用于检测、感应设备的周边信息;不用类型的传感器,检测到的信息也不一样

3.iPhone内置传感器有:

(1)运动传感器/加速传感器/加速计(Motion/Accelerometer Sensor)

加速计用于检测设备在x、y、z轴上的加速度(那个方向有力的作用);加速计可用检测设备的摇晃(摇一摇、计步器)

(2) 环境传感器(Ambient Light Sensor)

检测周围环境光线的强弱,来控制当前屏幕的亮度,让我们在使用Mac、iPhone、iPad时,眼睛更为舒适

(3)距离传感器(Proximity Sensor)

检测是否有其他物体靠近设备屏幕,当距离太近时,会自动关闭屏幕,可以节省电量,防止耳朵或者面部不小心触碰屏幕引发不必要的意外操作

(4)磁力传感器(Magnetometer Sensor)

可以感应地球磁场,获取方向信息,使位置服务更为精确,可以用于电子罗盘、或者导航应用,iPad的smart cover 盒盖睡眠操作就是基于磁力计传感器实现的

(5)内部温度传感器(Internal Temperature Sensor)

用于检测内部组件的温度,当温度过高时,会有温度过高提示,可以防止温度超高引起iPhone设备的安全性与稳定性

(6)湿度传感器(Moisture Sensor)

湿度传感器跟其他基于微电子的传感器不同,湿度传感器是一个简单地物理传感器,湿度传感器及时一张遇水变红的试纸;apple维修店的员工就是根据是否试纸变红来判断当前设备是进水

(7)陀螺仪(Gyroscoper)

陀螺仪可以用于检测设备的持握方式;陀螺仪的原理是检测设备在x、y、z轴的角速度

4.传感器总结

iOS磁力传感器极简教程

有三种获取磁力计数据的方法,如上图所示

来自磁力计的原始读数

磁场磁场 计读数针对器件偏差(板载磁场)进行了校正,没有器件偏差。

CMCalibratedMagneticField包括两个字段:field(XYZ轴上的磁场强度)和accuracy(磁场长度的精度)。

针对器件偏置校正磁性计读数并过滤以消除局部外部磁场(通过器件移动检测 - 如果器件随器件移动,忽略它;否则测量)

CLHeading是“ 偏离设备跟踪的磁场线”,而magnetometerData.magneticField是设备观察到的总磁场,等于地球的地磁场加上设备本身及其周围的偏置“ 。

因此,CLHeading会提供经过滤的值,其中“参照系”是现有的地球磁场。而磁力计数据提供未经过滤的值,参考帧是设备。

如果你想知道哪里是磁性或真正北方的位置,推荐使用 CLHeading ,可以做指南针的一类应用。如果想要创建一个响应紧邻设备磁场的应用,或者想要执行某种特定的传感器融合,可以尝试创建一个AHRS,然后使用 CMMagneticField 即第二种方式。


网站标题:ios传感器开发,苹果手机研究传感器
转载源于:http://6mz.cn/article/dsgocph.html

其他资讯