private void triggerTimer(SessionDao sessionDao, UserKey userKey, String value, int dashId, int[] deviceIds) { Session session = sessionDao.get(userKey); if (session != null) { if (!session.sendMessageToHardware(dashId, HARDWARE, TIMER_MSG_ID, value, deviceIds)) { actuallySendTimers++; } for (int deviceId : deviceIds) { session.sendToApps(HARDWARE, TIMER_MSG_ID, dashId, deviceId, value); } } }
private void sentOfflineMessage(ChannelHandlerContext ctx, Session session, DashBoard dashBoard, Device device) { //this is special case. //in case hardware quickly reconnects we do not mark it as disconnected //as it is already online after quick disconnect. //https://github.com/blynkkk/blynk-server/issues/403 boolean isHardwareConnected = session.isHardwareConnected(dashBoard.id, device.id); if (!isHardwareConnected) { log.trace("Changing device status. DeviceId {}, dashId {}", device.id, dashBoard.id); device.disconnected(); } if (!dashBoard.isActive) { return; } Notification notification = dashBoard.getNotificationWidget(); if (notification != null && notification.notifyWhenOffline) { sendPushNotification(ctx, notification, dashBoard.id, device); } else if (!dashBoard.isNotificationsOff) { session.sendOfflineMessageToApps(dashBoard.id, device.id); } }
public boolean isSameEventLoop(ChannelHandlerContext ctx) { return isSameEventLoop(ctx.channel()); }
public boolean sendMessageToHardware(int activeDashId, short cmd, int msgId, String body, int deviceId) { return hardwareChannels.size() == 0 || sendMessageToHardware(filter(body.length(), activeDashId, deviceId), cmd, msgId, body); }
public void sendToSharedApps(Channel sendingChannel, String sharedToken, short cmd, int msgId, String body) { Set<Channel> targetChannels = new HashSet<>(); for (Channel channel : appChannels) { if (channel != sendingChannel && needSync(channel, sharedToken)) { targetChannels.add(channel); } } int channelsNum = targetChannels.size(); if (channelsNum > 0) { send(targetChannels, cmd, msgId, body); } }
private static void completeLogin(Channel channel, Session session, User user, DashBoard dash, Device device, int msgId) { log.debug("completeLogin. {}", channel); session.addHardChannel(channel); channel.writeAndFlush(ACCEPTED); String responseBody = String.valueOf(dash.id) + DEVICE_SEPARATOR + device.id; session.sendToApps(HARDWARE_CONNECTED, msgId, dash.id, responseBody); log.info("{} mqtt hardware joined.", user.email); }
public boolean sendMessageToHardware(short cmd, int msgId, String body) { return sendMessageToHardware(hardwareChannels, cmd, msgId, body); }
Session session = sessionDao.get(state.userKey); if (session.isHardwareConnected(dashId)) { for (Device device : dash.devices) { String pmBody = dash.buildPMMessage(device.id); if (pmBody == null) { if (!session.isHardwareConnected(dashId, device.id)) { log.debug("No device in session."); if (ctx.channel().isWritable() && !dash.isNotificationsOff) { if (session.sendMessageToHardware(dashId, HARDWARE, PIN_MODE_MSG_ID, pmBody, device.id)) { log.debug("No device in session."); if (ctx.channel().isWritable() && !dash.isNotificationsOff) {
Session session = entry.getValue(); if ((allowRunWithoutApp || session.isAppConnected()) && session.isHardwareConnected()) { UserKey userKey = entry.getKey(); User user = userDao.users.get(userKey);
for (Channel appChannel : session.appChannels) { if (appChannel != ctx.channel() && appChannel.isWritable() && Session.needSync(appChannel, sharedToken)) { appChannel.writeAndFlush( makeUTF8StringMessage(APP_SYNC, message.id, message.body), if (session.sendMessageToHardware(dashId, HARDWARE, message.id, split[1], deviceIds) && !dash.isNotificationsOff) { log.debug("No device in session.");
private void completeLogin(Channel channel, Session session, User user, int msgId, Version version) { if (allowStoreIp) { user.lastLoggedIP = IPUtils.getIp(channel.remoteAddress()); } user.lastLoggedAt = System.currentTimeMillis(); session.addAppChannel(channel); channel.writeAndFlush(ok(msgId), channel.voidPromise()); for (DashBoard dashBoard : user.profile.dashBoards) { if (dashBoard.isAppConnectedOn && dashBoard.isActive) { log.trace("{}-{}. Sending App Connected event to hardware for project {}.", user.email, user.appName, dashBoard.id); session.sendMessageToHardware(dashBoard.id, BLYNK_INTERNAL, 7777, "acon"); } } if (version.isOutdated()) { channel.writeAndFlush( makeASCIIStringMessage(OUTDATED_APP_NOTIFICATION, msgId, "Your app is outdated. Please update to the latest app version. " + "Ignoring this notice may affect your projects."), channel.voidPromise()); } log.info("{} {}-app ({}) joined.", user.email, user.appName, version); }
public void sendToApps(short cmd, int msgId, int dashId, int deviceId, String body) { if (isAppConnected()) { String finalBody = prependDashIdAndDeviceId(dashId, deviceId, body); sendToApps(cmd, msgId, dashId, finalBody); } }
private void execute(Session session, Profile profile, DashBoard dash, int deviceId, SetPropertyPinAction action, long now) { String body = action.makeHardwareBody(); session.sendToApps(SET_WIDGET_PROPERTY, 888, dash.id, deviceId, body); Widget widget = dash.updateProperty(deviceId, action.dataStream.pin, action.property, action.value); //this is possible case for device selector if (widget == null) { profile.putPinPropertyStorageValue(dash, deviceId, PinType.VIRTUAL, action.dataStream.pin, action.property, action.value); } dash.updatedAt = now; } }
session.sendToSharedApps(ctx.channel(), dash.sharedToken, APP_SYNC, message.id, message.body); if (session.sendMessageToHardware(dashId, HARDWARE, message.id, split[1], deviceIds) && !dash.isNotificationsOff) { log.debug("No device in session.");
@GET @Path("{token}/isHardwareConnected") @Metric(HTTP_IS_HARDWARE_CONNECTED) public Response isHardwareConnected(@PathParam("token") String token) { TokenValue tokenValue = tokenManager.getTokenValueByToken(token); if (tokenValue == null) { log.debug("Requested token {} not found.", token); return badRequest("Invalid token."); } User user = tokenValue.user; int dashId = tokenValue.dash.id; int deviceId = tokenValue.device.id; Session session = sessionDao.get(new UserKey(user)); return ok(session.isHardwareConnected(dashId, deviceId)); }
@GET @Path("{token}/isAppConnected") @Metric(HTTP_IS_APP_CONNECTED) public Response isAppConnected(@PathParam("token") String token) { TokenValue tokenValue = tokenManager.getTokenValueByToken(token); if (tokenValue == null) { log.debug("Requested token {} not found.", token); return badRequest("Invalid token."); } User user = tokenValue.user; Session session = sessionDao.get(new UserKey(user)); return ok(tokenValue.dash.isActive && session.isAppConnected()); }
@Override public void channelInactive(ChannelHandlerContext ctx) { var state = getAppState(ctx.channel()); if (state != null) { var session = sessionDao.get(state.userKey); if (session != null) { log.trace("Application channel disconnect. {}", ctx.channel()); for (var dashBoard : state.user.profile.dashBoards) { if (dashBoard.isAppConnectedOn && dashBoard.isActive) { log.trace("{}-{}. Sending App Disconnected event to hardware.", state.user.email, state.user.appName); session.sendMessageToHardware(dashBoard.id, Command.BLYNK_INTERNAL, 7777, "adis"); } } } } }
public boolean sendMessageToHardware(int activeDashId, short cmd, int msgId, String body, int... deviceIds) { return hardwareChannels.size() == 0 || sendMessageToHardware(filter(body.length(), activeDashId, deviceIds), cmd, msgId, body); }
Session session = entry.getValue(); if (session.isHardwareConnected() && session.isAppConnected()) { connectedSessions++; if (session.isHardwareConnected()) { hardActive++; totalOnlineHards += session.hardwareChannels.size(); if (session.isAppConnected()) { appActive++; totalOnlineApps += session.appChannels.size();
session.sendToApps(HARDWARE, message.id, dash.id, deviceId, body); } else { log.trace("No active dashboard.");