Ejemplo n.º 1
0
 def do_connect(self, params):
     try:
         l = int(params)
     except ValueError:
         print "*** argument should be number"
         return
     except IndexError:
         print "*** connect takes at least one parameter"
         return
     dev_id = l
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if len(connected_devices.keys()) >= 5:
         print(
             "Can't connect to more than 5 devices at the same time, disconnect some"
         )
     else:
         if ((args.mode == "db"
              and mb2db.is_device_registered(mb2db.cnxn,
                                             self.mibands.keys()[dev_id]))
                 or args.mode == "json" and self.mibands.keys()[dev_id]
                 in self.registered_devices):
             if self.mibands.keys()[dev_id] in connected_devices.keys():
                 print("That MiBand2 is already connected")
             else:
                 try:
                     addr = self.mibands.keys()[dev_id]
                     self.scd.tmp_devices[addr]["strikes"] = -9999
                     if not addr in self.devices_keys.keys():
                         self.devices_keys[addr] = random_key()
                     mb2 = MiBand2(addr,
                                   self.devices_keys[addr],
                                   initialize=False)
                     connected_devices[self.mibands.keys()[dev_id]] = mb2
                     if args.mode == "db":
                         alarms = mb2db.get_device_alarms(
                             mb2db.cnxn, mb2.addr)
                         mb2db.update_battery(mb2db.cnxn, mb2.addr,
                                              mb2.battery_info['level'])
                     else:
                         if mb2.addr in self.devices_alarms.keys():
                             alarms = self.devices_alarms[mb2.addr]
                         else:
                             alarms = []
                     for a in alarms:
                         mb2.alarms += [
                             MiBand2Alarm(a["hour"],
                                          a["minute"],
                                          enabled=a["enabled"],
                                          repetitionMask=a["repetition"])
                         ]
                 except BTLEException as e:
                     print(
                         "There was a problem connecting to this MiBand2, try again later"
                     )
                     print e
         else:
             print(
                 "You have to register the MiBand2 before connecting to it")
Ejemplo n.º 2
0
def do_fetch_activity(item, cmd):
    print "Fetching MiBand2 [%s] activity!" % item
    if item not in connected_devices.keys():
        try:
            if not item in cmd.devices_keys.keys():
                cmd.devices_keys[item] = random_key()
            mb2 = MiBand2(addr, self.devices_keys[item], initialize=False)
            connected_devices[item] = mb2
        except BTLEException as e:
            print("There was a problem connecting this MiBand2, try again later")
            print e
    try:
        if args.mode == "db":
            last_sync = mb2db.get_device_last_sync(mb2db.cnxn, item)
        else:
            last_sync = None
            if item in cmd.devices_last_sync.keys():
                last_sync = cmd.devices_last_sync[item]
        if last_sync != None:
            connected_devices[item].setLastSyncDate(last_sync)
        connected_devices[item].send_alert(b'\x03')
        connected_devices[item].fetch_activity_data()
        connected_devices[item].send_alert(b'\x03')
        if len(connected_devices[item].getActivityDataBuffer()) > 0:
            print "Saving Data to DB..."
            if args.mode == "db":
                mb2db.write_activity_data(mb2db.cnxn, connected_devices[item])
            else:
                connected_devices[item].store_activity_data_file(base_route + '/localdata/activity_log/')
        print "Finished fetching MiBand2 [%s] activity!" % item
    except BTLEException as e:
        print("There was a problem retrieving this MiBand2's activity, try again later")
        print e
Ejemplo n.º 3
0
def do_fetch_activity(item):
    print "Fetching MiBand2 [%s] activity!" % item
    if item not in connected_devices.keys():
        try:
            mb2 = MiBand2(item, initialize=False)
            connected_devices[item] = mb2
        except BTLEException as e:
            print(
                "There was a problem connecting this MiBand2, try again later")
            print e
    try:
        last_sync = mb2db.get_device_last_sync(cnxn_string, item)
        if last_sync != None:
            connected_devices[item].setLastSyncDate(last_sync)
        connected_devices[item].send_alert(b'\x03')
        connected_devices[item].fetch_activity_data()
        connected_devices[item].send_alert(b'\x03')
        if len(connected_devices[item].getActivityDataBuffer()) > 0:
            print "Saving Data to DB..."
            mb2db.write_activity_data(cnxn_string, connected_devices[item])
        print "Finished fetching MiBand2 [%s] activity!" % item
    except BTLEException as e:
        print(
            "There was a problem retrieving this MiBand2's activity, try again later"
        )
        print e
