[android源码解析]bluetoothd默认初始化中main.conf的解析

上文我们从总体上把握了bluetoothd启动的流程,下面我们就具体的细节来详细分析一下,首先要看到的就是init_defaults,在它里面最重要也是最有意义的就是main.conf的解析了。我们通常需要修改某个配置就去修改main.conf中的内容,那么这些内容又是如何真正被配置呢?本文就来和你一一说来。

2.2.1 默认的初始化简介

这个函数会初始化一些默认的配置,在main.conf中没有修改的参数,将会使用这里定义的,当然,若是修改过了,那就只能使用这里的参数了

[cpp]  view plain copy
  1. static void init_defaults(void)  
  2. {  
  3.     /* Default HCId settings */  
  4.     //默认的配置  
  5.     //这里的main_opts是一个全局变量  
  6.     memset(&main_opts, 0, sizeof(main_opts));  
  7.     main_opts.mode  = MODE_CONNECTABLE; //可连接的  
  8.     main_opts.name  = g_strdup("BlueZ");//名字是bluez  
  9.     main_opts.discovto  = DEFAULT_DISCOVERABLE_TIMEOUT;//默认的可发现timeout是3分钟  
  10.     main_opts.remember_powered = TRUE;  
  11.     main_opts.reverse_sdp = TRUE;  
  12.     main_opts.name_resolv = TRUE; //需要remote name request  
  13.     main_opts.link_mode = HCI_LM_ACCEPT;  
  14.     //支持role swtich以sniff,hold和park状态了  
  15.     main_opts.link_policy = HCI_LP_RSWITCH | HCI_LP_SNIFF |  
  16.                         HCI_LP_HOLD | HCI_LP_PARK;  
  17.     //这里就是获取主机的名字来作为host_name  
  18.     if (gethostname(main_opts.host_name, sizeof(main_opts.host_name) - 1) < 0)  
  19.         strcpy(main_opts.host_name, "noname");  
  20. }  

2.2.2glib命令行解析库的简单使用

         这个方法使用的目的就是避免一个一个参数进行switch的解析,就像hciattach中写的那样,大家会发现那样去解析要写很大一段代码。glib库提供了一个库函数进行解析,他会根据一个GoptionEntry结构体进行自动地解析,先来看一下GoptionEntry结构体:

[cpp]  view plain copy
  1. typedef struct {    
  2.   const gchar *long_name;  // 完整命令 如:--name    
  3.   gchar        short_name;    // 简写命令 如:-n    
  4.   gint         flags;           // GOptionFlags枚举的值    
  5.   GOptionArg   arg;    // GOptionArg枚举的值    
  6.   gpointer     arg_data; // 解析出来的数据,所要存储的位置    
  7.       
  8.   const gchar *description;  // 参数描述,--help可以查看到    
  9.   const gchar *arg_description;     
  10. } GOptionEntry;    

这样一看就感觉到很清晰了吧,就是说我们解析命令行中的参数最终把它保存到arg_data中,我们只要事先实现这个结构体就万事大吉了。

         回到我们的分析中来,我们这个结构体是实现在options中的,我们看一下它的定义:

[cpp]  view plain copy
  1. static GOptionEntry options[] = {  
  2.     { "debug"'d', G_OPTION_FLAG_OPTIONAL_ARG,  
  3.                 G_OPTION_ARG_CALLBACK, parse_debug,  
  4.                 "Specify debug options to enable""DEBUG" },  
  5.     { "plugin"'p', 0, G_OPTION_ARG_STRING, &option_plugin,  
  6.                 "Specify plugins to load""NAME,..," },  
  7.     { "noplugin"'P', 0, G_OPTION_ARG_STRING, &option_noplugin,  
  8.                 "Specify plugins not to load""NAME,..." },  
  9.     { "nodetach"'n', G_OPTION_FLAG_REVERSE,  
  10.                 G_OPTION_ARG_NONE, &option_detach,  
  11.                 "Don't run as daemon in background" },  
  12.     { "version"'v', 0, G_OPTION_ARG_NONE, &option_version,  
  13.                 "Show version information and exit" },  
  14.     { "udev"'u', 0, G_OPTION_ARG_NONE, &option_udev,  
  15.                 "Run from udev mode of operation" },  
  16.     { NULL },  
  17. };  


 

所以,很清晰把,就是我们定义了一系列的参数比如-n,后面的参数就会被保存在parse_debug中,简单吧。

         那么在我们想解析的时候该如何使用,并调用哪些函数呢?

         首先你需要调用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中的配置进行不同的设置。需要注意的是bluez中有一个main.conf的文件,然而android最终并没有使用这个文件,而是使用了system/bluetooth/data目录下的main.conf文件。

         初略地去看一下,这个文件的内容其实蛮简单的,去除掉注释就是这样的:

[plain]  view plain copy
  1. [General]  
  2. Name = %m  
  3. Class = 0x40020C  
  4. DiscoverableTimeout = 120  
  5. PairableTimeout = 0  
  6. PageTimeout = 8192  
  7. DiscoverSchedulerInterval = 30  
  8. InitiallyPowered = true  
  9. RememberPowered = false  
  10. DeviceID = android:generic:1.5  
  11. ReverseServiceDiscovery = true  
  12. NameResolving = true  
  13. DebugKeys = false  
  14. EnableLE = false  
  15. AttributeServer = false  
  16. DefaultLinkPolicy = 7  

 

下面我们就根据源码解析的代码来看一下这些参数都是什么意思

[cpp]  view plain copy
  1. static void parse_config(GKeyFile *config)  
  2. {  
  3.     GError *err = NULL;  
  4.     char *str;  
  5.     int val;  
  6.     gboolean boolean;  
  7.     //首先肯定是文件要是存在的  
  8.     if (!config)  
  9.         return;  
  10.   
  11.     DBG("parsing main.conf");  
  12.     //找到General下面的DiscoverableTimeout  
  13.     val = g_key_file_get_integer(config, "General",  
  14.                         "DiscoverableTimeout", &err);  
  15.     if (err) {  
  16.         DBG("%s", err->message);  
  17.         g_clear_error(&err);  
  18.     } else {  
  19.         //设置main_opts中的discovto参数  
  20.         //同时把flags中的HCID_SET_DISCOVTO置位  
  21.         DBG("discovto=%d", val);  
  22.         main_opts.discovto = val;  
  23.         main_opts.flags |= 1 << HCID_SET_DISCOVTO;  
  24.     }  
  25. ……  
  26.     //下面的代码就全部是类似的,不再相信分析  
  27.     //所以,都只是根据main.conf然后设置一些值,这些值将在后面才会真正用到,我们在用到的时候再来具体分析  
  28. }  


这样main.conf中的内容就被我们解析出来了,后面只要根据具体的内容做具体的配置就可以了。这些配置的值如何被使用的,我们在后面的文章中将一一介绍。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值