[android 원본 코드 해석] 블루투스 기본 초기화 중main.conf의 해석
5381 단어 androidglibbluetoothdmain.conf
2.2.1 기본 초기화 소개
이 함수는main.에서 기본 설정을 초기화합니다.conf에 수정된 매개 변수가 없습니다. 여기 정의된 매개 변수를 사용할 것입니다. 물론 수정된 매개 변수는 여기 있는 매개 변수만 사용할 수 있습니다.
static void init_defaults(void)
{
/* Default HCId settings */
//
// main_opts
memset(&main_opts, 0, sizeof(main_opts));
main_opts.mode = MODE_CONNECTABLE; //
main_opts.name = g_strdup("BlueZ");// bluez
main_opts.discovto = DEFAULT_DISCOVERABLE_TIMEOUT;// timeout 3
main_opts.remember_powered = TRUE;
main_opts.reverse_sdp = TRUE;
main_opts.name_resolv = TRUE; // remote name request
main_opts.link_mode = HCI_LM_ACCEPT;
// role swtich sniff,hold park
main_opts.link_policy = HCI_LP_RSWITCH | HCI_LP_SNIFF |
HCI_LP_HOLD | HCI_LP_PARK;
// host_name
if (gethostname(main_opts.host_name, sizeof(main_opts.host_name) - 1) < 0)
strcpy(main_opts.host_name, "noname");
}
2.2.2glib 명령행 해석 라이브러리의 간단한 사용
이 방법을 사용하는 목적은 하나의 매개 변수가 switch의 해석을 하는 것을 피하는 것이다. hciattach에서 쓴 것처럼 그렇게 해석하려면 큰 코드를 써야 한다는 것을 발견할 수 있다.glib 라이브러리는 GoptionEntry 구조체에 따라 자동으로 해석되는 라이브러리 함수를 제공합니다. 먼저 GoptionEntry 구조체를 살펴보겠습니다.
typedef struct {
const gchar *long_name; // :--name
gchar short_name; // :-n
gint flags; // GOptionFlags
GOptionArg arg; // GOptionArg
gpointer arg_data; // ,
const gchar *description; // ,--help
const gchar *arg_description;
} GOptionEntry;
이렇게 보면 또렷해지죠. 명령줄의 매개 변수를 분석하여 최종적으로arg 에 저장하는 거예요.데이터에서 우리는 이 구조체를 사전에 실현하기만 하면 만사대길하다.
우리의 분석으로 돌아가면 이 구조체는 옵션에 실현된 것이다. 그 정의를 살펴보자.
static GOptionEntry options[] = {
{ "debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
G_OPTION_ARG_CALLBACK, parse_debug,
"Specify debug options to enable", "DEBUG" },
{ "plugin", 'p', 0, G_OPTION_ARG_STRING, &option_plugin,
"Specify plugins to load", "NAME,..," },
{ "noplugin", 'P', 0, G_OPTION_ARG_STRING, &option_noplugin,
"Specify plugins not to load", "NAME,..." },
{ "nodetach", 'n', G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &option_detach,
"Don't run as daemon in background" },
{ "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
"Show version information and exit" },
{ "udev", 'u', 0, G_OPTION_ARG_NONE, &option_udev,
"Run from udev mode of operation" },
{ NULL },
};
그래서 분명히 말하자면 우리가 일련의 매개 변수를 정의했다. 예를 들어 n, 뒤에 있는 매개 변수는parsedebug 중, 간단하죠.
그렇다면 우리가 해석하고 싶을 때 어떻게 사용하고 어떤 함수를 호출해야 하는가?
우선 context=g 를 호출해야 합니다option_context_new(NULL);goptioncontext를 만들고
g 호출option_context_add_main_entries(context,options, NULL);해당 GoptionEntry와 연결하면 아래에서 호출 가능option_context_parse(context, &argc, &argv, &err)로 전송된 파라미터를 분석했습니다. 마지막으로 g 를 호출하는 것을 잊지 마십시오.option_context_free에서 대응하는 goptioncontext를 방출합니다. 그렇지 않으면 메모리 유출이 발생할 수 있습니다.
2.2.3main.conf의 해석
이 함수는main에 근거한 것이다.conf의 설정은 다른 설정을 진행합니다.주의해야 할 것은 블루즈 중 하나의main.conf 파일,android는 결국 이 파일을 사용하지 않고 시스템/bluetooth/data 디렉터리의main을 사용합니다.conf 파일.
처음에 살펴보면 이 문서의 내용은 사실 매우 간단하다. 주석을 제거하면 바로 이렇다.
[General]
Name = %m
Class = 0x40020C
DiscoverableTimeout = 120
PairableTimeout = 0
PageTimeout = 8192
DiscoverSchedulerInterval = 30
InitiallyPowered = true
RememberPowered = false
DeviceID = android:generic:1.5
ReverseServiceDiscovery = true
NameResolving = true
DebugKeys = false
EnableLE = false
AttributeServer = false
DefaultLinkPolicy = 7
다음은 원본 코드로 해석된 코드에 근거하여 이 매개 변수들이 모두 무슨 뜻인지 살펴보자
static void parse_config(GKeyFile *config)
{
GError *err = NULL;
char *str;
int val;
gboolean boolean;
//
if (!config)
return;
DBG("parsing main.conf");
// General DiscoverableTimeout
val = g_key_file_get_integer(config, "General",
"DiscoverableTimeout", &err);
if (err) {
DBG("%s", err->message);
g_clear_error(&err);
} else {
// main_opts discovto
// flags HCID_SET_DISCOVTO
DBG("discovto=%d", val);
main_opts.discovto = val;
main_opts.flags |= 1 << HCID_SET_DISCOVTO;
}
……
// ,
// , main.conf , ,
}
이렇게conf의 내용은 우리가 해석한 것이고 그 다음에 구체적인 내용에 따라 구체적인 설정을 하면 된다.이 설정의 값이 어떻게 사용되는지 뒷글에서 일일이 소개할 것입니다.
만약 이 글이 당신에게 도움이 된다고 생각되면 아래에서 마우스로 가볍게'정'을 눌러주세요. 하하~...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.