我们已经将ledflasher与ledservice集成进了系统。今天主要就是如何使用Brillo系统提供的API去设置LED灯的状态。去查询命令执行的状态。
本来是很简单的的几行代码,于为对JSON不熟,花了很长的时候去调试。
- 通过/privet/v3/commands/execute接口去设置LED灯的状态
如将LED 2设为on的状态,可以这么写:
curl -H 'Authorization: Privet Q7ocAjrETlRo4hifxHoTkLJWmRZ9Z0wfD4sbpOzTHmAzOjE6MTQ1MTIwMjg4NA==' -H 'Content-Type: application/json' -X POST --data '{ "id": "123", "component": "ledflasher", "name": "_ledflasher._set", "parameters": { "_led": 2, "_on": true } }' -k https://10.0.0.18/privet/v3/commands/execute
NOTE: 这里一定要注意JSON的语法,parameters中的_led值是int类型的参数,而_on是bool类型的参数,也就是说这两个值不能带双引号。如果带了双引号,那么系统就会将这两个值当写符串来处理。我之前就是因为觉常上引号会好看一些,并且想当然地认为系统会自动转换为所需的类型,于是花了一天半的时间来解这个问题。
关于命令的语法:
- id: string类型,可以是任意的字串,如果你执行命令的时候不带id号,系统会自动帮你生成一个。
- component: string类型,可以不指定。如果不指定,系统会从name中取得。
- name: string类型,格式通常是<component name>.<command name>。实际是要和代码一致的。
- parameters: json对象,看实际需要。
NOTE: 先看一下相关的代码:product/google/example-ledflasher/src/ledflasher/ledflasher.cc
int Daemon::OnInit() { int return_code = brillo::DBusDaemon::OnInit(); if (return_code != EX_OK) return return_code; device_ = weaved::Device::CreateInstance( bus_, base::Bind(&Daemon::UpdateDeviceState, base::Unretained(this))); device_->AddComponent(kWeaveComponent, {"_ledflasher"}); device_->AddCommandHandler( kWeaveComponent, "_ledflasher._set", base::Bind(&Daemon::OnSet, base::Unretained(this))); device_->AddCommandHandler( kWeaveComponent, "_ledflasher._toggle", base::Bind(&Daemon::OnToggle, base::Unretained(this))); device_->AddCommandHandler( kWeaveComponent, "_ledflasher._animate", base::Bind(&Daemon::OnAnimate, base::Unretained(this))); led_object_mgr_.reset(new com::android::LEDService::ObjectManagerProxy{bus_}); led_object_mgr_->SetServiceAddedCallback( base::Bind(&Daemon::OnLEDServiceConnected, base::Unretained(this))); led_object_mgr_->SetServiceRemovedCallback( base::Bind(&Daemon::OnLEDServiceDisconnected, base::Unretained(this))); LOG(INFO) << "Waiting for commands..."; return EX_OK; }
可以看到component的名字,name都是要和代码相同。
- 通过/privet/v3/commands/list接口查询之前执行过的命令
如我们之前执行了一条命令使LED 2为on的状态,调用这个接口,我们就可以看到:
$ curl -H 'Authorization: Privet Q7ocAjrETlRo4hifxHoTkLJWmRZ9Z0wfD4sbpOzTHmAzOjE6MTQ1MTIwMjg4NA==' -H 'Content-Type: application/json' -k https://10.0.0.18/privet/v3/commands/list { "commands": [ { "id": "123", "name": "_ledflasher._set", "parameters": { "_led": 2, "_on": true }, "progress": { }, "results": { }, "state": "done" } ] }
通过/privet/v3/commands/status接口查询命令执行的状态
查询命令需要带id号:
$ curl -H 'Authorization: Privet Q7ocAjrETlRo4hifxHoTkLJWmRZ9Z0wfD4sbpOzTHmAzOjE6MTQ1MTIwMjg4NA==' -H 'Content-Type: application/json' -k https://10.0.0.18/privet/v3/commands/list { "commands": [ { "id": "123", "name": "_ledflasher._set", "parameters": { "_led": 2, "_on": true }, "progress": { }, "results": { }, "state": "done" } ] }
可以看到这条命令执行的状态为done了。
- 如行调试dbus
当 然,花了这么长时间去调试,也并不是一无所获。除了知道在调用这些API的基本流程是怎样的,还知道使有dbus-monitor去debug:
$ adb shell dbus-monitor --system signal sender=org.freedesktop.DBus -> dest=:1.17 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired string ":1.17" signal sender=:1.15 -> dest=(null destination) serial=108 path=/com/android/Weave; interface=org.freedesktop.DBus.ObjectManager; member=InterfacesAdded object path "/com/android/Weave/commands/3" array [ dict entry( string "com.android.Weave.Command" array [ dict entry( string "Component" variant string "ledflasher" ) dict entry( string "Id" variant string "2" ) dict entry( string "Name" variant string "_ledflasher._set" ) dict entry( string "Origin" variant string "local" ) dict entry( string "Parameters" variant array [ dict entry( string "_led" variant int32 3 ) dict entry( string "_on" variant boolean true ) ] ) dict entry( string "Progress" variant array [ ] ) dict entry( string "Results" variant array [ ] ) dict entry( string "State" variant string "queued" ) ] ) ] signal sender=:1.15 -> dest=(null destination) serial=109 path=/com/android/Weave; interface=org.freedesktop.DBus.ObjectManager; member=InterfacesAdded object path "/com/android/Weave/commands/3" array [ dict entry( string "org.freedesktop.DBus.Properties" array [ ] ) ] signal sender=:1.15 -> dest=(null destination) serial=111 path=/com/android/Weave/commands/3; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged string "com.android.Weave.Command" array [ dict entry( string "State" variant string "done" ) ] array [ ] signal sender=:1.7 -> dest=(null destination) serial=494 path=/service/0; interface=org.chromium.flimflam.Service; member=PropertyChanged string "WiFi.FrequencyList" variant array [ uint16 2412 ] signal sender=:1.7 -> dest=(null destination) serial=495 path=/service/0; interface=org.chromium.flimflam.Service; member=PropertyChanged string "Strength" variant byte 86