File: obex_push.go

package info (click to toggle)
golang-github-muka-go-bluetooth 5.60-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,688 kB
  • sloc: makefile: 92; sh: 2
file content (133 lines) | stat: -rw-r--r-- 3,031 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//this example starts discovery on adapter
//after discovery process GetDevices method
//returns list of discovered devices
//then with the help of mac address
//connectivity starts
//once sensors are connected it will
//fetch sensor name,manufacturer detail,
//firmware version, hardware version, model
//and sensor data...

package obex_push_example

import (
	"sync"
	"time"

	"github.com/muka/go-bluetooth/api"
	"github.com/muka/go-bluetooth/bluez/profile/obex"
	log "github.com/sirupsen/logrus"
)

var wg sync.WaitGroup

func Run(targetAddress, filePath, adapterID string) error {

	a, err := api.GetAdapter(adapterID)
	if err != nil {
		return err
	}

	dev, err := a.GetDeviceByAddress(targetAddress)
	if err != nil {
		return err
	}

	log.Debugf("device %s (%s)", dev.Properties.Name, dev.Properties.Address)

	if dev == nil {
		return err
	}

	props, err := dev.GetProperties()
	if err != nil {
		return err
	}
	if !props.Paired {
		log.Debug("not paired")

		err = dev.Pair()
		if err != nil {
			return err
		}

	} else {
		log.Debug("already paired")
	}

	sessionArgs := map[string]interface{}{}
	sessionArgs["Target"] = "opp"

	obexClient := obex.NewObexClient1()

	tries := 1
	maxRetry := 20
	var sessionPath string
	for tries < maxRetry {

		log.Debug("Create Session...")
		sessionPath, err = obexClient.CreateSession(targetAddress, sessionArgs)
		if err == nil {
			break
		}

		tries++

		if err != nil {
			return err
		}
	}
	if tries >= maxRetry {
		log.Fatal("Max tries reached")
	}

	log.Debug("Session created: ", sessionPath)

	obexSession := obex.NewObexSession1(sessionPath)
	sessionProps, err := obexSession.GetProperties()
	if err != nil {
		return err
	}

	log.Debug("Source		: ", sessionProps.Source)
	log.Debug("Destination	: ", sessionProps.Destination)
	log.Debug("Channel		: ", sessionProps.Channel)
	log.Debug("Target		: ", sessionProps.Target)
	log.Debug("Root			: ", sessionProps.Root)

	log.Debug("Init transmission on ", sessionPath)
	obexObjectPush := obex.NewObjectPush1(sessionPath)
	log.Debug("Send File: ", filePath)
	transPath, transProps, err := obexObjectPush.SendFile(filePath)
	if err != nil {
		return err
	}

	log.Debug("Transmission initiated: ", transPath)
	log.Debug("Status      : ", transProps.Status)
	log.Debug("Session     : ", transProps.Session)
	log.Debug("Name        : ", transProps.Name)
	log.Debug("Type        : ", transProps.Type)
	log.Debug("Time        : ", transProps.Time)
	log.Debug("Size        : ", transProps.Size)
	log.Debug("Transferred : ", transProps.Transferred)
	log.Debug("Filename    : ", transProps.Filename)

	for transProps.Transferred < transProps.Size {
		time.Sleep(1 * time.Second)

		obexTransfer := obex.NewObexTransfer1(transPath)
		transProps, err = obexTransfer.GetProperties()
		if err != nil {
			return err
		}
		transferedPercent := (100 / float64(transProps.Size)) * float64(transProps.Transferred)

		log.Debug("Progress    : ", transferedPercent)
	}

	obexClient.RemoveSession(sessionPath)
	log.Debug(sessionPath)

	return nil
}