鸿蒙开发(NEXT/API 12)【硬件(传感器开发3)】传感器服务

场景介绍

当设备需要获取传感器数据时,可以使用sensor模块,例如:通过订阅方向传感器数据感知用户设备当前的朝向,通过订阅计步传感器数据统计用户的步数等。

函数说明

名称描述
OH_Sensor_GetInfos(Sensor_Info **infos, uint32_t *count)获取设备上所有传感器的信息。
OH_Sensor_Subscribe(const Sensor_SubscriptionId *id, const Sensor_SubscriptionAttribute *attribute, const Sensor_Subscriber *subscriber)订阅传感器数据。系统将以指定的频率向用户上报传感器数据。订阅加速度传感器,需要申请ohos.permission.ACCELEROMETER权限;订阅陀螺仪传感器,需要申请ohos.permission.GYROSCOPE权限;订阅计步器相关传感器时,需要申请ohos.permission.ACTIVITY_MOTION权限;订阅与健康相关的传感器时,比如心率传感器需要申请ohos.permission.READ_HEALTH_DATA权限,否则订阅失败;订阅其余传感器不需要申请权限。
OH_Sensor_Unsubscribe(const Sensor_SubscriptionId *id, const Sensor_Subscriber *subscriber)取消订阅传感器数据。取消订阅加速度计传感器,需要申请ohos.permission.ACCELEROMETER权限;取消订阅陀螺仪传感器,需要申请ohos.permission.GYROSCOPE权限;取消订阅计步器相关传感器时,需要申请ohos.permission.ACTIVITY_MOTION权限;取消订阅与健康相关的传感器时,需要申请ohos.permission.READ_HEALTH_DATA权限,否则取消订阅失败。取消订阅其余传感器不需要申请权限。
OH_Sensor_CreateInfos(uint32_t count)用给定的数字创建一个实例数组
OH_Sensor_DestroyInfos(Sensor_Info **sensors, uint32_t count)销毁实例数组并回收内存
OH_SensorInfo_GetName(Sensor_Info *sensor, char *sensorName, uint32_t *length)获取传感器名称。
OH_SensorInfo_GetVendorName(Sensor_Info* sensor, char *vendorName, uint32_t *length)获取传感器的厂商名称。
OH_SensorInfo_GetType(Sensor_Info* sensor, Sensor_Type *sensorType)获取传感器类型。
OH_SensorInfo_GetResolution(Sensor_Info* sensor, float *resolution)获取传感器分辨率。
OH_SensorInfo_GetMinSamplingInterval(Sensor_Info* sensor, int64_t *minSamplingInterval)获取传感器的最小数据上报间隔。
OH_SensorInfo_GetMaxSamplingInterval(Sensor_Info* sensor, int64_t *maxSamplingInterval)获取传感器的最大数据上报间隔时间。
OH_SensorEvent_GetType(Sensor_Event* sensorEvent, Sensor_Type *sensorType)获取传感器类型。
OH_SensorEvent_GetTimestamp(Sensor_Event* sensorEvent, int64_t *timestamp)获取传感器数据的时间戳。
OH_SensorEvent_GetAccuracy(Sensor_Event* sensorEvent, Sensor_Accuracy *accuracy)获取传感器数据的精度。
OH_SensorEvent_GetData(Sensor_Event* sensorEvent, float **data, uint32_t *length)获取传感器数据。数据的长度和内容依赖于监听的传感器类型,传感器上报的数据格式如下:1.SENSOR_TYPE_ACCELEROMETER:data[0]、data[1]、data[2]分别表示设备x、y、z轴的加速度分量,单位m/s²;2.SENSOR_TYPE_GYROSCOPE:data[0]、data[1]、data[2]分别表示设备x、y、z轴的旋转角速度,单位弧度/s;3.SENSOR_TYPE_AMBIENT_LIGHT:data[0]表示环境光强度,单位lux;从API Version 12开始,将返回两个额外的数据,其中data[1]表示色温,单位kelvin;data[2]表示红外亮度,单位cd/m²;4.SENSOR_TYPE_MAGNETIC_FIELD:data[0]、data[1]、data[2]分别表示设备x、y、z轴的地磁分量,单位微特斯拉;5.SENSOR_TYPE_BAROMETER:data[0]表示气压值,单位hPa;6.SENSOR_TYPE_HALL:data[0]表示皮套吸合状态,0表示打开,大于0表示吸附;7.SENSOR_TYPE_PROXIMITY:data[0]表示接近状态,0表示接近,大于0表示远离;8.SENSOR_TYPE_ORIENTATION:data[0]、data[1]、data[2]分别表示设备绕z、x、y轴的角度,单位度;9.SENSOR_TYPE_GRAVITY:data[0]、data[1]、data[2]分别表示设备x、y、z轴的重力加速度分量,单位m/s²;10.SENSOR_TYPE_ROTATION_VECTOR:data[0]、data[1]、data[2]分别表示设备x、y、z轴的旋转角度,单位度,data[3]表示旋转向量元素;11.SENSOR_TYPE_PEDOMETER_DETECTION:data[0]表示计步检测状态,1表示检测到了步数变化;12.SENSOR_TYPE_PEDOMETER:data[0]表示步数;13.SENSOR_TYPE_HEART_RATE:data[0]表示心率数值。
OH_Sensor_CreateSubscriptionId(void)创建一个Sensor_SubscriptionId 实例。
OH_Sensor_DestroySubscriptionId(Sensor_SubscriptionId *id)销毁Sensor_SubscriptionId 实例并回收内存。
OH_SensorSubscriptionId_GetType(Sensor_SubscriptionId *id, Sensor_Type *sensorType)获取传感器类型。
OH_SensorSubscriptionId_SetType(Sensor_SubscriptionId* id, const Sensor_Type sensorType)设置传感器类型。
OH_Sensor_CreateSubscriptionAttribute(void)创建Sensor_SubscriptionAttribute实例。
OH_Sensor_DestroySubscriptionAttribute(Sensor_SubscriptionAttribute *attribute)销毁Sensor_SubscriptionAttribute实例并回收内存。
OH_SensorSubscriptionAttribute_SetSamplingInterval(Sensor_SubscriptionAttribute* attribute, const int64_t samplingInterval)设置传感器数据上报间隔。
OH_SensorSubscriptionAttribute_GetSamplingInterval(Sensor_SubscriptionAttribute* attribute, int64_t *samplingInterval)获取传感器数据上报间隔。
OH_Sensor_CreateSubscriber(void)创建一个Sensor_Subscriber实例。
OH_Sensor_DestroySubscriber(Sensor_Subscriber *subscriber)销毁Sensor_Subscriber实例并回收内存。
OH_SensorSubscriber_SetCallback(Sensor_Subscriber* subscriber, const Sensor_EventCallback callback)设置一个回调函数来上报传感器数据。
OH_SensorSubscriber_GetCallback(Sensor_Subscriber* subscriber, Sensor_EventCallback *callback)获取用于上报传感器数据的回调函数。

