Concept of a flexible but simple smart network
-
yes, to address devices across different network segments you need a global ID
but there is a trick... Please see the first picture. It is a layer called Translator.
it is possible to translate non-global ID to global and back and this will allow to create a bridge -
yes, to address devices across different network segments you need a global ID
but there is a trick... Please see the first picture. It is a layer called Translator.
it is possible to translate non-global ID to global and back and this will allow to create a bridge -
@axillent Isn't that in a sense a broad definition of what a bridge does? Translating information between two different types of networks.
@dbemowsk each layer does it's job
bridge just creates a bridge
will it do a translation between depends on translation layer
translation job can be about translation of address or translation of data form or even both
all this depends on the goal but brings wide flexibility -
some more details about addressing

global adress is 16 bit number. 12 most significant bits are defining network segment number while 4 less significant bits are providing nodeID
section 0xFE00-0xFEFF is reserved for local broadcasting, 0xFF00-0xFFFF - for global broadcasts. Etc. 256 broadcasts of each type
segments and differenciation between local and global broadcasts are needed for efficient support of bridging and routing.
bridging is a simplified version of routing. bridging is connecting network segments on different physycal inrterfaces while routing can assume to bypass many physical interfaces between (routing throuth).
one of the bridge example is a link between wired interface and MQTT.
one of the routing example is a link between 2 wired interfaces across public Interneteach network segment can have 15 nodes. nodeID = 0 is a special local segment broadcast addressing all devices in segment.
each physical interface can have several segments, etc. there is no limitation to have 15 nodes on physical interface. you just add as many segments to interface as you need to have devices
-
Is encryption built in?
-
What is W3P? Is this some sort of CANBUS?
-
I think your addressing concept do not respect hardware - microcontrollers and radio modules we are using.
Some hardware ( RFM69, serial in 9bit mode, etc. ) can filter incoming messages itself and do not disturb controller when
receive different address then node own ID or broadcast.
For example with RFM69 you can store node ID and broadcast address in radiomodule and it will receive only messages with this specific addresses.
But your address schema uses 4 lower bits for node ID ( 0-16 ) and lower 8 bits in all combination for broadcast too.
Your node must receive all 16 bits to distinguish - if it is node addressed message or broadcast call.
So you cannot use addressing features of our hardware.
I think, better is divide 16 bits to 8 bit node ID and 8 bits network ID.
Network filtering and routing then make gateway and distribute messages to connected nodes or other networks. -
I think your addressing concept do not respect hardware - microcontrollers and radio modules we are using.
Some hardware ( RFM69, serial in 9bit mode, etc. ) can filter incoming messages itself and do not disturb controller when
receive different address then node own ID or broadcast.
For example with RFM69 you can store node ID and broadcast address in radiomodule and it will receive only messages with this specific addresses.
But your address schema uses 4 lower bits for node ID ( 0-16 ) and lower 8 bits in all combination for broadcast too.
Your node must receive all 16 bits to distinguish - if it is node addressed message or broadcast call.
So you cannot use addressing features of our hardware.
I think, better is divide 16 bits to 8 bit node ID and 8 bits network ID.
Network filtering and routing then make gateway and distribute messages to connected nodes or other networks.@kimot the main idea of all my project is to manage network abstraction layer regardless hardware
only translation + driver layers are hardware related, but them allow to transfer logical layer data throuth any physical hardware
my 16bit addressing could be translated to addresses used by your hardware to keep handle communication based on hardware advantages.I just launched a network with translation throuth Ethernet/TCP with application server running on orangepi
Working pretty well. On logical level it is always 16bit addressing with broadcasting support.
developing device you should not take care how message will reach another device
this is handled while developing appropriate translations/drivers on bridge side.bridge - a device connecting 2 or more different physycal layers.
it is also allows to crate a building blocks.
For example I'm running ESP8266 with TCP interface to network on one side and UART&JSON interface on other side
attaching MCU to ESP by UART a can connect any kind of network to my network -
just to illustrate how translation is working
you do not need direct logic match between abstract layer and the layer of used interfacehere is how translation is working between my network and MQTT broker:

bellow is initialization of 2 different nodes attached to 2 different interfaces, one to TCP/IP network, other to MQTT broker
it is a code from linux application server//----------------------------------------------------------------------------------------- // Nodes //----------------------------------------------------------------------------------------- // --- inet typedef Smartlets::Common::RouteTableFile RouteTable; typedef STAVRP::Linux::TCPDrv<0> TCPDrv; typedef Smartlets::Interface::Translator::INet<Message, TCPDrv, RouteTable> TranslINet; typedef Smartlets::Interface::P2P<Message, TranslINet, 16, 16> InterfaceINet; typedef Smartlets::Node::NodeBasic<Message, InterfaceINet, ApplInet> NodeINet; // --- mqtt typedef Smartlets::Interface::Translator::Mqtt<Message> TranslMqtt; typedef Smartlets::Interface::P2P<Message, TranslMqtt, 16, 16> InterfaceMqtt; typedef Smartlets::Node::NodeBasic<Message, InterfaceMqtt, ApplMqtt> NodeMqtt;Inside Translator:Mqtt the following is used for example inside TX method (sending message):
static bool TX(const Message& msg) { char key[128]; if( msg.header.tx.IsBroadcast() ) sprintf(key, "/%s/bc/o/%d/%d/%d/%d", data.swi_domain.c_str(), msg.header.tx.GetBroadcastID(), msg.header.rx.GetNetSegment(), msg.header.rx.GetNetDevID(), msg.header.type.type); else sprintf(key, "/%s/m/o/%d/%d/%d/%d/%d", data.swi_domain.c_str(), msg.header.tx.GetNetSegment(), msg.header.tx.GetNetDevID(), msg.header.rx.GetNetSegment(), msg.header.rx.GetNetDevID(), msg.header.type.type); std::string payload = json_ext::FromMessage(msg); data.drv.TXPut(STAVRP::Linux::MqttEntry(key, payload)); return true; }``` and this is how it is finally bridged between:while(1) { //--------------------------------------------------------------------------- // loop inet //--------------------------------------------------------------------------- if( NodeINet::Loop() ) { Message msg = NodeINet::RX(); Logger::root() << log4cpp::Priority::DEBUG << "inet-> tx=" << msg.header.tx.id; NodeINet::CommitRX(false); // --- routing if( NodeINet::TX(msg) ) { Logger::root() << log4cpp::Priority::DEBUG << "inet->inet TX OK"; // delayed queue } else { Logger::root() << log4cpp::Priority::ERROR << "inet->inet TX failed"; } if( NodeMqtt::TX(msg) ) { Logger::root() << log4cpp::Priority::DEBUG << "inet->mqtt TX OK"; } else { Logger::root() << log4cpp::Priority::ERROR << "inet->mqtt TX failed"; } } //--------------------------------------------------------------------------- // loop mqtt //--------------------------------------------------------------------------- if( NodeMqtt::Loop() ) { Message msg = NodeMqtt::RX(); Logger::root() << log4cpp::Priority::DEBUG << "mqtt-> tx=" << msg.header.tx.id; NodeMqtt::CommitRX(false); if( NodeINet::TX(msg) ) Logger::root() << log4cpp::Priority::DEBUG << "mqtt->inet TX OK"; else Logger::root() << log4cpp::Priority::ERROR << "mqtt->inet TX failed"; } sleep(1); }``` -
made a few steps forward
launched ESP8266 node & bridge and STM32 bridge and TCP/IP router based on linux (orangepi)
bellow is my working example
list of supported platforms:- STM8S/IAR
- STM32F0/Keil - draft
- ATMEL/Atmel studio - draft
- Arduino ESP8266
- Arduino STM32
- Linux/g++
i;m working on 2 libs. first is to handle platform dependant things. second is platform independant smart devices network
regardless platform and regardless communication hardware the framework allows to transfer messages using RX/TX notation with 16 bit global addressing.
Addressing is organized as 4096 segments where 4094 are 15 node segments each and 2 segments are for broadcadstingframework allows to connect potentially absolutelly different communication hardware
currently i'm running:- simple one wire (1 wire signal + 2 wire power) network
- wifi based nodes
- twisted pair connected ethernet devices
bridge between different types of network is organized on TCP/IP application server running currently on linux
etc. potentially allows to connect network segments regardless physicall location, only internet connection is requiredwhy i'm doing this? mostly for fan but also to implement 2 principles:
- application layer to be independant from hardware and transport. message format is universal and is the same regardless platform and communication hardware. Addressing is also universal. Application should not take care about intermediate specific, this is handled by other components
- avoid a central unit. each device can communicate with each device. the only central component is application server. but is is very simple, robust and reliable. failover is supported
My example:

-
for esp8266 i made an universal bridge application
it can be used for both:-
single node, esp8266 is running a final application. on the photo above my thermostats to measure room temperature, report it and to send ON/OFF commands to heaters
-
bridge. can be used to connect other type networks wirelessly to application server. UART is used for this + json translation. currently this is implemented to connect heating controllers located on each floor

main and failover servers can be configured
also each node is configured to handle from one to a few network segments. this allows simple routing from application server back to node
esp8266 is using ArduinoOTA and zero hardcording.
after fresh programming esp creates AP and smartphone can be used to preconfigure a node
any updates are keeping configuration except major updates there stored structure can be affectedapplication server is also support MQTT translation
etc. it looks like a routing between my network and MQTT server
RX/TX adresing are mapped to MQTT topic while message is translated into JSON:

-
-
-
just published my libraries
anyonw is welsome on review and comments https://github.com/axillent :-
list item stavrp C++ multiplafrom suport library, platforms are at different level of support
-
list item smartletsp C++ smart devices network
-
list item swilib and integration of above two libraries with arduino framework
-