122 lines
4.6 KiB
C++
122 lines
4.6 KiB
C++
// Copyright 2015 The Weave Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include <weave/device.h>
|
|
#include <weave/error.h>
|
|
|
|
#include <base/bind.h>
|
|
|
|
#include "examples/provider/avahi_client.h"
|
|
#include "examples/provider/bluez_client.h"
|
|
#include "examples/provider/curl_http_client.h"
|
|
#include "examples/provider/event_http_server.h"
|
|
#include "examples/provider/event_network.h"
|
|
#include "examples/provider/event_task_runner.h"
|
|
#include "examples/provider/file_config_store.h"
|
|
#include "examples/provider/wifi_manager.h"
|
|
|
|
class Daemon {
|
|
public:
|
|
struct Options {
|
|
bool force_bootstrapping_{false};
|
|
bool disable_privet_{false};
|
|
std::string registration_ticket_;
|
|
std::string model_id_{"AAAAA"};
|
|
|
|
static void ShowUsage(const std::string& name) {
|
|
LOG(ERROR) << "\nUsage: " << name << " <option(s)>"
|
|
<< "\nOptions:\n"
|
|
<< "\t-h,--help Show this help message\n"
|
|
<< "\t--v=LEVEL Logging level\n"
|
|
<< "\t-b,--bootstrapping Force WiFi bootstrapping\n"
|
|
<< "\t--registration_ticket=TICKET Register device with the "
|
|
"given ticket\n"
|
|
<< "\t--disable_privet Disable local privet\n";
|
|
}
|
|
|
|
bool Parse(int argc, char** argv) {
|
|
for (int i = 1; i < argc; ++i) {
|
|
std::string arg = argv[i];
|
|
if (arg == "-h" || arg == "--help") {
|
|
return false;
|
|
} else if (arg == "-b" || arg == "--bootstrapping") {
|
|
force_bootstrapping_ = true;
|
|
} else if (arg == "--disable_privet") {
|
|
disable_privet_ = true;
|
|
} else if (arg.find("--registration_ticket") != std::string::npos) {
|
|
auto pos = arg.find("=");
|
|
if (pos == std::string::npos) {
|
|
return false;
|
|
}
|
|
registration_ticket_ = arg.substr(pos + 1);
|
|
} else if (arg.find("--v") != std::string::npos) {
|
|
auto pos = arg.find("=");
|
|
if (pos == std::string::npos) {
|
|
return false;
|
|
}
|
|
logging::SetMinLogLevel(-std::stoi(arg.substr(pos + 1)));
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
Daemon(const Options& opts)
|
|
: task_runner_{new weave::examples::EventTaskRunner},
|
|
config_store_{
|
|
new weave::examples::FileConfigStore(opts.model_id_,
|
|
task_runner_.get())},
|
|
http_client_{new weave::examples::CurlHttpClient(task_runner_.get())},
|
|
network_{new weave::examples::EventNetworkImpl(task_runner_.get())},
|
|
bluetooth_{new weave::examples::BluetoothImpl} {
|
|
if (!opts.disable_privet_) {
|
|
network_->SetSimulateOffline(opts.force_bootstrapping_);
|
|
|
|
dns_sd_.reset(new weave::examples::AvahiClient);
|
|
http_server_.reset(
|
|
new weave::examples::HttpServerImpl{task_runner_.get()});
|
|
if (weave::examples::WifiImpl::HasWifiCapability())
|
|
wifi_.reset(
|
|
new weave::examples::WifiImpl{task_runner_.get(), network_.get()});
|
|
}
|
|
device_ = weave::Device::Create(config_store_.get(), task_runner_.get(),
|
|
http_client_.get(), network_.get(),
|
|
dns_sd_.get(), http_server_.get(),
|
|
wifi_.get(), bluetooth_.get());
|
|
|
|
if (!opts.registration_ticket_.empty()) {
|
|
device_->Register(opts.registration_ticket_,
|
|
base::Bind(&OnRegisterDeviceDone, device_.get()));
|
|
}
|
|
}
|
|
|
|
void Run() { task_runner_->Run(); }
|
|
|
|
weave::Device* GetDevice() const { return device_.get(); }
|
|
|
|
weave::examples::EventTaskRunner* GetTaskRunner() const {
|
|
return task_runner_.get();
|
|
}
|
|
|
|
private:
|
|
static void OnRegisterDeviceDone(weave::Device* device,
|
|
weave::ErrorPtr error) {
|
|
if (error)
|
|
LOG(ERROR) << "Fail to register device: " << error->GetMessage();
|
|
else
|
|
LOG(INFO) << "Device registered: " << device->GetSettings().cloud_id;
|
|
}
|
|
|
|
std::unique_ptr<weave::examples::EventTaskRunner> task_runner_;
|
|
std::unique_ptr<weave::examples::FileConfigStore> config_store_;
|
|
std::unique_ptr<weave::examples::CurlHttpClient> http_client_;
|
|
std::unique_ptr<weave::examples::EventNetworkImpl> network_;
|
|
std::unique_ptr<weave::examples::BluetoothImpl> bluetooth_;
|
|
std::unique_ptr<weave::examples::AvahiClient> dns_sd_;
|
|
std::unique_ptr<weave::examples::HttpServerImpl> http_server_;
|
|
std::unique_ptr<weave::examples::WifiImpl> wifi_;
|
|
std::unique_ptr<weave::Device> device_;
|
|
};
|