ukitai.link.uKitAiBleLink 源代码

import _thread
import json
import socket
import threading
import time

import websocket

import ukitai.depend.binaries as binaries
from ukitai.link.uKitAiLink import uKitAiLink


def _id2mac(id) -> str:
    if isinstance(id, int):
        _mac = "%012X" % id
        mac = ""
        for i in range(6):
            if i == 0:
                mac = _mac[i * 2:(i + 1) * 2]
            else:
                mac = mac + ":" + _mac[i * 2:(i + 1) * 2]
    else:
        mac = str(id)
    return mac


def _mac2id(mac: str, type='str'):
    if type == 'int':
        return int(mac.replace(':', ''), 16)
    else:
        return mac


def _makeRequest(method: str, *, params: dict = None, id: int = 0, rpc: str = "2.0"):
    jsonStr = json.dumps({"id": id, "jsonrpc": rpc, "method": method, "params": params})
    # print(jsonStr)
    return jsonStr


_ws_url = 'ws://127.0.0.1:20111/ucode/ble'





[文档]def listDevices(timeout_ms: int = 15000) -> None: """列出当前通过蓝牙扫描的所有uKitAi设备信息 参数值说明: timeout_ms(int): 超时时间,单位毫秒 返回值说明: (None): 通过控制台显示结果 """ ws = None try: _prepare_server() ws = websocket.create_connection(_ws_url) def timeout_callback(ws, timeout_ms): if ws: time.sleep(timeout_ms / 1000.0) ws.close() _thread.start_new_thread(timeout_callback, (ws, timeout_ms)) ws.send(_makeRequest("discover", params={ "filters": [{"namePrefix": "uKit2_"}], "optionalServices": [uKitAiBleLink._GATT_SERVICE_UUID] })) endtime_ms = (time.time() * 1000.0) + timeout_ms index = 0 devices = [] while True: remaining = endtime_ms - (time.time() * 1000.0) if remaining <= 0.0: return try: message = ws.recv() response = json.loads(message) method = response.get('method') if method != 'didDiscoverPeripheral': continue params = response.get('params') name = params.get('name') mac = _id2mac(params.get('peripheralId')) if mac in devices: continue devices.append(mac) index = index + 1 print("Device %d: %s\n\t%s" % (index, name, mac)) except Exception: continue finally: if ws: ws.close()
def _prepare_server(): _serverLock = threading.Lock() try: def __check_server(lock): endtime_ms = (time.time() * 1000.0) + 10000 s = None while True: remaining = endtime_ms - (time.time() * 1000.0) if remaining <= 0.0: try: lock.release() except: pass return try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("127.0.0.1", 20111)) s.close() s = None try: lock.release() except: pass break except Exception: time.sleep(0.1) continue finally: if s is not None: s.close() s = None def __start_server(lock): s = None try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(("0.0.0.0", 20111)) s.close() s = None binaries.prepareEnvironment() _thread.start_new_thread(__check_server, (lock,)) binaries.startLinkToolDaemon() except Exception as e: pass finally: if s is not None: s.close() try: lock.release() except: pass _serverLock.acquire() _thread.start_new_thread(__start_server, (_serverLock,)) _serverLock.acquire(timeout=10) finally: _serverLock.release()
[文档]def create(devId: str = None, name: str = None) -> uKitAiBleLink: """创建一个uKitAi蓝牙连接对象 参数值说明: devId (str): 蓝牙设备标识,一般情况下为MAC地址,格式为:'XX:XX:XX:XX:XX:XX' 但由于在MacOS上面无法获取到设备MAC地址,因此MacOS上面此字段为UUID name (str): uKitAi蓝牙设备名称,格式为:'uKit2_XXXX' 返回值说明: (bool): 返回创建好的uKitAi蓝牙连接对象 """ return uKitAiBleLink(devId, name)