Управление входящими соединениями устройств
SberMobile Server обычно устанавливает исходящие соединения TCP/UDP с подключенными к сети устройствами, аутентифицируя себя с учетными данными, находящимися в учетной записи устройства. Однако некоторые устройства сами подключаются к серверу. Это в основном M2M устройства, подключаемые к IP сети через модемы GPRS/3G. Такие устройства не имеют статичных IP адресов и имен хоста, поэтому доступ сервера к ним невозможен.
Драйвера устройств, обслуживающие входящие соединения с устройствами, требуют специального подхода к их разработке:
globalInit()
должен вызывать метод createGlobalConfigContext(Context rootContext, VariableDefinition... properties)
. Его параметры должны включать определение переменной, которая содержит настройки глобального подключения драйвера, т.е. хотя бы номер порта для прослушивания входящих соединений с устройствами.globalStart()
должен открывать прослушивающий сокет и запускать отдельный поток, который принимает и обслуживает входящие соединения с устройствами. Этот метод имеет доступ к свойствам глобальной конфигурации драйвера путем получения контекста глобальных свойств через getGlobalConfigContext()
и извлечения значения переменной глобальной конфигурации из этого контекста. Возможно (но не необходимо) создать класс, унаследованный из SocketServerThread
(для нормальных сокетов) или SslSocketServerThread
(для сокетов, защищенных SSL), и использовать этот класс в качестве потока прослушивания сокетов. globalStop()
.SocketServerThread
или SslSocketServerThread
должна включать метод createConnectionThread()
, который создает поток контроллера входящих соединений каждый раз при подключении нового устройства к серверу.setupDeviceContext()
.deviceContext.getDriver()
.deviceContext.requestSynchronization()
для получения нормальной последовательности синхронизации.shouldSynchronize()
должен вернуть true, если контроллер входящих соединений в данный момент зарегистрирован в экземпляре драйвера, в ином случае false.connect()
должен отправлять устройству некоторые тестовые команды, чтобы убедиться, что входящее соединение все еще имеется. Если соединение TCP/UDP прервано или устройство не отвечает, метод соединения должен вызвать исключение для приостановки последующей синхронизации.disconnect()
должен отключать контроллер входящих соединений и закрывать его входящие соединения.