游乐游手机版
首页/科技数码/文章详情

SpringBoot与Californium整合,实现物联网设备低功耗通信系统

时间:2025-12-15 20:03
CoAP是一种专门为物联网设备设计的轻量级协议,特别适用于资源受限的环境。它通过简单的二进制消息格式、高效的传输机制和RESTful架构,使得在低带宽、高延迟和不可靠网络条件下进行通信变得容易。 C

CoAP是一种专门为物联网设备设计的轻量级协议,特别适用于资源受限的环境。它通过简单的二进制消息格式、高效的传输机制和RESTful架构,使得在低带宽、高延迟和不可靠网络条件下进行通信变得容易。

CoAP是一种专门为物联网设备设计的轻量级协议,特别适用于资源受限的环境。它通过简单的二进制消息格式、高效的传输机制和RESTful架构,使得在低带宽、高延迟和不可靠网络条件下进行通信变得容易。

哪些公司使用Californium?

Intel Corporation在其 IoT 平台和开发工具中集成 Californium 以支持 CoAP 协议。IBM利用 Californium 在其 IoT 和边缘计算解决方案中实现高效的数据传输。西门子使用 Californium 在其 IoT 解决方案中实现低功耗设备的通信。Bosch Rexroth利用 Californium 支持其工业 IoT 应用程序中的 CoAP 通信。Infineon Technologies 在其嵌入式系统和 IoT 解决方案中集成 Californium 以支持 CoAP 协议。爱立信在其 IoT 平台中使用 Californium 实现高效的设备间通信。Texas Instruments Inc.提供基于 Californium 的开发套件和示例代码,助力开发者构建 IoT 应用。ABB Ltd.在其智能制造解决方案中利用 Californium 实现高效的数据交换和控制。Cisco Systems, Inc.在其 IoT 平台上使用 Californium 实现低延迟和可靠的设备通信。

Californium的特点

轻量级: 适合资源受限的设备。可靠传输: 支持确认消息(CON)、非确认消息(NON)和重置消息(RST)。多播支持: 允许向一组设备发送请求。观察机制: 客户端可以订阅资源变化,实时接收更新。安全性: 支持DTLS(Datagram Transport Layer Security)加密。RESTful架构: 使用HTTP方法(GET, POST, PUT, DELETE),便于与现有Web服务集成。

Californium的核心组件

CoapClient: 用于创建CoAP客户端,发送请求并处理响应。CoapServer: 用于创建CoAP服务器,处理来自客户端的请求。CoapResource: 定义CoAP资源,处理特定路径上的请求。CoapExchange: 提供请求和响应的上下文,便于处理具体业务逻辑。

代码实操

org.springframework.boot spring-boot-starter-web org.eclipse.californium californium-spring-boot-starter-server 2.6.0 org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-java runtime

application.properties

# MySQL 数据库配置spring.datasource.url=jdbc:mysql://localhost:3306/iot_db?useSSL=false&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=rootpasswordspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# Hibernate 配置spring.jpa.hibernate.ddl-auto=updatespring.jpa.show-sql=truespring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

Device实体类