开发步骤

开发步骤以加速度传感器为例。

  1. 新建一个Native C++工程。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 检查是否已经配置相应权限。

"requestPermissions": [{"name": "ohos.permission.ACCELEROMETER",},]
  1. CMakeLists.txt文件中引入动态依赖库。
target_link_libraries(entry PUBLIC libace_napi.z.so)
target_link_libraries(entry PUBLIC libhilog_ndk.z.so)
target_link_libraries(entry PUBLIC libohsensor.so)
  1. 导入模块。
#include "sensors/oh_sensor.h"
#include "napi/native_api.h"
#include "hilog/log.h"
#include <thread>
  1. 定义常量。
const int GLOBAL_RESMGR = 0xFF00;
const char *TAG = "[Sensor]";
constexpr Sensor_Type SENSOR_ID { SENSOR_TYPE_ACCELEROMETER };
constexpr uint32_t SENSOR_NAME_LENGTH_MAX = 64;
constexpr int64_t SENSOR_SAMPLE_PERIOD = 200000000;
constexpr int32_t SLEEP_TIME_MS = 1000;
constexpr int64_t INVALID_VALUE = -1;
constexpr float INVALID_RESOLUTION = -1.0F;
Sensor_Subscriber *g_user = nullptr;
  1. 定义一个回调函数用来接收传感器数据。
