案例 运行任务 传一个参数进去 这个任务时死循环 希望running的时候还可以修改这个参数
不可以的
package main
import (
"fmt"
"time"
)
func main() {
var num int = 4
go m_ble_task(num)
time.Sleep(3 * time.Second)
num = 5
time.Sleep(3 * time.Second)
}
func m_ble_task(conn_limit int) {
for {
time.Sleep(1 * time.Second)
fmt.Println(conn_limit)
}
}
[Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"
4
4
4
4
4
传入地址
可以的
package main
import (
"fmt"
"time"
)
func main() {
var num int = 4
go m_ble_task(&num)
time.Sleep(3 * time.Second)
num = 5
time.Sleep(3 * time.Second)
}
func m_ble_task(conn_limit *int) {
for {
time.Sleep(1 * time.Second)
fmt.Println(*conn_limit)
}
}
[Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"
4
4
4
5
5
补充简单
package main
import (
"fmt"
"time"
)
var num int = 4
func main() {
go m_ble_task()
time.Sleep(3 * time.Second)
num = 5
time.Sleep(3 * time.Second)
}
func m_ble_task() {
for {
time.Sleep(1 * time.Second)
fmt.Println(num)
}
}
补充一个简单的方式
[Running] go run "c:\Users\Koson.Gong\Desktop\sgo\pack.go"
4
4
5
5
5
全局变量
我的操作时
ota.Mask = 0 --关闭了
for {
if (len(connected) < *conn_limit) && (len(connected) < ota.Mask) { 在使用的时候变化
Mask = 100 还原出去
+++++++继续
问题:树莓派做蓝牙主机 连接从机时候 以后 断开时从机的行为
不是树莓派主机主动去断开的
目前没有断开的回调函数(可以考虑自己开发)
那么我需要一个任务去监听断开(先这么做吧)
补充一个案例:主机-扫描-连接--打印连接状态
方式1 台湾
AA-------
func ble_on_disconnect(a *bluetooth.Adapter, result bluetooth.ScanResult, c chan bool) {
for {
connected, _ := a.Connected(result.Address)
if !connected {
log.Printf("[BLE][%s] on disconnected\r\n", parse_MAC(result))
c <- false // ble disconnect
return
}
time.Sleep(500 * time.Millisecond)
}
}
BB-----mian里面
ble_close := make(chan bool, 1)
go ble_on_disconnect(adapter, result, ble_close)
select {
case <-ble_close:
打印连接状态
break
也即是做了一个死循环轮询 一个通道返回消息
接口是自己写的
D:\QMDownload\bluetooth_mcube\gap_linux.go
func (a *Adapter) Connected(address Addresser) (bool, error) {
adr := address.(Address)
devicePath := dbus.ObjectPath(string(a.adapter.Path()) + "/dev_" + strings.Replace(adr.MAC.String(), ":", "_", -1))
dev, err := device.NewDevice1(devicePath)
if err != nil {
return false, err
}
return dev.Properties.Connected, nil
}
方式2 参考:LED的代码
func main() {
println("starting")
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
neo.Configure(machine.PinConfig{Mode: machine.PinOutput})
ws = ws2812.New(neo)
adapter.SetConnectHandler(func(d bluetooth.Addresser, c bool) {
connected = c
if !connected && !disconnected {
clearLEDS()
disconnected = true
}
if connected {
disconnected = false
}
})
它的意思是这样的
2个全局变量
其中disconnected一直是我自己控制
另外一个connected一直不归我自己控制 而是丢给后台 让程序自己控制
一开始两个都是0 进到第一个if所以disconnected=1标识没有连接
一旦连接 也就是后台程序设置了 connected=1 我进第二个if disconnected=0
再次断开连接 那就近代第一个if
关注一个和后台的桥梁回调函数 SetConnectHandler
package main
import (
"fmt"
"time"
)
/*
定义一个结构体 成员1是string 成员2是一个函数需要参数bool没有返回值
*/
type Adapter struct {
id string
connectHandler func(connected bool)
}
/*
实例化一个出来 现场赋值第二个成员
*/
var DefaultAdapter = &Adapter{
connectHandler: func(connected bool) {
fmt.Println("connectHandler I am here")
return
},
}
/*
结构体绑定一个方法 它是修改里面的函数的!
*/
func (a *Adapter) SetConnectHandler(c func(connected bool)) {
a.connectHandler = c
}
func myswap(c bool) {
go func(b bool) {
for {
time.Sleep(time.Second * 2)
fmt.Println("myswap", b)
b = !b
}
}(c)
}
func main() {
tt := true
count := 0
var m_adapter = DefaultAdapter
m_adapter.id = "HCI2"
fmt.Println(m_adapter)
m_adapter.connectHandler(tt) //调用1
/*
第一轮测试
&{HCI2 0x1fc6a0}
connectHandler I am here
*/
m_adapter.SetConnectHandler(func(c bool) {
fmt.Println("new boy!")
})
fmt.Println(m_adapter)
m_adapter.connectHandler(tt) //调用2
/*
上面是经过SetConnectHandler以后第二轮测试
&{HCI2 0x1fc720}
new boy!
*/
m_adapter.SetConnectHandler(myswap)
fmt.Println(m_adapter)
m_adapter.connectHandler(tt) //调用3
for {
time.Sleep(time.Second)
fmt.Println(tt)
count++
if count == 8 {
break
}
}
/*
上面是经过SetConnectHandler以后第三轮测试
myswap false
true
函数内的bool已经翻转 凡是不能带出来 tt不变化
因为这里是值 不是地址
*/
/*
前面的模仿没有到位
应该是这个结构体 给一个bool标识状态 即可
但是结构体给的不是bool 而是一个函数
应该是后台有函数在设置的 我送bool进去
源码// TODO: a proper async callback.
m_adapter.connectHandler(nil, true)
*/
fmt.Println("wrong--->right")
/*后台设置函数 */
go func() {
b := true
for {
time.Sleep(time.Second * 2)
b = !b
fmt.Println("background", b)
m_adapter.connectHandler(b)
}
}()
/*用户设置函数 */
m_adapter.SetConnectHandler(func(c bool) {
tt = c
})
/*主程序打印 看到后台的修改 传过来了*/
for {
time.Sleep(time.Second)
fmt.Println(tt)
count++
if count == 8 {
break
}
}
}
这个是后台传给前台---给的是api函数
本文前面我们把数据传进去 是前台传给后台