我正在尝试从Go打开RFCOMM套接字。我有一个测试设置,其中客户端连接到回显服务器。我坚持的部分是设置蓝牙地址。在 C 中,你有 str2ba,它将 MAC 字符串转换为包含六个元素的字节数组。在 Go 中,它似乎希望该设备是 uint16。我不确定这将如何工作。
package main
import (
"fmt"
"log"
"syscall"
"golang.org/x/sys/unix"
)
func main() {
fd, err := unix.Socket(syscall.AF_BLUETOOTH, syscall.SOCK_STREAM, unix.BTPROTO_RFCOMM)
if err != nil {
log.Fatalf("%vn", err)
}
addr := unix.SockaddrHCI{Dev: 1, Channel: 1}
unix.Connect(fd, addr)
unix.Write(fd, []byte("Hello"))
var data []byte
unix.Read(fd, data)
fmt.Printf("Received: %vn", string(data))
}
unix.SockaddrHCI
中的Dev
成员是 uint16,我认为这是代表蓝牙 MAC。这是对的吗?
谢谢。
我认为
主题启动器已经不需要这个答案,但我昨天需要它))有点找到了正确的答案,所以让我分享在我的情况下有效的代码(它是 Arduino 的 HC06 蓝牙模块)。我假设该模块已经被bt发现并配对(例如通过蓝牙ctl)。
package main
import (
"strconv"
"strings"
"syscall"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
)
func main() {
mac := str2ba("00:19:10:08:FE:08") // YOUR BLUETOOTH MAC ADDRESS HERE
fd, err := unix.Socket(syscall.AF_BLUETOOTH, syscall.SOCK_STREAM, unix.BTPROTO_RFCOMM)
check(err)
addr := &unix.SockaddrRFCOMM{Addr: mac, Channel: 1}
var data = make([]byte, 50)
logrus.Print("connecting...")
err = unix.Connect(fd, addr)
check(err)
defer unix.Close(fd)
logrus.Println("done")
for {
n, err := unix.Read(fd, data)
check(err)
if n > 0 {
logrus.Infof("Received: %vn", string(data[:n]))
}
}
}
func check(err error) {
if err != nil {
logrus.Fatal(err)
}
}
// str2ba converts MAC address string representation to little-endian byte array
func str2ba(addr string) [6]byte {
a := strings.Split(addr, ":")
var b [6]byte
for i, tmp := range a {
u, _ := strconv.ParseUint(tmp, 16, 8)
b[len(b)-1-i] = byte(u)
}
return b
}