Управление входящими соединениями устройств
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() должен отключать контроллер входящих соединений и закрывать его входящие соединения.