EdgexAgent/device-ble-go/pkg/ble/bleController.go
2025-07-10 20:40:32 +08:00

154 lines
5.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package ble
import (
"device-ble/internal/interfaces"
"device-ble/pkg/uart"
"strings"
"time"
"github.com/edgexfoundry/go-mod-core-contracts/v4/clients/logger"
)
// BLEController 蓝牙低功耗控制器管理BLE设备的初始化、命令发送和状态控制。
type BLEController struct {
Port *uart.SerialPort
Queue interfaces.SerialQueueInterface
logger logger.LoggingClient
}
// NewBLEController 创建新的BLE控制器。
func NewBLEController(port *uart.SerialPort, queue interfaces.SerialQueueInterface, logger logger.LoggingClient) *BLEController {
return &BLEController{
Port: port,
Queue: queue,
logger: logger,
}
}
// InitializeAsPeripheral 启动初始化BLE设备为外围设备模式。
func (c *BLEController) InitializeAsPeripheral() error {
initCommands := []BLECommand{
CommandReset,
CommandInitPeripheral,
CommandSetAdvertisingParams,
CommandCreateGATTService,
CommandCreateGATTCharacteristic,
CommandCompleteGATTService,
CommandSetDeviceName,
CommandStartAdvertising,
}
for _, cmd := range initCommands {
response, err := c.Queue.SendCommand([]byte(cmd), 2*time.Second, 1*time.Second, 100*time.Millisecond)
if strings.Contains(response, "OK") {
c.logger.Infof("✅ 发送 %q 成功, 回显: %v", cmd, response)
} else if strings.Contains(response, "ERROR") {
c.logger.Errorf("⛔️ 发送 %q 失败: %q , 回显: %v ", cmd, err, response)
} else if err != nil {
c.logger.Errorf("❗❓未知回显 :%v, response:%v", err, response)
} else {
c.logger.Warnf("❗❓未知回显, response:%v", response)
}
}
c.logger.Info("BLE设备已成功初始化为外围设备")
return nil
}
// InitializeAsPeripheral 自定义初始化BLE设备。
func (c *BLEController) CustomInitializeBle(cmds []string) error {
for _, cmd := range cmds {
response, err := c.Queue.SendCommand([]byte(cmd), 2*time.Second, 1*time.Second, 100*time.Millisecond)
if strings.Contains(response, "OK") {
c.logger.Infof("✅ 发送 %q 成功, 回显: %v", cmd, response)
} else if strings.Contains(response, "ERROR") {
c.logger.Errorf("⛔️ 发送 %q 失败: %q , 回显: %v ", cmd, err, response)
} else if err != nil {
c.logger.Errorf("❗❓未知回显 :%v, response:%v", err, response)
} else {
c.logger.Warnf("❗❓未知回显, response:%v", response)
}
}
c.logger.Info("BLE设备已成功初始化为外围设备")
return nil
}
func (c *BLEController) GetQueue() interfaces.SerialQueueInterface {
return c.Queue
}
func (c *BLEController) Close() error {
err := c.Queue.Close()
if err != nil {
return err
}
return nil
}
// 向BLE发送一条数据MTU小于247), 不带返回值
func (c *BLEController) SendSingle(cmd string) error {
response, err := c.Queue.SendCommand([]byte(cmd), 2*time.Second, 1*time.Second, 100*time.Millisecond)
if err != nil {
c.logger.Errorf("❌发送%v, 出现错误 :%v, response:%v", cmd, err, response)
return err
} else {
if strings.Contains(response, "OK") {
c.logger.Infof("✅ 发送 %q 成功, 回显: %v", cmd, response)
} else if strings.Contains(response, "ERROR") {
c.logger.Errorf("⛔️ 发送 %q 失败: %q , 回显: %v ", cmd, err, response)
} else {
c.logger.Warnf("❗❓ 未知回显, response:%v", response)
}
}
c.logger.Info("BLE 单条指令发送成功")
return nil
}
// 多条指令单条指令MTU小于247),不带返回值
// 如果需要发送JSON数据请使用jsonSender中的方法
func (c *BLEController) SendMulti(cmds []string) error {
for _, cmd := range cmds {
response, err := c.Queue.SendCommand([]byte(cmd), 2*time.Second, 1*time.Second, 100*time.Millisecond)
if err != nil {
c.logger.Errorf("❌发送%v, 出现错误 :%v, response:%v", cmd, err, response)
return err
} else {
if strings.Contains(response, "OK") {
c.logger.Infof("✅ 发送 %q 成功, 回显: %v", cmd, response)
} else if strings.Contains(response, "ERROR") {
c.logger.Errorf("⛔️ 发送 %q 失败: %q , 回显: %v ", cmd, err, response)
} else {
c.logger.Warnf("❗❓ 未知回显, response:%v", response)
}
}
}
c.logger.Info("BLE 多条指令发送成功")
return nil
}
func (c *BLEController) SendSingleWithResponse(cmd string) (res string, err error) {
response, err := c.Queue.SendCommand([]byte(cmd), 300*time.Millisecond, 1*time.Millisecond, 100*time.Millisecond)
if err != nil {
c.logger.Errorf("❌发送%v, 出现错误 :%v, response:%v", cmd, err, response)
return "", err
} else {
if strings.Contains(response, "OK") {
c.logger.Infof("✅ 发送 %q 成功, 回显: %v", cmd, response)
} else if strings.Contains(response, "ERROR") {
c.logger.Errorf("⛔️ 发送 %q 失败: %q , 回显: %v ", cmd, err, response)
} else {
c.logger.Warnf("❗❓ 未知回显, response:%v", response)
}
}
c.logger.Info("BLE 单条指令发送成功")
return response, nil
}
// // 获取一次响应
// // 对于获取版本、地址一般都是先发OK第二次响应才是内容
// // 所以需要再获取一行响应,以获得实际内容
// func (c *BLEController) GetOnceResponse() (res string, err error) {
// return c.Queue.GetResponse(2 * time.Second)
// }