# tiny-iot-server **Repository Path**: pspglb/tiny-iot-server ## Basic Information - **Project Name**: tiny-iot-server - **Description**: 一个简洁、轻量的物联网服务开发框架 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2022-12-04 - **Last Updated**: 2022-12-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 一个轻量的物联网服务框架 ================================================== 它提供了一种简单的方式进行物联网服务端开发。可用于开发物联网控制中心。 架构图 --------- ![Architecture Diagram](architecture.png) ## 一、使用示例 我们以温度传感器控制空调为例,演示如何开发服务端的控制逻辑。示例代码在example/example_server ### 1、首先,创建处理器(handler) ```go //处理温度事件,开空调 //处理逻辑:如果温度>28度,开启空调制冷(制冷温度为26度) type TurnOnTheAirConditionerMsgHandler struct { } // msg 为温度传感器发送来的消息,内容示例:"35C"; // newMsg 为控制逻辑处理后,生成的后续指令,供空调设备获取 func (h *TurnOnTheAirConditionerMsgHandler) Handle(msg *tinyiotserver.Message) (newMsg *tinyiotserverMessage) { tag := "TurnOnTheAirConditionerMsgHandler" tmp := string(msg.Body.Payload) tmp = tmp[0 : len(tmp)-1] tmpInt, err := strconv.Atoi(tmp) if err != nil { return tinyiotserver.FailMsg("Temperature content is not a number") } //温度>28度 if tmpInt > 28 { newMsg = msg.Copy() //生成空调消息(指令) newMsg.SetTopic("AirConditioner") newMsg.SetPayload([]byte("26C")) log.Printf("[%s] generate TurnOnAirConditioner msg:\n%s\n", tag, newMsg) } return } ``` ### 2、注册处理器(handler)并启动服务 ```go func main() { //创建server server := tinyiotserver.NewServer(":7070") //创建“温度-空调”处理逻辑 turnOnTheAirConditionerMsgHandler := &TurnOnTheAirConditionerMsgHandler{} //注册处理逻辑 //POST_NO_RESPONSE表示,客户端推送消息后不会等待服务端的处理结果,防止网络I/O阻塞; //Temperature是主题(topic)名,每个topic会对应一个消息队列,框架会根据msg中的topic来路由到合适的handler server.RegisterHandler(common.POST_NO_RESPONSE, "Temperature", turnOnTheAirConditionerMsgHandler) //注册空调拉取消息的逻辑,QueryPopMsgHandler为框架提供的逻辑(拉取消息后,删除队列中的消息) server.RegisterHandler(common.QUERY, "AirConditioner", tinyiotserver.QueryPopMsgHandler) //启动服务 server.Start() } ``` ### 3、模拟温度传感器提交数据 ```go serverAddress := "127.0.0.1:7070" c, err := tinyiotserver.NewClient(serverAddress, 2) require.NoError(t, err) defer c.Close() //10000,单位ms,代表消息时效为10s err := c.Submit("Temperature", []byte("35C"), 10000) require.NoError(t, err) ``` ### 4、模拟空调拉取温度调控指令 ```go serverAddress := "127.0.0.1:7070" c, err := tinyiotserver.NewClient(serverAddress, 2) require.NoError(t, err) defer c.Close() res, err = c.Query("AirConditioner", nil) require.NoError(t, err) log.Println("Query res: ", res) ``` ## 二、客户端接入授权 示例代码在example/example_server_with_auth。示例中提供了一个简单的鉴权逻辑。大家可以仿照定制。 ## 三、性能 ### 1、硬件配置 HUAWEI nova 2手机 cpu:Hisilicon Kirin 659(arm64:4个2.36GHz A53 + 4个1.7GHz A51);内存:4GB;闪存:64GB ### 2、benchmark,局域网,示例代码:example/example_bench ``` go test -bench=BenchmarkClient_Submit_S -benchtime=5s 输出: BenchmarkClient_Submit_S-4 140514 91199 ns/op HUAWEI nova 2 CPU占用最大情况(%CPU总 = 800%): USER %CPU %MEM CMDLINE VIRT RES shell 103 0.1 tiny-iot-server-arm64 970M 7.2M ``` ## 四、设计理念 简洁、高效、高度可定制。