【Java】XStream入门基本使用,XStream下划线问题

XStream入门Demo

依赖


<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.10</version>
 </dependency>
<!--与spring整合的话要用到的-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>5.1.3.RELEASE</version>
 </dependency>

准备工作

一个需要转换的实体类,拿大家最喜欢的Student类,嘻嘻。

public class Student {
    private String name;
    private Integer age;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

例子:实体类转换成XML格式

场景1
代码
Student student = new Student();
student.setName("张三");
student.setAge(10);
student.setAddress("北京市东城区");

XStream xStream = new XStream();
String result = xStream.toXML(student);
System.out.println(result);
结果
<Student>
  <name>张三</name>
  <age>10</age>
  <address>北京市东城区</address>
</Student>
场景2

我们发现根标签是这个类的名称,其实如果这个类是有在哪个包下的话 也就是有import package 这种东西的话

其实根标签会出现全路径名,但是这样太固定了,我们可能想自定义根路径。所以我们可以变成以下代码。

代码
Student student = new Student();
student.setName("张三");
student.setAge(10);
student.setAddress("北京市东城区");
XStream xStream = new XStream();
//设置跟路径别名
xStream.alias("xml",Student.class);
String result = xStream.toXML(student);
System.out.println(result);
结果
<xml>
  <name>张三</name>
  <age>10</age>
  <address>北京市东城区</address>
</xml>
场景3

既然根标签可以修改,那里面的标签是不是也可以修改呢?答案是可以的。 因为我们可能有这样的需求,起码楼主在微信支付中见过此需求。因为我们平时实体类在定义属性的时候是不习惯把一个属性名字带有下划线,如mchId 很少人在定义的时候会写成mch_id。但是输出的时候我们又得是<mch_id>[!DATA]</mch_id>类似这样的。所以这时候我们得用XStream中的一个注解 @XStreamAlias(“别名”),本人感觉很好用。在刚才的Student类中属性的头上加一个这样的注解。

public class Student {
    private String name;
    private Integer age;
    private String address;
    @XStreamAlias("mch_id")
    private String mchId;
}
代码
Student student = new Student();
student.setName("张三");
student.setAge(10);
student.setAddress("北京市东城区");
student.setMchId("110010");
XStream xStream = new XStream();
xStream.alias("xml",Student.class);
String result = xStream.toXML(student);
System.out.println(result);
结果
<xml>
  <name>张三</name>
  <age>10</age>
  <address>北京市东城区</address>
  <mchId>110010</mchId>
</xml>

从结果中可以看出答案并不是我们想要的那样。注解压根没起作用啊,原来要让注解起作用,我们还得加一行代码才可以。

//扫描注解
xStream.autodetectAnnotations(true);
结果
<xml>
  <name>张三</name>
  <age>10</age>
  <address>北京市东城区</address>
  <mch__id>110010</mch__id>
</xml>

但是又有问题!我想要mch_id 一个下划线 但是结果好像是mch__id 两个下划线。这里我们得需要一个驱动器可以解决这个问题,大家可以直接拿来用。

XStream parseXStream = new XStream(new Xpp3Driver(new NoNameCoder()));
结果
<xml>
  <name>张三</name>
  <age>10</age>
  <address>北京市东城区</address>
  <mch_id>110010</mch_id>
</xml>

这次终于是我们想要的了。

例子:XML格式转成实体类

场景1
XML
<xml>
  <name>张三</name>
  <age>10</age>
  <address>北京市东城区</address>
</xml>

将上面的XML映射到Student类中

String xml = "<xml><name>张三</name><age>10</age><address>北京市东城区</address></xml>";
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
Student student= (Student) xStream.fromXML(xml);
System.out.println(student);
结果
Security framework of XStream not initialized, XStream is probably vulnerable.
com.thoughtworks.xstream.mapper.CannotResolveClassException: xml

这是因为XStream解析不了根标签与Student之间的关系。所以我们得告诉它。所以要在类上添加刚才说的那个注解 @XStreamAlias

@XStreamAlias("xml")
public class Student {
}
String xml = "<xml><name>张三</name><age>10</age><address>北京市东城区</address></xml>";
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
//别名xml
xStream.alias("xml",Student.class);
//开启注解扫描
xStream.autodetectAnnotations(true);
Student student= (Student) xStream.fromXML(xml);
System.out.println(student);
结果
Student(name=张三, age=10, address=北京市东城区, mchId=null)

同理,属性的别名也是按照的套路添加别名设置即可。

场景2

还有一个需求场景我也测试过。就是我们有时候不能保证实体类的属性值刚好跟XML的内容是对应的,这时候我们得靠一个方法设置一下即可解决。

<xml>
  <name>张三</name>
  <age>10</age>
  <address>北京市东城区</address>
  <mch_id>110010</mch_id>
  <code>1</code>
</xml>
代码
String xml = "<xml><name>张三</name><age>10</age><address>北京市东城区</address><mch_id>110010</mch_id><code>11</code></xml>";
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
xStream.alias("xml",Student.class);
xStream.autodetectAnnotations(true);
Student student= (Student) xStream.fromXML(xml);
System.out.println(student);
结果
Security framework of XStream not initialized, XStream is probably vulnerable.
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field Student.code

这样就会出现未知字段的异常,这时候只需要添加一个方法即可。

xStream.ignoreUnknownElements();

这是我刚使用心得,后面SpringMVC整合XStream的我会再写一篇,希望还是有帮助到刚使用的小伙伴们。

<think>好的,用户之前已经询问过基于STM32的智能婴儿监护系统的电路图,现在他再次提问,但这次的硬件需求有所不同。我需要仔细分析他的新要求,确保不遗漏任何细节。 首先,用户这次的系统包括STM32F103C8t6、DHT11、Pluse Sensor、MAX9814、MPU6050、0.96寸OLED、TTS中文语音模块和电源模块,但不需要Wi-Fi、蓝牙和小程序。之前的回答中已经涵盖了DHT11、MPU6050和电源部分,但现在需要新增Pluse Sensor、MAX9814、OLED和TTS模块,同时去掉无线通信模块。 接下来,我需要确定这些新增模块的连接方式和电路设计要点。Pluse Sensor通常使用模拟输入,可能需要信号调理电路。MAX9814是麦克风放大器,需要正确的偏置和滤波电路。OLED显示屏一般是I2C或SPI接口,需要确认用户的具体型号。TTS模块可能需要串口通信,同时注意音频输出的驱动能力。 用户可能希望得到一个更具体的电路设计,而不仅仅是框架。需要分模块详细说明每个硬件的连接,包括引脚分配、电源要求和信号处理电路。此外,用户提到不需要无线模块,所以需要确保之前的Wi-Fi相关部分被移除,重点放在本地报警和显示上。 还需要注意电源管理,特别是多个传感器的供电是否足够,是否需要额外的LDO或稳压电路。TTS模块的功耗可能较高,需要确认电源能否支持,或者是否需要独立的电源路径。 用户可能没有明确说明的是,是否需要低功耗设计,或者系统是持续供电还是电池供电。根据之前的回答,有锂电池管理部分,所以可能需要保留电源管理电路,但需要调整以适应新的模块。 另外,要检查所有模块的接口是否冲突,例如I2C设备地址是否重复,是否需要使用不同的总线或GPIO。例如,MPU6050和OLED可能都使用I2C,需要确保地址不同或使用不同的总线。 最后,确保所有电路设计符合安全标准,比如添加保护二极管、滤波电容,以及正确的接地处理。可能还需要考虑传感器的布局和布线,避免干扰,尤其是Pluse Sensor和MAX9814这类模拟信号部分。</think>以下是基于STM32F103C8T6的智能婴儿监护系统电路设计详解(不含无线模块),按照您要求的硬件设备分模块说明: --- ### **一、系统架构框图** ``` [传感器组] → STM32F103C8T6 → [输出设备] 传感器组:DHT11 | Pluse Sensor | MAX9814 | MPU6050 输出设备:OLED | TTS模块 | 蜂鸣器报警 电源:锂电池+5V稳压 ``` --- ### **二、详细电路设计** #### **1. 主控核心电路** **STM32F103C8T6最小系统**: ```c /* 关键电路连接 */ - 晶振:8MHz(OSC_IN/OUT) + 32.768kHz(LSE) - BOOT0/1:10kΩ下拉电阻 - 复位电路:10kΩ上拉 + 100nF电容 - SWD调试:PA13(SWDIO)/PA14(SWCLK) - 电源滤波:3.3V端并联100μF+0.1μF电容 ``` #### **2. 传感器模块电路** **(1) DHT11温湿度传感器**: ``` PA1 ─┬─ DATA ├─ 5.1kΩ上拉电阻 └─ 0.1μF去耦电容→GND VCC: 3.3V直连 ``` **(2) Pluse Sensor脉搏传感器**: ``` 信号处理电路: Pluse_OUT ─── 10kΩ ─┬─ PC0(ADC1_IN10) └─ 0.1μF→GND 供电配置: 3.3V ── LC滤波(100Ω+100μF) → 传感器VCC ``` **(3) MAX9814声音传感器**: ``` 硬件设计要点: MIC+ → MAX9814_IN │ ├─ AGC引脚悬空(启用自动增益) └─ AR引脚接0.1μF电容→GND 输出连接: OUT ── 1kΩ ─┬─ PA4(ADC1_IN4) └─ 10nF→GND(抗混叠滤波) ``` **(4) MPU6050陀螺仪**: ``` I²C总线配置: SCL → PB8(I2C1_SCL) + 4.7kΩ上拉 SDA → PB9(I2C1_SDA) + 4.7kΩ上拉 中断引脚: INT → PC5 + 10kΩ下拉 ``` #### **3. 输出设备电路** **(1) 0.96" OLED(SSD1306)**: ``` SPI模式连接: CS → PA2 DC → PA3 RES → PA4 SCLK → PA5 MOSI → PA7 VCC: 3.3V直接供电 ``` **(2) TTS中文语音模块**: ``` 推荐SYN6288方案: TX → PB10(USART3_TX) BUSY → PC6(检测语音状态) 供电注意:独立3.3V/500mA线路 扬声器接口: SPK+ ─┬─ 8Ω/1W喇叭 SPK- └─ 100μF隔直电容 ``` **(3) 本地报警电路**: ``` 蜂鸣器驱动: PB12 ── 2N3904基极 │ ├─ 1kΩ限流电阻 └─ 蜂鸣器(3V有源型) ``` #### **4. 电源系统设计** ``` 锂电池供电方案: 3.7V Li-ion ─┬─ TP4056充电IC ├─ AMS1117-3.3V(给MCU) └─ TPS7350(5V给传感器) 关键参数: - 充电电流:Rprog=2kΩ → 500mA - 低电检测:PC7(ADC1_IN15)检测分压值 分压公式: $$ V_{detect} = \frac{R2}{R1+R2} \cdot V_{bat} \quad (R1=100kΩ, R2=47kΩ) $$ ``` --- ### **三、关键接口汇总表** | 外设名称 | 接口类型 | STM32引脚 | 备注 | |----------------|------------|------------|-----------------------| | DHT11 | 单总线 | PA1 | 需严格时序控制 | | Pluse Sensor | ADC | PC0 | 建议采样率100Hz | | MAX9814 | ADC | PA4 | 需软件滤波算法 | | MPU6050 | I²C | PB8/PB9 | 地址0x68/0x69可选 | | OLED | SPI | PA2-PA7 | 硬件SPI1 | | TTS模块 | UART | PB10 | 波特率9600/115200可选 | | 蜂鸣器 | GPIO | PB12 | PWM驱动 | --- ### **四、特殊电路设计要点** 1. **信号隔离设计**: - 脉搏/声音信号走线加屏蔽层 - ADC输入端串联100Ω电阻+并联10pF电容 2. **电源去耦策略**: - 每个传感器VCC端添加10μF+0.1μF电容 - 数字/模拟地单点连接(建议在AMS1117接地脚) 3. **抗运动干扰措施**: - MPU6050安装位置远离振动源 - 使用软件卡尔曼滤波算法: $$ \hat{x}_k = F_k \hat{x}_{k-1} + K_k(z_k - H_k F_k \hat{x}_{k-1}) $$ 4. **语音模块优化**: - 增加音频功放电路(如LM386) - 预留TF卡接口备用语音存储 --- ### **五、典型原理图片段** **复合传感器供电电路**: ``` AMS1117-3.3V ─┬─ 传感器组 ├─ 100Ω磁珠 ─┬─ MCU └─ LC滤波 ───┘ ``` **MPU6050接口电路**: ``` PB8 ──┬─ 4.7kΩ ── 3.3V └─ SCL PB9 ──┬─ 4.7kΩ ── 3.3V └─ SDA PC5 ──┬─ 10kΩ ── GND └─ INT ``` --- ### **六、设计验证建议** 1. 分模块调试顺序: ``` 电源 → 核心板 → 传感器 → 输出设备 ``` 2. 关键测试点: - 脉搏信号波形(应有0.5-2Hz周期信号) - MPU6050原始数据(静止时加速度≈1g) - TTS模块的BUSY信号电平变化 需要具体参数计算或某模块的详细电路说明,可告知重点模块我将补充技术细节。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杰肥啊

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值