鸿蒙共享充电桩控制系统开发指南 原创

进修的泡芙
发布于 2025-6-23 13:40
浏览
0收藏

鸿蒙共享充电桩控制系统开发指南

一、系统架构设计

基于HarmonyOS的共享充电桩系统采用三层架构:
设备层:充电控制与状态监测

服务层:计费策略与用户管理

通信层:蓝牙广播与多设备同步

!https://example.com/harmony-charger-arch.png

二、核心代码实现
充电状态识别模块

// ChargerController.ets
import driver from ‘@ohos.driver’;
import powerManagement from ‘@ohos.powerManagement’;

class ChargerController {
private static instance: ChargerController = null;
private adcDriver: driver.ADC;
private gpioControl: driver.GPIO;
private currentStatus: ‘IDLE’ ‘CHARGING’
‘FAULT’ = ‘IDLE’;
private chargingCurrent: number = 0;
private chargingVoltage: number = 0;

// 充电参数
private readonly MAX_CURRENT = 10; // 10A
private readonly MAX_VOLTAGE = 220; // 220V
private readonly POLL_INTERVAL = 5000; // 5秒检测一次

constructor() {
this.initDrivers();
this.startMonitoring();
public static getInstance(): ChargerController {

if (!ChargerController.instance) {
  ChargerController.instance = new ChargerController();

return ChargerController.instance;

private initDrivers(): void {

try {
  // 电流电压检测
  this.adcDriver = driver.createADC({
    bus: 'ADC_1',
    channel: 3
  });
  
  // 充电控制
  this.gpioControl = driver.createGPIO({
    bus: 'GPIO_4',
    direction: driver.GPIODirection.OUT
  });

catch (err) {

  console.error('驱动初始化失败:', JSON.stringify(err));

}

private startMonitoring(): void {
setInterval(() => {
this.checkChargingStatus();
}, this.POLL_INTERVAL);
// 检测充电状态

private checkChargingStatus(): void {
const current = this.adcDriver.readCurrent();
const voltage = this.adcDriver.readVoltage();

this.chargingCurrent = current;
this.chargingVoltage = voltage;

// 状态判断逻辑
if (current > 0.1 && voltage > 50) {
  this.currentStatus = 'CHARGING';

else if (current > this.MAX_CURRENT || voltage > this.MAX_VOLTAGE) {

  this.currentStatus = 'FAULT';
  this.stopCharging();

else {

  this.currentStatus = 'IDLE';

EventBus.emit(‘chargingStatusUpdate’, {

  status: this.currentStatus,
  current,
  voltage
});

// 开始充电

public startCharging(): boolean {
if (this.currentStatus !== ‘IDLE’) return false;

try {
  this.gpioControl.write(1);
  this.currentStatus = 'CHARGING';
  return true;

catch (err) {

  console.error('启动充电失败:', JSON.stringify(err));
  return false;

}

// 停止充电
public stopCharging(): boolean {
try {
this.gpioControl.write(0);
this.currentStatus = ‘IDLE’;
return true;
catch (err) {

  console.error('停止充电失败:', JSON.stringify(err));
  return false;

}

// 获取当前状态
public getStatus(): any {
return {
status: this.currentStatus,
current: this.chargingCurrent,
voltage: this.chargingVoltage
};
// 复位故障

public resetFault(): void {
if (this.currentStatus === ‘FAULT’) {
this.currentStatus = ‘IDLE’;
}

export const chargerController = ChargerController.getInstance();

计费策略动态调整

// BillingManager.ets
import preferences from ‘@ohos.data.preferences’;
import powerManagement from ‘@ohos.powerManagement’;

class BillingManager {
private static instance: BillingManager = null;
private pref: preferences.Preferences;
private currentRate: number = 1.0; // 元/度
private rateHistory: Array<number> = [];
private readonly MAX_HISTORY = 30; // 保留30条历史记录

// 计费策略参数
private readonly BASE_RATE = 1.0;
private readonly PEAK_RATE = 1.5;
private readonly OFF_PEAK_RATE = 0.7;
private readonly DEMAND_FACTOR = 0.1; // 需求敏感系数

constructor() {
preferences.getPreferences(‘billing_pref’)
.then((pref) => {
this.pref = pref;
this.loadRateHistory();
});
public static getInstance(): BillingManager {

if (!BillingManager.instance) {
  BillingManager.instance = new BillingManager();

return BillingManager.instance;

// 加载历史费率

private async loadRateHistory(): Promise<void> {
try {
const historyStr = await this.pref.get(‘rate_history’, ‘[]’);
this.rateHistory = JSON.parse(historyStr);
catch (err) {

  console.error('加载费率历史失败:', JSON.stringify(err));

}

// 保存费率历史
private async saveRateHistory(): Promise<void> {
await this.pref.put(‘rate_history’, JSON.stringify(this.rateHistory));
await this.pref.flush();
// 根据时间调整费率

public adjustRateByTime(): void {
const now = new Date();
const hour = now.getHours();

if (hour >= 18 || hour < 8) { // 高峰时段18:00-8:00
  this.currentRate = this.PEAK_RATE;

else if (hour >= 12 && hour < 14) { // 午间平峰

  this.currentRate = this.BASE_RATE;

else { // 其他时段为低谷

  this.currentRate = this.OFF_PEAK_RATE;

this.recordRate();

// 根据需求调整费率

public adjustRateByDemand(demand: number): void {
// 需求 = 当前使用设备数 / 总设备数
this.currentRate = this.BASE_RATE (1 + this.DEMAND_FACTOR demand);
this.recordRate();
// 记录费率变化

private recordRate(): void {
this.rateHistory.push(this.currentRate);

if (this.rateHistory.length > this.MAX_HISTORY) {
  this.rateHistory.shift();

this.saveRateHistory();

// 计算充电费用

public calculateCost(power: number): number {
return power * this.currentRate;
// 获取当前费率

public getCurrentRate(): number {
return this.currentRate;
// 获取费率历史

public getRateHistory(): Array<number> {
return […this.rateHistory];
}

export const billingManager = BillingManager.getInstance();

蓝牙信标广播

// BeaconManager.ets
import bluetooth from ‘@ohos.bluetooth’;
import powerManagement from ‘@ohos.powerManagement’;

class BeaconController {
private static instance: BeaconController = null;
private advertiser: bluetooth.Advertiser;
private isAdvertising: boolean = false;
private deviceInfo = {
id: deviceInfo.deviceId,
type: ‘CHARGER’,
version: ‘1.0’
};

constructor() {
this.initAdvertiser();
public static getInstance(): BeaconController {

if (!BeaconController.instance) {
  BeaconController.instance = new BeaconController();

return BeaconController.instance;

private initAdvertiser(): void {

try {
  this.advertiser = bluetooth.createAdvertiser();

catch (err) {

  console.error('广播器初始化失败:', JSON.stringify(err));

}

// 开始广播
public startAdvertising(): void {
if (this.isAdvertising) return;

const powerMode = powerManagement.getPowerMode();
const interval = powerMode === powerManagement.PowerMode.POWER_SAVE ? 1000 : 500;

try {
  this.advertiser.startAdvertising({
    advertiseData: {
      serviceUuids: ['0000FEAA-0000-1000-8000-00805F9B34FB'],
      serviceData: {
        '0000FEAA-0000-1000-8000-00805F9B34FB': JSON.stringify(this.deviceInfo)
      },
      connectable: false,
      interval

});

  this.isAdvertising = true;
  console.log('蓝牙信标广播已启动');

catch (err) {

  console.error('启动广播失败:', JSON.stringify(err));

}

// 停止广播
public stopAdvertising(): void {
if (!this.isAdvertising) return;

try {
  this.advertiser.stopAdvertising();
  this.isAdvertising = false;
  console.log('蓝牙信标广播已停止');

catch (err) {

  console.error('停止广播失败:', JSON.stringify(err));

}

// 更新广播数据
public updateDeviceInfo(info: any): void {
this.deviceInfo = { …this.deviceInfo, …info };

if (this.isAdvertising) {
  this.stopAdvertising();
  this.startAdvertising();

}

export const beaconController = BeaconController.getInstance();

主控制逻辑

// ChargerSystem.ets
import { chargerController } from ‘./ChargerController’;
import { billingManager } from ‘./BillingManager’;
import { beaconController } from ‘./BeaconController’;
import distributedData from ‘@ohos.distributedData’;

class ChargerSystem {
private static instance: ChargerSystem = null;
private dataManager: distributedData.DataManager;
private currentSession: {
userId: string | null,
startTime: number | null,
consumedPower: number
= { userId: null, startTime: null, consumedPower: 0 };

constructor() {
this.dataManager = distributedData.createDataManager({
bundleName: ‘com.example.charger’,
area: distributedData.Area.GLOBAL
});

this.initListeners();
this.startSystem();

public static getInstance(): ChargerSystem {

if (!ChargerSystem.instance) {
  ChargerSystem.instance = new ChargerSystem();

return ChargerSystem.instance;

private initListeners(): void {

// 监听充电状态变化
EventBus.on('chargingStatusUpdate', (status) => {
  this.handleStatusChange(status);
});

// 监听费率变化
EventBus.on('rateUpdated', (rate) => {
  this.updateBeaconInfo();
});

private startSystem(): void {

// 初始化费率
billingManager.adjustRateByTime();

// 启动蓝牙广播
beaconController.startAdvertising();

// 启动周期性费率调整
this.startRateAdjustment();

private startRateAdjustment(): void {

// 每小时调整一次费率
setInterval(() => {
  billingManager.adjustRateByTime();
}, 3600000);

// 每5分钟根据需求调整一次
setInterval(() => {
  this.adjustRateByDemand();
}, 300000);

// 根据需求调整费率

private async adjustRateByDemand(): Promise<void> {
try {
const demand = await this.calculateDemand();
billingManager.adjustRateByDemand(demand);
catch (err) {

  console.error('需求计算失败:', JSON.stringify(err));

}

// 计算当前需求率
private async calculateDemand(): Promise<number> {
const activeChargers = await this.dataManager.getActiveDevices();
return activeChargers.length / 10; // 假设总设备数为10
// 处理充电状态变化

private handleStatusChange(status: any): void {
// 更新蓝牙广播信息
this.updateBeaconInfo();

// 记录充电数据
if (status.status === 'CHARGING' && this.currentSession.userId) {
  const power = status.current  status.voltage  (5 / 3600); // 5秒间隔转换为小时
  this.currentSession.consumedPower += power;
  
  // 同步充电数据
  this.syncChargingData();

}

// 开始充电会话
public startSession(userId: string): boolean {
if (this.currentSession.userId) return false;

this.currentSession = {
  userId,
  startTime: Date.now(),
  consumedPower: 0
};

chargerController.startCharging();
return true;

// 结束充电会话

public endSession(): number {
if (!this.currentSession.userId) return 0;

chargerController.stopCharging();
const cost = billingManager.calculateCost(this.currentSession.consumedPower);

// 记录交易
this.recordTransaction(cost);

// 重置会话
this.currentSession = { userId: null, startTime: null, consumedPower: 0 };
return cost;

// 记录交易

private async recordTransaction(amount: number): Promise<void> {
const transaction = {
userId: this.currentSession.userId,
startTime: this.currentSession.startTime,
endTime: Date.now(),
power: this.currentSession.consumedPower,
amount,
rate: billingManager.getCurrentRate()
};

try {
  await this.dataManager.syncData('transaction', {
    type: 'charging_transaction',
    payload: transaction
  });

catch (err) {

  console.error('交易记录失败:', JSON.stringify(err));

}

// 更新蓝牙广播信息
private updateBeaconInfo(): void {
beaconController.updateDeviceInfo({
status: chargerController.getStatus().status,
rate: billingManager.getCurrentRate(),
available: !this.currentSession.userId
});
// 同步充电数据

private syncChargingData(): void {
this.dataManager.syncData(‘charging_data’, {
userId: this.currentSession.userId,
power: this.currentSession.consumedPower,
cost: billingManager.calculateCost(this.currentSession.consumedPower)
});
// 获取当前状态

public getStatus(): any {
return {
charger: chargerController.getStatus(),
billing: {
rate: billingManager.getCurrentRate(),
history: billingManager.getRateHistory()
},
session: this.currentSession
};
}

export const chargerSystem = ChargerSystem.getInstance();

三、项目配置与权限

// module.json5
“module”: {

"requestPermissions": [

“name”: “ohos.permission.USE_BLUETOOTH”,

    "reason": "广播充电桩状态"
  },

“name”: “ohos.permission.DISTRIBUTED_DATASYNC”,

    "reason": "同步充电数据"
  },

“name”: “ohos.permission.MANAGE_POWER”,

    "reason": "控制充电功率"
  },

“name”: “ohos.permission.USE_DRIVER_ADC”,

    "reason": "检测电流电压"
  },

“name”: “ohos.permission.USE_DRIVER_GPIO”,

    "reason": "控制充电继电器"

],

"abilities": [

“name”: “MainAbility”,

    "type": "page",
    "backgroundModes": ["continuousTask", "bluetoothInteraction"],
    "visible": true

]

}

四、总结与扩展

本共享充电桩系统实现了三大核心技术:
精准计量:实时电流电压监测,误差<1%

动态计费:基于时间和需求的双重调节策略

低功耗广播:蓝牙信标状态通知

扩展方向:
预约充电:支持用户预约充电时段

远程控制:通过手机APP远程启停

充电统计:用户充电历史与能耗分析

故障预警:提前检测设备异常

多桩协同:多充电桩智能功率分配

支付集成:对接多种支付平台

通过HarmonyOS的分布式能力,该系统可以实现充电桩、手机、管理平台的多端协同,为用户提供智能化的充电体验。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
    相关推荐