void SensorDataCallbackImpl(Sensor_Event *event) {if (event == nullptr) {OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "event is null");return;}int64_t timestamp = INVALID_VALUE;int32_t ret = OH_SensorEvent_GetTimestamp(event, &timestamp); // 获取传感器数据的时间戳。if (ret != SENSOR_SUCCESS) {return;}Sensor_Type sensorType;ret = OH_SensorEvent_GetType(event, &sensorType); // 获取传感器类型。if (ret != SENSOR_SUCCESS) {return;}Sensor_Accuracy accuracy = SENSOR_ACCURACY_UNRELIABLE;ret = OH_SensorEvent_GetAccuracy(event, &accuracy); // 获取传感器数据的精度。if (ret != SENSOR_SUCCESS) {return;}float *data = nullptr;uint32_t length = 0;ret = OH_SensorEvent_GetData(event, &data, &length); // 获取传感器数据。if (ret != SENSOR_SUCCESS) {return;}OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "sensorType:%{public}d, dataLen:%{public}d, accuracy:%{public}d", sensorType, length, accuracy);for (uint32_t i = 0; i < length; ++i) {OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "data[%{public}d]:%{public}f", i, data[i]);}
}
  1. 获取设备上所有传感器的信息。
static napi_value GetSensorInfos(napi_env env, napi_callback_info info)
{uint32_t count = 0;int32_t ret = OH_Sensor_GetInfos(nullptr, &count); // 获取设备上所有传感器的个数。 if (ret != SENSOR_SUCCESS) {return nullptr;}Sensor_Info **sensors = OH_Sensor_CreateInfos(count); // 用给定的数字创建一个实例数组。if (ret != SENSOR_SUCCESS) {return nullptr;}        ret = OH_Sensor_GetInfos(sensors, &count); // 获取设备上所有传感器的信息。 if (ret != SENSOR_SUCCESS) {return nullptr;}for (uint32_t i = 0; i < count; ++i) {char sensorName[SENSOR_NAME_LENGTH_MAX] = {};uint32_t length = SENSOR_NAME_LENGTH_MAX;ret = OH_SensorInfo_GetName(sensors[i], sensorName, &length); // 获取传感器名称。if (ret != SENSOR_SUCCESS) {return nullptr;}char vendorName[SENSOR_NAME_LENGTH_MAX] = {};length = SENSOR_NAME_LENGTH_MAX;ret = OH_SensorInfo_GetVendorName(sensors[i], vendorName, &length); // 获取传感器的厂商名称。if (ret != SENSOR_SUCCESS) {return nullptr;}Sensor_Type sensorType;ret = OH_SensorInfo_GetType(sensors[i], &sensorType); // 获取传感器类型。if (ret != SENSOR_SUCCESS) {return nullptr;}float resolution = INVALID_RESOLUTION;ret = OH_SensorInfo_GetResolution(sensors[i], &resolution); // 获取传感器分辨率。if (ret != SENSOR_SUCCESS) {return nullptr;}int64_t minSamplePeriod = INVALID_VALUE;ret = OH_SensorInfo_GetMinSamplingInterval(sensors[i], &minSamplePeriod); // 获取传感器的最小数据上报间隔。if (ret != SENSOR_SUCCESS) {return nullptr;}int64_t maxSamplePeriod = INVALID_VALUE;ret = OH_SensorInfo_GetMaxSamplingInterval(sensors[i], &maxSamplePeriod); // 获取传感器的最大数据上报间隔时间。if (ret != SENSOR_SUCCESS) {return nullptr;}}OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "GetSensorInfos sucessful");ret = OH_Sensor_DestroyInfos(sensors, count); // 销毁实例数组并回收内存。if (ret != SENSOR_SUCCESS) {return nullptr;}
}
  1. 订阅和取消订阅传感器数据。
