Как использовать протокол ICE
Я пытаюсь установить соединение между двумя компьютерами за NAT. У меня есть третий компьютер, который доступен этим двум.
Я хотел бы использовать протокол ICE (Interactive Connectivity Establishment), но я не могу найти ни одного примера в Python. Я слышал о pjsip
, которые включают в себя библиотеку C под названием pjnath
, но это также написано на C.
Есть ли инструменты, чтобы сделать это в Python? Если нет, есть ли другой способ сделать то, что я описал? Если нет, то как запустить протокол ICE в Python?
2 ответа
PjSIP имеет модуль Python, который вы можете использовать.
Вы можете найти детали и ссылку на необходимые уроки здесь.
Вы можете использовать следующую библиотеку только для Python, чтобы установить соединение ICE:
https://github.com/jlaine/aioice
Вот пример двух конечных точек ICE в одном и том же процессе. В реальной жизни вам нужен какой-то метод сигнализации для обмена кандидатами, именем пользователя ("ufrag") и паролем ("pwd") между ними.
import asyncio
import aioice
async def connect_using_ice():
conn_a = aioice.Connection(ice_controlling=True)
conn_b = aioice.Connection(ice_controlling=False)
# invite
await conn_a.gather_candidates()
conn_b.remote_candidates = conn_a.local_candidates
conn_b.remote_username = conn_a.local_username
conn_b.remote_password = conn_a.local_password
# accept
await conn_b.gather_candidates()
conn_a.remote_candidates = conn_b.local_candidates
conn_a.remote_username = conn_b.local_username
conn_a.remote_password = conn_b.local_password
# connect
await asyncio.gather(conn_a.connect(), conn_b.connect())
# send data a -> b
await conn_a.send(b'howdee')
data = await conn_b.recv()
print('B got', data)
# send data b -> a
await conn_b.send(b'gotcha')
data = await conn_a.recv()
print('A got', data)
# close
await asyncio.gather(conn_a.close(), conn_b.close())
asyncio.get_event_loop().run_until_complete(connect_using_ice())