传感器:探索Android中的传感器功能与使用

传感器:探索Android中的传感器功能与使用

  • 一、传感器介绍
    • 1.1 Android 平台三大类传感器
    • 1.2 Android 平台支持的传感器
    • 1.3 传感器框架
  • 二、传感器的使用
    • 2.1 识别传感器和传感器特性
    • 2.2 针对不同制造商的传感器或传感器的不同版本优化
    • 2.3 监控传感器事件
    • 2.4 处理不同的传感器配置
    • 2.5 传感器坐标系
    • 2.6 访问和使用传感器的最佳做法

一、传感器介绍

利用 Android 传感器框架,您可以访问多种类型的传感器。有些传感器基于硬件,有些基于软件。基于硬件的传感器是内置在手机或平板设备中的物理组件。这类传感器通过直接测量特定的环境属性(如加速度、地磁场强度或角度变化)来采集数据。基于软件的传感器不是物理设备,它们只是模仿基于硬件的传感器。基于软件的传感器从一个或多个基于硬件的传感器获取数据,有时被称为虚拟传感器或合成传感器。比如线性加速度传感器和重力传感器就是基于软件的传感器。

1.1 Android 平台三大类传感器

  • 动态传感器

    这类传感器测量三个轴向上的加速力和旋转力。这个类别中包含加速度计、重力传感器、陀螺仪和旋转矢量传感器。

  • 环境传感器

    这类传感器测量各种环境参数,如环境气温、气压、照度和湿度。这个类别中包含气压计、光度计和温度计。

  • 位置传感器

    这类传感器测量设备的物理位置。这个类别中包含屏幕方向传感器和磁力计。

1.2 Android 平台支持的传感器

传感器类型说明常见用途
TYPE_ACCELEROMETER硬件测量在所有三个物理轴向(x、y 和 z)上施加在设备上的加速力(包括重力),以 m/s2 为单位。动态检测(摇晃、倾斜等)。
TYPE_AMBIENT_TEMPERATURE硬件以摄氏度 (°C) 为单位测量环境室温。请参见下面的备注。监测气温。
TYPE_GRAVITY软件或硬件测量在所有三个物理轴向(x、y、z)上施加在设备上的重力,单位为 m/s2。动态检测(摇晃、倾斜等)。
TYPE_GYROSCOPE硬件测量设备在三个物理轴向(x、y 和 z)上的旋转速率,以 rad/s 为单位。旋转检测(旋转、转动等)。
TYPE_LIGHT硬件测量环境光级(照度),以 lx 为单位。控制屏幕亮度。
TYPE_LINEAR_ACCELERATION软件或硬件测量在所有三个物理轴向(x、y 和 z)上施加在设备上的加速力(不包括重力),以 m/s2 为单位。监测单个轴向上的加速度。
TYPE_MAGNETIC_FIELD硬件测量所有三个物理轴向(x、y、z)上的环境地磁场,以 μT 为单位。创建罗盘。
TYPE_ORIENTATION软件测量设备围绕所有三个物理轴(x、y、z)旋转的度数。从 API 级别 3 开始,您可以结合使用重力传感器、地磁场传感器和 getRotationMatrix() 方法来获取设备的倾角矩阵和旋转矩阵。确定设备位置。
TYPE_PRESSURE硬件测量环境气压,以 hPa 或 mbar 为单位。监测气压变化。
TYPE_PROXIMITY硬件测量物体相对于设备显示屏幕的距离,以 cm 为单位。该传感器通常用于确定手机是否被举到人的耳边。通话过程中手机的位置。
TYPE_RELATIVE_HUMIDITY硬件测量环境的相对湿度,以百分比 (%) 表示。监测露点、绝对湿度和相对湿度。
TYPE_ROTATION_VECTOR软件或硬件通过提供设备旋转矢量的三个元素来检测设备的屏幕方向。动态检测和旋转检测。
TYPE_TEMPERATURE硬件测量设备的温度,以摄氏度 (°C) 为单位。该传感器的实现因设备而异。在 API 级别 14 中,该传感器已被 TYPE_AMBIENT_TEMPERATURE 传感器取代监测温度。

很少有 Android 设备拥有所有类型的传感器。例如,大多数手机设备和平板电脑都有加速度计和磁力计,但很少有气压计或温度计。此外,一个设备可以有多个特定类型的传感器。例如,一个设备可以有两个重力传感器,分别具有不同的量程。

