8.1.4. Mesh Support

To receive EVENTS from MeshService following Events are observed on Telemesh app end at ViperUtil.java class inside the package com.w3engineers.unicef.util.helper.

ApiEvent.TRANSPORT_INIT - After initializing mesh service this event provide mesh initialization state with own user/peer id

ApiEvent.WALLET_LOADED - After successfully wallet get loaded this event provide wallet status

ApiEvent.PEER_ADD - This event provide the new peer id when another user/peer get discovered through local mesh

ApiEvent.PEER_REMOVED - This event provide the remove peer id when user/peer get removed from local mesh

ApiEvent.DATA - This event provide the received data in byte array format

ApiEvent.DATA_ACKNOWLEDGEMENT - This event provide the send data/message acknowledgment status with message-id

ApiEvent.USER_INFO - This event sends the connected peer’s info like peer name, peer image index, etc.

private void initObservers() {

        AppDataObserver.on().startObserver(ApiEvent.TRANSPORT_INIT, event -> {
            TransportInit transportInit = (TransportInit) event;

            if (transportInit.success) {
                myUserId = transportInit.nodeId;

                onMesh(myUserId);
            }
        });

        AppDataObserver.on().startObserver(ApiEvent.WALLET_LOADED, event -> {
            WalletLoaded walletLoaded = (WalletLoaded) event;

            if (walletLoaded.success) {
                onMeshPrepared();
            }
        });

        AppDataObserver.on().startObserver(ApiEvent.PEER_ADD, event -> {
            PeerAdd peerAdd = (PeerAdd) event;
            peerDiscoveryProcess(peerAdd.peerId, true);
        });

        AppDataObserver.on().startObserver(ApiEvent.PEER_REMOVED, event -> {
            PeerRemoved peerRemoved = (PeerRemoved) event;
            peerDiscoveryProcess(peerRemoved.peerId, false);
        });

        AppDataObserver.on().startObserver(ApiEvent.DATA, event -> {

            DataEvent dataEvent = (DataEvent) event;

            dataReceive(dataEvent.peerId, dataEvent.data);
        });

        AppDataObserver.on().startObserver(ApiEvent.DATA_ACKNOWLEDGEMENT, event -> {

            DataAckEvent dataAckEvent = (DataAckEvent) event;

            onAck(dataAckEvent.dataId, dataAckEvent.status);

        });

        AppDataObserver.on().startObserver(ApiEvent.USER_INFO, event -> {

            UserInfoEvent userInfoEvent = (UserInfoEvent) event;

            UserModel userModel = new UserModel().setName(userInfoEvent.getUserName())
                    .setImage(userInfoEvent.getAvatar())
                    .setTime(userInfoEvent.getRegTime());

            peerAdd(userInfoEvent.getAddress(), userModel);
        });

    }

To receive data from Viper to Telemesh Android app following abstract methods are used on Telemesh app end at MeshDataSource.java class inside the package com.w3engineers.unicef.telemesh.data.helper.

protected abstract void onMesh(String myMeshId) - When observer receive ApiEvent.TRANSPORT_INIT EVENT then this method get called.

protected abstract void peerAdd(String peerId, byte[] peerData) - When observer receive ApiEvent.DATA EVENT then this method get called.

protected abstract void peerAdd(String peerId, UserModel userModel) - When observer receive ApiEvent.USER_INFO EVENT then this method get called.

protected abstract void peerRemove(String nodeId) - When observer receive ApiEvent.PEER_REMOVED EVENT then this method get called.

protected abstract void onData(String peerId, ViperData viperData) - When observer receive ApiEvent.DATA EVENT then this method get called.

protected abstract void onAck(String messageId, int status) - When observer receive ApiEvent.DATA_ACKNOWLEDGEMENT EVENT then this method get called.

protected abstract boolean isNodeAvailable(String nodeId, int userActiveStatus) - To check whether the user/peer is currently active/online