EdgexAgent/device-ble-go/pkg/ble/bleController.go

154 lines
5.1 KiB
Go
Raw Normal View History

2025-07-10 20:40:32 +08:00
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)
// }