基于MQTT的多隧道管理系统省中心端API实现

项目背景

现有的隧道管理软件未实现中心化,即不同的隧道采用独立的隧道管理软件,省中心无法实时监测管理各隧道,随即需要开发中心服务器实现对各个隧道的管理。隧道内的设备种类较多,但可分为监视类、监控类。监视类设备信息传递为单向的,即设备状态单向传递给服务器,监控类设备信息传递则为双向的,即设备状态传递给服务器的同时,还需要能够远程对设备进行控制。为了高效的实现中心服务器对隧道的远程监控,拟采用MQTT协议实现隧道到省中心的消息传递。

基本功能

在这里插入图片描述

基本要求

(1)secretKey和secretData的隧道到省中心的鉴权;
(2)省中心向隧道的设备列表请求(包含状态);
(3)省中心向隧道设备下达控制指令;
(4)省中心向隧道服务器的日报、月报请求;
(5)面向省中心隧道管理软件的graohQL协议。

鉴权和加密实现方式

在这里插入图片描述

主代码实现

在这里插入图片描述

Branch_name 该文件存放所有分公司的公钥
CAPHCHA.txt 该文件存省中心校验码
encrpty 该文件夹内 encrpty.go为RSA加密代码实现
mqtt 为主功能函数实现文件
publickey_center 省中心公钥
secretkey_center 省中心秘钥

主功能实现
//mqtt.go

package mqtt

import (
	"fmt"
	"log"
	en "mqtt_B/encrpty"
	"os"
	"strconv"
	"strings"
	"time"

	MQTT "github.com/eclipse/paho.mqtt.golang"
	)


//省中心的RSA加密解密文件名
type RSA struct{
   
   
	publickey_Center string	//省中心公钥
	secretkey_Center string //省中心私钥
}

//默认加密钥文件名称
func NewDefaultRSA() RSA {
   
   
	return RSA{
   
   
		publickey_Center : "publickey_Center",
		secretkey_Center : "secretkey_Center",
	}
}

func NewRSA(p_C,s_C string) RSA {
   
   
	return RSA{
   
   
		publickey_Center  : p_C,
		secretkey_Center  : s_C,
	}
}

type Message struct {
   
   
	Name string //分公司名
	id string	//设备id
	CAPTCHA string	//省中心校验码
	body string		//命令主体
}

//默认省中心校验码
func (m *Message) SetCAPTCHA() bool {
   
   
	file, err := os.Open("CAPTCHA.txt")
	if err != nil {
   
   
		log.Println(err)
		return false
	}
	defer file.Close()
	//获取文件内容
	info, _ := file.Stat()
	buf := make([]byte, info.Size())
	file.Read(buf)
	m.CAPTCHA = string(buf)
	return true
}

//时间差有有效性判断
func CheckTime(t_start, t_end int64) bool{
   
   
	if t_end - t_start < 10 {
   
   
		return true
	}
	return false
}

//组装要发送的消息内容
func Message_assembly(msg Message,rs RSA) string{
   
   

	//Name_id_CAPTCHA_timestamp_body

	//先放分公司名称
	s := msg.Name
	//再将设备id放在最前
	s = s + "_" + msg.id

	//用分中心的公钥对省中心验证码签名
	esc := "Branch_name/" + msg.Name
	m_CAPTCHA := string(en.RSA_Encrypt([]byte(msg.CAPTCHA),esc))
	//m_CAPTCHA := string(en.RSA_Encrypt([]byte(msg.CAPTCHA),rs.publickey_Filiale))

	//对消息主体用分中心公钥进行签名
	m_body := string(en.RSA_Encrypt([]byte(msg.body),esc))
	//m_body := string(en.RSA_Encrypt([]byte(msg.body),rs.publickey_Filiale))

	//获取当前时间戳
	ti := time.Now().Unix()
	//用省中心公钥对时间戳签名
	m_timestamp := string(en
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

quchen528

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值