Ejemplo n.º 4
0
def devices():
    if request.method == "GET":
        dev_list = []
        print(connected_devices)
        mibands = copy.deepcopy(tmp_mibands)
        for idx, mb in enumerate(mibands.keys()):
            dev_id = mb2db.get_device_id(cnxn_string, mb)
            dev_user = mb2db.get_device_user(cnxn_string, dev_id)
            device = mb2db.get_device_by_id(cnxn_string, dev_id)
            battery = -1
            if device:
                battery = device.bateria
            username = (dev_user.nombre + " " +
                        dev_user.apellidos) if dev_user else "Unregistered"
            dev_dict = {
                "address": mb,
                "signal": mibands[mibands.keys()[idx]].rssi,
                "registered": False,
                "connected": False,
                "dev_id": dev_id,
                "user_name": username,
                "battery": battery,
                "strikes": strikes[mibands[mibands.keys()[idx]].addr.upper()]
            }
            if mb2db.is_device_registered(cnxn_string, mb):
                dev_dict["registered"] = True
            if mb in connected_devices.keys():
                dev_dict["connected"] = True
            dev_list += [dev_dict]
        print json.dumps(dev_list)
        return json.dumps(dev_list)
    elif request.method == "POST":
        addr = request.form["address"].upper()
        if mb2db.is_device_registered(cnxn_string, addr):
            abort(403)
        else:
            try:
                strikes[addr] = -9999
                mb2 = MiBand2(addr, initialize=True)
                mb2.cleanAlarms()
                dev_id = mb2db.register_device(cnxn_string, mb2.addr)
                mb2db.delete_all_alarms(cnxn_string, dev_id)
                mb2db.update_battery(cnxn_string, mb2.addr,
                                     mb2.battery_info['level'])
                # Device stays connected after initialize, but we don't want that
                mb2.disconnect()
                strikes[addr] = 0
                return json.dumps({"dev_id": dev_id, "registered": True})
            except BTLEException as e:
                print(
                    "There was a problem registering this MiBand2, try again later"
                )
                print e
                abort(500)
            except BTLEException.DISCONNECTED as d:
                print("Device disconnected, removing from connected devices")
                del connected_devices[addr]
                del mb2
                abort(500)
Ejemplo n.º 5
0
def main():
    """ main func """
    parser = argparse.ArgumentParser()
    parser.add_argument('host', action='store', help='MAC of BT device')
    parser.add_argument('-t',
                        action='store',
                        type=float,
                        default=3.0,
                        help='duration of each notification')

    parser.add_argument('--init', action='store_true', default=False)
    parser.add_argument('-n', '--notify', action='store_true', default=False)
    parser.add_argument('-hrm', '--heart', action='store_true', default=False)
    parser.add_argument('-act',
                        '--activity',
                        action='store_true',
                        default=False)
    parser.add_argument(
        '-sn',
        '--since',
        action='store',
        type=str,
        default="2018-04-06 00:00",
        help=
        'optional date to retrieve activity since, format "YYYY-MM-DD hh:mm"')
    parser.add_argument('-de',
                        '--devevent',
                        action='store_true',
                        default=False)
    arg = parser.parse_args(sys.argv[1:])

    print('Connecting to ' + arg.host)
    band = MiBand2(arg.host, initialize=arg.init)

    if arg.notify:
        print("Sending message notification...")
        band.send_alert(b'\x01')
        time.sleep(arg.t)
        print("Sending phone notification...")
        band.send_alert(b'\x02')
        time.sleep(arg.t)
        print("Turning off notifications...")
        band.send_alert(b'\x00')

    if arg.heart:
        band.monitorHeartRate()

    if arg.activity:
        band.setLastSyncDate(arg.since)
        band.fetch_activity_data()

    if arg.devevent:
        band.event_listen()

    print("Disconnecting...")
    band.disconnect()
    del band
Ejemplo n.º 6
0
def main():
    sc = Scanner()
    devs = sc.scan(5)

    if (len(devs) > 0):
        mb2 = MiBand2(devs[0])
    else:
        exit()

    mb2.authenticate()

    mb2.setDelegate(ActivityDelegate(mb2))

    mb2.req_battery()

    print(mb2.battery_info)
