@bs-solutions/bastion-network-plugin
v1.0.2
Published
Raw TCP/UDP socket plugin for Capacitor 6 and higher (LAN device discovery and connection)
Readme
bastion-network-plugin
Raw TCP/UDP socket plugin for Capacitor 6 and higher. Даёт прямой доступ к сырым сокетам из JS: UDP-broadcast для обнаружения устройств в локальной сети и TCP для подключения к ним и обмена произвольными данными. Порты и формат данных полностью на стороне приложения — плагин ничего не знает о конкретном протоколе.
Веб-платформа не поддерживается (сырые сокеты в браузере недоступны).
Install
npm i @bs-solutions/bastion-network-plugin
npx cap syncAndroid
Плагин объявляет INTERNET, ACCESS_WIFI_STATE, CHANGE_WIFI_MULTICAST_STATE в
собственном манифесте — дополнительно ничего добавлять не нужно.
iOS
Начиная с iOS 14 приложению нужно самому объявить local network permission в
своём Info.plist — плагин это сделать не может:
<key>NSLocalNetworkUsageDescription</key>
<string>Нужен доступ к локальной сети для поиска устройств</string>Конфигурация
TCP (connectTCP/sendTCP/disconnectTCP) работает всегда без какой-либо
настройки. Для UDP (sendBroadcastUDP/receiveUDP) порты обязательно нужно
задать конфигом плагина в capacitor.config.json — дефолтов нет намеренно,
без конфига UDP-методы отклоняются с понятной ошибкой:
{
"plugins": {
"BastionNetworkPlugin": {
"portListTransmit": [23629, 47701],
"portListReceive": [23569, 21913]
}
}
}portListTransmit— порты, на которые уходитsendBroadcastUDP(на все локальные подсети). Без этого ключаsendBroadcastUDPвернёт reject.portListReceive— порты, которые слушаются на входящие UDP-пакеты (receiveUDP). Без этого ключа слушатели просто не поднимаются (без ошибки — приложению, которому не нужен UDP, ничего делать не надо).
API
Все бинарные данные (UDP-датаграммы, TCP-пакеты) передаются как base64-строки.
import { BastionNetworkPlugin } from '@bs-solutions/bastion-network-plugin';
await BastionNetworkPlugin.addListener('receiveUDP', ({ ip, port, data }) => {
// data — base64
});
await BastionNetworkPlugin.addListener('receiveTCP', ({ linkId, data }) => {});
await BastionNetworkPlugin.addListener('disconnectTCP', ({ linkId }) => {});
await BastionNetworkPlugin.sendBroadcastUDP({ data: base64Data });
const { linkId } = await BastionNetworkPlugin.connectTCP({
ip: '192.168.1.50',
port: 1234,
data: base64AuthToken,
});
await BastionNetworkPlugin.sendTCP({ linkId, data: base64Data });
await BastionNetworkPlugin.disconnectTCP({ linkId });Методы
| Метод | Описание |
| ------------------ | --------------------------------------------------------------------- |
| sendBroadcastUDP | Разослать UDP broadcast на все локальные подсети (порты из portListTransmit) |
| connectTCP | Открыть TCP-соединение, первым пакетом отправить данные авторизации |
| sendTCP | Отправить данные в открытое TCP-соединение |
| disconnectTCP | Закрыть TCP-соединение |
События
| Событие | Когда срабатывает |
| ---------------- | ------------------------------------------------------ |
| receiveUDP | Пришёл UDP-пакет на один из портов portListReceive |
| receiveTCP | Пришли данные по открытому TCP-соединению |
| disconnectTCP | TCP-соединение закрыто (в т.ч. по инициативе устройства) |
Maintainer
Contributing
Please contribute! Look at the issues.
License
MIT © 2026