static napi_value Subscriber(napi_env env, napi_callback_info info)
{g_user = OH_Sensor_CreateSubscriber();                                         // 创建一个Sensor_Subscriber实例。int32_t ret = OH_SensorSubscriber_SetCallback(g_user, SensorDataCallbackImpl); // 设置一个回调函数来报告传感器数据。if (ret != SENSOR_SUCCESS) {return nullptr;}Sensor_SubscriptionId *id = OH_Sensor_CreateSubscriptionId(); // 创建一个Sensor_SubscriptionId实例。ret = OH_SensorSubscriptionId_SetType(id, SENSOR_ID);         // 设置传感器类型。if (ret != SENSOR_SUCCESS) {return nullptr;}Sensor_SubscriptionAttribute *attr = OH_Sensor_CreateSubscriptionAttribute();     // 创建Sensor_SubscriptionAttribute实例。ret = OH_SensorSubscriptionAttribute_SetSamplingInterval(attr, SENSOR_SAMPLE_PERIOD); // 设置传感器数据报告间隔。if (ret != SENSOR_SUCCESS) {return nullptr;}ret = OH_Sensor_Subscribe(id, attr, g_user); // 订阅传感器数据。if (ret != SENSOR_SUCCESS) {return nullptr;}OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "Subscriber successful");std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_MS));ret = OH_Sensor_Unsubscribe(id, g_user); // 取消订阅传感器数据。if (ret != SENSOR_SUCCESS) {return nullptr;}if (id != nullptr) {OH_Sensor_DestroySubscriptionId(id); // 销毁Sensor_SubscriptionId实例并回收内存。}if (attr != nullptr) {OH_Sensor_DestroySubscriptionAttribute(attr); // 销毁Sensor_SubscriptionAttribute实例并回收内存。}if (g_user != nullptr) {OH_Sensor_DestroySubscriber(g_user); // 销毁Sensor_Subscriber实例并回收内存。g_user = nullptr;}
}
  1. 在types/libentry路径下index.d.ts文件中引入Napi接口。
export const getSensorInfos: () => number;
export const subscriber: () => number;
  1. 编写Js用例调用接口。

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
1

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GAMES101(作业8)

作业8 题目&#xff1a; 模拟绳子动画&#xff0c;包括基于物理的&#xff0c;和非物理的&#xff0c;应该修改的函数是:rope.cpp 中的void Rope::simulateEuler(... Rope::rope(...)&#xff0c;&#xff0c;void Rope::simulateVerlet(...) 代码框架&#xff1a; main:负…

调试分析:[跳数度量]更改为[距离度量]后的 routing_bellmanford 算法

回顾复习2023年8月的《★修改Exata6.2源码&#xff1a;〔修改Bellmanford最短路径路由的衡量标准从【路由跳数】改为【“路由器节点间的物理距离”】&#xff0c;并动画演示〕》&#xff0c;VS2015调试Exata&#xff0c;跟踪调试修改后的[ routing_bellmanford.cpp ]源码&#…

Redis-常见数据类型(修改ing)

1. 预备知识 redis按照键值对的方式存储数据 1.1 基本全局命令 KEYS 返回所有满⾜样式&#xff08;pattern&#xff09;的key,⽀持如下统配样式: h?llo 匹配hello,hallo,hxlloh*llo 匹配hllo,heeeelloh[ae]llo 只匹配hallo helloh[^e]llo 匹配除hello,heee..llo以外的h[a…

Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )

文本目录&#xff1a; ❄️一、哈希表&#xff1a; ☑ 1、概念&#xff1a; ☑ 2、冲突-概念&#xff1a; ☑ 3、冲突-避免&#xff1a; ☞ 1&#xff09;、避免冲突-哈希函数的设计&#xff1a; ☞ 2&#xff09;、避免冲突-负载因子调节(重点)&#xff1a; ☑ 4、冲突-解决&…

宠物空气净化器该怎么选?希喂、美的、有哈这三款有推荐的吗?

终于要到国庆了&#xff0c;这可是打工人除春节外最长的假期&#xff01;在外上班后&#xff0c;回家的次数越来越少了&#xff0c;这次国庆肯定要回去陪陪父母。这票是真难买啊&#xff0c;候补了我一个多星期才买到。本来以为最困难的问题已经解决了&#xff0c;又想到我家猫…

有通话质量更好的蓝牙耳机推荐吗?高品质的平价开放式耳机推荐

个人认为开放式耳机在通话方面还是表现不错的&#xff0c;主要有以下几个原因&#xff1a; 首先&#xff0c;在麦克风设计与配置方面&#xff1a; 拥有高品质麦克风硬件。优质的开放式耳机往往会配备高性能的麦克风&#xff0c;这些麦克风灵敏度较高&#xff0c;能够精准地捕捉…

情感短视频素材下载推荐

在制作热门的情感短视频时&#xff0c;优质的素材是不可或缺的。作为一名资深视频剪辑师&#xff0c;今天我将为你推荐几个可以下载高清无水印情感视频素材的网站&#xff0c;助你轻松找到创作灵感。 蛙学网 蛙学网是国内领先的视频素材平台&#xff0c;专注于情感和治愈类视频…

TypeScript是基于LLM上层研发的受益者

