xMova Android

Field Server

Quando habilitado permite que um dispositivo móvel atue como um servidor que pode fazer a entrega de dados atualizados para os Field Server Clients, receber os dados offline destes dispositivos, atualizar a versão do aplicativo (APK e Fluxo), fazer a entrega de arquivos para aplicativos de terceiros, receber dados de aplicativos de terceiro e também a execução de um código dinâmico implementado no fluxo.

Atributos:

  • levels: Devem ser informados os níveis dos coletores de acordo com o ip, no exemplo seriam considerados os níveis de ip 192.168.0.100 (Máx Nível 0), 192.168.0.200 (Máx Nível 1) e 192.168.0.255 (Máx Nivel 2). Caso o desenvolvedor informe apenas levels 0,1,2 o aplicativo irá considerar os níveis de ip 192.168.0.255 (Máx Nível 0), 192.168.1.255 (Máx Nível 1) e 192.168.2.255 (Máx Nivel 2). Ao identificar que o aplicativo que está buscando sincronismo com um XFS é um XFS o aplicativo identifica o nível do ip da request e ignora a execução do ping se o nível do ip a ser buscado for menor ou igual ao nível do ip da request. O aplicativo irá considerar a quantidade de valores separados por ‘.’ (ponto) para determinar qual a parte do ip da request deve ser extraída para calcular o nível, então se a request vier do ip 192.168.0.76 e a máscara do nível for levels 0.100, 0.200 o aplicativo irá extraria 0.76 para a comparação de nível, no caso o ip da request se enquadra abaixo do valor 0.100 sendo então considerado de nível 0, podendo se comunicar com qualquer ip superior ou igual a 0.101. O compilador sempre ordena os níveis do menor para o maior então se for colocado levels 3,2,1 será compilado 1.255 (Máx. Nível 0), 2.255 (Máx.Nível 1) e 3.255 (Máx Nível 2)
  • disableStartWithApp: Quando adicionada, esta flag desabilita a inicialização do servidor junto com o aplicativo sendo necessário clicar na opção do Field Server presente no menu para que o serviço seja inicializado.
  • checkVersionsUrl: Utilizado pelo aplicativo para verificar as versões atualizadas dos aplicativos que estão sendo controlados pelo fluxo, só deve ser usada quando se deseja alterar o padrão do aplicativo que é definido automaticamente.
  • checkVersionsInterval: Utilizado para determinar de quanto em quanto tempo o aplicativo deve verificar novas versões disponíveis para os aplicativos que o fluxo gerencia. (Padrão: 10m)
  • donwloadVersionRequestTimeout: Utilizado para alterar o tempo de timeout da tentativa de conexão com o servidor (Conexão e leitura) para o download de novas versões disponíveis (APK e Fluxo). (Padrão: 1m)
  • checkFilesInterval: Utilizado para determinar de quanto em quanto tempo o aplicativo deve tentar fazer o download dos arquivos gerenciados pelo fluxo. (Padrão: 10m)
  • downloadFileRequetTimeout: Utilizado para alterar o tempo de timeout da tentativa de conexão com o servidor (Conexão e leitura) para o download dos arquivos gerenciados pelo fluxo. (Padrão: 1m)
  • communicationsSyncOut: Quando presente indica que o aplicativo deve enviar para a WEB as comunicações recebidas e processadas usando a entidade _XFS_COMMUNICATION. A entidade _XFS_COMMUNICATION é gerada dinamicamente pelo parser do xMova mas é possível sobrescrever a entidade no fluxo caso necessite mais campos além dos campos obrigatórios.