Ejemplo n.º 7
0
def do_fetch_activity(item, silent_fetch):
    print "Fetching MiBand [%s] activity!" % item
    disconnect_after = False
    if item not in connected_devices.keys():
        try:
            disconnect_after = True
            if not item in devices_keys.keys():
                key = DEFAULT_KEY
            else:
                key = devices_keys[item.upper()]
            if model[item] == "mb2":
                mb = MiBand2(item, key, initialize=False)
            elif model[item] == "mb3":
                mb = MiBand3(item, key, initialize=False)
            connected_devices[item] = mb
        except BTLEException as e:
            print(
                "There was a problem connecting this MiBand, try again later")
            print e
            if item in connected_devices.keys():
                connected_devices[item].force_disconnect()
                del connected_devices[item]
    if item in connected_devices.keys():
        try:
            last_sync = mbdb.get_device_last_sync(cnxn_string, item)
            if last_sync != None:
                connected_devices[item].setLastSyncDate(last_sync)
            if not silent_fetch:
                connected_devices[item].send_alert(b'\x03')
            connected_devices[item].fetch_activity_data()
            if not silent_fetch:
                connected_devices[item].send_alert(b'\x03')
            if len(connected_devices[item].getActivityDataBuffer()) > 0:
                print "Saving Data to DB..."
                mbdb.write_activity_data(cnxn_string, connected_devices[item])
            print "Finished fetching MiBand [%s] activity!" % item
            if disconnect_after:
                connected_devices[item].disconnect()
                del connected_devices[item]
        except BTLEException as e:
            print(
                "There was a problem retrieving this MiBand's activity, try again later"
            )
            print e
            if item in connected_devices.keys():
                connected_devices[item].force_disconnect()
                del connected_devices[item]
Ejemplo n.º 8
0
 def do_register(self, params):
     try:
        l = int(params)
     except ValueError:
        print "*** argument should be number"
        return
     except IndexError:
        print "*** register takes at least one parameter"
        return
     dev_id = l
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if ((args.mode == "db" and mbdb.is_device_registered(cnxn_string, self.mibands.keys()[dev_id]))
         or args.mode == "json" and self.mibands.keys()[dev_id] in self.registered_devices):
         print("That MiBand is already registered")
     else:
         mb = None
         try:
             addr = self.mibands.keys()[dev_id]
             model = self.models[addr]
             if not addr in self.devices_keys.keys():
                 self.devices_keys[addr] = random_key()
             if model.upper() == "MB2":
                 mb = MiBand2(addr, self.devices_keys[addr], initialize=False)
             elif model.upper() == "MB3":
                 mb = MiBand3(addr, self.devices_keys[addr], initialize=False)
             mb.cleanAlarms()
             if args.mode == "db":
                 dev_id = mbdb.get_device_id(cnxn_string, mb.addr)
                 mbdb.delete_all_alarms(cnxn_string, dev_id)
                 mbdb.register_device(cnxn_string, mb.addr)
                 mbdb.update_battery(cnxn_string, mb.addr, mb.battery_info['level'])
             else:
                 self.registered_devices += [mb.addr]
             # Device stays connected after initialize, but we don't want that
             mb.disconnect()
         except BTLEException as e:
             print("There was a problem registering this MiBand, try again later")
             print e
         except KeyError as e:
             print("Device was kicked out")
             print e
Ejemplo n.º 9
0
 def do_register(self, params):
     try:
         l = int(params)
     except ValueError:
         print "*** argument should be number"
         return
     except IndexError:
         print "*** register takes at least one parameter"
         return
     dev_id = l
     if dev_id >= len(self.mibands.keys()):
         print "*** device not in the device list"
         return
     if ((args.mode == "db"
          and mb2db.is_device_registered(mb2db.cnxn,
                                         self.mibands.keys()[dev_id]))
             or args.mode == "json"
             and self.mibands.keys()[dev_id] in self.registered_devices):
         print("That MiBand2 is already registered")
     else:
         mb2 = None
         try:
             addr = self.mibands.keys()[dev_id]
             self.scd.tmp_devices[addr]["strikes"] = -9999
             if not addr in self.devices_keys.keys():
                 self.devices_keys[addr] = random_key()
             mb2 = MiBand2(addr, self.devices_keys[addr], initialize=False)
             mb2.cleanAlarms()
             if args.mode == "db":
                 mb2db.delete_all_alarms(mb2db.cnxn, mb2.addr)
                 mb2db.register_device(mb2db.cnxn, mb2.addr)
                 mb2db.update_battery(mb2db.cnxn, mb2.addr,
                                      mb2.battery_info['level'])
             else:
                 self.registered_devices += [mb2.addr]
             # Device stays connected after initialize, but we don't want that
             mb2.disconnect()
         except BTLEException as e:
             print(
                 "There was a problem registering this MiBand2, try again later"
             )
             print e
             mb2.disconnect