TypeScript优在哪里 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的一个超集&#xff0c;添加了类型系统和一些其他特性。TypeScript的优势在于&#xff1a; 静态类型检查&#xff1a;TypeScript的最大卖点是它的静态类型系统。这允许开发者在编写代码…

11.C++程序中的常用函数

我们将程序中反复执行的代码封装到一个代码块中&#xff0c;这个代码块就被称为函数&#xff0c;它类似于数学中的函数&#xff0c;在C程序中&#xff0c;有许多由编译器定义好的函数&#xff0c;供大家使用。下面就简单说一下&#xff0c;C中常用的函数。 1.sizeof sizeof函…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月28日新模型预测第101弹

经过100多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;100多期一共只错了12次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xf…

Learn OpenGL In Qt之炫酷进度条

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 公众号&#xff1a; C学习与探索 | 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; Learn OpenGL In Qt 文章目录 设计实现目录结构需要哪些类接口设计关键函数 实现效果Shader解析GLSL基本函数clampsmoothstep 实现分析效…

2.点位管理——帝可得后台管理系统

目录 前言点位管理菜单模块1.需求说明2.库表设计3.生成基础代码0 .使用若依代码生成器最终目标1.创建点位管理2.添加数据字典3.配置代码生成信息4.下载代码并导入项目 4.优化菜单——点位管理1.优化区域管理2.增加点位数3. 合作商 前言 提示&#xff1a;本篇介绍点位管理模块&…

[论文精读]AI-Guardian: Defeating Adversarial Attacks using Backdoors

会议名称&#xff1a;2023 IEEE Symposium on Security and Privacy (SP) 发布链接&#xff1a;AI-Guardian: Defeating Adversarial Attacks using Backdoors | IEEE Conference Publication | IEEE Xplore 中文译名&#xff1a;AI-Guardian:利用后门防御对抗攻击 阅读原因…

记一次教学版内网渗透流程

信息收集 如果觉得文章写的不错可以共同交流 http://aertyxqdp1.target.yijinglab.com/dirsearch dirsearch -u "http://aertyxqdp1.target.yijinglab.com/"发现 http://aertyxqdp1.target.yijinglab.com/joomla/http://aertyxqdp1.target.yijinglab.com/phpMyA…

IT基础监控范围和对象

监控易作为一款由美信时代独立自主研发的分布式一体化集中监控平台&#xff0c;其监控范围极为广泛&#xff0c;几乎涵盖了所有主流的IT基础设施以及相关的设备和系统。以下是对监控易监控范围的详细介绍&#xff1a; 一、IT基础资源监控 服务器硬件监控&#xff1a;监控易支…

fmql之Linux阻塞和非阻塞IO

继续学习正点原子吧。 概念简介 什么是阻塞、非阻塞IO 阻塞/非阻塞访问的代码示例 等待队列&#xff08;阻塞访问使用&#xff09; 轮询&#xff08;非阻塞访问使用&#xff09; poll操作函数的使用&#xff08;轮询的一种&#xff09; 阻塞IO的实验 blockio.c blockioAPP.c 运…

大模型能力扩展之——提示词(Prompt),知识库,思维链(CoT)和Agent(代理)

前言 “大模型的推理能力配合外部工具才能真正发挥大模型的作用” 在学习和使用大模型的过程中&#xff0c;我们会发现大模型只能用来进行一下简单的问答&#xff1b;一旦涉及到复杂的问题&#xff0c;大模型就无能为力了。 其原因就在于我们并不会使用大模型&#xff0c;或…

【韩顺平Java笔记】第3章:变量

只记录我觉得重点的&#xff0c;自用&#xff0c;如果有漏的请自己看视频 文章目录 33. 内容梳理34. 变量原理34.1 为什么需要变量35. 变量概念35.1 概念35.2 变量使用的基本步骤36. 变量入门36.1 变量使用入门案例 37. 变量细节37.1 变量使用注意事项 38. 加号使用38.1 程序中…

Node.js安装Express,Node.js支持Typescript以及Express支持Typescript的步骤

1. Node.js 安装Express 运行如下命令&#xff1a; $ mkdir express-demo $ cd express-demo$ npm install express $ npm install body-parser //(可选)中间件&#xff0c;用于处理 JSON, Raw, Text 和 URL 编码的数据 $ npm install cookie-parser //(可选)通过req.cookies…

如何使用ssm实现大学生校园招聘网的设计与实现

TOC ssm738大学生校园招聘网的设计与实现jsp 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域…