Langs:

  • FixedKeyFieldServerTitle: Exibida na opção apresentada no menu e também na tela que é exibida quando a opção do menu é acionada para apresentar as comunicações recebidas pelo Field Server. Padrão: Servidor
  • FixedKeyFieldServerComunications: Título da sessão de registro de comunicações presente na tela do Field Server. (Padrão: Comunicações)
  • FixedKeyFieldServerUrlTitle: Texto do label que exibe o endereço do servidor móvel na tela do Field Server. Padrão: Server Url
  • FixedKeyStopFieldServerConfirmMessage: Mensagem exibida quando o usuário seleciona a opção de parar o Field Server que existe dentro da notificação de que o mesmo está ativo. (Padrão: Deseja parar o servidor?)
  • FixedKeyFieldServerServerUrlUnavailable: Texto exibido para o Server Url quando o Field Server não está disponível, geralmente por não ter acesso a rede. (Padrão: Indisponível)
  • FixedKeyHttpSearchingForFieldServer: Exibida quando aplicativo não conseguiu se comunicar com o xMova Server e iniciará a busca por um xMova Field Server. (Padrão: Procurando por um servidor móvel)
  • FixedKeyHttpConnectingWithFieldServer: Exibida quando o aplicativo encontro um xMova Field Server e irá iniciar o sincronismo usando a url deste servidor móvel. (Padrão: Conectando-se ao servidor móvel...)
  • FixedKeyFieldServerSendBackupFilesAction: Exibida na tela de envio de backups dos dados recebidos por um aplcicativo que atua como Field Server. (Padrão: Enviar Backups)
  • FixedKeyFieldServerSendBackupTitle: Título da tela que exibe os arquivos de backups existentes para serem enviados. (Padrão: Backup Servidor Móvel)
  • FixedKeyFieldServerSendBackupReceivedRecordsLabel: Label da exibição da contagem de apontamentos na tela de envio de dados de backup. (Padrão: Apontamentos)
  • FixedKeyFieldServerSendBackupFilesCountLabel: Label que exibe a quantidade de arquivos existentes na pasta de backup do sincronismo do Field Server (Padrão: Arquivos)
  • FixedKeyFieldServerSendBackupNoFilesTopMessage: Label exibido quando não existem arquivos na pasta para serem exibidos. (Padrão: Nenhum arquivo de backup encontrado)
  • FixedKeyFieldServerSendBackupDateLabel: Label que exibe a quantidade de arquivos existentes na pasta de backup do sincronismo do Field Server (Padrão: Data)
  • FixedKeyFieldServerIpLabel: Label que exibe o endereço de ip do cliente que se comunicou com um Field Server (Padrão: IP)

Modelo da Entidade _XFS_COMMUNICATION:

_XFS_COMMUNICATION
        id inc
        ip String
        uuid String
        name String
        description String
        date Now

Exemplo de Configuração de um Field Server:

App syncInterval=1m appCode=X
        id 28352
        name xMova Field Server
        version 1.0.131
        intVersion 132
        location minTime=1m minDistance=1 minLastTime=10m tracking
        install type=fillAuth inputEntity=AuthInput
        server
                jsonServiceApi url=%jsonServiceApiUrl
                sqlDataSource agro
                defaultOnlineValidator jsonServiceApi
                defaultDataSource jsonServiceApi
                defaultReceiver jsonServiceApi
                versionControl Crc

        fieldServerClient
                serverUrl http://192.168.0.76:8080, http://192.168.0.214
                pingTimeoutMillis 150


        fieldServer
                levels 0.100, 0.200, 0.300
                communicationsCleanUpDays 2

Configuração de um Field Server Client

O Desenvolvedor do fluxo deve adicionar a sessão fieldServerClient ao App para que o aplicativo faça a busca por um XFS quando não for possível se comunicar com o xMova Server. Quando a sessão é adicionada o único parâmetro obrigatório é serverUrl que determina um padrão de busca de XFS, automaticamente o aplicativo cria uma entidade _XFS_URL_RANGES que permite que sejam incluídos padrões adicionais vindo da Web.

  • serverUrl: Determina os padrões de busca dos XFS. Podem ser informados valores no formato http://192.168.0.76:8080 que fará com que somente um ip seja buscado, [76-100]:8080” http://192.168.0.[76-100]:8080 que fará que sejam buscados ips de 192.168.0.76 até o ip 192.168.0.100 ou então http://192.168.*.* que fará com que sejam buscados todos os ips na rede. Podem ser informados padrões separados por vírgulas na ordem de preferência de busca.
  • pingTimeoutMillis: Determina por quanto tempo o aplicativo deve esperar que o ip buscado responda a solicitação de ping
  • reachServerTimeout: Determina o tempo que o aplicativo deve esperar pela resposta da request HTTP|HEAD para determinar que um ip que teve o ping encontrado pode receber requisições.
  • timeWithoutSyncToAddSourceServerUrls: Determina após quanto tempo sem nenhuma comunicação com sucesso o aplicativo deve adicionar as urls presentes nas configurações do fluxo, uma vez que quando são recebidas configurações diferentes

