Code Monkey home page Code Monkey logo

blaecktcp's Introduction

BlaeckTCP Logo SeeSaw Font

BlaeckTCP is a simple Arduino library to send binary (sensor) data via Ethernet/WiFi to your PC. The data can be sent periodically or requested on demand with commands. Also included is a message parser which reads input in the syntax of <HelloWorld, 12, 47>. The parsed command HelloWorld and its parameters are available in your own sketch by attaching a callback function.

Loggbok.mp4

Getting Started

Clone this repository into Arduino/Libraries or use the built-in Arduino IDE Library manager to install a copy of this library. You can find more detail about installing libraries here, on Arduino's website.

(Open BasicEthernet Example under File -> Examples -> BlaeckTCP for reference)

#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>
#include <BlaeckTCP.h>

Instantiate BlaeckTCP

BlaeckTCP BlaeckTCP;

Initialize Serial & BlaeckTCP

void setup()
{
  Serial.begin(9600);

   BlaeckTCP.begin(
      MAX_CLIENTS, // Maximal number of allowed clients
      &Serial,     // Serial reference, used for debugging
      2,           // Maximal signal count used;
      0b11111101   // Clients allowed to receive Blaeck Data; from right to left: client #0, #1, .. , #7
  );
}

Add signals

BlaeckTCP.addSignal("Small Number", &randomSmallNumber);
BlaeckTCP.addSignal("Big Number", &randomBigNumber);

Update your variables and don't forget to tick()!

void loop()
{
  UpdateYourVariables();

 /*Keeps watching for commands from TCP client and
     transmits the data back to client at the user-set interval*/
  BlaeckTCP.tick();
}

BlaeckTCP commands

Here's a full list of the commands handled by this library:

Command Description
<BLAECK.GET_DEVICES> Writes the device information including the device name, hardware version, firmware version and library version
<BLAECK.WRITE_SYMBOLS> Writes symbol list including datatype information.
<BLAECK.WRITE_DATA> Writes the binary data.
<BLAECK.ACTIVATE,first,second,third,fourth byte> Activates writing the binary data in user-set interval [ms]
Min: 0ms Max: 4294967295ms
e.g. <BLAECK.ACTIVATE,96,234> The data is written every 60 seconds (60 000ms)
first Byte: 0b01100000 = 96 DEC
second Byte: 0b11101010 = 234 DEC
<BLAECK.DEACTIVATE> Deactivates writing in intervals.

Messages

The messages are in the following format:

