[android 원본 코드 해석] 블루투스 기본 초기화 중main.conf의 해석

위에서 우리는 전체적으로 블루투스 가동의 절차를 파악했다. 다음에 우리는 구체적인 세부 사항을 상세하게 분석했다. 먼저 볼 것은 initdefaults, 그 안에서 가장 중요하고 의미 있는 것은main.conf의 해석이 나왔습니다.우리는 보통 어떤 설정을 수정해야 하기 때문에main을 수정한다.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의 내용은 우리가 해석한 것이고 그 다음에 구체적인 내용에 따라 구체적인 설정을 하면 된다.이 설정의 값이 어떻게 사용되는지 뒷글에서 일일이 소개할 것입니다.
만약 이 글이 당신에게 도움이 된다고 생각되면 아래에서 마우스로 가볍게'정'을 눌러주세요. 하하~...

좋은 웹페이지 즐겨찾기