de url da WEB utilizando a entidade _XFS_URL_RANGES as configurações do fluxo não são utilizadas.

Exemplo de Configuração de um Field Server Client:

App syncInterval=1m appCode=X
        id 28353
        name xMova Field Server Client
        version 1.0.53
        intVersion 54
        location minTime=1m minDistance=1 minLastTime=10m tracking
        install type=fillAuth inputEntity=AuthInput
        getDeviceName
                return @DEVICE_NAME
        server
                jsonServiceApi url=%jsonServiceApiUrl
                sqlDataSource agro
                defaultOnlineValidator jsonServiceApi
                defaultDataSource jsonServiceApi
                defaultReceiver jsonServiceApi
                versionControl Crc

        fieldServerClient
                serverUrl http://192.168.0.76:8080, http://192.168.[0-1].[70-255]:8080
                pingTimeoutMillis 200
                reachServerTimeout 5s

Exemplo de registros de _XFS_URL_RANGES:

{
             "type": "_XFS_URL_RANGES",
             "records": [{
                     "id": 1,
                     "range": "http://192.168.0.158:8080"
             },
             {
                     "id": 2,
                     "range": "http://192.168.0.1-100:8080"
             }]
     }

Note

É importante criar os registros de _XFS_URL_RANGES de modo que o mais específico venha com um id menor do que os mais genéricos para que o aplicativo não leve tempo demais procurando por um XFS válido para se comunicar.

Configuração da Atualização do aplicativo (APK e Fluxo) e dos Dados Cadastrais dos Fluxos Gerenciados

O aplicativo que tem a funcionalidade de Field Server consegue gerenciar as versões dos fluxos que são passados para ele por meio dos registros da entidade _XFS_VERSION_UPDATE criada dinamicamente pelo parser quando a funciondade de FieldServer é encontrada.

Modelo da Entidade de Controle de Fluxos:

_XFS_VERSION_UPDATE sync=backgroundIn
        id int
        code String
        apkMd5 String
        apkVersion String
        apkPath String
        sourceMd5 String
        sourceVersion String
        sourcePath String
        downloaded Boolean

Exemplo de Envio de dados Da Entidade _XFS_VERSION_UPDATE pela WEB:

{
        "types": [{
                        "records": [{
                                        "code": "1238080",
                                        "id": 1
                                }, {
                                        "code": "350210",
                                        "id": 2
                                }
                        ],
                        "name": "_XFS_VERSION_UPDATE"
                }
        ],
        "status": 0
}

Ao receber dados da entidade _XFS_VERSION_UPDATE o aplicativo iniciará a rotina de gerenciamento dos dados de atualização dos aplicativos gerenciados. Para que seja possível que o aplicativo faço o download dos dados é necessário que a WEB implemente alguns serviços.

Quando o mobile solicitar os dados de listas atualizados a requisição pode ser feita em dois formatos com e sem o Auth dos aplicativos gerenciados.

Exemplo de Requisição sem o Auth:

