蓝牙射频通信插座与戈朗



我正在尝试从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
}

最新更新