|Header|--       Message        --||-- EOT  --|
<BLAECK:<MSGKEY>:<MSGID>:<ELEMENTS>/BLAECK>\r\n
Type MSGKEY Elements Description
Symbol List B0 <MasterSlaveConfig><SlaveID><SymbolName><DTYPE> Up to n symbols. Response to request for available symbols <BLAECK.WRITE_SYMBOLS>
Data B1 <SymbolID><DATA><StatusByte><CRC32> Up to n data items. Response to request for data <BLAECK.WRITE_DATA>
Devices B3 <MasterSlaveConfig><SlaveID><DeviceName><DeviceHWVersion><DeviceFWVersion><LibraryVersion><LibraryName> Deprecated (Used in BlaeckTCP v1)
Devices B4 <MasterSlaveConfig><SlaveID><DeviceName><DeviceHWVersion><DeviceFWVersion><LibraryVersion><LibraryName><Client#><ClientDataEnabled> Deprecated (Used in BlaeckTCP v2)
Devices B5 <MasterSlaveConfig><SlaveID><DeviceName><DeviceHWVersion><DeviceFWVersion><LibraryVersion><LibraryName><Client#><ClientDataEnabled><ServerRestarted> Only one device (No master/slave support). Response to request for device information <BLAECK.GET_DEVICES>
Element Type DESCRIPTION:
MSGKEY byte Message Key, A unique key for the type of message being sent; 1 byte transmitted
MSGID ulong Message ID, A unique message ID which echoes back to transmitter to indicate a response to a message (0 to 4294967295); 4 bytes transmitted
DATA (varying) Message Data, varying data types and length depending on message
SymbolID uint Symbol ID number
SymbolName String0 Symbol Name - Null Terminated String
DTYPE byte DataType 0=bool, 1=byte, 2=short, 3=ushort, 4=int, 5=uint, 6=long, 7=ulong, 8=float
MasterSlaveConfig byte always 0: Single device (no master/slave support in this library)
SlaveID byte Slave Address, always 0 (no master/slave support in this library)
DeviceName String0 set with public variable DeviceName
DeviceHWVersion String0 set with public variable DeviceHWVersion
DeviceFWVersion String0 set with public variable DeviceFWVersion
LibraryVersion String0 set with public const LIBRARY_VERSION
LibraryName String0 set with public const LIBRARY_NAME
Client# String0 Client number of the connected client
ClientDataEnabled String0 0 or 1; Client is not allowed/allowed to receive Data (MSGKEY: B1); Set with blaeckWriteDataClientMask in BlaeckTCP::begin
ServerRestarted String0 0 or 1; first time sending <BLAECK.GET_DEVICES> after a restart ServerRestarted is set to 1 (at other times: 0)
StatusByte byte 1 byte; Always 0: Normal Transmission (no master/slave support in this library)
CRC32 byte 4 bytes; CRC order: 32; CRC Polynom (hex): 4C11DB7; Initial value (hex): FFFFFFFF; Final XOR value (hex): FFFFFFFF; reverse data bytes: true; reverse CRC result before Final XOR: true; (http://zorc.breitbandkatze.de/crc.html)

MSGID is supported by <BLAECK.GET_DEVICES>, <BLAECK.WRITE_SYMBOLS> and <BLAECK.WRITE_DATA>:

<BLAECK.GET_DEVICES, firstByteMSGID, secondByteMSGID, thirdByteMSGID, fourthByteMSGID>
<BLAECK.WRITE_SYMBOLS, firstByteMSGID, secondByteMSGID, thirdByteMSGID, fourthByteMSGID>
<BLAECK.WRITE_DATA, firstByteMSGID, secondByteMSGID, thirdByteMSGID, fourthByteMSGID>

Decoding Examples

Symbol List Decoding

Example from BasicEthernet.ino: <BLAECK.WRITE_SYMBOLS, 0, 255, 0, 0>:

ASCII: <  B  L  A  E  C  K  :  °  :  °  °  °  °  :  °  °  S  m  a  l  l     N  u  m  b
HEX:   3C 42 4C 41 45 43 4B 3A B0 3A 00 FF 00 00 3A 00 00 53 6D 61 6C 6C 20 4E 75 6D 62
Byte:  0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
-----------------------------------------------------------------------------------
ASCII: e  r  °  °  °  °  B  i  g     N  u  m  b  e  r  °  °  /  B  L  A  E  C  K  >
HEX:   65 72 00 08 00 00 42 69 67 20 4E 75 6D 62 65 72 00 06 2F 42 4C 41 45 43 4B 3E
Byte:  27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 56 47 48 49 50 51 52
Byte DESCRIPTION:
8 MSGKEY: B0 -> Symbol List
10-13 MSGID: Hex: 00 FF 00 00 -> Decimal: 65280
15 MasterSlaveConfig: Hex: 00 -> Decimal: 0 -> Single device
16 SlaveID: Hex: 00 -> Decimal: 0 -> Slave Address: 0
17-29 SymbolName: ASCII: Small Number + Null Termination '\0'
30 DTYPE: Hex: 08 -> Float
31 MasterSlaveConfig: Hex: 00 -> Decimal: 0 -> Single device
32 SlaveID: Hex: 00 -> Decimal: 0 -> Slave Address: 0
33-43 SymbolName: ASCII: Big Number + Null Termination '\0'
44 DTYPE: Hex: 06 -> Long

Data Decoding

Example from BasicEthernet.ino: <BLAECK.WRITE_DATA, 255, 255, 255, 255>:

ASCII: <  B  L  A  E  C  K  :  °  :  °  °  °  °  :  °  °  °  °  °  °  °  °  °  °  °  °  °  °  °  °  °  /  B  L  A  E  C  K  >  \r \n
HEX:   3C 42 4C 41 45 43 4B 3A B1 3A FF FF FF FF 3A 00 00 B8 1E FD 40 01 00 D8 E6 32 7C 00 FE D9 3D 20 2F 42 4C 41 45 43 4B 3E 0D 0A
Byte:  0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
Byte DESCRIPTION:
8 MSGKEY: B1 -> Data
10-13 MSGID: Hex: FF FF FF FF -> Decimal: 4294967295
15-16 SymbolID: Hex: 00 00 -> Decimal: 0
17-20 DATA: Float -> 4 Bytes; Hex: B8 1E FD 40 -> Float: 7.91
21-22 SymbolID: Hex: 01 00 -> Decimal: 1
23-26 DATA: Long -> 4 Bytes; Hex: D8 E6 32 7C -> Long: 2083710680
27 StatusByte: 0 -> Normal Transmission
28-31 CRC32: 4 Bytes; Hex: 20 3D D9 FE (Calculated from 19 bytes: Byte 8-26)

Datatypes

DTYPE Datatype Bytes
0 bool 1
1 byte 1
2 short 2
3 unsigned short 2
4 int 2
5 unsigned int 2
6 long 4
7 unsigned long 4
8 float 4
9 double 8

On the Uno and other ATMEGA based boards, the double implementation occupies 4 byte and is exactly the same as the float, with no gain in precision. Therefore if you add a double signal with addSignal("My Double Signal", &doubleVariable) the symbol list will return the DTYPE 8 (float).

blaecktcp's People

Contributors

sebajost avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.