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