POST /application-json
http://<WEB_URL>/xfs/list
{
        "sourceId": 28239,
        "installCode": "1238080",
        "version": "1.0.70",
        "coreVersion": "1.66.0",
        "intVersion": 71,
        "deviceUuid": "354106073914019",
        "appCode": "X",
        "batteryLevel": 100,
        "remoteAddr": "192.168.0.76",
        "requestBytesLength": 1377,
        "validTime": "27/12/2016 16:32:30",
        "validTimeType": "S",
        "deviceTime": "27/12/2016 16:32:32",
        "gpsTime": "27/12/2016 18:31:48",
        "lat": -23.19402454,
        "lon": -45.89274151,
        "network": "WIFI|s1m0v@AP",
        "deviceInfo": {
                "lastKnownGPSBearing": "0.0",
                "IMEI-1": "354106073914027",
                "X-INSTALLED-CODES": "1238080",
                "lastKnownGPSValidTime": "S 27/12/2016 16:32:21 - TZ: America/Sao_Paulo",
                "X-SOURCEVERSION": "1.0.70-71",
                "platform": "ANDROID",
                "launcherInstalled": "NO",
                "X-SERVER-URL": "http://192.168.0.131:8080/xmova-server/m",
                "pushId": "APA91bEXtQNChBUlCHG55wa7awXg2TTbJqluphuD9uNGAksTY_qxkM6HIYKAQCy--xAZA4ppIrB1yUETZzwFqSE63Z2NIL9AXvDu-FCwwHxpDZrh_Nxf1CqqBlhAOd5p0UbyY-FfsoCE",
                "X-INSTALLCODE": "1238080",
                "validTimeTimeZone": "America/Sao_Paulo",
                "lastKnownGPSSpeed": "0.0",
                "XUUID": "d5421503-ec44-4f05-aa85-ad7b7a78072c",
                "osVersion": "3.10.49-gc39bc14",
                "lastKnownLong": "-45.89274151",
                "deviceTimeMillis": "1482863551965",
                "model": "MotoG3",
                "SDK": "23",
                "BID": null,
                "XENV": "LOCAL",
                "GPSEnabled": "YES",
                "deviceIP": "192.168.0.76",
                "product": "osprey_retla_ds",
                "X-COREVERSION": "1.66.0",
                "currentGpsTime": "G 27/12/2016 18:20:35 - TZ: UTC",
                "currentGpsTimeMillis": "1482862835981",
                "IMEI": "354106073914019",
                "validTimeMillis": "1482863550010",
                "lastKnownGPSAccuracy": "54.0",
                "BOOT": "108686300",
                "XID": "000.003L",
                "WID": "A4:70:D6:44:57:57",
                "SIMINFO": "/SIMCOUNT:2/ROAMING:false",
                "lastKnownGPSTime": "1482863508000",
                "lastKnownAlt": "605.0",
                "deviceTimeZone": "America/Sao_Paulo",
                "validTime": "S 27/12/2016 16:32:30 - TZ: America/Sao_Paulo",
                "lastKnownLat": "-23.19402454",
                "device": "osprey_uds",
                "SECID": "880C6AA4C97D6417",
                "lastKnownGPSProvider": "gps"
        },
        "auth": {
                "Filial": 1
        },
        "types": [{
                        "types": [],
                        "code": "3027"
                }, {
                        "types": [{
                                        "types": [{
                                                        "name": "_XFS_VERSION_UPDATE",
                                                        "version": 0
                                                }, {
                                                        "name": "_XFS_FILE_UPDATE",
                                                        "version": 0
                                                }
                                        ]
                                }
                        ],
                        "code": "1238080"
                }
        ]
}

Exemplo de Requisição com o Auth:

POST /application-json
http://<WEB_URL>/xfs/list
{
        "sourceId": 28239,
        "installCode": "1238080",
        "version": "1.0.70",
        "coreVersion": "1.66.0",
        "intVersion": 71,
        "deviceUuid": "354106073914019",
        "appCode": "X",
        "batteryLevel": 100,
        "remoteAddr": "192.168.0.76",
        "requestBytesLength": 1468,
        "validTime": "27/12/2016 16:59:09",
        "validTimeType": "S",
        "deviceTime": "27/12/2016 16:59:10",
        "network": "WIFI|s1m0v@AP",
        "deviceInfo": {
                "lastKnownGPSBearing": "0.0",
                "IMEI-1": "354106073914027",
                "X-INSTALLED-CODES": "1238080",
                "lastKnownGPSValidTime": "S 27/12/2016 16:32:21 - TZ: America/Sao_Paulo",
                "X-SOURCEVERSION": "1.0.70-71",
                "platform": "ANDROID",
                "launcherInstalled": "NO",
                "X-SERVER-URL": "http://192.168.0.131:8080/xmova-server/m",
                "pushId": "APA91bEXtQNChBUlCHG55wa7awXg2TTbJqluphuD9uNGAksTY_qxkM6HIYKAQCy--xAZA4ppIrB1yUETZzwFqSE63Z2NIL9AXvDu-FCwwHxpDZrh_Nxf1CqqBlhAOd5p0UbyY-FfsoCE",
                "X-INSTALLCODE": "1238080",
                "validTimeTimeZone": "America/Sao_Paulo",
                "lastKnownGPSSpeed": "0.0",
                "XUUID": "d5421503-ec44-4f05-aa85-ad7b7a78072c",
                "osVersion": "3.10.49-gc39bc14",
                "lastKnownLong": "-45.89274151",
                "deviceTimeMillis": "1482865150888",
                "model": "MotoG3",
                "SDK": "23",
                "BID": null,
                "XENV": "LOCAL",
                "GPSEnabled": "YES",
                "deviceIP": "192.168.0.76",
                "product": "osprey_retla_ds",
                "X-COREVERSION": "1.66.0",
                "currentGpsTime": "G 27/12/2016 18:47:14 - TZ: UTC",
                "currentGpsTimeMillis": "1482864434903",
                "IMEI": "354106073914019",
                "validTimeMillis": "1482865149174",
                "lastKnownGPSAccuracy": "54.0",
                "BOOT": "110285228",
                "XID": "000.003L",
                "WID": "A4:70:D6:44:57:57",
                "SIMINFO": "/SIMCOUNT:2/ROAMING:false",
                "lastKnownGPSTime": "1482863508000",
                "lastKnownAlt": "605.0",
                "deviceTimeZone": "America/Sao_Paulo",
                "validTime": "S 27/12/2016 16:59:09 - TZ: America/Sao_Paulo",
                "lastKnownLat": "-23.19402454",
                "device": "osprey_uds",
                "SECID": "880C6AA4C97D6417",
                "lastKnownGPSProvider": "gps"
        },
        "auth": {
                "Filial": 1
        },
        "types": [{
                        "types": [],
                        "code": "3027"
                }, {
                        "types": [{
                                        "types": [{
                                                        "name": "_XFS_VERSION_UPDATE",
                                                        "version": 1317200891
                                                }, {
                                                        "name": "_XFS_FILE_UPDATE",
                                                        "version": 1364822817
                                                }
                                        ],
                                        "auth": {
                                                "idEquipemento": "20",
                                                "idFilial": "10"
                                        }
                                }
                        ],
                        "code": "1238080"
                }
        ]
}

Exemplo de uma Resposta com os Dados:

