麦步社区-论坛

标题: 蓝牙状态判断的代码示例,请需要的同学参考或完善 [打印本页]

作者: dscao    时间: 2016-1-9 01:02
标题: 蓝牙状态判断的代码示例,请需要的同学参考或完善


之前蓝牙状态一直说os未支持,直到前几天Timex表盘发布时实现了蓝牙状态的功能,其作者diablozhu开源了这个代码。
经他提醒后来发现:
enum BleStatus{
BLE_STATUS_ADVERTISING, // 广播
BLE_STATUS_CONNECTED, // 被连接
BLE_STATUS_USING, // 使用中(发送数据中)
BLE_STATUS_CLOSE // 该状态蓝牙被关闭 (这个在测试中好像无论什么状态总是返回真,不知哪里出了问题。)
};




晚上我也研究一差不多一个通宵了,前期一直没搞定,后来直接使用了diablozhu的部分代码,并作一两句一两句增加代码、安装测试的方式,终于完成了多显表盘的蓝牙状态功能。后来发现蓝牙状态通讯时也是一个状态,参数中有一个断开,但用了断开参数好像决断不准,无论连接状态如何,断开总是true。还有一些函数或参数不支持,有些能编译但安装不了,有些也不能编译。虽然后来也列了一个可用函数列表,但总之现在调试代码还是非常麻烦。

最后使用了以下代码:

  1. /*蓝牙状态更改*/
  2.         GBitmap bitmap_ble_con;
  3.         GBitmap bitmap_ble_discon;
  4.         GRect frame_ble = {{MWD_BLE_ORIGIN_X, MWD_BLE_ORIGIN_Y}, {MWD_BLE_SIZE_H, MWD_BLE_SIZE_W}};
  5.         res_get_user_bitmap(RES_BITMAP_BLE_CONNECTED, &bitmap_ble_con);
  6.         res_get_user_bitmap(RES_BITMAP_BLE_DISCONNECTED, &bitmap_ble_discon);
  7.         LayerBitmap layer_bitmap_ble_con = { bitmap_ble_con,frame_ble,GAlignCenter };
  8.         LayerBitmap layer_bitmap_ble_discon = { bitmap_ble_discon,frame_ble,GAlignCenter };
  9.         enum BleStatus ble_sta;
  10.         ble_sta = maibu_get_ble_status();  //获取蓝牙状态
  11.         if (ble_sta != BLE_STATUS_CONNECTED && ble_sta != BLE_STATUS_USING) {
  12.                 if (g_official_bledis == 0)
  13.                 {
  14.                 P_Layer layer_ble_new = app_layer_create_bitmap(&layer_bitmap_ble_discon);
  15.                 app_layer_set_bg_color(layer_ble_new, GColorBlack);
  16.                 g_app_mwd_ble_layer_id = app_window_replace_layer(p_window, p_ble_layer, layer_ble_new);
  17.                 app_window_update(p_window);
  18.                 g_official_bledis = 1;
  19.                 maibu_service_vibes_pulse(VibesPulseTypeShort,1); //调用短振动1次,本想用一次长振动,当时测试无效。
  20.                 }
  21.         }
  22.         else if (ble_sta = BLE_STATUS_CONNECTED) {
  23.                 if (g_official_bledis == 1)
  24.                 {
  25.                 P_Layer layer_ble_new = app_layer_create_bitmap(&layer_bitmap_ble_con);
  26.                 app_layer_set_bg_color(layer_ble_new, GColorBlack);
  27.                 g_app_mwd_ble_layer_id = app_window_replace_layer(p_window, p_ble_layer, layer_ble_new);
  28.                 app_window_update(p_window);
  29.                 g_official_bledis = 0;
  30.                 }
  31.         }
复制代码



作者: 陶坤@麦步    时间: 2016-1-9 10:46
有心了,互帮互助,手动点赞
作者: diablozhu    时间: 2016-1-9 20:39
本帖最后由 diablozhu 于 2016-1-9 20:40 编辑

