# omq

Omq is a IPC that uses [Nanomsg](https://nanomsg.org/) under the hood. It likes MQTT in some degree.

### Concept
nanomsg is a socket library that provides several common communication patterns. It aims to make the networking layer fast, scalable, and easy to use. Implemented in C, it works on a wide range of operating systems with no further dependencies. But its sub-pub mode is not very good for us to use. So, omq bornd. Through omq, you can easily publish and subscribe message like MQTT.

## Installation
```
pip install git+https://cloud.orca-tech.cn:9091/rty813/omq.git
```

Omq requires python 3.6+ and CMake 3.13+

## Usage
### Bus
![](https://cloud.orca-tech.cn:9091/rty813/omq/-/raw/0739c2bbfea64253669ca9b03fd065feb1410524/assets/bus.png)
```python
# node1.py
import omq

with omq.Bus() as node:
    node.publish('test', 'hello world')
```


```python
# node2.py
import omq

def on_message(topic, payload):
    print(f'{topic} - {payload}')

with omq.Bus() as node:
    node.on_message = on_message
    node.subscribe(['test', 'test/#'])
    node.loop_forever()
```

---
### REQ/REP
![](https://cloud.orca-tech.cn:9091/rty813/omq/-/raw/0739c2bbfea64253669ca9b03fd065feb1410524/assets/req-rep.png)
```python
# rep.py
import omq

def handler(topic, payload):
    print(topic, payload)
    # Handle data...
    return 'ok'

with omq.Rep(omq.Addr.MAIN, handler) as node:
    node.loop_forever()
```

```python
# req.py
import omq

res = omq.req(omq.Addr.MAIN, 'test', 'req data')
print(res)  # ok
```

---
### Supernode/Slavenode
![](https://cloud.orca-tech.cn:9091/rty813/omq/-/raw/0739c2bbfea64253669ca9b03fd065feb1410524/assets/super-slave.png)
```python
# Supernode.py
import omq

count = 0
node = omq.SuperNode()

def on_message(slave_id, payload):
    global count
    count += 1
    if count % 3 == 0:
        print(f'send: {slave_id}')
        node.publish(slave_id, 'Recv')

    print(f'recv: {slave_id} - {payload}')

node.on_message = on_message
node.loop_forever()
```

```python
# Slave.py
import omq
import time

node = omq.SlaveNode('node1', '127.0.0.1')

def on_message(payload):
    print('recv: ' + payload)

node.on_message = on_message

node.loop_start()

while True:
    try:
        node.publish({'a': time.time(), 'b': 2})
        time.sleep(1)
    except:
        node.close()
        break
```
