尝试在 dbus-next 中为 Bluez LEAdvertisement1 接口创建一个对象
Trying to create an object for a Bluez LEAdvertisement1 interface in dbus-next
我对 DBUS 和 BlueZ 还很陌生。我一直在遵循几个指南,直到我需要创建一个 LEAdvertisement1 接口并将其注册到 LEAdvertisingManager1。
我一直在阅读 LEAdvertisement1 的 BlueZ 文档:
Service org.bluez
Interface org.bluez.LEAdvertisement1
Object path freely definable
我不确定对象路径可自由定义是什么意思。我尝试按照 BlueZ 示例(使用 dbus-next 而不是 python),但是当我 运行 RegisterAdvertisement 时,我一直 运行ning 进入错误“org.bluez.Error.Failed”。该错误没有提供任何有用的信息,因此无法解决我 运行 dbus 监视器的问题。
sudo dbus-monitor --system "destination='org.bluez'" "sender='org.bluez'"
在监视器中我收到以下错误:
method call time=1622421524.320548 sender=:1.18 -> destination=org.freedesktop.DBus serial=71 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender=':1.37',path='/org/bluez/example/advertisement0',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',arg0='org.bluez.LEAdvertisement1'"
method return time=1622421524.320650 sender=org.freedesktop.DBus -> destination=:1.18 serial=35 reply_serial=71
method call time=1622421524.322726 sender=:1.18 -> destination=org.freedesktop.DBus serial=72 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=StartServiceByName
string ":1.37"
uint32 0
error time=1622421524.322852 sender=org.freedesktop.DBus -> destination=:1.18 error_name=org.freedesktop.DBus.Error.ServiceUnknown reply_serial=72
string "The name :1.37 was not provided by any .service files"
接口Class:
const LE_ADVERTISEMENT_IFACE = 'org.bluez.LEAdvertisement1';
const PATH_BASE = '/org/bluez/example/advertisement';
export class BLEAdvertisementInterface extends dbus.interface.Interface {
adType: string = "peripheral";
serviceUuids: Array<any> = [];
manufacturerData: any; //none
solicitUuids: Array<any> = []; //none
serviceData: any; //none
localName: string = "Testing";
includeTxPower: boolean = false;
data: any; //none
constructor() {
super(LE_ADVERTISEMENT_IFACE);
this.serviceUuids = [uuidv4()];
}
@method({ inSignature: "s", outSignature: "a{sv}" })
GetAll(): Variant {
console.log("This does not run due to service unknown error");
let includes = [];
if(this.includeTxPower) includes.push("tx-power");
const allProperties = {
LocalName: new Variant("s", this.localName),
ServiceUUIDs: new Variant("as", this.serviceUuids),
Includes: new Variant("as",includes),
Type: new Variant("s", this.adType)
};
return new Variant("a{sv}", allProperties);
}
@method({ inSignature: "", outSignature: "" })
Release() {
console.log("released!");
}
}
适配器代码(不确定我是否需要 requestName):
let advertisement = new BLEAdvertisementInterface();
this.getAdvertisingManager().RegisterAdvertisement("/org/bluez/example/advertisement0", {}).then((result: any) => {
console.log(result)
}, (err: any) => {
console.log(err);
});
我不确定我到底错过了什么。我尝试了几种方法,例如 requestName 和 export。以及检查 system.d 下的安全设置。我觉得我需要在 Linux (raspbian) 中进行一些配置才能使其正常工作,但我不确定在哪里。任何人都可以给我弄清楚下一步的任何帮助将不胜感激。大多数在线指南似乎都忽略了这一步并引用了一个库。遗憾的是他们都在 python.
BlueZ 文档:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/advertising-api.txt
BlueZ 示例:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/example-advertisement
dbus-下一个:https://github.com/dbusjs/node-dbus-next
谢谢
要使用 DBus API 在 BlueZ 中创建广告,需要做两件事。第一个是使用接口 org.bluez.LEAdvertisement1
创建一个 DBus 服务,第二个是使用 RegisterAdvertisement
.
告诉 BlueZ 该服务在哪里
从您在问题中发布的错误消息来看,BlueZ 似乎无法找到位于 /org/bluez/example/advertisement0
的服务。
我对 node-js 的经验很少,但是快速浏览一下 node-dbus-next
的文档,看起来你需要
bus.export('/org/bluez/example/advertisement0', advertisement)
发布您定义的DBus服务。
在命令行上,如果您执行 busctl list
,即使您不执行 RegisterAdvertisement
的第二步,您也应该能够看到出现了新服务。该服务将有一个唯一的名称(即 :x.xxx
),而不使用请求名称。由于安全设置,您将无法使用该服务做很多事情,但它会证明您正在发布一些东西。
下一步是向 BlueZ 注册该服务。正是在那个阶段,如果广告的格式不是 BlueZ 所期望的,您可能会看到 Failed to parse advertisement
错误。
我对 DBUS 和 BlueZ 还很陌生。我一直在遵循几个指南,直到我需要创建一个 LEAdvertisement1 接口并将其注册到 LEAdvertisingManager1。
我一直在阅读 LEAdvertisement1 的 BlueZ 文档:
Service org.bluez
Interface org.bluez.LEAdvertisement1
Object path freely definable
我不确定对象路径可自由定义是什么意思。我尝试按照 BlueZ 示例(使用 dbus-next 而不是 python),但是当我 运行 RegisterAdvertisement 时,我一直 运行ning 进入错误“org.bluez.Error.Failed”。该错误没有提供任何有用的信息,因此无法解决我 运行 dbus 监视器的问题。
sudo dbus-monitor --system "destination='org.bluez'" "sender='org.bluez'"
在监视器中我收到以下错误:
method call time=1622421524.320548 sender=:1.18 -> destination=org.freedesktop.DBus serial=71 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender=':1.37',path='/org/bluez/example/advertisement0',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',arg0='org.bluez.LEAdvertisement1'"
method return time=1622421524.320650 sender=org.freedesktop.DBus -> destination=:1.18 serial=35 reply_serial=71
method call time=1622421524.322726 sender=:1.18 -> destination=org.freedesktop.DBus serial=72 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=StartServiceByName
string ":1.37"
uint32 0
error time=1622421524.322852 sender=org.freedesktop.DBus -> destination=:1.18 error_name=org.freedesktop.DBus.Error.ServiceUnknown reply_serial=72
string "The name :1.37 was not provided by any .service files"
接口Class:
const LE_ADVERTISEMENT_IFACE = 'org.bluez.LEAdvertisement1';
const PATH_BASE = '/org/bluez/example/advertisement';
export class BLEAdvertisementInterface extends dbus.interface.Interface {
adType: string = "peripheral";
serviceUuids: Array<any> = [];
manufacturerData: any; //none
solicitUuids: Array<any> = []; //none
serviceData: any; //none
localName: string = "Testing";
includeTxPower: boolean = false;
data: any; //none
constructor() {
super(LE_ADVERTISEMENT_IFACE);
this.serviceUuids = [uuidv4()];
}
@method({ inSignature: "s", outSignature: "a{sv}" })
GetAll(): Variant {
console.log("This does not run due to service unknown error");
let includes = [];
if(this.includeTxPower) includes.push("tx-power");
const allProperties = {
LocalName: new Variant("s", this.localName),
ServiceUUIDs: new Variant("as", this.serviceUuids),
Includes: new Variant("as",includes),
Type: new Variant("s", this.adType)
};
return new Variant("a{sv}", allProperties);
}
@method({ inSignature: "", outSignature: "" })
Release() {
console.log("released!");
}
}
适配器代码(不确定我是否需要 requestName):
let advertisement = new BLEAdvertisementInterface();
this.getAdvertisingManager().RegisterAdvertisement("/org/bluez/example/advertisement0", {}).then((result: any) => {
console.log(result)
}, (err: any) => {
console.log(err);
});
我不确定我到底错过了什么。我尝试了几种方法,例如 requestName 和 export。以及检查 system.d 下的安全设置。我觉得我需要在 Linux (raspbian) 中进行一些配置才能使其正常工作,但我不确定在哪里。任何人都可以给我弄清楚下一步的任何帮助将不胜感激。大多数在线指南似乎都忽略了这一步并引用了一个库。遗憾的是他们都在 python.
BlueZ 文档:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/advertising-api.txt
BlueZ 示例:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/example-advertisement
dbus-下一个:https://github.com/dbusjs/node-dbus-next
谢谢
要使用 DBus API 在 BlueZ 中创建广告,需要做两件事。第一个是使用接口 org.bluez.LEAdvertisement1
创建一个 DBus 服务,第二个是使用 RegisterAdvertisement
.
从您在问题中发布的错误消息来看,BlueZ 似乎无法找到位于 /org/bluez/example/advertisement0
的服务。
我对 node-js 的经验很少,但是快速浏览一下 node-dbus-next
的文档,看起来你需要
bus.export('/org/bluez/example/advertisement0', advertisement)
发布您定义的DBus服务。
在命令行上,如果您执行 busctl list
,即使您不执行 RegisterAdvertisement
的第二步,您也应该能够看到出现了新服务。该服务将有一个唯一的名称(即 :x.xxx
),而不使用请求名称。由于安全设置,您将无法使用该服务做很多事情,但它会证明您正在发布一些东西。
下一步是向 BlueZ 注册该服务。正是在那个阶段,如果广告的格式不是 BlueZ 所期望的,您可能会看到 Failed to parse advertisement
错误。