package com.example.coapserver.entity;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entitypublicclass Device { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 设备ID,自增主键 private String deviceId; // 设备唯一标识符 private String type; // 设备类型 privatedouble temperature; // 温度数据 privateboolean active; // 设备是否激活 // Getter 和 Setter 方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDeviceId() { return deviceId; } public void setDeviceId(String deviceId) { this.deviceId = deviceId; } public String getType() { return type; } public void setType(String type) { this.type = type; } public double getTemperature() { return temperature; } public void setTemperature(double temperature) { this.temperature = temperature; } public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; }}

仓库接口

package com.example.coapserver.repository;import com.example.coapserver.entity.Device;import org.springframework.data.jpa.repository.JpaRepository;public interface DeviceRepository extends JpaRepository { Device findByDeviceId(String deviceId); // 根据设备ID查找设备}

Controller

package com.example.coapserver.controller;import com.example.coapserver.entity.Device;import com.example.coapserver.repository.DeviceRepository;import org.eclipse.californium.core.CoapHandler;import org.eclipse.californium.core.CoapResponse;import org.eclipse.californium.spring.annotation.CoapController;import org.eclipse.californium.spring.annotation.CoapGetMapping;import org.eclipse.californium.spring.annotation.CoapObserveRelation;import org.eclipse.californium.spring.annotation.CoapPutMapping;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;import java.util.List;import java.util.Optional;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.atomic.AtomicInteger;@RestController@CoapController@RequestMapping("/api")publicclass SensorDataController { privatestaticfinal Logger logger = LoggerFactory.getLogger(SensorDataController.class); @Autowired private DeviceRepository deviceRepository; // 注入设备仓库 // 存储传感器数据的并发哈希映射 private ConcurrentHashMap sensorDataMap = new ConcurrentHashMap<>(); private AtomicInteger observeCounter = new AtomicInteger(0); // 观察计数器 /** * 注册新设备 * * @param device 要注册的设备对象 * @return 注册结果 */ @PostMapping("/register") public ResponseEntity registerDevice(@RequestBody Device device) { if (deviceRepository.findByDeviceId(device.getDeviceId()) != null) { returnnew ResponseEntity<>("设备已注册", HttpStatus.BAD_REQUEST); } device.setActive(true); deviceRepository.save(device); logger.info("注册设备: {}", device.getDeviceId()); returnnew ResponseEntity<>("设备注册成功", HttpStatus.CREATED); } /** * 更新传感器数据 * * @param sensorId 传感器ID * @param payload 数据负载(温度值) */ @CoapPutMapping("/sensors/{sensorId}") public void updateSensorData(@PathVariable String sensorId, byte[] payload) { String dataStr = new String(payload); try { double data = Double.parseDouble(dataStr); Optional deviceOpt = Optional.ofNullable(deviceRepository.findByDeviceId(sensorId)); if (deviceOpt.isPresent()) { Device device = deviceOpt.get(); device.setTemperature(data); deviceRepository.save(device); sensorDataMap.put(sensorId, data); logger.info("收到传感器 {} 的数据: {}", sensorId, data); checkAndAlert(sensorId, data); observeCounter.incrementAndGet(); // 触发观察者通知 } else { logger.warn("未知的传感器ID: {}", sensorId); } } catch (NumberFormatException e) { logger.error("传感器 {} 的数据格式无效: {}", sensorId, dataStr); } } /** * 获取传感器数据 * * @param sensorId 传感器ID * @return 传感器数据 */ @CoapGetMapping("/sensors/{sensorId}") public String getSensorData(@PathVariable String sensorId) { return sensorDataMap.getOrDefault(sensorId, "无数据").toString(); } /** * 提供一个可观察的资源,用于实时订阅传感器状态的变化 * * @return 观察计数器值 */ @CoapObserveRelation @CoapGetMapping("/observe") public String observeSensors() { int count = observeCounter.get(); logger.info("观察传感器,计数器: {}", count); return String.valueOf(count); // 返回计数器值以触发观察者通知 } /** * 获取所有已注册的设备信息 * * @return 设备列表 */ @GetMapping("/devices") public List getAllDevices() { return deviceRepository.findAll(); } /** * 检查温度并触发警报 * * @param sensorId 传感器ID * @param temperature 温度值 */ private void checkAndAlert(String sensorId, double temperature) { if (temperature > 30.0) { logger.warn("高温警报:传感器 {} 的温度为 {}°C", sensorId, temperature); // 在这里可以添加发送警报的通知逻辑 } }}

Application

package com.example.coapserver;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class CoapServerApplication { public static void main(String[] args) { SpringApplication.run(CoapServerApplication.class, args); }}

测试

为了测试CoAP协议,我们可以使用Californium提供的命令行工具来发送CoAP请求。

我已经安装Californium CLI工具。你也可以从Californium GitHub仓库 (https://github.com/eclipse/californium)下载并编译。很简单的!

更新传感器数据

cf-cli put coap://localhost:5683/api/sensors/sensor1 --payload "25.5"

输出:

Sending PUT request to coap://localhost:5683/api/sensors/sensor1Response from coap://localhost:5683/api/sensors/sensor1:Code: 2.04 ChangedPayload:

获取传感器数据

cf-cli get coap://localhost:5683/api/sensors/sensor1

输出:

Sending GET request to coap://localhost:5683/api/sensors/sensor1Response from coap://localhost:5683/api/sensors/sensor1:Code: 2.05 ContentOptions: [Content-Format:text/plain]Payload: 25.5


来源:https://www.51cto.com/article/811519.html
上一篇12 个 grep 命令行组合,覆盖 90% 的生产场景 下一篇星露谷物语创作者埃里克·巴龙为空洞骑士:丝之歌追加角色配音
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
2026中国航空产业大会10月底南昌启幕:首次与航博会同期举办,聚焦低空经济新路径
科技数码 · 2026-08-31

2026中国航空产业大会10月底南昌启幕:首次与航博会同期举办,聚焦低空经济新路径

2026中国航空产业大会与南昌航空产业博览会将于10月31日至11月4日在南昌国际博览城首次同期举办。大会聚焦低空经济,设置主旨报告、行业专家报告及低空产业洽谈会等主题活动,旨在探讨航空产业新路径,推动低空物流、城市巡检等新业态集聚,打造中部领先、全国知名的航空产业交流高地。

联想来酷Air 16酷睿5 315版开售:国补后3739元,16英寸轻薄本选购指南
科技数码 · 2026-08-28

联想来酷Air 16酷睿5 315版开售:国补后3739元,16英寸轻薄本选购指南

联想来酷Air 16酷睿5 315版于8月27日正式开售,搭载6核处理器与12GB内存,配备16英寸16:10屏幕。叠加国家补贴后预估到手价仅3739 15元,主打长续航与静音办公。本文详细解析其硬件配置、接口布局及购买建议,助您快速决策。

牛来AirPods保护套海外走红:萌趣硅胶设计引发关注
科技数码 · 2026-08-28

牛来AirPods保护套海外走红:萌趣硅胶设计引发关注

一款名为“牛来”的AirPods硅胶保护套在日本市场引发关注,售价约1726日元。其独特的搞怪萌趣造型、兼容多代机型的硅胶材质以及专属挂饰设计,使其在社交平台上迅速走红,成为近期备受瞩目的国产原创数码周边产品。

行李箱选购全攻略:材质、轮子与尺寸避坑指南
科技数码 · 2026-08-28

行李箱选购全攻略:材质、轮子与尺寸避坑指南

选购行李箱时,材质、轮子和尺寸是核心决策点。PP材质抗冲击且轻便,适合频繁托运;万向轮决定推行顺滑度;尺寸需匹配航空限重。本文拆解关键参数,结合具体产品案例,助您选出耐用且实用的行李箱。

《湮灭之潮》成都试玩会:技嘉RTX 5080风魔显卡实测体验
科技数码 · 2026-08-28

《湮灭之潮》成都试玩会:技嘉RTX 5080风魔显卡实测体验

2026年8月《湮灭之潮》成都试玩会圆满举行,千名玩家现场体验西方奇幻大作。文章重点解析技嘉RTX 5080风魔显卡在虚幻5引擎下的表现,涵盖Blackwell架构、DLSS 4 5技术及16GB GDDR7显存对高画质流畅运行的支撑作用。