Ejemplo n.º 10
0
def do_fetch_activity(item):
    print "Fetching MiBand2 [%s] activity!" % item
    try:
        mb2 = MiBand2(item, initialize=False)
        try:
            if item in devices_last_sync.keys():
                mb2.setLastSyncDate(devices_last_sync[item])
            mb2.send_alert(b'\x01')
            mb2.fetch_activity_data(base_dir + '/activity_log/')
            mb2.send_alert(b'\x01')
            print "Finished fetching MiBand2 [%s] activity!" % item
            lastDate = str(mb2.lastSyncDate)
            mb2.disconnect()
            return lastDate
        except BTLEException as e:
            print("There was a problem retrieving this MiBand2's activity, try again later")
            print e
    except BTLEException as e:
        print("There was a problem connecting this MiBand2, try again later")
        print e
    return None
Ejemplo n.º 11
0
def do_fetch_activity(item):
    print "Fetching MiBand2 [%s] activity!" % item
    if item not in connected_devices.keys():
        try:
            mb2 = MiBand2(item, initialize=False)
            connected_devices[item] = mb2
        except BTLEException as e:
            print("There was a problem connecting this MiBand2, try again later")
            print e
    try:
        if item in devices_last_sync.keys():
            connected_devices[item].setLastSyncDate(devices_last_sync[item])
        connected_devices[item].send_alert(b'\x01')
        connected_devices[item].fetch_activity_data()
        connected_devices[item].send_alert(b'\x01')
        devices_last_sync[item] = str(connected_devices[item].lastSyncDate)
        print "Finished fetching MiBand2 [%s] activity!" % item
    except BTLEException as e:
        print("There was a problem retrieving this MiBand2's activity, try again later")
        print e
    finally:
        connected_devices[item].disconnect()
        del connected_devices[item]
Ejemplo n.º 12
0
def HiloCorazon():
    print('Connecting')
    band = MiBand2('FA:01:FB:63:6A:75')
    band.setSecurityLevel(level="medium")

    band.authenticate()
    band.init_after_auth()

    print("Cont. HRM start")
    band.hrmStopContinuous()
    band.hrmStartContinuous()

    global bienestar
    musica = reproducirPulso(0)
    while True:
        while bienestar:
            band.char_hrm_ctrl.write(b'\x16', True)
            band.waitForNotifications(1.0)
        musica.reproducirMusica()

    print("Disconnecting...")
    band.disconnect()
    del band
