使用Golang创建蓝牙RFCOMM套接字

3

我正在尝试使用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("%v\n", 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: %v\n", string(data))
}
unix.SockaddrHCI 中的 Dev 成员是 uint16 类型,我认为这是用来表示蓝牙 MAC 地址的。这个理解正确吗?
谢谢。
1个回答

3

我认为发起此话题的人可能已经不需要这个答案了,但是昨天我需要了。 我找到了正确的答案,并在此分享适用于我的情况(它是用于Arduino的HC06蓝牙模块)。 我假设模块已经通过蓝牙控制器进行了发现和配对。

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: %v\n", 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
}



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接