1. 前言
libev是一個(gè)非常輕量級的事件驅(qū)動框架辫秧,用來實(shí)現(xiàn)一個(gè)簡單的消息處理服務(wù)會非常簡單。
2. 軟件框架
image.png
- 啟動一個(gè)線程從MQTT Broker接收字符串形式的命令被丧,接收完成后保存到隊(duì)列盟戏,并喚醒主線程從隊(duì)列處理命令
- 啟動一個(gè)TCP Server,接收從手機(jī)甥桂、PC柿究、等終端發(fā)送過來的命令,并把接收的命令保存到隊(duì)列黄选,并喚醒主線程從隊(duì)列處命令
- 主線程大部分時(shí)間處于sleep狀態(tài)蝇摸,當(dāng)消息隊(duì)列有命令時(shí)被喚醒
這種簡單的框架在嵌入式中經(jīng)常能用的上,代碼比較簡單办陷。
3. 代碼路徑
https://github.com/jokerC8/msgHandler.git
4. 效果
- 安裝依賴
$$ sudo apt install libev-dev
$$ sudo apt install mosquitto-dev
- 安裝工具
sudo apt install mosquitto-clients
- 客戶端
啟動100萬個(gè)goroutine去連接并發(fā)送json消息
package main
import (
"fmt"
"net"
"sync"
"time"
)
var (
count = 1000000
)
func client(addr string) {
wg := sync.WaitGroup{}
wg.Add(count)
for i := 0; i < count; i++ {
conn, err := net.Dial("tcp", addr)
if err != nil {
fmt.Println(err)
return
}
go func(c net.Conn) {
defer func() {
c.Close()
wg.Done()
}()
messages := []string{
`{"open":"door"}`,
`{"close":"light"}`,
`{"change":"color"}`,
`{"report":"power"}`,
`{"move":"down"}`,
`{"move":"up"}`,
`{"move":"left"}`,
`{"move":"right"}`,
}
message := messages[time.Now().UTC().Second() % len(messages)]
length := len(message)
data := make([]byte, 4 + length)
data[0] = 0x0a
data[1] = 0x05
data[2] = uint8(length>>8);
data[3] = uint8(length)
copy(data[4:], []byte(message))
c.Write(data)
} (conn)
}
wg.Wait()
}
func main() {
client("127.0.0.1:10080")
}
- 發(fā)送訂閱消息
#!/bin/bash
function client()
{
while true; do
mosquitto_pub -h 127.0.0.1 -p 1883 -t "/parent/child/topic" -m "{\"hello\":\"world\"}"
sleep 0.1
done
}
client
animation.gif