1.3 传感器框架

可以利用 Android 传感器框架来访问这些传感器并获取传感器的原始数据。传感器框架是 android.hardware 软件包的一部分,包含了以下类和接口:

  • SensorManager

    您可以使用这个类来创建传感器服务的实例。该类提供了各种方法来访问和列出传感器,注册和取消注册传感器事件监听器,以及获取屏幕方向信息。它还提供了几个传感器常量,用于报告传感器精确度,设置数据采集频率和校准传感器。

  • Sensor

    您可以使用这个类来创建特定传感器的实例。该类提供了各种方法来确定传感器的特性。

  • SensorEvent

    系统使用这个类来创建传感器事件对象,该对象提供有关传感器事件的信息。传感器事件对象中包含以下信息:原始传感器数据、生成事件的传感器类型、数据的准确度和事件的时间戳。

  • SensorEventListener

    您可以使用此接口创建两种回调方法,以在传感器值或传感器精确度发生变化时接收通知(传感器事件)。

在典型的应用中,您可以使用这些与传感器相关的 API 来执行两个基本任务:

  • 识别传感器和传感器特性

    如果应用具有依赖于特定传感器类型或特性的功能,则在运行时识别传感器和传感器特性非常有用。例如,您可能希望识别设备上的所有传感器,以便于停用依赖于不存在的传感器的应用功能。同样,您可能希望识别特定类型的所有传感器,以便选择可以为应用带来最佳性能的传感器实现。

  • 监控传感器事件

    您可以通过监控传感器事件来获取原始传感器数据。每当传感器检测到它所测量的参数发生变化时,就会发生传感器事件。传感器事件为您提供 4 项信息:触发事件的传感器的名称、事件的时间戳、事件的准确度以及触发事件的原始传感器数据。

二、传感器的使用

2.1 识别传感器和传感器特性

Android 传感器框架提供了几个方法,可让您在运行时轻松确定设备上有哪些传感器。该 API 还提供了相关方法来确定每个传感器的特性,例如最大量程、分辨率和功率要求。

要识别设备上的传感器,您首先需要获得对传感器服务的引用。为此,您可以调用 getSystemService() 方法并传入 SENSOR_SERVICE 参数来创建 SensorManager 类的实例。例如:

    private SensorManager sensorManager;...sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

接下来,您可以调用 getSensorList() 方法并使用 TYPE_ALL 常量来获取设备上每种传感器的列表。例如:

    List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

如果您想列出特定类型的所有传感器,可以使用其他常量来代替 TYPE_ALL,例如 TYPE_GYROSCOPETYPE_LINEAR_ACCELERATIONTYPE_GRAVITY