确实BLE_STATUS_CLOSE 这个状态有点奇怪,所以后来就改成那样了
还有1秒检测是不是有些太频繁了,对续航有没有影响?这也是我用10秒的原因

作者: dscao    时间: 2016-1-10 19:45
diablozhu 发表于 2016-1-9 20:39
确实BLE_STATUS_CLOSE 这个状态有点奇怪,所以后来就改成那样了
还有1秒检测是不是有些太频繁了,对续航有 ...

是啊,不清楚这个检测对耗电的影响有多大,与即时性之间的权衡什么样才是最佳的。可能需要长时间的对比测试才知道。希望官方也有这方面的数据。
最好是蓝牙状态由系统级的事件来判断,看sdk后期应该会加上这个。

enum SysEventType
{
        SysEventTypeTimeChange,                //时间更改
        SysEventTypeBleConnected,           //被连接
        SysEventTypeBleDisconnected          //断开连接
};


typedef void(*AppServiceSysEventCallback)(enum SysEventType type, void *context);

void maibu_service_sys_event_subscribe(AppServiceSysEventCallback sys_event_callback);

void maibu_set_app_exit_time(uint32_t time);

作者: achen    时间: 2016-1-10 21:18
感觉,手表的耗电还好,但手机太耗电了:L
作者: 陶坤@麦步    时间: 2016-1-11 08:33
achen 发表于 2016-1-10 21:18
感觉,手表的耗电还好,但手机太耗电了

有耗电分析占比不?
作者: Zola    时间: 2016-1-11 20:30
我的代码是这样才工作起来:
/*蓝牙状态*/
enum BleStatus{
BLE_STATUS_ADVERTISING, // 广播
BLE_STATUS_CONNECTED, // 被连接
BLE_STATUS_USING, // 使用中(发送数据中)
BLE_STATUS_CLOSE // 该状态蓝牙被关闭
};


enum AppCommStatus{
APP_COMM_STATUS_ADVERTISING,  //广播
APP_COMM_STATUS_CONNECTED,   //被连接
APP_COMM_STATUS_AVAILABLE,  //可用
APP_COMM_STATUS_BUSY,
APP_COMM_STATUS_DISCONNECTED  //断开连接
};


enum AppCommStatus  ble_sta;

ble_sta = maibu_get_ble_status();  //获取蓝牙状态

if (ble_sta != BLE_STATUS_CONNECTED && ble_sta != BLE_STATUS_USING)   //如果蓝牙断开
        {
        ble_staus_event = 1;
        }
作者: Zola    时间: 2016-1-12 21:23
我再次找了一下官方发布的API,提到 maibu_get_ble_status()  返回的是enum AppCommStatus类型,但实际应用中,应该返回了上面enum BleStatus 枚举的类型之一。而官方API没有提到maibu_get_ble_status会是哪些数据。

enum SysEventType也现在也只有SysEventTypeTimeChange     这一个参数了,原来早期的API版本里有提到蓝牙状态的SysEventType。