{
        "types": [{
                        "code": "1238080",
                        "records": [{
                                        "auth": {
                                                "idFilial": 10,
                                                "idEquipemento": 20
                                        },
                                        "types": [{
                                                        "records": [{
                                                                        "file": "image_2.jpg",
                                                                        "application": "simova-apps",
                                                                        "id": 1,
                                                                        "dir": "",
                                                                        "version": 1480674601253,
                                                                        "downloaded": 0,
                                                                        "url": "http://192.168.0.131:8081/pub/image_2.jpg",
                                                                        "md5": "2437E6C9AA460CE14D42784A69A9B144"
                                                                }
                                                        ],
                                                        "name": "_NANO_FILE_UPDATE"
                                                }, {
                                                        "records": [{
                                                                        "code": "1238080",
                                                                        "id": 1
                                                                }, {
                                                                        "code": "350210",
                                                                        "id": 2
                                                                }
                                                        ],
                                                        "name": "_NANO_VERSION_UPDATE"
                                                }
                                        ]
                                }
                        ]
                }, {
                        "code": "350210",
                        "records": [{
                                        "auth": {},
                                        "types": [{
                                                        "records": [{
                                                                        "file": "image_1.jpg",
                                                                        "application": "simova-nano-list",
                                                                        "id": 1,
                                                                        "dir": "",
                                                                        "version": 1480674601253,
                                                                        "downloaded": 0,
                                                                        "url": "http://192.168.0.131:8081/pub/image_2.jpg",
                                                                        "md5": "2437E6C9AA460CE14D42784A69A9B144"
                                                                }
                                                        ],
                                                        "name": "_NANO_FILE_UPDATE"
                                                }, {
                                                        "records": [{
                                                                        "code": "1238080",
                                                                        "id": 1
                                                                }, {
                                                                        "code": "3027",
                                                                        "id": 2
                                                                }
                                                        ],
                                                        "name": "_NANO_VERSION_UPDATE"
                                                }
                                        ]
                                }, {
                                        "auth": {
                                                "idFilial": 1
                                        },
                                        "types": [{
                                                        "records": [{
                                                                        "file": "image_2.jpg",
                                                                        "application": "simova-nano-list",
                                                                        "id": 2,
                                                                        "dir": "",
                                                                        "version": 1480674601253,
                                                                        "downloaded": 0,
                                                                        "url": "http://192.168.0.131:8081/pub/image_2.jpg",
                                                                        "md5": "2437E6C9AA460CE14D42784A69A9B144"
                                                                }
                                                        ],
                                                        "name": "_NANO_FILE_UPDATE"
                                                }
                                        ]
                                }
                        ]
                }
        ],
        "status": 0
}

Configuração de Entrega de Arquivos

Para que a entrega de arquivos possa acontecer o parser do xMova cria uma entidade denominada _XFS_FILE_UPDATE sempre que é encontrada a funcionalidade fieldServer no fluxo. Uma vez criada esta entidade que é do tipo sync=backgroundIn é possível ao painel fazer o envio dos arquivos que serão entregues pelo Simova Apps quando forem solicitados de acordo com o nome da aplicação e a versão do arquivo.

Formato da entidade ‘_XFS_FILE_UPDATE’ criada dinamicamente:

_XFS_FILE_UPDATE sync=backgroundIn
        id int
        application String
        file String
        version long
        md5 String
        url String
        dir String
        downloaded boolean

Formato de um dado enviado pelo painel:

{
  "types": [
    {
      "records": [
        {
          "file": "image_2.jpg",
          "application": "simova-apps",
          "id": 1,
          "version": 1480674601253,
          "url": "http://192.168.0.131:8081/pub/image_2.jpg",
          "md5": "2437E6C9AA460CE14D42784A69A9B144"
        },
        {
          "id": 2,
          "file": "xmova-bin-1.66.36.apk",
          "application": "simova-apps",
          "version": 1480674601254,
          "url": "http://xmova-server-h1.simova.ws/center1_65/update?code=1003&p=1",
          "md5": "595cdb25fc4b080a8e101acb7c7922dc"
        }
      ],
      "name": "_XFS_FILE_UPDATE"
    }
  ],
  "status": 0
}

Assim que o mobile recebe dados da entidade do painel, é iniciado o processo de download dos arquivos, é ideal que a url presente nos dados do arquivo permita o início do arquivo de um determinado range para que seja possível interromper o download e reiniciá-lo, principalmente no caso de download de arquivos grandes.

Formato da request:

GET /application_file.mp4
Range: bytes=100-

O Simova Apps irá manter os arquivos enquanto houver referência deles na web, caso a web adicione um novo arquivo e mantenha os anteriores será feita a avaliação dos arquivos presentes para verificar se atendem os requisitos e caso atenda não será feito o download novamente será feito o download apenas dos arquivos não existentes. Caso o usuário remova o arquivo da pasta, o aplicativo irá fazer o download novamente dos arquivos. O serviço de monitoramento e download dos arquivos funciona apenas enquanto o aplicativo Simova Apps estiver em execução, indepentende se Foreground ou Background. Quando for feita a solicitação de um arquivo ao Simova Apps este irá entregar o arquivo que tem o versionamento imediatamente posterior a versão passada.