Ejemplo n.º 13
0
def device(dev_id):
    row = mbdb.get_device_by_id(cnxn_string, dev_id)
    if row:
        if request.method == "GET":
            connected = True if row.mac in connected_devices else False
            signal = 0
            mibands = copy.deepcopy(tmp_mibands)
            if row.mac in mibands.keys():
                signal = mibands[row.mac].rssi
            dev_user = mbdb.get_device_user(cnxn_string, dev_id)
            username = (dev_user.nombre + " " +
                        dev_user.apellidos) if dev_user else "Unregistered"
            detail_dict = {
                "dev_id": row.dispositivoId,
                "battery": row.bateria,
                "registered": row.registrado,
                "address": row.mac,
                "connected": connected,
                "signal": signal,
                "visible": (signal < 0),
                "model": row.tipoDispositivo.upper(),
                "user_name": username,
                "reputation": reputation[row.mac.upper()]
            }
            return json.dumps(detail_dict)
        elif request.method == "PUT":
            if mbdb.is_device_registered(cnxn_string, row.mac):
                action = request.form.get("action")
                if action == "connect" and row.mac not in connected_devices.keys(
                ):
                    try:
                        reputation[row.mac.upper()] = 100
                        if not row.mac in devices_keys.keys():
                            key = DEFAULT_KEY
                        else:
                            key = devices_keys[row.mac.upper()]
                        if model[row.mac.upper()] == "mb2":
                            mb = MiBand2(
                                row.mac.upper(),
                                key,
                                initialize=False,
                            )
                        elif model[row.mac.upper()] == "mb3":
                            mb = MiBand3(
                                row.mac.upper(),
                                key,
                                initialize=False,
                            )
                        connected_devices[row.mac] = mb
                        alarms = mbdb.get_device_alarms(cnxn_string, mb.addr)
                        mbdb.update_battery(cnxn_string, mb.addr,
                                            mb.battery_info['level'])
                        for a in alarms:
                            mb.alarms += [
                                MiBandAlarm(a["hour"],
                                            a["minute"],
                                            enabled=a["enabled"],
                                            repetitionMask=a["repetition"])
                            ]
                        reputation[row.mac.upper()] = 50
                        return json.dumps({
                            "connected": True,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        reputation[row.mac.upper()] = 50
                        print(
                            "There was a problem (dis)connecting to this MiBand, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        reputation[row.mac.upper()] = 50
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb
                        abort(500)
                elif action == "disconnect" and row.mac in connected_devices.keys(
                ):
                    try:
                        mb = connected_devices[row.mac]
                        mb.disconnect()
                        mb.force_disconnect()
                        del connected_devices[row.mac]
                        del mb
                        print("MiBand disconnected!")
                        return json.dumps({
                            "connected": False,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem disconnecting this MiBand, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb
                        abort(500)
                elif action == "alert" and row.mac in connected_devices.keys():
                    try:
                        print("Alerting MB2 " + row.mac)
                        mb = connected_devices[row.mac]
                        if request.args.get('notification') == "message":
                            mb.send_alert(b'\x01')
                        elif request.args.get('notification') == "call":
                            mb.send_alert(b'\x02')
                        elif request.args.get('notification') == "vibrate":
                            mb.send_alert(b'\x03')
                        elif request.args.get('notification') == "stop":
                            mb.send_alert(b'\x00')
                        else:
                            mb.send_alert(b'\x03')
                        return json.dumps({
                            "alerting": True,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem alerting this MiBand, try again later"
                        )
                        del connected_devices[row.mac]
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb
                        abort(500)
        elif request.method == "DELETE":
            # Just Unregister MiBand
            if mbdb.is_device_registered(cnxn_string, row.mac):
                if not row.mac in connected_devices.keys():
                    try:
                        dev_id = mbdb.get_device_id(cnxn_string, row.mac)
                        mbdb.unregister_device(cnxn_string, dev_id)
                        mbdb.delete_all_alarms(cnxn_string, dev_id)
                        del devices_keys[row.mac.upper()]
                        print("MiBand unregistered!")
                        save_keys(devices_keys)
                        return json.dumps({
                            "registered": False,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem unregistering this MiBand, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        if row.mac in connected_devices.keys():
                            connected_devices[row.mac].force_disconnect()
                            del connected_devices[row.mac]
                        abort(500)
        abort(403)
    else:
        abort(404)
Ejemplo n.º 14
0
def devices():
    if request.method == "GET":
        dev_list = []
        mibands = copy.deepcopy(tmp_mibands)
        for idx, mb in enumerate(mibands.keys()):
            dev_id = mbdb.get_device_id(cnxn_string, mb)
            dev_user = mbdb.get_device_user(cnxn_string, dev_id)
            device = mbdb.get_device_by_id(cnxn_string, dev_id)
            battery = -1
            if device:
                battery = device.bateria
            username = (dev_user.nombre + " " +
                        dev_user.apellidos) if dev_user else "Unregistered"
            dev_dict = {
                "address": mb,
                "signal": mibands[mibands.keys()[idx]].rssi,
                "registered": False,
                "connected": False,
                "dev_id": dev_id,
                "model":
                model[mibands[mibands.keys()[idx]].addr.upper()].upper(),
                "user_name": username,
                "battery": battery,
                "reputation":
                reputation[mibands[mibands.keys()[idx]].addr.upper()]
            }
            if mbdb.is_device_registered(cnxn_string, mb):
                dev_dict["registered"] = True
            if mb in connected_devices.keys():
                dev_dict["connected"] = True
            dev_list += [dev_dict]
        return json.dumps(dev_list)
    elif request.method == "POST":
        addr = request.form["address"].upper()
        if mbdb.is_device_registered(cnxn_string, addr):
            abort(403)
        else:
            try:
                reputation[addr] = 100
                if not addr in devices_keys.keys():
                    devices_keys[addr] = random_key()
                if model[addr] == "mb2":
                    mb = MiBand2(addr, devices_keys[addr], initialize=False)
                elif model[addr] == "mb3":
                    mb = MiBand3(addr, devices_keys[addr], initialize=False)
                devices_keys[addr] = mb.key
                connected_devices[addr] = mb
                save_keys(devices_keys)
                mb.cleanAlarms()
                dev_id = mbdb.register_device(cnxn_string, mb.addr,
                                              mb.get_model())
                mbdb.delete_all_alarms(cnxn_string, dev_id)
                mbdb.update_battery(cnxn_string, mb.addr,
                                    mb.battery_info['level'])
                # Device stays connected after initialize, but we don't want that
                del connected_devices[addr]
                mb.disconnect()
                reputation[addr] = 50
                return json.dumps({"dev_id": dev_id, "registered": True})
            except BTLEException as e:
                print(
                    "There was a problem registering this MiBand, try again later"
                )
                print e
                if addr in connected_devices.keys():
                    connected_devices[addr].force_disconnect()
                    del connected_devices[addr]
                abort(500)
            except BTLEException.DISCONNECTED as d:
                print("Device disconnected, removing from connected devices")
                print e
                if addr in connected_devices.keys():
                    connected_devices[addr].force_disconnect()
                    del connected_devices[addr]
                abort(500)
Ejemplo n.º 15
0
import sys
import binascii
sys.path.append('./lib')
from miband2 import MiBand2

mb2 = MiBand2("fc:5a:18:28:15:53")

for svc in mb2.services:
    print 'SERV: {0}\tUUID: {1}'.format(svc.uuid.getCommonName(), svc.uuid)
    for c in svc.getCharacteristics():
        if c.supportsRead():
            print '\tCHAR: {0}\t({1}) // HANDLE: {2} // VALUE: {3}'.format(
                c.uuid.getCommonName(), c.uuid, c.getHandle(),
                binascii.hexlify(c.read()))
        else:
            print '\tCHAR: {0}\t({1}) // HANDLE: {2} // PROPS: {3}'.format(
                c.uuid.getCommonName(), c.uuid, c.getHandle(),
                c.propertiesToString())
    print '\n'
Ejemplo n.º 16
0
from bluepy.btle import Scanner, DefaultDelegate
from miband2 import MiBand2, ActivityDelegate

# Script to initalize all the MB2s in range

print "Scanning for nearby MiBands2..."
sc = Scanner()
devs = sc.scan(5)

print "Found {0} devices! Initializing...".format(len(devs))
mibands = []
for d in devs:
    mb = MiBand2(d)
    mibands += [mb]
    mb.initialize()
    mb.disconnect()
Ejemplo n.º 17
0
def device(dev_id):
    row = mb2db.get_device_by_id(cnxn_string, dev_id)
    if row:
        if request.method == "GET":
            connected = True if row.mac in connected_devices else False
            signal = 0
            mibands = copy.deepcopy(tmp_mibands)
            if row.mac in mibands.keys():
                signal = mibands[row.mac].rssi
            dev_user = mb2db.get_device_user(cnxn_string, dev_id)
            username = (dev_user.nombre + " " +
                        dev_user.apellidos) if dev_user else "Unregistered"
            detail_dict = {
                "dev_id": row.dispositivoId,
                "battery": row.bateria,
                "registered": row.registrado,
                "address": row.mac,
                "connected": connected,
                "signal": signal,
                "visible": (signal < 0),
                "user_name": username
            }
            return json.dumps(detail_dict)
        elif request.method == "PUT":
            if mb2db.is_device_registered(cnxn_string, row.mac):
                action = request.form.get("action")
                strikes[row.mac] = -9999
                if action == "connect" and row.mac not in connected_devices.keys(
                ):
                    try:
                        mb2 = MiBand2(row.mac, initialize=False)
                        connected_devices[row.mac] = mb2
                        alarms = mb2db.get_device_alarms(cnxn_string, mb2.addr)
                        mb2db.update_battery(cnxn_string, mb2.addr,
                                             mb2.battery_info['level'])
                        for a in alarms:
                            mb2.alarms += [
                                MiBand2Alarm(a["hour"],
                                             a["minute"],
                                             enabled=a["enabled"],
                                             repetitionMask=a["repetition"])
                            ]
                        return json.dumps({
                            "connected": True,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem (dis)connecting to this MiBand2, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb2
                        abort(500)
                elif action == "disconnect" and row.mac in connected_devices.keys(
                ):
                    try:
                        mb2 = connected_devices[row.mac]
                        mb2.disconnect()
                        del connected_devices[row.mac]
                        del mb2
                        print("MiBand2 disconnected!")
                        return json.dumps({
                            "connected": False,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem disconnecting this MiBand2, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb2
                        abort(500)
        elif request.method == "DELETE":
            # Just Unregister MiBand2
            if mb2db.is_device_registered(cnxn_string, row.mac):
                if not row.mac in connected_devices.keys():
                    try:
                        dev_id = mb2db.get_device_id(cnxn_string, row.mac)
                        mb2db.unregister_device(cnxn_string, dev_id)
                        mb2db.delete_all_alarms(cnxn_string, dev_id)
                        print("MiBand2 unregistered!")
                        return json.dumps({
                            "registered": False,
                            "dev_id": row.dispositivoId
                        }), 200
                    except BTLEException as e:
                        print(
                            "There was a problem unregistering this MiBand2, try again later"
                        )
                        print e
                        abort(500)
                    except BTLEException.DISCONNECTED as d:
                        print(
                            "Device disconnected, removing from connected devices"
                        )
                        del connected_devices[row.mac]
                        del mb2
                        abort(500)
        abort(403)
    else:
        abort(404)
Ejemplo n.º 18
0
def main():
    sc = Scanner()
    scd = MiBand2ScanDelegate()
    sc.withDelegate(scd)

    scan_thread = threading.Thread(target=scan_miband2, args=(sc,))
    scan_thread.start()

    for i in range(max_connections):
         t = threading.Thread(target=worker)
         t.daemon = True
         t.start()

    while True:
        try:
            s = raw_input('> ')
        except:
            break

        try:
            command = s.strip().lower()
            if command == "exit":
                scan_thread.do_scan = False
                scan_thread.join()
                print ("Disconnecting from %s devices" % len(connected_devices.values()))
                for con in connected_devices.values():
                    con.disconnect()
                print("Saving changes to Registered Devices storage")
                save_registered(registered_devices, devices_last_sync)
                break

            elif command == "save":
                print("Saving changes to Registered Devices storage")
                save_registered(registered_devices, devices_last_sync)
            elif command == "devices":
                mibands = scd.tmp_devices
                for idx,mb in enumerate(mibands.keys()):
                    str = "[%s] Mi Band 2 (%s) %sdB " % (idx,mb,mibands[mibands.keys()[idx]].rssi)
                    if mb in registered_devices:
                        str += "[R]"
                    if mb in connected_devices:
                        str += "[C]"
                    print str
            elif "alert" in command:
                arg = re.search("\w+\s+(\d+)\s+(\d+)", command)
                if arg != None and len(arg.groups()) == 2:
                    dev_id = int(arg.groups()[0])
                    alert_int = int(arg.groups()[1])
                    if mibands.keys()[dev_id] in registered_devices:
                        if mibands.keys()[dev_id] in connected_devices.keys():
                            try:
                                mb2 = connected_devices[mibands.keys()[dev_id]]
                                data = struct.pack('B', alert_int)
                                mb2.send_alert(data)
                                print "Sending Notification: " + binascii.hexlify(data)
                            except BTLEException:
                                print("There was a problem alerting this MiBand2, try again later")
                        else:
                            print("That MiBand2 is not connected!")
                    else:
                        print("That MiBand2 is not registered")
                else:
                    print("'alert' takes two parameters")
            elif "unregister" in command:
                arg = re.search("\w+\s+(\d+)", command)
                if arg != None and len(arg.groups()) == 1:
                    dev_id = int(arg.groups()[0])
                    if mibands.keys()[dev_id] in registered_devices:
                        if not mibands.keys()[dev_id] in connected_devices.values():
                            try:
                                registered_devices.remove(mibands.keys()[dev_id])
                                print("MiBand2 unregistered!")
                            except BTLEException:
                                print("There was a problem unregistering this MiBand2, try again later")
                        else:
                            print("Disconnect the miBand2 first!")
                    else:
                        print("That MiBand2 is not registered")
                else:
                    print("'unregister' takes only one parameter")

            elif "register" in command:
                arg = re.search("\w+\s+(\d+)", command)
                if arg != None and len(arg.groups()) == 1:
                    dev_id = int(arg.groups()[0])
                    if mibands.keys()[dev_id] in registered_devices:
                        print("That MiBand2 is already registered")
                    else:
                        try:
                            mb2 = MiBand2(mibands.keys()[dev_id], initialize=True)
                            registered_devices.append(mibands.keys()[dev_id])
                        except BTLEException as e:
                            print("There was a problem disconnecting this MiBand2, try again later")
                            print e
                else:
                    print("'register' takes only one parameter")

            elif "disconnect" in command:
                arg = re.search("\w+\s+(\d+)", command)
                if arg != None and len(arg.groups()) == 1:
                    dev_id = int(arg.groups()[0])
                    if len(connected_devices.keys()) >= max_connections:
                        print("Can't connect to more than 5 devices at the same time, disconnect some")
                    else:
                        if mibands.keys()[dev_id] in connected_devices.keys():
                            try:
                                mb2 = connected_devices[mibands.keys()[dev_id]]
                                mb2.disconnect()
                                del connected_devices[mibands.keys()[dev_id]]
                                del mb2
                                print ("MiBand2 disconnected!")
                            except BTLEException as e:
                                print("There was a problem disconnecting this MiBand2, try again later")
                                print e
                        else:
                            print("That MiBand2 isn't connected!")
                else:
                    print("'connect' takes only one parameter")

            elif "connect" in command:
                arg = re.search("\w+\s+(\d+)", command)
                if arg != None and len(arg.groups()) == 1:
                    dev_id = int(arg.groups()[0])
                    if len(connected_devices.keys()) >= 5:
                        print("Can't connect to more than 5 devices at the same time, disconnect some")
                    else:
                        if mibands.keys()[dev_id] in registered_devices:
                            if mibands.keys()[dev_id] in connected_devices.keys():
                                print("That MiBand2 is already connected")
                            else:
                                try:
                                    mb2 = MiBand2(mibands.keys()[dev_id], initialize=False)
                                    connected_devices[mibands.keys()[dev_id]] = mb2
                                except BTLEException as e:
                                    print("There was a problem connecting to this MiBand2, try again later")
                                    print e
                        else:
                            print("You have to register the MiBand2 before connecting to it")
                else:
                    print("'connect' takes only one parameter")

            elif "alarms" in command:
                pass
                # TODO:  load JSON alarms into device representation
                #        let the user view, queue, toggle and toggle days of each alarm
                #        save and persist alarms in JSON form, key should be mac
                #        and elements arrays of alarm parameters (hour, min, enabledness and daymasks)        

            elif "activity" in command:
                arg = re.search("\w+\s+(\w+)", command)
                if arg != None and len(arg.groups()) == 1:
                    if arg.groups()[0] == 'all':
                        print("Fetching all registered and in range Miband2's activity data")
                        # Check that the registered device is present on the scanned mibands list
                        for item in filter(lambda x: x in registered_devices, mibands.keys()):
                            q.put(item)
                    else:
                        dev_id = int(arg.groups()[0])
                        if mibands.keys()[dev_id] in registered_devices:
                            q.put(mibands.keys()[dev_id])
                        else:
                            print("MiBand2 should be registered before fetching activity data")
                else:
                    print("'activity' takes only one parameter")
            elif command == '':
                pass
            else:
                print ("Unknown command %s, try using 'help'" % command)

        except OSError:
            print 'Invalid command'
Ejemplo n.º 19
0
# This script extracts the services and characteristics from a MiBand2 and stores
# them on a local file so they can be loaded from a file and save time
# This file is provided in the repo, but you might want to update it

from miband2 import MiBand2
import json

ADDR = "00:11:22:33:44:55"

mb2 = MiBand2(ADDR, initialize=true)

svc_export = {}

for svc in mb2.svcs:
    svc_export[str(svc.uuid)] = {
        "hndStart": svc.hndStart,
        "hndEnd": svc.hndEnd,
        "chars": {}
    }
    for c in svc.getCharacteristics():
        svc_export[str(svc.uuid)]["chars"][str(c.uuid)] = {
            "handle": c.handle,
            "valHandle": c.valHandle,
            "properties": c.properties,
            "descs": {}
        }
        for d in c.getDescriptors():
            svc_export[str(svc.uuid)]["chars"][str(c.uuid)]["descs"][str(
                d.uuid)] = {
                    "handle": d.handle
                }