修复MPY的蓝牙支持断开重连功能
This commit is contained in:
@@ -19,6 +19,8 @@ _IRQ_CENTRAL_DISCONNECT = const(2)
|
|||||||
_IRQ_GATTS_WRITE = const(3)
|
_IRQ_GATTS_WRITE = const(3)
|
||||||
_IRQ_MTU_EXCHANGED = const(21)
|
_IRQ_MTU_EXCHANGED = const(21)
|
||||||
_IRQ_CONNECTION_UPDATE = const(27)
|
_IRQ_CONNECTION_UPDATE = const(27)
|
||||||
|
_IRQ_GET_SECRET = const(29)
|
||||||
|
_IRQ_SET_SECRET = const(30)
|
||||||
_IRQ_PASSKEY_ACTION = const(31)
|
_IRQ_PASSKEY_ACTION = const(31)
|
||||||
_PASSKEY_ACTION_INPUT = const(2)
|
_PASSKEY_ACTION_INPUT = const(2)
|
||||||
_PASSKEY_ACTION_DISP = const(3)
|
_PASSKEY_ACTION_DISP = const(3)
|
||||||
@@ -66,6 +68,11 @@ class Keyboard:
|
|||||||
self.passkey = passkey
|
self.passkey = passkey
|
||||||
self.battery_level = battery_level
|
self.battery_level = battery_level
|
||||||
self.report = b'\x00'
|
self.report = b'\x00'
|
||||||
|
try:
|
||||||
|
import ble_hid_key
|
||||||
|
self.keys = ble_hid_key.keys
|
||||||
|
except:
|
||||||
|
self.keys = {}
|
||||||
|
|
||||||
handles = self._ble.gatts_register_services((_DIS, _BAS, _HIDS))
|
handles = self._ble.gatts_register_services((_DIS, _BAS, _HIDS))
|
||||||
self._service_characteristics(handles)
|
self._service_characteristics(handles)
|
||||||
@@ -106,10 +113,44 @@ class Keyboard:
|
|||||||
print("unknown action")
|
print("unknown action")
|
||||||
elif event == _IRQ_GATTS_WRITE:
|
elif event == _IRQ_GATTS_WRITE:
|
||||||
conn_handle, attr_handle = data
|
conn_handle, attr_handle = data
|
||||||
self.report = self._ble.gatts_read(attr_handle)
|
self.report = self._ble.gatts_read(attr_handle)
|
||||||
|
elif event == _IRQ_SET_SECRET:
|
||||||
|
sec_type, key, value = data
|
||||||
|
key = sec_type, bytes(key)
|
||||||
|
value = bytes(value) if value else None
|
||||||
|
#print("Set secret: ", key, value)
|
||||||
|
if value is None:
|
||||||
|
if key in self.keys:
|
||||||
|
del self.keys[key]
|
||||||
|
self.key_secrets(self.keys)
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
self.keys[key] = value
|
||||||
|
self.key_secrets(self.keys)
|
||||||
|
return True
|
||||||
|
elif event == _IRQ_GET_SECRET:
|
||||||
|
sec_type, index, key = data
|
||||||
|
#print("Get secret: ", sec_type, index, bytes(key) if key else None)
|
||||||
|
if key is None:
|
||||||
|
i = 0
|
||||||
|
for (t, _key), value in self.keys.items():
|
||||||
|
if t == sec_type:
|
||||||
|
if i == index:
|
||||||
|
return value
|
||||||
|
i += 1
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
key = sec_type, bytes(key)
|
||||||
|
return self.keys.get(key, None)
|
||||||
#else:
|
#else:
|
||||||
#print("Unhandled IRQ event: ", event, data)
|
#print("Unhandled IRQ event: ", event, data)
|
||||||
|
|
||||||
|
def key_secrets(self, keys={}):
|
||||||
|
with open("ble_hid_key.py", "w+") as s_f:
|
||||||
|
s_f.write("keys=" + str(keys) + "\n")
|
||||||
|
|
||||||
def _service_characteristics(self, handles):
|
def _service_characteristics(self, handles):
|
||||||
(h_mod, h_ser, h_fwr, h_hwr, h_swr, h_man, h_pnp) = handles[0]
|
(h_mod, h_ser, h_fwr, h_hwr, h_swr, h_man, h_pnp) = handles[0]
|
||||||
(self.h_bat, h_ccc, h_bfmt,) = handles[1]
|
(self.h_bat, h_ccc, h_bfmt,) = handles[1]
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ _IRQ_CENTRAL_CONNECT = const(1)
|
|||||||
_IRQ_CENTRAL_DISCONNECT = const(2)
|
_IRQ_CENTRAL_DISCONNECT = const(2)
|
||||||
_IRQ_MTU_EXCHANGED = const(21)
|
_IRQ_MTU_EXCHANGED = const(21)
|
||||||
_IRQ_CONNECTION_UPDATE = const(27)
|
_IRQ_CONNECTION_UPDATE = const(27)
|
||||||
|
_IRQ_GET_SECRET = const(29)
|
||||||
|
_IRQ_SET_SECRET = const(30)
|
||||||
_IRQ_PASSKEY_ACTION = const(31)
|
_IRQ_PASSKEY_ACTION = const(31)
|
||||||
_PASSKEY_ACTION_INPUT = const(2)
|
_PASSKEY_ACTION_INPUT = const(2)
|
||||||
_PASSKEY_ACTION_DISP = const(3)
|
_PASSKEY_ACTION_DISP = const(3)
|
||||||
@@ -60,6 +62,11 @@ class Mouse:
|
|||||||
self.conn_handle = None
|
self.conn_handle = None
|
||||||
self.passkey = passkey
|
self.passkey = passkey
|
||||||
self.battery_level = battery_level
|
self.battery_level = battery_level
|
||||||
|
try:
|
||||||
|
import ble_hid_key
|
||||||
|
self.keys = ble_hid_key.keys
|
||||||
|
except:
|
||||||
|
self.keys = {}
|
||||||
|
|
||||||
handles = self._ble.gatts_register_services((_DIS, _BAS, _HIDS))
|
handles = self._ble.gatts_register_services((_DIS, _BAS, _HIDS))
|
||||||
self._service_characteristics(handles)
|
self._service_characteristics(handles)
|
||||||
@@ -98,9 +105,43 @@ class Mouse:
|
|||||||
self._ble.gap_passkey(conn_handle, action, None)
|
self._ble.gap_passkey(conn_handle, action, None)
|
||||||
else:
|
else:
|
||||||
print("unknown action")
|
print("unknown action")
|
||||||
|
elif event == _IRQ_SET_SECRET:
|
||||||
|
sec_type, key, value = data
|
||||||
|
key = sec_type, bytes(key)
|
||||||
|
value = bytes(value) if value else None
|
||||||
|
#print("Set secret: ", key, value)
|
||||||
|
if value is None:
|
||||||
|
if key in self.keys:
|
||||||
|
del self.keys[key]
|
||||||
|
self.key_secrets(self.keys)
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
self.keys[key] = value
|
||||||
|
self.key_secrets(self.keys)
|
||||||
|
return True
|
||||||
|
elif event == _IRQ_GET_SECRET:
|
||||||
|
sec_type, index, key = data
|
||||||
|
#print("Get secret: ", sec_type, index, bytes(key) if key else None)
|
||||||
|
if key is None:
|
||||||
|
i = 0
|
||||||
|
for (t, _key), value in self.keys.items():
|
||||||
|
if t == sec_type:
|
||||||
|
if i == index:
|
||||||
|
return value
|
||||||
|
i += 1
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
key = sec_type, bytes(key)
|
||||||
|
return self.keys.get(key, None)
|
||||||
#else:
|
#else:
|
||||||
#print("Unhandled IRQ event: ", event, data)
|
#print("Unhandled IRQ event: ", event, data)
|
||||||
|
|
||||||
|
def key_secrets(self, keys={}):
|
||||||
|
with open("ble_hid_key.py", "w+") as s_f:
|
||||||
|
s_f.write("keys=" + str(keys) + "\n")
|
||||||
|
|
||||||
def _service_characteristics(self, handles):
|
def _service_characteristics(self, handles):
|
||||||
(h_mod, h_ser, h_fwr, h_hwr, h_swr, h_man, h_pnp) = handles[0]
|
(h_mod, h_ser, h_fwr, h_hwr, h_swr, h_man, h_pnp) = handles[0]
|
||||||
(self.h_bat, h_ccc, h_bfmt,) = handles[1]
|
(self.h_bat, h_ccc, h_bfmt,) = handles[1]
|
||||||
|
|||||||
Reference in New Issue
Block a user