├── .travis.yml
├── scripts
├── move.sh
├── move.bat
├── copy_to_local_server.sh
└── copy_to_azure_server.sh
├── server
├── twitter
│ ├── src
│ │ ├── test
│ │ │ ├── resources
│ │ │ │ └── twitter4j.properties
│ │ │ └── java
│ │ │ │ └── cc
│ │ │ │ └── blynk
│ │ │ │ └── server
│ │ │ │ └── twitter
│ │ │ │ └── TwitterWrapperTest.java
│ │ └── main
│ │ │ └── java
│ │ │ └── cc
│ │ │ └── blynk
│ │ │ └── server
│ │ │ ├── exceptions
│ │ │ ├── TweetException.java
│ │ │ └── TweetNotAuthorizedException.java
│ │ │ ├── model
│ │ │ └── TwitterAccessToken.java
│ │ │ └── twitter
│ │ │ └── TwitterWrapper.java
│ └── pom.xml
├── push-notifications-android
│ ├── src
│ │ ├── test
│ │ │ ├── resources
│ │ │ │ └── gcm.properties
│ │ │ └── java
│ │ │ │ └── cc
│ │ │ │ └── blynk
│ │ │ │ └── server
│ │ │ │ └── push
│ │ │ │ └── GCMWrapperTest.java
│ │ └── main
│ │ │ ├── java
│ │ │ └── cc
│ │ │ │ └── blynk
│ │ │ │ └── server
│ │ │ │ └── push
│ │ │ │ ├── response
│ │ │ │ ├── enums
│ │ │ │ │ ├── ControlType.java
│ │ │ │ │ └── NACKError.java
│ │ │ │ ├── ACKMessage.java
│ │ │ │ ├── ControlMessage.java
│ │ │ │ ├── NACKMessage.java
│ │ │ │ └── ResponseMessageBase.java
│ │ │ │ ├── exceptions
│ │ │ │ └── PushException.java
│ │ │ │ ├── request
│ │ │ │ └── RequestMessage.java
│ │ │ │ ├── GCMPacketExtension.java
│ │ │ │ ├── LoggingConnectionListener.java
│ │ │ │ ├── GCMWrapper.java
│ │ │ │ └── MyPacketListener.java
│ │ │ └── resources
│ │ │ └── log4j2.xml
│ └── pom.xml
├── tcp-server
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── cc
│ │ │ │ │ └── blynk
│ │ │ │ │ └── server
│ │ │ │ │ ├── model
│ │ │ │ │ ├── enums
│ │ │ │ │ │ ├── State.java
│ │ │ │ │ │ ├── PinType.java
│ │ │ │ │ │ └── WidgetType.java
│ │ │ │ │ ├── widgets
│ │ │ │ │ │ ├── controls
│ │ │ │ │ │ │ ├── SliderLarge.java
│ │ │ │ │ │ │ ├── Knob.java
│ │ │ │ │ │ │ ├── RGB.java
│ │ │ │ │ │ │ ├── Gamepad.java
│ │ │ │ │ │ │ ├── Keypad.java
│ │ │ │ │ │ │ ├── FourWayArrow.java
│ │ │ │ │ │ │ ├── RotaryKnob.java
│ │ │ │ │ │ │ ├── TwoWayArrow.java
│ │ │ │ │ │ │ ├── OneAxisJoystick.java
│ │ │ │ │ │ │ ├── TwoAxisJoystick.java
│ │ │ │ │ │ │ ├── Button.java
│ │ │ │ │ │ │ └── Slider.java
│ │ │ │ │ │ ├── inputs
│ │ │ │ │ │ │ ├── GPS.java
│ │ │ │ │ │ │ ├── Gyroscope.java
│ │ │ │ │ │ │ ├── Microphone.java
│ │ │ │ │ │ │ └── Accelerometer.java
│ │ │ │ │ │ ├── others
│ │ │ │ │ │ │ ├── RCT.java
│ │ │ │ │ │ │ ├── Email.java
│ │ │ │ │ │ │ ├── Eventor.java
│ │ │ │ │ │ │ ├── SDCard.java
│ │ │ │ │ │ │ ├── Twitter.java
│ │ │ │ │ │ │ ├── Terminal.java
│ │ │ │ │ │ │ ├── Notification.java
│ │ │ │ │ │ │ └── Timer.java
│ │ │ │ │ │ └── outputs
│ │ │ │ │ │ │ ├── Gauge.java
│ │ │ │ │ │ │ ├── Graph.java
│ │ │ │ │ │ │ ├── LCDDisplay.java
│ │ │ │ │ │ │ ├── LevelDisplay.java
│ │ │ │ │ │ │ ├── LED.java
│ │ │ │ │ │ │ └── Digit4Display.java
│ │ │ │ │ └── auth
│ │ │ │ │ │ ├── Stats.java
│ │ │ │ │ │ ├── nio
│ │ │ │ │ │ ├── ChannelState.java
│ │ │ │ │ │ └── ChannelServer.java
│ │ │ │ │ │ └── Session.java
│ │ │ │ │ ├── dao
│ │ │ │ │ ├── Storage.java
│ │ │ │ │ ├── SessionsHolder.java
│ │ │ │ │ ├── GraphInMemoryStorage.java
│ │ │ │ │ └── UserRegistry.java
│ │ │ │ │ ├── exceptions
│ │ │ │ │ ├── NotAllowedException.java
│ │ │ │ │ ├── UserNotRegistered.java
│ │ │ │ │ ├── InvalidTokenException.java
│ │ │ │ │ ├── UserAlreadyLoggedIn.java
│ │ │ │ │ ├── UserNotAuthenticated.java
│ │ │ │ │ ├── IllegalCommandException.java
│ │ │ │ │ ├── DeviceNotInNetworkException.java
│ │ │ │ │ ├── NoActiveDashboardException.java
│ │ │ │ │ └── TweetBodyInvalidException.java
│ │ │ │ │ ├── handlers
│ │ │ │ │ ├── workflow
│ │ │ │ │ │ ├── ClientChannelStateHandler.java
│ │ │ │ │ │ ├── PingHandler.java
│ │ │ │ │ │ ├── LoadProfileHandler.java
│ │ │ │ │ │ ├── DeActivateDashboardHandler.java
│ │ │ │ │ │ ├── GetTokenHandler.java
│ │ │ │ │ │ ├── RefreshTokenHandler.java
│ │ │ │ │ │ ├── TweetHandler.java
│ │ │ │ │ │ ├── ActivateDashboardHandler.java
│ │ │ │ │ │ ├── HardwareHandler.java
│ │ │ │ │ │ └── SaveProfileHandler.java
│ │ │ │ │ └── auth
│ │ │ │ │ │ ├── RegisterHandler.java
│ │ │ │ │ │ └── AppLoginHandler.java
│ │ │ │ │ ├── workers
│ │ │ │ │ ├── ShutdownHookWorker.java
│ │ │ │ │ ├── ProfileSaverWorker.java
│ │ │ │ │ └── PropertiesChangeWatcherWorker.java
│ │ │ │ │ ├── utils
│ │ │ │ │ ├── Finder.java
│ │ │ │ │ └── JsonParser.java
│ │ │ │ │ ├── core
│ │ │ │ │ ├── hardware
│ │ │ │ │ │ ├── HardwareServer.java
│ │ │ │ │ │ ├── HardwareChannelInitializer.java
│ │ │ │ │ │ └── HardwareHandlersHolder.java
│ │ │ │ │ ├── application
│ │ │ │ │ │ └── AppChannelInitializer.java
│ │ │ │ │ └── BaseServer.java
│ │ │ │ │ └── ArgumentsParser.java
│ │ │ └── resources
│ │ │ │ └── server.properties
│ │ └── test
│ │ │ ├── resources
│ │ │ ├── json_test
│ │ │ │ ├── user_profile_json_3.txt
│ │ │ │ ├── user_profile_with_timer.txt
│ │ │ │ ├── user_profile_json_2.txt
│ │ │ │ ├── user_profile_json_4.txt
│ │ │ │ ├── user_profile_json.txt
│ │ │ │ └── user_profile_json_5.txt
│ │ │ └── log4j2-test.xml
│ │ │ └── java
│ │ │ └── cc
│ │ │ └── blynk
│ │ │ └── server
│ │ │ ├── TestBase.java
│ │ │ ├── utils
│ │ │ ├── EMailValidationTest.java
│ │ │ └── FileManagerIntegrationTest.java
│ │ │ ├── handlers
│ │ │ └── workflow
│ │ │ │ └── SaveProfileHandlerTest.java
│ │ │ ├── workers
│ │ │ ├── PropertiesChangeWatcherWorkerTest.java
│ │ │ ├── ProfileSaverWorkerTest.java
│ │ │ └── timer
│ │ │ │ └── TimerWorkerTest.java
│ │ │ ├── dao
│ │ │ └── GraphInMemoryStorageTest.java
│ │ │ └── model
│ │ │ └── UserProfileCalcGraphPinsTest.java
│ └── pom.xml
├── push-notifications-ios
│ └── pom.xml
└── pom.xml
├── integration-tests
├── src
│ └── test
│ │ ├── resources
│ │ ├── twitter4j.properties
│ │ ├── log4j2-test.xml
│ │ ├── test-certs
│ │ │ ├── test-server.crt
│ │ │ └── test-server.pem
│ │ ├── server.properties
│ │ └── json_test
│ │ │ ├── user_profile_json.txt
│ │ │ └── user_profile_json_many_dashes.txt
│ │ └── java
│ │ └── cc
│ │ └── blynk
│ │ └── integration
│ │ └── model
│ │ ├── SimpleClientHandler.java
│ │ ├── ClientPair.java
│ │ ├── MockHolder.java
│ │ └── TestHardClient.java
└── pom.xml
├── client
├── src
│ ├── main
│ │ ├── resources
│ │ │ ├── log4j2.xml
│ │ │ └── test.crt
│ │ └── java
│ │ │ └── cc
│ │ │ └── blynk
│ │ │ └── client
│ │ │ ├── enums
│ │ │ └── ClientMode.java
│ │ │ ├── handlers
│ │ │ └── ClientReplayingMessageDecoder.java
│ │ │ ├── CommandParser.java
│ │ │ ├── core
│ │ │ ├── HardwareClient.java
│ │ │ └── AppClient.java
│ │ │ ├── HexConvertor.java
│ │ │ └── ClientLauncher.java
│ └── test
│ │ └── java
│ │ └── cc
│ │ └── blynk
│ │ └── client
│ │ └── ClientTest.java
└── pom.xml
├── common
├── src
│ ├── main
│ │ └── java
│ │ │ └── cc
│ │ │ └── blynk
│ │ │ └── common
│ │ │ ├── utils
│ │ │ ├── Config.java
│ │ │ ├── ParseUtil.java
│ │ │ ├── ReflectionUtil.java
│ │ │ └── StringUtils.java
│ │ │ ├── exceptions
│ │ │ ├── UnsupportedCommandException.java
│ │ │ └── BaseServerException.java
│ │ │ ├── model
│ │ │ └── messages
│ │ │ │ ├── Message.java
│ │ │ │ ├── protocol
│ │ │ │ ├── PingMessage.java
│ │ │ │ ├── hardware
│ │ │ │ │ └── TweetMessage.java
│ │ │ │ ├── appllication
│ │ │ │ │ ├── LoginMessage.java
│ │ │ │ │ ├── GetTokenMessage.java
│ │ │ │ │ ├── RegisterMessage.java
│ │ │ │ │ ├── LoadProfileMessage.java
│ │ │ │ │ ├── SaveProfileMessage.java
│ │ │ │ │ ├── RefreshTokenMessage.java
│ │ │ │ │ ├── ActivateDashboardMessage.java
│ │ │ │ │ └── DeActivateDashboardMessage.java
│ │ │ │ └── HardwareMessage.java
│ │ │ │ ├── ResponseMessage.java
│ │ │ │ ├── MessageBase.java
│ │ │ │ └── MessageFactory.java
│ │ │ ├── handlers
│ │ │ ├── encoders
│ │ │ │ └── DeviceMessageEncoder.java
│ │ │ ├── decoders
│ │ │ │ └── ReplayingMessageDecoder.java
│ │ │ └── DefaultExceptionHandler.java
│ │ │ ├── enums
│ │ │ ├── Command.java
│ │ │ └── Response.java
│ │ │ └── stats
│ │ │ ├── metrics
│ │ │ └── InstanceLoadMeter.java
│ │ │ └── GlobalStats.java
│ └── test
│ │ └── java
│ │ └── cc
│ │ └── blynk
│ │ └── common
│ │ └── utils
│ │ └── StringUtilsTest.java
└── pom.xml
└── license.txt
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: java
2 | jdk:
3 | - oraclejdk8
4 | script: mvn test
--------------------------------------------------------------------------------
/scripts/move.sh:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HenrikDA/blynk-server/HEAD/scripts/move.sh
--------------------------------------------------------------------------------
/scripts/move.bat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HenrikDA/blynk-server/HEAD/scripts/move.bat
--------------------------------------------------------------------------------
/server/twitter/src/test/resources/twitter4j.properties:
--------------------------------------------------------------------------------
1 | debug=true
2 | oauth.consumerKey=
3 | oauth.consumerSecret=
--------------------------------------------------------------------------------
/scripts/copy_to_local_server.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | scp ../build/server-0.1.jar pupkin@192.168.0.64:/home/pupkin/Dropbox/blynk_new
--------------------------------------------------------------------------------
/scripts/copy_to_azure_server.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | scp ../build/server-0.1.jar azureuser@blynk-test-east.cloudapp.net:/home/azureuser
--------------------------------------------------------------------------------
/server/push-notifications-android/src/test/resources/gcm.properties:
--------------------------------------------------------------------------------
1 | gcm.server=gcm.googleapis.com
2 | gcm.port=5235
3 | gcm.project.id=YOUR_PROJECT_ID_HERE
4 | gcm.api.key=YOUR_API_KEY_HERE
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/enums/State.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.enums;
2 |
3 | /**
4 | * User: ddumanskiy
5 | * Date: 21.11.13
6 | * Time: 13:44
7 | */
8 | public enum State {
9 |
10 | ON, OFF
11 | }
12 |
--------------------------------------------------------------------------------
/server/tcp-server/src/test/resources/json_test/user_profile_json_3.txt:
--------------------------------------------------------------------------------
1 | {"dashBoards":[{"id":1,"boardType":"UNO","widgets":[{"y":0,"id":2948750487994149329,"type":"BUTTON","x":0,"label":"BUTTON"},{"y":6,"id":4396013099992412521,"type":"SLIDER","x":2,"label":"SLIDER"}]}]}
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/enums/PinType.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.enums;
2 |
3 | /**
4 | * User: ddumanskiy
5 | * Date: 10.12.13
6 | * Time: 10:15
7 | */
8 | public enum PinType {
9 |
10 | NONE,
11 | DIGITAL,
12 | VIRTUAL,
13 | ANALOG
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/SliderLarge.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 21.03.15.
7 | */
8 | public class SliderLarge extends Slider {
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/response/enums/ControlType.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push.response.enums;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/8/2015.
7 | */
8 | public enum ControlType {
9 |
10 | CONNECTION_DRAINING
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/inputs/GPS.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.inputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class GPS extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/others/RCT.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.others;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class RCT extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/Knob.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Knob extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/RGB.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class RGB extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/others/Email.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.others;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Email extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/others/Eventor.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.others;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Eventor extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/others/SDCard.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.others;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class SDCard extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/others/Twitter.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.others;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Twitter extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/outputs/Gauge.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.outputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Gauge extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/outputs/Graph.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.outputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Graph extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/Gamepad.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Gamepad extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/Keypad.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Keypad extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/inputs/Gyroscope.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.inputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Gyroscope extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/others/Terminal.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.others;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Terminal extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/FourWayArrow.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class FourWayArrow extends Widget {
11 | }
12 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/RotaryKnob.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class RotaryKnob extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/TwoWayArrow.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class TwoWayArrow extends Widget {
11 | }
12 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/inputs/Microphone.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.inputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Microphone extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/others/Notification.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.others;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Notification extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/outputs/LCDDisplay.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.outputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class LCDDisplay extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/inputs/Accelerometer.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.inputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Accelerometer extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/outputs/LevelDisplay.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.outputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class LevelDisplay extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/OneAxisJoystick.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class OneAxisJoystick extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/TwoAxisJoystick.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class TwoAxisJoystick extends Widget {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/outputs/LED.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.outputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class LED extends Widget {
11 |
12 | int color;
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/dao/Storage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.dao;
2 |
3 | import cc.blynk.server.model.auth.User;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 2/18/2015.
9 | */
10 | public interface Storage {
11 |
12 | public String store(User user, Integer dashId, String body, int msgId);
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/Button.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Button extends Widget {
11 |
12 | public boolean pushMode;
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/exceptions/PushException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push.exceptions;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/8/2015.
7 | */
8 | public class PushException extends RuntimeException {
9 |
10 | public PushException(String message) {
11 | super(message);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/integration-tests/src/test/resources/twitter4j.properties:
--------------------------------------------------------------------------------
1 | ## For local servers you should fill this fields by yourself
2 | ## Go here https://apps.twitter.com/
3 | ## Create twitter app.
4 | ## paste here consumerKey and consumerSecret
5 | ## Access token will be populated from mobile app.
6 | ## Also you could read instruction here http://twitter4j.org/en/code-examples.html
7 | debug=true
8 | oauth.consumerKey=
9 | oauth.consumerSecret=
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/outputs/Digit4Display.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.outputs;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Digit4Display extends Widget {
11 |
12 | public int min;
13 |
14 | public int max;
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/server/tcp-server/src/test/java/cc/blynk/server/TestBase.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server;
2 |
3 | import cc.blynk.common.utils.ServerProperties;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 2/12/2015.
9 | */
10 | public class TestBase {
11 |
12 | public ServerProperties props = new ServerProperties();
13 | public String dataFolder = props.getProperty("data.folder");
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/response/ACKMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push.response;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/8/2015.
7 | */
8 | public class ACKMessage extends ResponseMessageBase {
9 |
10 | @Override
11 | public String toString() {
12 | return "ACKMessage{" + super.toString() + "}";
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/client/src/main/resources/log4j2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/controls/Slider.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.controls;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Slider extends Widget {
11 |
12 | public boolean pwmMode;
13 |
14 | public int min;
15 |
16 | public int max;
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/utils/Config.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.utils;
2 |
3 | import java.nio.charset.Charset;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 1/31/2015.
9 | */
10 | public class Config {
11 |
12 | public static final Charset DEFAULT_CHARSET = Charset.defaultCharset();
13 |
14 | public static final String SERVER_PROPERTIES_FILENAME = "server.properties";
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/server/tcp-server/src/test/resources/json_test/user_profile_with_timer.txt:
--------------------------------------------------------------------------------
1 | {"dashBoards":[{"boardType":"Arduino Mega","widgets":[{"pushMode":false,"type":"BUTTON","pinType":"DIGITAL","pin":13,"index":0,"id":2,"height":2,"width":2,"x":0,"y":0},{"stopValue":"dw\u00009\u00000","startValue":"dw\u00009\u00001","stopTime":-1,"startTime":65640,"type":"TIMER","label":"","pinType":"DIGITAL","pin":9,"index":43,"id":3,"height":1,"width":3,"x":3,"y":5}],"name":"NEW PROJECT","id":1}]}
2 |
--------------------------------------------------------------------------------
/integration-tests/src/test/resources/log4j2-test.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/resources/log4j2.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/widgets/others/Timer.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.widgets.others;
2 |
3 | import cc.blynk.server.model.widgets.Widget;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 21.03.15.
9 | */
10 | public class Timer extends Widget {
11 |
12 | public Long startTime;
13 |
14 | public String startValue;
15 |
16 | public Long stopTime;
17 |
18 | public String stopValue;
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/exceptions/UnsupportedCommandException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 2/3/2015.
9 | */
10 | public class UnsupportedCommandException extends BaseServerException {
11 |
12 | public UnsupportedCommandException(String message, int msgId) {
13 | super(message, msgId, Response.ILLEGAL_COMMAND);
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/server/twitter/src/main/java/cc/blynk/server/exceptions/TweetException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class TweetException extends BaseServerException {
12 |
13 | public TweetException(String message, int msgId) {
14 | super(message, msgId, Response.TWEET_EXCEPTION);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/NotAllowedException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/23/2015.
10 | */
11 | public class NotAllowedException extends BaseServerException {
12 |
13 | public NotAllowedException(String message, int msgId) {
14 | super(message, msgId, Response.NOT_ALLOWED);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/UserNotRegistered.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class UserNotRegistered extends BaseServerException {
12 |
13 | public UserNotRegistered(String message, int msgId) {
14 | super(message, msgId, Response.USER_NOT_REGISTERED);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/InvalidTokenException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class InvalidTokenException extends BaseServerException {
12 |
13 | public InvalidTokenException(String message, int msgId) {
14 | super(message, msgId, Response.INVALID_TOKEN);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/exceptions/BaseServerException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.exceptions;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/3/2015.
7 | */
8 | public class BaseServerException extends RuntimeException {
9 |
10 | public final int msgId;
11 | public final int errorCode;
12 |
13 | public BaseServerException(String message, int msgId, int errorCode) {
14 | super(message);
15 | this.msgId = msgId;
16 | this.errorCode = errorCode;
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/UserAlreadyLoggedIn.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class UserAlreadyLoggedIn extends BaseServerException {
12 |
13 | public UserAlreadyLoggedIn(String message, int msgId) {
14 | super(message, msgId, Response.USER_ALREADY_LOGGED_IN);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/UserNotAuthenticated.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class UserNotAuthenticated extends BaseServerException {
12 |
13 | public UserNotAuthenticated(String message, int msgId) {
14 | super(message, msgId, Response.USER_NOT_AUTHENTICATED);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/IllegalCommandException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class IllegalCommandException extends BaseServerException {
12 |
13 | public IllegalCommandException(String message, int msgId) {
14 | super(message, msgId, Response.ILLEGAL_COMMAND);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/DeviceNotInNetworkException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class DeviceNotInNetworkException extends BaseServerException {
12 |
13 | public DeviceNotInNetworkException(String message, int msgId) {
14 | super(message, msgId, Response.DEVICE_NOT_IN_NETWORK);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/NoActiveDashboardException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/23/2015.
10 | */
11 | public class NoActiveDashboardException extends BaseServerException {
12 |
13 | public NoActiveDashboardException(String message, int msgId) {
14 | super(message, msgId, Response.NO_ACTIVE_DASHBOARD);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/exceptions/TweetBodyInvalidException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class TweetBodyInvalidException extends BaseServerException {
12 |
13 | public TweetBodyInvalidException(String message, int msgId) {
14 | super(message, msgId, Response.TWEET_BODY_INVALID_EXCEPTION);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/server/twitter/src/main/java/cc/blynk/server/exceptions/TweetNotAuthorizedException.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.exceptions;
2 |
3 | import cc.blynk.common.enums.Response;
4 | import cc.blynk.common.exceptions.BaseServerException;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/3/2015.
10 | */
11 | public class TweetNotAuthorizedException extends BaseServerException {
12 |
13 | public TweetNotAuthorizedException(String message, int msgId) {
14 | super(message, msgId, Response.TWEET_NOT_AUTHORIZED_EXCEPTION);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/Message.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/1/2015.
7 | */
8 | public abstract class Message extends MessageBase {
9 |
10 | public String body;
11 |
12 | public Message(int messageId, short command, int length, String body) {
13 | super(messageId, command, length);
14 | this.body = body;
15 | }
16 |
17 | @Override
18 | public String toString() {
19 | return super.toString() + ", body='" + body + "'";
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/client/src/main/java/cc/blynk/client/enums/ClientMode.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.client.enums;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/16/2015.
7 | */
8 | public enum ClientMode {
9 |
10 | APP, HARDWARE;
11 |
12 | public static ClientMode parse(String val) {
13 | for (ClientMode clientMode : values()) {
14 | if (clientMode.name().equalsIgnoreCase(val)) {
15 | return clientMode;
16 | }
17 | }
18 |
19 | throw new RuntimeException("Wrong client mode. app and hardware only supported.");
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/response/ControlMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push.response;
2 |
3 | import cc.blynk.server.push.response.enums.ControlType;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 2/8/2015.
9 | */
10 | public class ControlMessage extends ResponseMessageBase {
11 |
12 | public ControlType control_type;
13 |
14 | @Override
15 | public String toString() {
16 | return "ControlMessage{" +
17 | "control_type='" + control_type + "'," +
18 | super.toString() + "} ";
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/integration-tests/src/test/java/cc/blynk/integration/model/SimpleClientHandler.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.integration.model;
2 |
3 | import cc.blynk.common.model.messages.MessageBase;
4 | import io.netty.channel.ChannelHandlerContext;
5 | import io.netty.channel.SimpleChannelInboundHandler;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 1/31/2015.
11 | */
12 | public class SimpleClientHandler extends SimpleChannelInboundHandler {
13 |
14 | @Override
15 | public void channelRead0(ChannelHandlerContext ctx, MessageBase msg) throws Exception {
16 | //System.out.println(msg);
17 | }
18 |
19 | }
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/PingMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.PING;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class PingMessage extends Message {
13 |
14 | public PingMessage(int messageId, String body) {
15 | super(messageId, PING, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "PingMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/hardware/TweetMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.hardware;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.TWEET;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class TweetMessage extends Message {
13 |
14 | public TweetMessage(int messageId, String body) {
15 | super(messageId, TWEET, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "TweetMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/appllication/LoginMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.appllication;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.LOGIN;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class LoginMessage extends Message {
13 |
14 | public LoginMessage(int messageId, String body) {
15 | super(messageId, LOGIN, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "LoginMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/test/java/cc/blynk/server/push/GCMWrapperTest.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push;
2 |
3 | import org.junit.Ignore;
4 | import org.junit.Test;
5 |
6 | import java.util.HashMap;
7 | import java.util.Map;
8 |
9 | /**
10 | * The Blynk Project.
11 | * Created by Dmitriy Dumanskiy.
12 | * Created on 2/8/2015.
13 | */
14 | public class GCMWrapperTest {
15 |
16 | @Test
17 | @Ignore
18 | public void testSendMessage() throws Exception {
19 | Map payload = new HashMap<>();
20 | payload.put("Hello", "World");
21 | new GCMWrapper().sendMessage("534534534534", payload);
22 | Thread.sleep(1000);
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/appllication/GetTokenMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.appllication;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.GET_TOKEN;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class GetTokenMessage extends Message {
13 |
14 | public GetTokenMessage(int messageId, String body) {
15 | super(messageId, GET_TOKEN, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "GetTokenMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/appllication/RegisterMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.appllication;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.REGISTER;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class RegisterMessage extends Message {
13 |
14 | public RegisterMessage(int messageId, String body) {
15 | super(messageId, REGISTER, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "RegisterMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/server/twitter/src/main/java/cc/blynk/server/model/TwitterAccessToken.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/7/2015.
7 | */
8 | public class TwitterAccessToken {
9 |
10 | private String token;
11 | private String tokenSecret;
12 |
13 | public TwitterAccessToken() {
14 | }
15 |
16 | public TwitterAccessToken(String token, String tokenSecret) {
17 | this.token = token;
18 | this.tokenSecret = tokenSecret;
19 | }
20 |
21 | public String getToken() {
22 | return token;
23 | }
24 |
25 | public String getTokenSecret() {
26 | return tokenSecret;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/appllication/LoadProfileMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.appllication;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.LOAD_PROFILE;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class LoadProfileMessage extends Message {
13 |
14 | public LoadProfileMessage(int messageId, String body) {
15 | super(messageId, LOAD_PROFILE, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "LoadProfileMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/appllication/SaveProfileMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.appllication;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.SAVE_PROFILE;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class SaveProfileMessage extends Message {
13 |
14 | public SaveProfileMessage(int messageId, String body) {
15 | super(messageId, SAVE_PROFILE, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "SaveProfileMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/integration-tests/src/test/java/cc/blynk/integration/model/ClientPair.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.integration.model;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/4/2015.
7 | */
8 | public class ClientPair {
9 |
10 | public TestAppClient appClient;
11 |
12 | public TestHardClient hardwareClient;
13 |
14 | public String token;
15 |
16 | public ClientPair(TestAppClient appClient, TestHardClient hardwareClient, String token) {
17 | this.appClient = appClient;
18 | this.hardwareClient = hardwareClient;
19 | this.token = token;
20 | }
21 |
22 | public void stop() {
23 | appClient.stop();
24 | hardwareClient.stop();
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/response/NACKMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push.response;
2 |
3 | import cc.blynk.server.push.response.enums.NACKError;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 2/8/2015.
9 | */
10 | public class NACKMessage extends ResponseMessageBase {
11 |
12 | public NACKError error;
13 |
14 | public String error_description;
15 |
16 |
17 | @Override
18 | public String toString() {
19 | return "NACKMessage{" +
20 | "error='" + error + '\'' +
21 | ", error_description='" + error_description + "'," +
22 | super.toString() + "}";
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/appllication/RefreshTokenMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.appllication;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.REFRESH_TOKEN;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class RefreshTokenMessage extends Message {
13 |
14 | public RefreshTokenMessage(int messageId, String body) {
15 | super(messageId, REFRESH_TOKEN, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "RefreshTokenMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/appllication/ActivateDashboardMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.appllication;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.ACTIVATE_DASHBOARD;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class ActivateDashboardMessage extends Message {
13 |
14 | public ActivateDashboardMessage(int messageId, String body) {
15 | super(messageId, ACTIVATE_DASHBOARD, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "ActivateDashboardMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/ResponseMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages;
2 |
3 | import cc.blynk.common.enums.Command;
4 | import cc.blynk.common.enums.Response;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/1/2015.
10 | */
11 | public class ResponseMessage extends MessageBase {
12 |
13 | public ResponseMessage(int messageId, short command, int length) {
14 | super(messageId, command, length);
15 | }
16 |
17 | @Override
18 | public String toString() {
19 | return "ResponseMessage{id=" + id +
20 | ", command=" + Command.getNameByValue(command) +
21 | ", responseCode=" + Response.getNameByValue(length) + "}";
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/appllication/DeActivateDashboardMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol.appllication;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.DEACTIVATE_DASHBOARD;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class DeActivateDashboardMessage extends Message {
13 |
14 | public DeActivateDashboardMessage(int messageId, String body) {
15 | super(messageId, DEACTIVATE_DASHBOARD, body.length(), body);
16 | }
17 |
18 | @Override
19 | public String toString() {
20 | return "DeActivateDashboardMessage{" + super.toString() + "}";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/server/twitter/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | server
5 | cc.blynk
6 | 0.3-SNAPSHOT
7 |
8 | 4.0.0
9 |
10 | twitter
11 |
12 |
13 |
14 |
15 | org.twitter4j
16 | twitter4j-core
17 | 4.0.2
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/common/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | blynk
5 | cc.blynk
6 | 0.3-SNAPSHOT
7 |
8 | 4.0.0
9 |
10 | jar
11 | common
12 |
13 |
14 |
15 | com.codahale.metrics
16 | metrics-core
17 | 3.0.2
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/server/push-notifications-ios/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | server
5 | cc.blynk
6 | 0.3-SNAPSHOT
7 |
8 | 4.0.0
9 |
10 | push-notifications-ios
11 |
12 |
13 |
14 | com.notnoop.apns
15 | apns
16 | 1.0.0.Beta6
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/auth/Stats.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.auth;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/11/2015.
7 | */
8 | //todo think about migration
9 | public class Stats {
10 |
11 | private final int[] commands;
12 | private final int[] exceptions;
13 |
14 | public Stats() {
15 | //21 - is because Commands max value is 20;
16 | this.commands = new int[21];
17 | this.exceptions = new int[20];
18 | }
19 |
20 | //do not expect to be incremented from different threads
21 | public void incr(short cmd) {
22 | commands[cmd]++;
23 | }
24 |
25 | public void incrException(int exceptionCode) {
26 | exceptions[exceptionCode]++;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/server/tcp-server/src/test/resources/json_test/user_profile_json_2.txt:
--------------------------------------------------------------------------------
1 | {
2 | "dashBoards":[
3 | {
4 | "id":1,
5 | "boardType":"UNO",
6 | "widgets":[
7 | {
8 | "x":0,
9 | "type":"SLIDER",
10 | "y":4,
11 | "id":9013884621491657959,
12 | "label":"SLIDER",
13 | "width":8,
14 | "height":1,
15 | "pin":-1
16 | },
17 | {
18 | "x":0,
19 | "type":"BUTTON",
20 | "y":0,
21 | "id":8101118353106571483,
22 | "label":"BUTTON",
23 | "width":2,
24 | "height":2,
25 | "pin":-1
26 | }
27 | ]
28 | }
29 | ]
30 | }
--------------------------------------------------------------------------------
/server/twitter/src/test/java/cc/blynk/server/twitter/TwitterWrapperTest.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.twitter;
2 |
3 | import cc.blynk.server.exceptions.TweetException;
4 | import org.junit.Ignore;
5 | import org.junit.Test;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/7/2015.
11 | */
12 | public class TwitterWrapperTest {
13 |
14 | @Test
15 | @Ignore
16 | public void testTweet() {
17 | String token = "PUT_YOUR_TOKEN_HERE";
18 | String tokenSecret = "PUT_YOUR_TOKEN_SECRET_HERE";
19 | new TwitterWrapper().tweet(token, tokenSecret, "Hello444", 1);
20 | }
21 |
22 | @Test(expected = TweetException.class)
23 | public void expectException() {
24 | new TwitterWrapper().tweet("", "", "Hello 123", 1);
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/utils/ParseUtil.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.utils;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 1/31/2015.
7 | */
8 | public final class ParseUtil {
9 |
10 | public static int parseInt(String intProperty) {
11 | try {
12 | return Integer.parseInt(intProperty);
13 | } catch (NumberFormatException nfe) {
14 | throw new RuntimeException(intProperty + " not a number. " + nfe.getMessage());
15 | }
16 | }
17 |
18 | public static long parseLong(String longProperty) {
19 | try {
20 | return Integer.parseInt(longProperty);
21 | } catch (NumberFormatException nfe) {
22 | throw new RuntimeException(longProperty + " not a number. " + nfe.getMessage());
23 | }
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/auth/nio/ChannelState.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.auth.nio;
2 |
3 | import cc.blynk.server.model.auth.User;
4 | import io.netty.channel.Channel;
5 | import io.netty.channel.socket.nio.NioSocketChannel;
6 |
7 | import java.nio.channels.SocketChannel;
8 |
9 | /**
10 | * The Blynk Project.
11 | * Created by Dmitriy Dumanskiy.
12 | * Created on 2/17/2015.
13 | */
14 | public class ChannelState extends NioSocketChannel {
15 |
16 | public boolean isHardwareChannel;
17 |
18 | /**
19 | * Used for hardware channels in order to have quick access to dashId of dashboard connect to this hardware channel.
20 | */
21 | public Integer dashId;
22 |
23 | public User user;
24 |
25 | public ChannelState(Channel parent, SocketChannel socket) {
26 | super(parent, socket);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/enums/WidgetType.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.enums;
2 |
3 | /**
4 | * User: ddumanskiy
5 | * Date: 21.11.13
6 | * Time: 13:12
7 | */
8 | public enum WidgetType {
9 |
10 | //controls
11 | BUTTON,
12 | SLIDER,
13 | SLIDER_LARGE,
14 | KNOB,
15 | ROTARY_KNOB,
16 | RGB,
17 | TWO_WAY_ARROW,
18 | FOUR_WAY_ARROW,
19 | ONE_AXIS_JOYSTICK,
20 | TWO_AXIS_JOYSTICK,
21 | GAMEPAD,
22 | KEYPAD,
23 |
24 | //outputs
25 | LED,
26 | DIGIT4_DISPLAY, //same as NUMERICAL_DISPLAY
27 | GAUGE,
28 | LCD_DISPLAY,
29 | GRAPH,
30 | LEVEL_DISPLAY,
31 |
32 | //inputs
33 | MICROPHONE,
34 | GYROSCOPE,
35 | ACCELEROMETER,
36 | GPS,
37 |
38 | //other
39 | TERMINAL,
40 | TWITTER,
41 | EMAIL,
42 | NOTIFICATION,
43 | SD_CARD,
44 | EVENTOR,
45 | RCT,
46 | TIMER
47 |
48 | }
49 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/request/RequestMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push.request;
2 |
3 | import java.util.Map;
4 |
5 | /**
6 | * The Blynk Project.
7 | * Created by Dmitriy Dumanskiy.
8 | * Created on 2/8/2015.
9 | */
10 | public class RequestMessage {
11 |
12 | public String to;
13 |
14 | public String message_id;
15 |
16 | public Map data;
17 |
18 | public long time_to_live;
19 |
20 | public boolean delay_while_idle;
21 |
22 | public boolean delivery_receipt_requested;
23 |
24 | public RequestMessage(String to, String message_id, Map data, long time_to_live, boolean delay_while_idle) {
25 | this.to = to;
26 | this.message_id = message_id;
27 | this.data = data;
28 | this.time_to_live = time_to_live;
29 | this.delay_while_idle = delay_while_idle;
30 | this.delivery_receipt_requested = false;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/model/messages/protocol/HardwareMessage.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.model.messages.protocol;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 |
5 | import static cc.blynk.common.enums.Command.HARDWARE_COMMAND;
6 |
7 | /**
8 | * The Blynk Project.
9 | * Created by Dmitriy Dumanskiy.
10 | * Created on 2/1/2015.
11 | */
12 | public class HardwareMessage extends Message {
13 |
14 | public HardwareMessage(int messageId, String body) {
15 | super(messageId, HARDWARE_COMMAND, body.length(), body);
16 | }
17 |
18 | public static String attachTS(String body) {
19 | return body + '\0' + System.currentTimeMillis();
20 | }
21 |
22 | public HardwareMessage updateMessageBody(String newBody) {
23 | this.body = newBody;
24 | this.length = newBody.length();
25 | return this;
26 | }
27 |
28 | @Override
29 | public String toString() {
30 | return "HardwareMessage{" + super.toString() + "}";
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/server/push-notifications-android/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | server
5 | cc.blynk
6 | 0.3-SNAPSHOT
7 |
8 | 4.0.0
9 |
10 | push-notifications-android
11 |
12 |
13 |
14 |
15 | org.igniterealtime.smack
16 | smack-core
17 | 4.0.6
18 |
19 |
20 |
21 | org.igniterealtime.smack
22 | smack-tcp
23 | 4.0.6
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/client/src/main/java/cc/blynk/client/handlers/ClientReplayingMessageDecoder.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.client.handlers;
2 |
3 | import cc.blynk.common.handlers.decoders.ReplayingMessageDecoder;
4 | import io.netty.channel.ChannelHandlerContext;
5 |
6 | import java.io.IOException;
7 |
8 | /**
9 | * The Blynk Project.
10 | * Created by Dmitriy Dumanskiy.
11 | * Created on 2/20/2015.
12 | */
13 | public class ClientReplayingMessageDecoder extends ReplayingMessageDecoder {
14 |
15 | @Override
16 | public void channelInactive(ChannelHandlerContext ctx) throws Exception {
17 | throw new IOException("Server closed client connection.");
18 | }
19 |
20 | @Override
21 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
22 | //server goes down
23 | if (cause instanceof IOException) {
24 | ctx.close();
25 | log.error("Client socket closed. Reason : {}", cause.getMessage());
26 | //todo find better way
27 | System.exit(0);
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/response/enums/NACKError.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push.response.enums;
2 |
3 | /**
4 | * The Blynk Project.
5 | * Created by Dmitriy Dumanskiy.
6 | * Created on 2/8/2015.
7 | */
8 | public enum NACKError {
9 |
10 | BAD_ACK("The ACK message is improperly formed."),
11 | BAD_REGISTRATION("The device has a registration ID, but it's invalid or expired."),
12 | CONNECTION_DRAINING("The message couldn't be processed because the connection is draining. "),
13 | DEVICE_UNREGISTERED("The device is not registered."),
14 | INTERNAL_SERVER_ERROR("The server encountered an error while trying to process the request."),
15 | INVALID_JSON("The JSON message payload is not valid."),
16 | DEVICE_MESSAGE_RATE_EXCEEDED("The rate of messages to a particular device is too high."),
17 | SERVICE_UNAVAILABLE("CCS is not currently able to process the message.");
18 |
19 | private String message;
20 |
21 | private NACKError(String message) {
22 | this.message = message;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/response/ResponseMessageBase.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push.response;
2 |
3 | import com.fasterxml.jackson.annotation.JsonSubTypes;
4 | import com.fasterxml.jackson.annotation.JsonTypeInfo;
5 |
6 | /**
7 | * The Blynk Project.
8 | * Created by Dmitriy Dumanskiy.
9 | * Created on 2/8/2015.
10 | */
11 | @JsonTypeInfo(
12 | use = JsonTypeInfo.Id.NAME,
13 | include = JsonTypeInfo.As.PROPERTY,
14 | property = "message_type")
15 | @JsonSubTypes({
16 | @JsonSubTypes.Type(value = ACKMessage.class, name = "ack"),
17 | @JsonSubTypes.Type(value = NACKMessage.class, name = "nack"),
18 | @JsonSubTypes.Type(value = NACKMessage.class, name = "control")
19 | })
20 | public abstract class ResponseMessageBase {
21 |
22 | public String from;
23 |
24 | public String message_id;
25 |
26 | //public String message_type;
27 |
28 |
29 | @Override
30 | public String toString() {
31 | return "from='" + from + '\'' +
32 | ", message_id='" + message_id + '\'';
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/license.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Blynk
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/handlers/workflow/ClientChannelStateHandler.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.handlers.workflow;
2 |
3 | import cc.blynk.server.dao.SessionsHolder;
4 | import cc.blynk.server.model.auth.nio.ChannelState;
5 | import io.netty.channel.ChannelHandler;
6 | import io.netty.channel.ChannelHandlerContext;
7 | import io.netty.channel.ChannelInboundHandlerAdapter;
8 |
9 | /**
10 | * The Blynk Project.
11 | * Created by Dmitriy Dumanskiy.
12 | * Created on 2/20/2015.
13 | *
14 | * Removes channel from session in case it became inactive (closed from client side).
15 | */
16 | @ChannelHandler.Sharable
17 | public class ClientChannelStateHandler extends ChannelInboundHandlerAdapter {
18 |
19 | private final SessionsHolder sessionsHolder;
20 |
21 | public ClientChannelStateHandler(SessionsHolder sessionsHolder) {
22 | this.sessionsHolder = sessionsHolder;
23 | }
24 |
25 | @Override
26 | public void channelInactive(ChannelHandlerContext ctx) throws Exception {
27 | sessionsHolder.removeFromSession((ChannelState) ctx.channel());
28 | super.channelInactive(ctx);
29 | }
30 |
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/server/tcp-server/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | server
5 | cc.blynk
6 | 0.3-SNAPSHOT
7 |
8 | 4.0.0
9 |
10 | tcp-server
11 |
12 |
13 |
14 |
15 | commons-cli
16 | commons-cli
17 | 1.2
18 |
19 |
20 |
21 | cc.blynk
22 | twitter
23 | ${project.version}
24 |
25 |
26 |
27 | redis.clients
28 | jedis
29 | 2.6.2
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/integration-tests/src/test/resources/test-certs/test-server.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDHjCCAgYCCQCZpSzX8AGvdDANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQGEwJV
3 | QTETMBEGA1UECAwKU29tZS1TdGF0ZTENMAsGA1UEBwwES3lpdjEOMAwGA1UECgwF
4 | Qmx5bmsxDjAMBgNVBAMMBUJseW5rMB4XDTE1MDMxMDIzMzY0NVoXDTIwMDMwODIz
5 | MzY0NVowUTELMAkGA1UEBhMCVUExEzARBgNVBAgMClNvbWUtU3RhdGUxDTALBgNV
6 | BAcMBEt5aXYxDjAMBgNVBAoMBUJseW5rMQ4wDAYDVQQDDAVCbHluazCCASIwDQYJ
7 | KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKjAxLda35psH4EFkRWbnwySFf2yWcnK
8 | XPVzUrezqzTzH4qOHyUpLF0TlUdLBOAihAybLoOhsvEBFEdeqR/hZ0UUa7fQik6C
9 | jFt6C8w/IRKBbgrCjOS5yKdVTYVMZZnkFYVu0r93QA94g+mGvjSeyK1VIJFJRufJ
10 | KDojI1Z4/cdHnzDwXJBk3V9PWxLQgQlnTFHU6XQvvm69RHnos04VMROBhIIzSz1P
11 | DuGZeNTBaMOYFGFaFJPfH4Bkuv/EJtVgVJGqcY8cDupIfgd3YkPYIjTDA08vlrAr
12 | vDtY5sJqz/9uTJDTk5bdIcfHuxMhBZbtDgSnrqhg/xY14482Iz+PMgMCAwEAATAN
13 | BgkqhkiG9w0BAQsFAAOCAQEAb/4SHVNVU+wLvU8cESDewYykPk/f7U0mwrTgCzfl
14 | Gpjt1j8taRsg/nV02oOfVStHHUfH/pBFt0pOLgq/B2rfrjF6kRpVKoD/bSQkiXEz
15 | z1goVdE67s8pAUZGTj34Gdav1BIJ9gdzc4lqRbpfaVm1unpXxiOOxjzDuvksn1o3
16 | 5rI9VAhCQUZ4Cdi+uZzvADE7+Ls82CtkaaWaW4XLcKWOTCmjfFD07tgFRhiAUG2X
17 | oX/DviCn19MC0NIxprFvPuDXLJ9yTgrbk3IjbnfbVu+p7w1sxn7M4OlbR8MYfGzA
18 | l9DLfZlgB2lniqzRHiySoQEC511tB/yPgn0lZH70WV1GOg==
19 | -----END CERTIFICATE-----
20 |
--------------------------------------------------------------------------------
/server/tcp-server/src/test/resources/log4j2-test.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 | %d{HH:mm:ss.SSS} %-5level - %msg%n
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/common/src/main/java/cc/blynk/common/handlers/encoders/DeviceMessageEncoder.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.handlers.encoders;
2 |
3 | import cc.blynk.common.model.messages.Message;
4 | import cc.blynk.common.model.messages.MessageBase;
5 | import cc.blynk.common.utils.Config;
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.channel.ChannelHandlerContext;
8 | import io.netty.handler.codec.MessageToByteEncoder;
9 | import org.apache.logging.log4j.LogManager;
10 | import org.apache.logging.log4j.Logger;
11 |
12 | /**
13 | * The Blynk Project.
14 | * Created by Dmitriy Dumanskiy.
15 | * Created on 2/1/2015.
16 | */
17 | public class DeviceMessageEncoder extends MessageToByteEncoder {
18 |
19 | protected static final Logger log = LogManager.getLogger(DeviceMessageEncoder.class);
20 |
21 | @Override
22 | protected void encode(ChannelHandlerContext ctx, MessageBase message, ByteBuf out) throws Exception {
23 | out.writeByte(message.command);
24 | out.writeShort(message.id);
25 | out.writeShort(message.length);
26 |
27 | if (message.length > 0 && message instanceof Message) {
28 | out.writeBytes(((Message) message).body.getBytes(Config.DEFAULT_CHARSET));
29 | }
30 |
31 | log.trace("Out {}", message);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/server/push-notifications-android/src/main/java/cc/blynk/server/push/GCMPacketExtension.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.push;
2 |
3 | import org.jivesoftware.smack.packet.DefaultPacketExtension;
4 | import org.jivesoftware.smack.packet.Message;
5 | import org.jivesoftware.smack.packet.Packet;
6 | import org.jivesoftware.smack.util.StringUtils;
7 |
8 | /**
9 | * XMPP Packet Extension for GCM Cloud Connection Server.
10 | */
11 | final class GCMPacketExtension extends DefaultPacketExtension {
12 |
13 | static final String GCM_ELEMENT_NAME = "gcm";
14 | static final String GCM_NAMESPACE = "google:mobile:data";
15 |
16 | private final String json;
17 |
18 | public GCMPacketExtension(String json) {
19 | super(GCM_ELEMENT_NAME, GCM_NAMESPACE);
20 | this.json = json;
21 | }
22 |
23 | public String getJson() {
24 | return json;
25 | }
26 |
27 | @Override
28 | public String toXML() {
29 | return String.format("<%s xmlns=\"%s\">%s%s>",
30 | GCM_ELEMENT_NAME, GCM_NAMESPACE,
31 | StringUtils.escapeForXML(json), GCM_ELEMENT_NAME);
32 | }
33 |
34 | public Packet toPacket() {
35 | Message message = new Message();
36 | message.addExtension(this);
37 | return message;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/handlers/workflow/PingHandler.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.handlers.workflow;
2 |
3 | import cc.blynk.common.model.messages.protocol.PingMessage;
4 | import cc.blynk.common.utils.ServerProperties;
5 | import cc.blynk.server.dao.FileManager;
6 | import cc.blynk.server.dao.SessionsHolder;
7 | import cc.blynk.server.dao.UserRegistry;
8 | import cc.blynk.server.model.auth.User;
9 | import io.netty.channel.ChannelHandler;
10 | import io.netty.channel.ChannelHandlerContext;
11 |
12 | import static cc.blynk.common.enums.Response.OK;
13 | import static cc.blynk.common.model.messages.MessageFactory.produce;
14 |
15 | /**
16 | * The Blynk Project.
17 | * Created by Dmitriy Dumanskiy.
18 | * Created on 2/1/2015.
19 | *
20 | */
21 | @ChannelHandler.Sharable
22 | public class PingHandler extends BaseSimpleChannelInboundHandler {
23 |
24 | public PingHandler(ServerProperties props, FileManager fileManager, UserRegistry userRegistry, SessionsHolder sessionsHolder) {
25 | super(props, fileManager, userRegistry, sessionsHolder);
26 | }
27 |
28 | @Override
29 | protected void messageReceived(ChannelHandlerContext ctx, User user, PingMessage message) throws Exception {
30 | ctx.channel().writeAndFlush(produce(message.id, OK));
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/common/src/test/java/cc/blynk/common/utils/StringUtilsTest.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.common.utils;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.assertEquals;
6 | import static org.junit.Assert.assertNotNull;
7 |
8 | /**
9 | * The Blynk Project.
10 | * Created by Dmitriy Dumanskiy.
11 | * Created on 2/18/2015.
12 | */
13 | public class StringUtilsTest {
14 |
15 | @Test
16 | public void testCorrectFastSplit() {
17 | String in = "ar 1 2 3 4 5 6".replaceAll(" ", "\0");
18 |
19 | String[] res = StringUtils.split(in, '\0');
20 | assertEquals(7, res.length);
21 | assertEquals("ar", res[0]);
22 | assertEquals("1", res[1]);
23 | assertEquals("2", res[2]);
24 | assertEquals("3", res[3]);
25 | assertEquals("4", res[4]);
26 | assertEquals("5", res[5]);
27 | assertEquals("6", res[6]);
28 | }
29 |
30 | @Test
31 | public void testCorrectFastNewSplit() {
32 | String in = "ar 1 2 3 4 5 6".replaceAll(" ", "\0");
33 |
34 | String res = StringUtils.split(in);
35 | assertNotNull(res);
36 | assertEquals("1", res);
37 |
38 |
39 | in = "ar 22222".replaceAll(" ", "\0");
40 | res = StringUtils.split(in);
41 | assertNotNull(res);
42 | assertEquals("22222", res);
43 | }
44 |
45 | }
46 |
--------------------------------------------------------------------------------
/server/tcp-server/src/main/java/cc/blynk/server/model/auth/nio/ChannelServer.java:
--------------------------------------------------------------------------------
1 | package cc.blynk.server.model.auth.nio;
2 |
3 | import io.netty.channel.socket.nio.NioServerSocketChannel;
4 | import io.netty.util.internal.logging.InternalLogger;
5 | import io.netty.util.internal.logging.InternalLoggerFactory;
6 |
7 | import java.nio.channels.SocketChannel;
8 | import java.util.List;
9 |
10 | /**
11 | * The Blynk Project.
12 | * Created by Dmitriy Dumanskiy.
13 | * Created on 2/17/2015.
14 | */
15 | public class ChannelServer extends NioServerSocketChannel {
16 |
17 | private static final InternalLogger logger = InternalLoggerFactory.getInstance(ChannelServer.class);
18 |
19 | @Override
20 | protected int doReadMessages(List