看来API还是没有稳定下来,将来表盘还得继续改:'(:'(
作者: Ken_KgiV2    时间: 2016-1-23 00:02
根据楼上的特工局代码,我增加了debounce时间以及振动次数的控制
// ~constay --~disdebounce-- disstart --~distimes*disinter-- disend -- ~disandconbt -- conend--~contimes*coninter--constart--~condebounce--disstay

#define CONSTAYNUM 3  // 一般不用动
#define DISDEBOUNCE 5  // 断开的debounce次数
#define DISSTARTNUM (CONSTAYNUM + DISDEBOUNCE)
#define DISVIBTIMES 3  //断开的振动次数
#define DISVIBINTER 2 // 断开的振动间隔
#define DISENDNUM (DISSTARTNUM + DISVIBTIMES*DISVIBINTER)
#define DISVIB 1  //断开是否振动
#define CONVIB 0 //连通是否振动
#define DISANDCONBT 4
#define CONENDNUM (DISENDNUM + DISANDCONBT)
#define CONDEBOUNCE 5 //连通的debounce次数
#define CONSTARTNUM (CONENDNUM + CONVIBTIMES*CONVIBINTER)
#define CONVIBTIMES 1 //连通的振动次数
#define CONVIBINTER 2 //连通的振动间隔
#define DISSTAYNUM (CONSTARTNUM + CONDEBOUNCE)
在表盘初始化的时候判断蓝牙状态后对变量赋值
enum AppCommStatus  ble_sta;

ble_sta = maibu_get_ble_status();  //获取蓝牙状态

if (ble_sta != BLE_STATUS_CONNECTED && ble_sta != BLE_STATUS_USING)   //如果蓝牙断开
        {
        ble_staus_event = DISSTAYNUM;
        }else
        {
                ble_staus_event = CONSTAYNUM;
        }

然后在注册的timer函数里面修改判断条件。
enum AppCommStatus  ble_sta;

ble_sta = maibu_get_ble_status();  //获取蓝牙状态

if (ble_sta != BLE_STATUS_CONNECTED && ble_sta != BLE_STATUS_USING)   //如果蓝牙断开
        {
                if ((ble_staus_event >= CONENDNUM) && (ble_staus_event < DISSTAYNUM))
                                ble_staus_event = CONSTAYNUM;
                ble_staus_event ++;

                if(ble_staus_event > DISSTAYNUM)
                {
                        ble_staus_event = DISSTAYNUM;
                        return;
                }
                if(ble_staus_event == DISSTARTNUM)
                {
                        // show disconnected picture
                        P_Layer p_ble_layer = app_window_get_layer_by_id(p_window, g_app_mwd_layer_ble_id);
                        if (NULL == p_ble_layer)
                        {
                                return;
                        }
                        GBitmap bitmap_ble2;
                        res_get_user_bitmap(BLE_DISCONNECTED, &bitmap_ble2);
                        app_layer_set_bitmap_bitmap(p_ble_layer, &bitmap_ble2);
                        app_window_update(p_window);
                }
                if(( ble_staus_event >= DISSTARTNUM ) && ( ble_staus_event < DISENDNUM ) && (DISVIB == 1))
                {
                        if(((ble_staus_event - DISSTARTNUM) % DISVIBINTER) == 0 )
                                maibu_service_vibes_pulse(VibesPulseTypeShort,1); //调用短振动1次,
                }
                if( ble_staus_event >= DISENDNUM)
                        ble_staus_event = DISSTAYNUM;
        }
        else if (ble_sta = BLE_STATUS_CONNECTED) //如果系统事件是蓝牙連接
        {
                        if ((ble_staus_event < DISENDNUM) && (ble_staus_event > CONSTAYNUM))
                                ble_staus_event = DISSTAYNUM;
                        ble_staus_event --;

                        if(ble_staus_event < CONSTAYNUM)
                        {
                                ble_staus_event = CONSTAYNUM;
                                return;
                        }       
                        if( ble_staus_event == CONSTARTNUM )
                        {
                                // show connected picture
                                P_Layer p_ble_layer = app_window_get_layer_by_id(p_window, g_app_mwd_layer_ble_id);
                                if (NULL == p_ble_layer)
                                {
                                        return;
                                }
                                GBitmap bitmap_ble2;       
                                ble_staus_event = 0;
                                res_get_user_bitmap(BLE_CONNECTED, &bitmap_ble2);
                                app_layer_set_bitmap_bitmap(p_ble_layer, &bitmap_ble2);
                                app_window_update(p_window);
                        }
                        if(( ble_staus_event <= CONSTARTNUM ) && ( ble_staus_event > CONENDNUM ) && (CONVIB == 1))
                        {
                                if((( CONSTARTNUM - ble_staus_event) % CONVIBINTER) == 0 )
                                        maibu_service_vibes_pulse(VibesPulseTypeShort,1); //调用短振动1次,
                        }
                        if( ble_staus_event <= CONENDNUM)
                                ble_staus_event = CONSTAYNUM;
        }       




欢迎光临 麦步社区-论坛 (http://bbs.maibu.cc/) Powered by Discuz! X3.2