Exemplo de uma requisição de arquivo para o Simova Apps:

POST
Request feita para a url <xfs_url>/update
{
        "application" : "fabricante|fabricante1|equipamento|2|modulo|1",
        "version" : "1480519103000"
}

Neste caso se existirem registros com os valores:

  • application = fabricante|fabricante2|equipamento|2|modulo|1 e version: 1480519103001
  • application = fabricante|fabricante1|equipamento|2|modulo|1 e version: 1480519103002
  • application = fabricante|fabricante1 e version: 1480519103003

Será enviado o segundo arquivo, pois embora o segundo e o terceiro arquivo atendam ao requisito da requisição do cliente a versão imediatamente posterior a versão solicitada é a versão do segundo arquivo

Configuração Para Receber Apontamentos de Aplicativos de Terceiros

Para que o aplicativo receba dados de um aplicativo de terceiros é necessário que o desenvolvedor do fluxo crie a entidade no fluxo para então o aplicativo de terceiros enviar os dados no padrão estabelecido. Não é obrigatório que o aplicativo de terceiro envie o list e uma entidade exterior. Podem ser enviados em conjunto, pode ser enviado somente o list ou pode ser enviado somente a entidade externa. O aplicativo irá identificar se é um objeto apenas ou uma lista de objetos, quando for uma lista é obrigatório enviar o atributo type representando o nome da entidade e o atributo records contendo o valor dos objetos.

Entidades para Receber Dados Declaradas no Fluxo:

AuthPegaDados sync=out
        modulo String
        codigoEquipamento String
        fabricante String
        tipoEquipamento String
        regionalEquipamento String
        filialEquipamento String
        dataUltimaAtualizacao Date
        files List<File>
        events
                OnFieldServerSendReceived
                        toast Received
                        if modulo == @error
                                return false

File sync=out
        id long uuid
        modulo String
        fileName String
        fileMD5 String
        file path
        file2 Path

Exemplo de um Envio de Dados:

POST /application-json
<xfs_url>/send
{
  "AuthPegaDados": {
    "modulo": "módulo 1",
    "codigoEquipamento": 1,
    "fabricante": "Simova",
    "tipoEquipamento": "Floresta",
    "regionalEquipamento": "1",
    "filialEquipamento": "1",
    "dataUltimaAtualizacao": 1480086614000
  },
  "lists": [
        {
                "type": "file",
                "records": [
                        {
                        "fileName": "imagem_2.jpg",
                        "fileMD5": "2437E6C9AA460CE14D42784A69A9B144",
                        "file": "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"
                        }
                ]
        }
  ]
}

Implementação de Comunicação Dinâmica

Foram criados dois novos eventos no App OnFieldServerDynamicRequest e OnFieldServerDynamicRequestSuccess para que o desenvolvedor do fluxo possa adicionar um comportamento dinânimo à url <xfs_url>/dynamic.

Para que a url <xfs_url>/dynamic fique disponível é necessário implementar pelo menos o evento OnFieldServerDynamicRequest. Quando implementados, ambos eventos recebem as sequintes variáveis: requestIp, requestId, requestUuid e requestParams que devem ter seus valores definidos pelo client da request por meio dos atributos ‘X-ID’, ‘X-UUID’ e ‘X-PARAMS’ o requestIp é definido automaticamente pelo protocolo HTTP.

Ao fim do evento OnFieldServerDynamicRequest o desenvolvedor do fluxo deve adicionar um retorno que será enviado para o client da request em forma de texto.

Exemplo de Implementação:

App
        ...
        OnFieldServerDynamicRequest
                toast requestIp
                toast requestId
                toast requestUuid
                toast requestParams


                return concat currentDate requestParams

        OnFieldServerDynamicRequestSuccess
                toast requestIp
                toast requestId
                toast requestUuid
                toast requestParams
                toast @sucesso