blob: b64ade1b1089292a969a96929158d1fd7e84b77e [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package ble
import (
"fmt"
"strings"
"github.com/pborman/uuid"
vdiscovery "v.io/v23/discovery"
"v.io/x/ref/lib/discovery"
)
type bleAdv struct {
serviceUUID uuid.UUID
instanceID []byte
attrs map[string][]byte
}
const (
// This uuids are v5 uuid generated out of band. These constants need
// to be accessible in all the languages that have a ble implementation
instanceUUID = "12db9a9c-1c7c-5560-bc6b-73a115c93413" // NewAttributeUUID("_instanceuuid")
interfaceNameUUID = "b2cadfd4-d003-576c-acad-58b8e3a9cbc8" // NewAttributeUUID("_interfacename")
addrsUUID = "ad2566b7-59d8-50ae-8885-222f43f65fdc" // NewAttributeUUID("_addrs")
encryptionUUID = "6286d80a-adaa-519a-8a06-281a4645a607" // NewAttributeUUID("_encryption")
)
func newAdvertisment(adv discovery.Advertisement) bleAdv {
attrs := map[string][]byte{
instanceUUID: adv.InstanceUuid,
interfaceNameUUID: []byte(adv.InterfaceName),
addrsUUID: discovery.PackAddresses(adv.Addrs),
encryptionUUID: discovery.PackEncryptionKeys(adv.EncryptionAlgorithm, adv.EncryptionKeys),
}
for k, v := range adv.Attrs {
hexUUID := discovery.NewAttributeUUID(k).String()
attrs[hexUUID] = []byte(k + "=" + v)
}
return bleAdv{
instanceID: adv.InstanceUuid,
serviceUUID: adv.ServiceUuid,
attrs: attrs,
}
}
func (a *bleAdv) toDiscoveryAdvertisement() (*discovery.Advertisement, error) {
adv := &discovery.Advertisement{
Service: vdiscovery.Service{
InstanceUuid: a.instanceID,
Attrs: make(vdiscovery.Attributes),
},
ServiceUuid: a.serviceUUID,
}
for k, v := range a.attrs {
switch k {
case instanceUUID:
adv.InstanceUuid = v
case interfaceNameUUID:
adv.InterfaceName = string(v)
case addrsUUID:
adv.Addrs = discovery.UnpackAddresses(v)
case encryptionUUID:
adv.EncryptionAlgorithm, adv.EncryptionKeys = discovery.UnpackEncryptionKeys(v)
default:
parts := strings.SplitN(string(v), "=", 2)
if len(parts) != 2 {
return nil, fmt.Errorf("incorrectly formatted value, %s", v)
}
adv.Attrs[parts[0]] = parts[1]
}
}
return adv, nil
}