您还可以使用 getDefaultSensor() 方法并传入特定传感器的类型常量,来确定设备上是否存在相关类型的传感器。如果设备上有多个特定类型的传感器,则必须将其中一个指定为默认传感器。如果没有指定默认传感器,则该方法调用会返回 null,这表示设备没有该类型的传感器。例如,以下代码会检查设备上是否有磁力计:

    private SensorManager sensorManager;...sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){// Success! There's a magnetometer.} else {// Failure! No magnetometer.}

除了列出设备上的传感器之外,您还可以使用 Sensor 类的公共方法确定单个传感器的功能和属性。如果您希望应用根据设备上可用的传感器或传感器功能表现出不同的行为,这会非常有用。例如,您可以使用 getResolution()getMaximumRange() 方法来获得传感器的分辨率和最大量程。您也可以使用 getPower() 方法来获得传感器的电源要求。

2.2 针对不同制造商的传感器或传感器的不同版本优化

如果您希望针对不同制造商的传感器或传感器的不同版本优化您的应用,有两种公共方法特别有用。例如,如果您的应用需要监控用户手势(例如倾斜和摇晃),您可以针对带有特定供应商的重力传感器的新款设备创建一组数据过滤规则和优化配置,而针对没有重力传感器、只有加速度计的设备创建另一组数据过滤规则和优化配置。

以下代码示例展示了如何使用 getVendor()getVersion() 方法来执行此操作。在本例中,我们要查找一个将 Google LLC 列为供应商、版本号为 3 的重力传感器。如果设备上没有该传感器,我们会尝试使用加速度计。

    private SensorManager sensorManager;private Sensor mSensor;...sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = null;if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){List<Sensor> gravSensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY);for(int i=0; i<gravSensors.size(); i++) {if ((gravSensors.get(i).getVendor().contains("Google LLC")) &&(gravSensors.get(i).getVersion() == 3)){// Use the version 3 gravity sensor.mSensor = gravSensors.get(i);}}}if (mSensor == null){// Use the accelerometer.if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);} else{// Sorry, there are no accelerometers on your device.// You can't play this game.}}

另一个有用的方法是 getMinDelay(),它会返回传感器可用于检测数据的最小时间间隔(以微秒为单位)。如果 getMinDelay() 方法返回非零值,则表示相应传感器为流式传感器。流式传感器是在 Android 2.3(API 级别 9)中引入的,这类传感器会定期检测数据。如果调用 getMinDelay() 方法时,传感器返回 0,则说明传感器不是流式传感器,因为它仅在所检测的参数发生变化时才会报告数据。

getMinDelay() 方法可用于确定传感器采集数据的最高频率。如果应用中的某些功能需要较高的数据采集频率或流式传感器,则可以使用此方法确定传感器是否满足这些要求,然后相应地启用或停用应用中的相关功能。

2.3 监控传感器事件

要监控原始传感器数据,您需要实现两个通过 SensorEventListener 接口公开的回调方法:onAccuracyChanged()onSensorChanged()。Android 系统会在发生以下情况时调用这两个方法:

  • 传感器的准确度发生了变化。

    在这种情况下,系统会调用 onAccuracyChanged() 方法,为您提供对于发生变化的 Sensor 对象的引用以及传感器的新准确度。准确度由以下 4 个状态常量之一表示:SENSOR_STATUS_ACCURACY_LOWSENSOR_STATUS_ACCURACY_MEDIUMSENSOR_STATUS_ACCURACY_HIGHSENSOR_STATUS_UNRELIABLE

  • 传感器报告了新值。

    在这种情况下,系统会调用 onSensorChanged() 方法,为您提供 SensorEvent 对象。SensorEvent 对象包含关于新传感器数据的信息,包括:数据的准确度、生成数据的传感器、生成数据的时间戳以及传感器记录的新数据。

以下代码展示了如何使用 onSensorChanged() 方法监控光传感器的数据。在本示例中,原始传感器数据作为 sensor_data 显示在 main.xml 文件中定义的 TextView 中。

    public class SensorActivity extends Activity implements SensorEventListener {private SensorManager sensorManager;private Sensor mLight;@Overridepublic final void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);}@Overridepublic final void onAccuracyChanged(Sensor sensor, int accuracy) {// Do something here if sensor accuracy changes.}@Overridepublic final void onSensorChanged(SensorEvent event) {// The light sensor returns a single value.// Many sensors return 3 values, one for each axis.float lux = event.values[0];// Do something with this sensor value.}@Overrideprotected void onResume() {super.onResume();sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onPause() {super.onPause();sensorManager.unregisterListener(this);}}

在本示例中,在调用 registerListener() 方法时指定了默认数据延迟 (SENSOR_DELAY_NORMAL)。数据延迟(或采样率)控制传感器事件通过 onSensorChanged() 回调方法发送到应用的时间间隔。默认数据延迟采用 200,000 微秒的延迟,适用于监控典型的屏幕方向变化。您可以指定其他数据延迟,比如 SENSOR_DELAY_GAME(延迟 20,000 微秒)、SENSOR_DELAY_UI(延迟 60,000 微秒),或 SENSOR_DELAY_FASTEST(延迟 0 微秒)。从 Android 3.0(API 级别 11)开始,您还可以将延迟指定为以微秒为单位的绝对值。

您指定的延迟只是建议的延迟。Android 系统和其他应用可以更改此延迟。最佳做法是指定尽可能大的延迟,因为系统通常会使用比您指定的延迟更小的延迟(也就是说,您应该选择能够满足应用需求的最低采样率)。使用更大的延迟可以降低处理器的负载,从而降低功耗。

没有任何公共方法可以确定传感器框架向您的应用发送传感器事件的频率,但是,您可以使用与每个传感器事件关联的时间戳来计算几个事件的采样率。采样率(延迟)一旦设置,就不应该再更改。如果由于某种原因确实需要更改延迟,则必须取消注册再重新注册传感器监听器。

另外还需要注意的是,本示例使用 onResume()onPause() 回调方法来注册和取消注册传感器事件监听器。最佳的做法是始终停用不需要的传感器,特别是在活动处于暂停状态时。如果不这样做,可能会在几小时内将电池电量耗尽,因为有些传感器的电量需求很大,可以很快耗尽电池电量。当屏幕关闭时,系统不会自动停用传感器。

2.4 处理不同的传感器配置

Android 没有为设备指定标准的传感器配置,这意味着设备制造商可以在其 Android 设备中采用任何想要的传感器配置。因此,设备可以包含采用各种配置的各种传感器。如果您的应用依赖于特定类型的传感器,则必须确保设备上存在该传感器,这样您的应用才能成功运行。

有两种方法可以确保设备上存在特定的传感器:

  • 在运行时检测传感器,并根据需要启用或停用应用功能。
  • 使用 Google Play 过滤器定位具有特定传感器配置的设备。

下面将分别讨论这两种方法。

在运行时检测传感器

如果您的应用使用特定类型的传感器,但不依赖于它,则可以使用传感器框架在运行时检测传感器,然后根据需要停用或启用应用功能。例如,导航应用可能会使用温度传感器、压力传感器、GPS 传感器和地磁场传感器来显示温度、气压、位置和罗盘方位。如果设备没有压力传感器,您可以使用传感器框架在运行时检测压力传感器的缺失,然后停用应用界面中显示压力的部分。例如,以下代码会检查设备上是否有压力传感器:

    private SensorManager sensorManager;...sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){// Success! There's a pressure sensor.} else {// Failure! No pressure sensor.}

使用 Google Play 过滤器定位特定的传感器配置

如果您要在 Google Play 上发布应用,您可以在清单文件中使用 元素,以对不具备适合您应用的传感器配置的设备屏蔽您的应用。<uses-feature> 元素有几个硬件描述符,可让您根据是否存在特定传感器来过滤应用。您可以列出的传感器包括:加速度计、气压计、罗盘(地磁场)、陀螺仪、光传感器和距离传感器。以下清单示例条目会对没有加速度计的设备屏蔽应用:

    <uses-feature android:name="android.hardware.sensor.accelerometer"android:required="true" />

如果您将此元素和描述符添加到应用的清单中,那么只有当用户的设备具有加速度计时,他们才会在 Google Play 上看到您的应用。

仅当您的应用完全依赖于特定传感器时,才应将描述符设置为 android:required="true"。如果您的应用使用某种传感器来实现某项功能,但没有该传感器也可以运行,那么您就应该在 <uses-feature> 元素中列出该传感器,但将描述符设置为 android:required="false"。这样可以确保设备即使没有该传感器也可以安装您的应用。这也是帮助您跟踪应用所使用的功能的最佳项目管理方法。请记住,如果您的应用使用特定的传感器,但没有该传感器也能运行,那么您就应该在运行时检测传感器,并根据需要停用或启用应用功能。

2.5 传感器坐标系

通常,传感器框架使用标准的 3 轴坐标系来表示数据值。对于大多数传感器,当设备处于默认屏幕方向时,会相对于设备屏幕来定义坐标系。

img
当设备处于默认屏幕方向时,X 轴为水平向右延伸,Y 轴为垂直向上延伸,Z 轴为垂直于屏幕向外延伸。在此坐标系中,屏幕后面的坐标将具有负 Z 值。以下传感器使用此坐标系:

  • 加速度传感器
  • 重力传感器
  • 陀螺仪
  • 线性加速度传感器
  • 地磁场传感器

关于此坐标系,特别需要注意的一点就是当设备的屏幕方向改变时,坐标轴不会转换,也就是说,传感器的坐标系不会随着设备的移动而改变。此行为与 OpenGL 坐标系的行为是相同的。

还需要注意的一点是,您的应用不能假设设备的自然(默认)屏幕方向是竖屏。许多平板设备的自然屏幕方向为横屏。传感器坐标系始终基于设备的自然屏幕方向。

最后,如果您的应用将传感器数据对应到屏幕显示,您需要使用 getRotation() 方法确定屏幕的旋转度,然后使用 remapCoordinateSystem() 方法将传感器坐标映射到屏幕坐标。即使您的清单指定了仅限竖屏显示,您也需要这样做。

有些传感器和方法使用的坐标系基于世界参照系(而不是设备参照系)。这些传感器和方法返回的数据表示设备相对于地球的运动或位置。如需了解详情,请参阅 getOrientation() 方法、getRotationMatrix()方法、屏幕方向传感器和旋转矢量传感器。

2.6 访问和使用传感器的最佳做法

在设计传感器实现时,请务必遵循本节介绍的指导原则。若要使用传感器框架访问传感器和采集传感器数据,建议将这些指导原则视为最佳做法。

仅在前台采集传感器数据

在搭载 Android 9(API 级别 28)或更高版本的设备上,在后台运行的应用具有以下限制:

  • 采用连续报告模式的传感器(如加速度计和陀螺仪)不会收到事件。
  • 使用变化时触发或单次报告模式的传感器不会收到事件。

考虑到这些限制,最好是在应用于前台运行或作为前台服务的一部分时检测传感器事件。

取消注册传感器监听器

请确保在不使用传感器或传感器活动暂停时取消注册传感器的监听器。注册传感器监听器后,只要不取消注册传感器,那么即使监听器的活动已暂停,传感器仍会继续采集数据并消耗电池资源。以下代码展示了如何使用 onPause() 方法来取消注册监听器:

    private SensorManager sensorManager;...@Overrideprotected void onPause() {super.onPause();sensorManager.unregisterListener(this);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV | 图像梯度sobel算子、scharr算子、lapkacian算子

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline 1、sobel算子 img cv2.imread(pie.png,cv2.IMREAD_GRAYSCALE) cv2.imshow(img,img) cv2.waitKey() cv2.destroyAllWindows() pie图片 dst cv2.S…

vue3+vite搭建cesium项目

1.创建项目 cnpm create vite 2.安装依赖 npm i cesium vite-plugin-cesium vite -D 3.在vite.config.js里进行配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import cesium from vite-plugin-cesium; export default defineConfig({plugins…

NCo3.1(08) - Nco3 服务器端编程

本篇博文不再重复ABAP调用外部服务器的基础&#xff0c;只介绍 NCo3 开发的过程和要点。需要了解相关知识点的小伙伴们自行参考&#xff1a; SAP接口编程 之JCo3.0系列(06) - Jco服务器端编程 PyRFC 服务器端编程要点 创建项目 新建一个 Console 项目&#xff0c;选择 .Net …

失落的艺术:无着色器3D渲染

假设你想创建一个甜蜜的弹跳立方体&#xff0c;如下所示&#xff1a; 一个弹跳的立方体 你可以使用 3D 框架&#xff0c;例如 OpenGL 或 Metal。 这涉及编写一个或多个顶点着色器来变换 3D 对象&#xff0c;以及编写一个或多个片段着色器来在屏幕上绘制这些变换后的对象。 然…

Python中对数组连续赋值的问题

问题描述 在python中&#xff0c;首先用两个等号对两个数组进行初始化并赋值。之后&#xff0c;对任何一个数组进行赋值&#xff0c;都会将其赋予相同值。 import numpy as np Array1 Array2 np.empty(2) Array1[0],Array2[0]70,80 print(Array1[0],Array2[0])80.0 80.0 …

旋转的数组

分享今天看到的一个题目&#xff0c;不同思路解法 题目 思路1&#xff1a;时间复杂度0(N*k&#xff09; void rotate(int *a,int N,int k)//N为数组元素个数 { while(k--) { int tema[N-1]; for(int rightN-2;right>0;right--) { a[right1]a[right]; } a[0]tem; …

聊聊VMware vSphere

VMware vSphere是一种虚拟化平台和云计算基础设施解决方案&#xff0c;由VMware公司开发。它为企业提供了一种强大的虚拟化和云计算管理平台&#xff0c;能够在数据中心中运行、管理和保护应用程序和数据。vSphere平台与VMware ESXi虚拟化操作系统相结合&#xff0c;提供了完整…

水果编曲软件FL Studio21最新中文版本2023年最新FL 21中文版如何快速入门教程

水果编曲软件FL Studio介绍 各位&#xff0c;大家晚上好&#xff0c;今天给大家带来最新最新2023水果编曲软件FL Studio 21中文版下载安装激活图文教程。我们一起先了解一些FL Studio 。FL Studio21是目前流行广泛使用人数最多音乐编曲宿主制作DAW软件&#xff0c;这款软件相信…

java开发需要用到的软件,必备软件工具一览

java开发需要用到的软件&#xff0c;必备软件工具一览 如果你对Java编程感兴趣或已经是一名Java开发者&#xff0c;你需要一些必备的软件工具来提高你的生产力和简化开发过程。在本文中&#xff0c;我们将探讨Java开发所需的关键软件工具&#xff0c;并通过具体示例来解释它们的…

最新消息:滴滴 P0 事故原因,原因出来了

最新消息滴滴P0故障原因&#xff0c;是由于k8s集群升级导致的&#xff0c;后面又进行版本回退&#xff0c;由于现在大型互联网公司基本都是基于K8s进行部署的&#xff0c;如果K8s集群一出问题&#xff0c;上面运行的业务Pod和运维系统全部都得宕机&#xff0c;导致没法回滚。 …

二叉树(判断是否为单值二叉树)

题目&#xff08;力扣&#xff09;&#xff1a; 判断二叉树上每个节点的值是否相同&#xff0c;就需要让root节点分别与左节点和右节点分别比较是否相同。 注意&#xff1a;root等于空时&#xff0c;直接可以返回true&#xff1b; 首先&#xff0c;先判断他的特殊情况&#x…

如何在安防视频监控平台EasyCVR首页增添统计设备每个小时的温度展示功能?细节如下

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

BLIoTLink软网关,一键解决OT层与IT层的通信

在工业自动化领域&#xff0c;协议转换一直是一个重要的问题。不同的设备、系统往往使用不同的通信协议&#xff0c;这给数据采集、设备接入等带来很大的困扰。为了解决这个问题&#xff0c;各种协议转换软件应运而生。其中&#xff0c;BLIoTLink作为一款功能强大的嵌入式工业协…

常使用的定时任务

常使用的定时任务 一、 linux自带的定时任务 1、crontab 有这样一个需求&#xff1a;我们使用Java写一个工具jar包在系统空闲的时候去采集已经部署在Linux系统上的项目的一 些数据&#xff0c;可以使用 linux 系统的 crontab。 运行crontab -e&#xff0c;可以编辑定时器&…

[密码学]DES

先声明两个基本概念 代换&#xff08;substitution&#xff09;,用别的元素代替当前元素。des的s-box遵循这一设计。 abc-->def 置换&#xff08;permutation&#xff09;&#xff0c;只改变元素的排列顺序。des的p-box遵循这一设计。 abc-->bac DES最核心的算法就是…

使用nginx代理s3服务(私有云存储)

1、背景 公司网络安全原因&#xff0c;私有部署s3服务的机器无法被直接访问&#xff0c;所以需要加一层代理&#xff0c;通过访问代理去访问s3服务器&#xff0c;这里使用nginx进行代理。使用s3服务的方式是在代码中使用官方的java s3 sdk&#xff08;本文对于其他语言的官方s…

vue+jsonp编写可导出html的模版,可通过外部改json动态更新页面内容

效果 导出后文件结果如图所示&#xff0c;点击Index.html即可查看页面&#xff0c;页面所有数据由report.json控制&#xff0c;修改report.json内容即可改变index.html展示内容 具体实现 1. 编写数据存储的json文件 在index.html所在的public页面新建report.json文件&#xff…

彩虹云商城搭建教程+源码程序

前言&#xff1a;域名服务器或宝塔主机商场程序在线云商城 随着电子商务的快速发展&#xff0c;越来越多的企业开始意识到开设一个自己的电子商城对于销售和品牌推广的重要性。然而&#xff0c;选择一家合适的网站搭建平台和正确地构建一个商城网站并不是一件容易的事情。本文…

PyQt基础_008_ 按钮类控件QSpinbox

基本操作 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class spindemo(QWidget):def __init__(self, parentNone):super(spindemo, self).__init__(parent)self.setWindowTitle("SpinBox 例子")self.resize(300,…

微服务链路追踪组件SkyWalking实战

概述 微服务调用存在的问题 串联调用链路&#xff0c;快速定位问题&#xff1b;理清服务之间的依赖关系&#xff1b;微服务接口性能分析&#xff1b;业务流程调用处理顺序&#xff1b; 全链路追踪&#xff1a;对请求源头到底层服务的调用链路中间的所有环节进行监控。 链路…