diff --git a/beepack.sh b/beepack.sh index de4a91f..a6e114e 100644 --- a/beepack.sh +++ b/beepack.sh @@ -12,11 +12,16 @@ bee pack -be GOOS=windows GOARCH=amd64 #go build打包方式 GOOS=windows GOARCH=amd64 go build +GOOS=windows GOARCH=amd64 go build -o go_mqtt_pg.exe +GOOS=windows GOARCH=amd64 go build -o go_mqtt_weather.exe GOOS=linux GOARCH=amd64 go build +GOOS=linux GOARCH=amd64 go build -o go_mqtt_pg GOOS=freebsd GOARCH=amd64 go build +GOOS=freebsd GOARCH=amd64 go build -o go_mqtt_pg GOOS=linux GOARCH=arm64 go build +GOOS=linux GOARCH=arm64 go build -o go_mqtt_pg GOOS=darwin GOARCH=amd64 go build \ No newline at end of file diff --git a/main.go b/main.go index 63219bd..cc0479a 100755 --- a/main.go +++ b/main.go @@ -24,6 +24,8 @@ import ( "time" ) +var ExitFlag bool = false + func getMySqlDB() (*sql.DB, error) { dsn := "root:Skyinno251,@tcp(47.242.184.139:3306)/appserver?charset=utf8mb4&parseTime=True&loc=Local" db, err := sql.Open("mysql", dsn) @@ -186,7 +188,6 @@ func dbTest() { stmt.Exec(1) } - // GenRsaKey generates an PKCS#1 RSA keypair of the given bit size in PEM format. func GenRsaKey(bits int) (prvkey, pubkey []byte, err error) { // Generates private key. @@ -215,7 +216,6 @@ func GenRsaKey(bits int) (prvkey, pubkey []byte, err error) { return } - func ParseRSAPrivateKeyFromPEM(pemData string) (*rsa.PrivateKey, error) { var keyData = []byte(pemData) // 解析PEM块 @@ -252,7 +252,7 @@ func parsePrivateKey(privateKeyFile string) (*rsa.PrivateKey, error) { return privateKey, nil } -//生成RSA私钥和公钥,保存到文件中 +// 生成RSA私钥和公钥,保存到文件中 func GenerateRSAKey(bits int) { //GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥 //Reader是一个全局、共享的密码用强随机数生成器 @@ -403,7 +403,7 @@ func RsaEncryptBlock(src []byte, path string) (bytesEncrypt []byte, err error) { // 读取公钥文件 keyData, err := ioutil.ReadFile(path) if err != nil { - return nil,err + return nil, err } //pem解码 @@ -436,7 +436,6 @@ func RsaEncryptBlock(src []byte, path string) (bytesEncrypt []byte, err error) { return } - func timing(client mqtt.Client) { //定时器,10秒钟执行一次 ticker := time.NewTicker(10 * time.Second) @@ -475,7 +474,6 @@ func timing(client mqtt.Client) { //fmt.Println("解密后的字符串:") //fmt.Println(string(decrptCode)) - } } } @@ -488,7 +486,6 @@ var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Me fmt.Println(message) fmt.Println(topic) - //privatePath := "/Users/edao/GolandProjects/go_mqtt/privateKey.pem" privateKeyPEM := `-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL3dDf12MSeIY2jm5QpUSSoMhrJOWLbOt5fXQepPaNO0M30A+3C4SFZrM/9WA5ehazO1u1m1LAkYzoSDRH3MMJsrJC3lCGDeOROteu+safuP9k/npU1YQu/+Ll2xEJNxyvUx4jLGM4LamiMI6ytM3gdnOAGP4YRQo9Etwo6I986yg/seCQC5rza9M4iBamoin7U8h9yOMKrM6xK/k9CcY/vn5+Uhe3Pvk4qj/2Ff3OXkkc1wfdILqdLwLOKL0Tb3ZciwG0p1CKO80yf5hyYoWjqZk5Rcd07nTo2gqTFGfLl9sqI9/+ipMDtnHlAgMBAAECggEATJd5yCC6lusdMRO5FOBUyUaUi9X2i1AU+RZKAynQySvSnbavUgExW58tRCHBUrGW9gJp59ft1N8J8hHhSO18NDY4H7laBlVdnwmYjRqtFo2VQO6sD4G8JRDION5f2iIxn/b2fYDI9H8vILfJRbNgtTSILyGlzTYUZzhLKxCh+8IsN96Nic8wa5COd1vZZmdhf2y8TG8clFWmozaScNSAATx7y+8XLVWjjWiIRZ6xQvx0uQPUParc9KihXXTKR2pA22yPIdz+U4MGD4kC0eczlcFKZ/dYv9e7OIGgnJfT0idSCu7nYb1pxJ1LxD9fS6IScNTF5dSe0OIL98e+XdyoAQKBgQDRep+5cW4iAKrEMH+djmcXAkoMiYtNVtnu0efLE8dP6vjYytQi368X9SdcASbfrQ31eEZmr/xQnlUF8oyHGkI38YS8dpAHzQcrkP3BljbbzB/3gJZaUdghGsDrK0xAJIzzmFKQpeKnGtr23vxUgaGrNsCYvQ0eQ7+5056KXS4r5QKBgQC6r8xtRSaje6L4WIydjWvYywsmRO0Of0aJLMDA/Wt2MWhHfh7ba9oI1cKGN80ap7xB2a9lQLgpv+C53wNtE5SpvjxsikAj96nUMMhGy9ojXrUith6HQhiINETz6Shnznd+AyrXP6KI/RpfA5nkDB5nrJxODwtYLP467IL7Cv7OAQKBgQCl4KxKdH/5fP28jYsAgJsxpSZt9xzQCU5Zxu396ZOSvUaApVyGoQpNtluMh3z48lhzYOKevgzW6gn5w69z7F8zXZT2iAxVoQ1kelP2z7RxKJrHqpNkwhqbXEwX7RlcUZUr8BqxYCqymJl7k+fMIzqaEalBSbLxnEReKi0I8/Bz4QKBgHK4b0ZCtVDHPEmimJ6E9l4dv/c/afF7swu+zaCK2ouiJvOwBCRQbYb6XPR/u/GCXASXUdpF4CX/vIhcDE3uN2/r8FO+zVWM7vbvF1OyF5WesG7pPW9e5ZZlkG3WvLa1wOZV6fCmMSo/ZwI2Q05JSDHrd43cXttLotrw1jiQ9C4BAoGBAKi4SOoOVQ5J5HQCDkBwPbG1AOLHFinzfoDl26GF/8Hy7fmmd1JiRTFldQp/A9VTAABz3sVYmMB92HSIaJhuDMoYJNI2Cf/cZifsv7vUL8cbLn+lPsKsebiuB0m0g4P2qLwLfegfNGEgA7lA5HIz3SELqbdp3iuqJeQl1fsJqD74 @@ -502,7 +499,6 @@ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL } //decrptCode := RSA_Decrypts(decodeByte, privatePath) - decrptCode := RSA_DecryptsOne(decodeByte, privateKeyPEM) fmt.Println("解密后的字符串:") @@ -514,11 +510,11 @@ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL if models.GetUser(&user) { models.UpdateUser(&user) - }else{ + } else { models.SaveUser(&user) } - }else if topic == "app_push_dyw" { + } else if topic == "app_push_dyw" { fmt.Println("大亚湾电厂APP收到mqtt消息") decodeByte, err := base64.StdEncoding.DecodeString(message) if err != nil { @@ -534,11 +530,11 @@ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL if models.GetUserdyw(&user) { models.UpdateUserdyw(&user) - }else{ + } else { models.SaveUserdyw(&user) } - }else if topic == "app_push_yf" { + } else if topic == "app_push_yf" { fmt.Println("云浮电厂APP收到mqtt消息") decodeByte, err := base64.StdEncoding.DecodeString(message) if err != nil { @@ -554,16 +550,18 @@ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL if models.GetUseryf(&user) { models.UpdateUseryf(&user) - }else{ + } else { models.SaveUseryf(&user) } - }else{ + } else { result := strings.Split(message, " ") fmt.Println(result[0]) fmt.Println(result[1]) now := time.Now() + fmt.Println("---------now--------") + fmt.Println(now) temperature := new(models.Temperature) temperature.CreateDate = now temperature.DataDate = now.Format("2006-01-02") @@ -585,9 +583,6 @@ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL models.SaveTemperature(temperature) } - - - //uuid := uuid.New() //models.SaveProduct() //models.SaveUser(uuid.String()) @@ -653,7 +648,12 @@ func subAppPushDyw(client mqtt.Client) { token.Wait() fmt.Printf("Subscribed to topic: %s", topic) } - +func subAppPushYf(client mqtt.Client) { + topic := "app_push_yf" + token := client.Subscribe(topic, 2, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} func publish(client mqtt.Client) { num := 999999000000000000 @@ -666,7 +666,7 @@ func publish(client mqtt.Client) { } } -func main() { +func main1() { uuid := uuid.New() fmt.Println("Generated UUID:", uuid) @@ -694,7 +694,12 @@ func main() { subTemperature(client) subAppPush(client) subAppPushDyw(client) - publish(client) + subAppPushYf(client) + //publish(client) + + for true { + time.Sleep(5 * time.Second) + } //client.Disconnect(1000) diff --git a/main_hwy.go b/main_hwy.go new file mode 100644 index 0000000..3b180f5 --- /dev/null +++ b/main_hwy.go @@ -0,0 +1,229 @@ +package main + +import ( + "encoding/base64" + "encoding/json" + "fmt" + mqtt "github.com/eclipse/paho.mqtt.golang" + "github.com/google/uuid" + "go_mqtt/models" + "strings" + "time" +) + +func timing01(client mqtt.Client) { + //定时器,10秒钟执行一次 + ticker := time.NewTicker(10 * time.Second) + for { + time := <-ticker.C + fmt.Println("定时器====>", time.String()) + if !client.IsConnectionOpen() { + client.Connect() + } else { + fmt.Println("client has connect") + } + } +} + +var messagePubHandler01 mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) { + fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic()) + + message := fmt.Sprintf("%s", msg.Payload()) + topic := fmt.Sprintf("%s", msg.Topic()) + fmt.Println(message) + fmt.Println(topic) + + //privatePath := "/Users/edao/GolandProjects/go_mqtt/privateKey.pem" + privateKeyPEM := `-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL3dDf12MSeIY2jm5QpUSSoMhrJOWLbOt5fXQepPaNO0M30A+3C4SFZrM/9WA5ehazO1u1m1LAkYzoSDRH3MMJsrJC3lCGDeOROteu+safuP9k/npU1YQu/+Ll2xEJNxyvUx4jLGM4LamiMI6ytM3gdnOAGP4YRQo9Etwo6I986yg/seCQC5rza9M4iBamoin7U8h9yOMKrM6xK/k9CcY/vn5+Uhe3Pvk4qj/2Ff3OXkkc1wfdILqdLwLOKL0Tb3ZciwG0p1CKO80yf5hyYoWjqZk5Rcd07nTo2gqTFGfLl9sqI9/+ipMDtnHlAgMBAAECggEATJd5yCC6lusdMRO5FOBUyUaUi9X2i1AU+RZKAynQySvSnbavUgExW58tRCHBUrGW9gJp59ft1N8J8hHhSO18NDY4H7laBlVdnwmYjRqtFo2VQO6sD4G8JRDION5f2iIxn/b2fYDI9H8vILfJRbNgtTSILyGlzTYUZzhLKxCh+8IsN96Nic8wa5COd1vZZmdhf2y8TG8clFWmozaScNSAATx7y+8XLVWjjWiIRZ6xQvx0uQPUParc9KihXXTKR2pA22yPIdz+U4MGD4kC0eczlcFKZ/dYv9e7OIGgnJfT0idSCu7nYb1pxJ1LxD9fS6IScNTF5dSe0OIL98e+XdyoAQKBgQDRep+5cW4iAKrEMH+djmcXAkoMiYtNVtnu0efLE8dP6vjYytQi368X9SdcASbfrQ31eEZmr/xQnlUF8oyHGkI38YS8dpAHzQcrkP3BljbbzB/3gJZaUdghGsDrK0xAJIzzmFKQpeKnGtr23vxUgaGrNsCYvQ0eQ7+5056KXS4r5QKBgQC6r8xtRSaje6L4WIydjWvYywsmRO0Of0aJLMDA/Wt2MWhHfh7ba9oI1cKGN80ap7xB2a9lQLgpv+C53wNtE5SpvjxsikAj96nUMMhGy9ojXrUith6HQhiINETz6Shnznd+AyrXP6KI/RpfA5nkDB5nrJxODwtYLP467IL7Cv7OAQKBgQCl4KxKdH/5fP28jYsAgJsxpSZt9xzQCU5Zxu396ZOSvUaApVyGoQpNtluMh3z48lhzYOKevgzW6gn5w69z7F8zXZT2iAxVoQ1kelP2z7RxKJrHqpNkwhqbXEwX7RlcUZUr8BqxYCqymJl7k+fMIzqaEalBSbLxnEReKi0I8/Bz4QKBgHK4b0ZCtVDHPEmimJ6E9l4dv/c/afF7swu+zaCK2ouiJvOwBCRQbYb6XPR/u/GCXASXUdpF4CX/vIhcDE3uN2/r8FO+zVWM7vbvF1OyF5WesG7pPW9e5ZZlkG3WvLa1wOZV6fCmMSo/ZwI2Q05JSDHrd43cXttLotrw1jiQ9C4BAoGBAKi4SOoOVQ5J5HQCDkBwPbG1AOLHFinzfoDl26GF/8Hy7fmmd1JiRTFldQp/A9VTAABz3sVYmMB92HSIaJhuDMoYJNI2Cf/cZifsv7vUL8cbLn+lPsKsebiuB0m0g4P2qLwLfegfNGEgA7lA5HIz3SELqbdp3iuqJeQl1fsJqD74 +-----END PRIVATE KEY-----` + + if topic == "app_push" { + fmt.Println("珠海电厂APP收到mqtt消息") + decodeByte, err := base64.StdEncoding.DecodeString(message) + if err != nil { + fmt.Println(err.Error()) + } + //decrptCode := RSA_Decrypts(decodeByte, privatePath) + + decrptCode := RSA_DecryptsOne(decodeByte, privateKeyPEM) + + fmt.Println("解密后的字符串:") + fmt.Println(string(decrptCode)) + fmt.Println("-----user--------") + var user models.User + json.Unmarshal(decrptCode, &user) + fmt.Println(user) + + if models.GetUser(&user) { + models.UpdateUser(&user) + } else { + models.SaveUser(&user) + } + + } else if topic == "app_push_dyw" { + fmt.Println("大亚湾电厂APP收到mqtt消息") + decodeByte, err := base64.StdEncoding.DecodeString(message) + if err != nil { + fmt.Println(err.Error()) + } + decrptCode := RSA_DecryptsOne(decodeByte, privateKeyPEM) + fmt.Println("解密后的字符串:") + fmt.Println(string(decrptCode)) + fmt.Println("-----userdyw--------") + var user models.Userdyw + json.Unmarshal(decrptCode, &user) + fmt.Println(user) + + if models.GetUserdyw(&user) { + models.UpdateUserdyw(&user) + } else { + models.SaveUserdyw(&user) + } + + } else if topic == "app_push_yf" { + fmt.Println("云浮电厂APP收到mqtt消息") + decodeByte, err := base64.StdEncoding.DecodeString(message) + if err != nil { + fmt.Println(err.Error()) + } + decrptCode := RSA_DecryptsOne(decodeByte, privateKeyPEM) + fmt.Println("解密后的字符串:") + fmt.Println(string(decrptCode)) + fmt.Println("-----userdyw--------") + var user models.Useryf + json.Unmarshal(decrptCode, &user) + fmt.Println(user) + + if models.GetUseryf(&user) { + models.UpdateUseryf(&user) + } else { + models.SaveUseryf(&user) + } + + } else { + result := strings.Split(message, " ") + fmt.Println(result[0]) + fmt.Println(result[1]) + + now := time.Now() + fmt.Println("---------now--------") + fmt.Println(now) + temperature := new(models.Temperature) + temperature.CreateDate = now + temperature.DataDate = now.Format("2006-01-02") + temperature.DataHour = now.Format("2006-01-02 15") + temperature.DataMinute = now.Format("2006-01-02 15:04") + temperature.Humidity = result[0] + temperature.Temperature = result[1] + temperature.Topic = topic + if topic == "WifiSHT/7C87CE9CA4E6/SHT20" { + temperature.LocationDesc = "广东省珠海市高新区唐家湾镇东岸村水风三街28号501" + } + if topic == "WifiSHT/7C87CE9F5CBF/SHT20" { + temperature.LocationDesc = "广东省珠海市金湾区三灶镇百川路1号1栋1单元1508房" + } + if topic == "WifiSHT/4CEBD686B6AA/SHT20" { + temperature.LocationDesc = "广西壮族自治区崇左市天等县天等镇荣华村弄在屯113号" + } + fmt.Println("测温传感器地点:", temperature.LocationDesc) + models.SaveTemperature(temperature) + } + + //uuid := uuid.New() + //models.SaveProduct() + //models.SaveUser(uuid.String()) + //models.SaveOrder() + + //var users []models.User + //var orders []models.Order + //var user models.User + //mydb.DB.Where("name = ?", "wenfei").First(&user) + //fmt.Println(user) + + // 查询多条记录 + //mydb.DB.Find(&users) // 查询所有产品信息 + //mydb.DB.Order("id desc").Limit(2).Offset(0).Find(&users) // 按价格降序排序,取前 10 条记录 + //fmt.Println("users:", users) + + // 查询多条记录 + //mydb.DB.Find(&users) // 查询所有产品信息 + //mydb.DB.Where("id > ? and id < ?", 60,65).Find(&orders) + //fmt.Println("orders:", orders) + + // 原生 SQL 查询 + //var products []models.Product + //mydb.DB.Raw("SELECT * FROM product WHERE price > ?", 1000).Scan(&products) // 查询价格大于 1000 的产品信息 + //fmt.Println("Products:", products) + +} + +var connectHandler01 mqtt.OnConnectHandler = func(client mqtt.Client) { + fmt.Println("Connected") + subTemperature01(client) + subAppPush01(client) + subAppPushDyw01(client) + subAppPushYf01(client) +} + +var connectLostHandler01 mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) { + fmt.Printf("Connect lost: %v", err) +} + +func subTemperature01(client mqtt.Client) { + topic := "WifiSHT/+/SHT20" + token := client.Subscribe(topic, 2, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} + +func subAppPush01(client mqtt.Client) { + topic := "app_push" + token := client.Subscribe(topic, 2, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} +func subAppPushDyw01(client mqtt.Client) { + topic := "app_push_dyw" + token := client.Subscribe(topic, 2, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} +func subAppPushYf01(client mqtt.Client) { + topic := "app_push_yf" + token := client.Subscribe(topic, 2, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} + +func main() { + + uuid := uuid.New() + fmt.Println("Generated UUID:", uuid) + + var broker = "mqtt.fileview123.com" + var port = 1883 + opts := mqtt.NewClientOptions() + opts.AddBroker(fmt.Sprintf("tcp://%s:%d", broker, port)) + opts.SetClientID(uuid.String()) + opts.SetUsername("admin") + opts.SetPassword("publish452131wW452131wW$") + opts.SetDefaultPublishHandler(messagePubHandler01) + opts.OnConnect = connectHandler01 + opts.OnConnectionLost = connectLostHandler01 + client := mqtt.NewClient(opts) + if token := client.Connect(); token.Wait() && token.Error() != nil { + fmt.Println(token.Error()) + } + + go timing01(client) + + subTemperature01(client) + subAppPush01(client) + subAppPushDyw01(client) + subAppPushYf01(client) + + for true { + time.Sleep(5 * time.Second) + } +} diff --git a/models/User.go b/models/User.go index 84614ed..c73a36d 100644 --- a/models/User.go +++ b/models/User.go @@ -8,7 +8,7 @@ import ( ) type User struct { - Username string `gorm:"primaryKey;size:255"` + Username string `gorm:"primaryKey;size:100"` Password string `gorm:"size:255"` Date string `gorm:"size:255"` Imeinum string `gorm:"size:50"` diff --git a/models/Userdyw.go b/models/Userdyw.go index 3b60c57..85081b6 100644 --- a/models/Userdyw.go +++ b/models/Userdyw.go @@ -8,7 +8,7 @@ import ( ) type Userdyw struct { - Username string `gorm:"primaryKey;size:255"` + Username string `gorm:"primaryKey;size:100"` Password string `gorm:"size:255"` Date string `gorm:"size:255"` Imeinum string `gorm:"size:50"` diff --git a/models/Useryf.go b/models/Useryf.go index 71280a4..cb85d06 100644 --- a/models/Useryf.go +++ b/models/Useryf.go @@ -8,7 +8,7 @@ import ( ) type Useryf struct { - Username string `gorm:"primaryKey;size:255"` + Username string `gorm:"primaryKey;size:100"` Password string `gorm:"size:255"` Date string `gorm:"size:32"` Nfc string `gorm:"size:255"` diff --git a/mqtt/main_mqtt.go b/mqtt/main_mqtt.go new file mode 100644 index 0000000..af2c70d --- /dev/null +++ b/mqtt/main_mqtt.go @@ -0,0 +1,390 @@ +package mqtt + +import ( + "bytes" + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/base64" + "encoding/json" + "encoding/pem" + "fmt" + mqtt "github.com/eclipse/paho.mqtt.golang" + "github.com/google/uuid" + "go_mqtt/models" + "io/ioutil" + "log" + "os" + "strings" + "time" +) + +// RSA_Decrypts RSA解密支持分段解密 +func RSA_Decrypts(cipherText []byte, path string) []byte { + //打开文件 + var bytesDecrypt []byte + //file, err := os.Open(path) + //if err != nil { + // fmt.Println(err) + //} + // + ////获取文件内容 + //info, _ := file.Stat() + //buf := make([]byte, info.Size()) + //file.Read(buf) + + // 读取私钥文件 + keyData, err := ioutil.ReadFile(path) + if err != nil { + return nil + } + + //pem解码 + block, _ := pem.Decode(keyData) + //X509解码 + privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + fmt.Println(err.Error()) + os.Exit(0) + } + p := privateKey.(*rsa.PrivateKey) + keySize := p.Size() + srcSize := len(cipherText) + log.Println("密钥长度", keySize, "密文长度", srcSize) + var offSet = 0 + var buffer = bytes.Buffer{} + for offSet < srcSize { + endIndex := offSet + keySize + if endIndex > srcSize { + endIndex = srcSize + } + bytesOnce, err := rsa.DecryptPKCS1v15(rand.Reader, p, cipherText[offSet:endIndex]) + if err != nil { + return nil + } + buffer.Write(bytesOnce) + offSet = endIndex + } + bytesDecrypt = buffer.Bytes() + return bytesDecrypt +} + +// RSA_DecryptsOne RSA解密支持分段解密 +func RSA_DecryptsOne(cipherText []byte, privateKeyStr string) []byte { + //打开文件 + var bytesDecrypt []byte + // 读取私钥文件转成字节数组 + keyData := []byte(privateKeyStr) + + //pem解码 + block, _ := pem.Decode(keyData) + //X509解码 + privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + fmt.Println(err.Error()) + os.Exit(0) + } + p := privateKey.(*rsa.PrivateKey) + keySize := p.Size() + srcSize := len(cipherText) + log.Println("密钥长度", keySize, "密文长度", srcSize) + var offSet = 0 + var buffer = bytes.Buffer{} + for offSet < srcSize { + endIndex := offSet + keySize + if endIndex > srcSize { + endIndex = srcSize + } + bytesOnce, err := rsa.DecryptPKCS1v15(rand.Reader, p, cipherText[offSet:endIndex]) + if err != nil { + return nil + } + buffer.Write(bytesOnce) + offSet = endIndex + } + bytesDecrypt = buffer.Bytes() + return bytesDecrypt +} + +// RsaEncryptBlock 公钥加密-分段 +func RsaEncryptBlock(src []byte, path string) (bytesEncrypt []byte, err error) { + //打开文件 + //file, err := os.Open(path) + //if err != nil { + // return + //} + // + ////读取文件的内容 + //info, _ := file.Stat() + //buf := make([]byte, info.Size()) + //file.Read(buf) + + // 读取公钥文件 + keyData, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + + //pem解码 + block, _ := pem.Decode(keyData) + //x509解码 + publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + fmt.Println(err) + } + //类型断言 + publicKey := publicKeyInterface.(*rsa.PublicKey) + keySize, srcSize := publicKey.Size(), len(src) + log.Println("密钥长度", keySize, "明文长度", srcSize) + offSet, once := 0, keySize-11 + buffer := bytes.Buffer{} + for offSet < srcSize { + endIndex := offSet + once + if endIndex > srcSize { + endIndex = srcSize + } + // 加密一部分 + bytesOnce, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, src[offSet:endIndex]) + if err != nil { + return nil, err + } + buffer.Write(bytesOnce) + offSet = endIndex + } + bytesEncrypt = buffer.Bytes() + return +} + +func timing(client mqtt.Client) { + //定时器,10秒钟执行一次 + ticker := time.NewTicker(10 * time.Second) + for { + time := <-ticker.C + fmt.Println("定时器====>", time.String()) + if !client.IsConnectionOpen() { + client.Connect() + } else { + fmt.Println("client has connect") + } + } +} + +var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) { + fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic()) + + message := fmt.Sprintf("%s", msg.Payload()) + topic := fmt.Sprintf("%s", msg.Topic()) + fmt.Println(message) + fmt.Println(topic) + + //privatePath := "/Users/edao/GolandProjects/go_mqtt/privateKey.pem" + privateKeyPEM := `-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL3dDf12MSeIY2jm5QpUSSoMhrJOWLbOt5fXQepPaNO0M30A+3C4SFZrM/9WA5ehazO1u1m1LAkYzoSDRH3MMJsrJC3lCGDeOROteu+safuP9k/npU1YQu/+Ll2xEJNxyvUx4jLGM4LamiMI6ytM3gdnOAGP4YRQo9Etwo6I986yg/seCQC5rza9M4iBamoin7U8h9yOMKrM6xK/k9CcY/vn5+Uhe3Pvk4qj/2Ff3OXkkc1wfdILqdLwLOKL0Tb3ZciwG0p1CKO80yf5hyYoWjqZk5Rcd07nTo2gqTFGfLl9sqI9/+ipMDtnHlAgMBAAECggEATJd5yCC6lusdMRO5FOBUyUaUi9X2i1AU+RZKAynQySvSnbavUgExW58tRCHBUrGW9gJp59ft1N8J8hHhSO18NDY4H7laBlVdnwmYjRqtFo2VQO6sD4G8JRDION5f2iIxn/b2fYDI9H8vILfJRbNgtTSILyGlzTYUZzhLKxCh+8IsN96Nic8wa5COd1vZZmdhf2y8TG8clFWmozaScNSAATx7y+8XLVWjjWiIRZ6xQvx0uQPUParc9KihXXTKR2pA22yPIdz+U4MGD4kC0eczlcFKZ/dYv9e7OIGgnJfT0idSCu7nYb1pxJ1LxD9fS6IScNTF5dSe0OIL98e+XdyoAQKBgQDRep+5cW4iAKrEMH+djmcXAkoMiYtNVtnu0efLE8dP6vjYytQi368X9SdcASbfrQ31eEZmr/xQnlUF8oyHGkI38YS8dpAHzQcrkP3BljbbzB/3gJZaUdghGsDrK0xAJIzzmFKQpeKnGtr23vxUgaGrNsCYvQ0eQ7+5056KXS4r5QKBgQC6r8xtRSaje6L4WIydjWvYywsmRO0Of0aJLMDA/Wt2MWhHfh7ba9oI1cKGN80ap7xB2a9lQLgpv+C53wNtE5SpvjxsikAj96nUMMhGy9ojXrUith6HQhiINETz6Shnznd+AyrXP6KI/RpfA5nkDB5nrJxODwtYLP467IL7Cv7OAQKBgQCl4KxKdH/5fP28jYsAgJsxpSZt9xzQCU5Zxu396ZOSvUaApVyGoQpNtluMh3z48lhzYOKevgzW6gn5w69z7F8zXZT2iAxVoQ1kelP2z7RxKJrHqpNkwhqbXEwX7RlcUZUr8BqxYCqymJl7k+fMIzqaEalBSbLxnEReKi0I8/Bz4QKBgHK4b0ZCtVDHPEmimJ6E9l4dv/c/afF7swu+zaCK2ouiJvOwBCRQbYb6XPR/u/GCXASXUdpF4CX/vIhcDE3uN2/r8FO+zVWM7vbvF1OyF5WesG7pPW9e5ZZlkG3WvLa1wOZV6fCmMSo/ZwI2Q05JSDHrd43cXttLotrw1jiQ9C4BAoGBAKi4SOoOVQ5J5HQCDkBwPbG1AOLHFinzfoDl26GF/8Hy7fmmd1JiRTFldQp/A9VTAABz3sVYmMB92HSIaJhuDMoYJNI2Cf/cZifsv7vUL8cbLn+lPsKsebiuB0m0g4P2qLwLfegfNGEgA7lA5HIz3SELqbdp3iuqJeQl1fsJqD74 +-----END PRIVATE KEY-----` + + if topic == "app_push" { + fmt.Println("珠海电厂APP收到mqtt消息") + decodeByte, err := base64.StdEncoding.DecodeString(message) + if err != nil { + fmt.Println(err.Error()) + } + //decrptCode := RSA_Decrypts(decodeByte, privatePath) + + decrptCode := RSA_DecryptsOne(decodeByte, privateKeyPEM) + + fmt.Println("解密后的字符串:") + fmt.Println(string(decrptCode)) + fmt.Println("-----user--------") + var user models.User + json.Unmarshal(decrptCode, &user) + fmt.Println(user) + + if models.GetUser(&user) { + models.UpdateUser(&user) + } else { + models.SaveUser(&user) + } + + } else if topic == "app_push_dyw" { + fmt.Println("大亚湾电厂APP收到mqtt消息") + decodeByte, err := base64.StdEncoding.DecodeString(message) + if err != nil { + fmt.Println(err.Error()) + } + decrptCode := RSA_DecryptsOne(decodeByte, privateKeyPEM) + fmt.Println("解密后的字符串:") + fmt.Println(string(decrptCode)) + fmt.Println("-----userdyw--------") + var user models.Userdyw + json.Unmarshal(decrptCode, &user) + fmt.Println(user) + + if models.GetUserdyw(&user) { + models.UpdateUserdyw(&user) + } else { + models.SaveUserdyw(&user) + } + + } else if topic == "app_push_yf" { + fmt.Println("云浮电厂APP收到mqtt消息") + decodeByte, err := base64.StdEncoding.DecodeString(message) + if err != nil { + fmt.Println(err.Error()) + } + decrptCode := RSA_DecryptsOne(decodeByte, privateKeyPEM) + fmt.Println("解密后的字符串:") + fmt.Println(string(decrptCode)) + fmt.Println("-----userdyw--------") + var user models.Useryf + json.Unmarshal(decrptCode, &user) + fmt.Println(user) + + if models.GetUseryf(&user) { + models.UpdateUseryf(&user) + } else { + models.SaveUseryf(&user) + } + + } else { + result := strings.Split(message, " ") + fmt.Println(result[0]) + fmt.Println(result[1]) + + now := time.Now() + fmt.Println("---------now--------") + fmt.Println(now) + temperature := new(models.Temperature) + temperature.CreateDate = now + temperature.DataDate = now.Format("2006-01-02") + temperature.DataHour = now.Format("2006-01-02 15") + temperature.DataMinute = now.Format("2006-01-02 15:04") + temperature.Humidity = result[0] + temperature.Temperature = result[1] + temperature.Topic = topic + if topic == "WifiSHT/7C87CE9CA4E6/SHT20" { + temperature.LocationDesc = "广东省珠海市高新区唐家湾镇东岸村水风三街28号501" + } + if topic == "WifiSHT/7C87CE9F5CBF/SHT20" { + temperature.LocationDesc = "广东省珠海市金湾区三灶镇百川路1号1栋1单元1508房" + } + if topic == "WifiSHT/4CEBD686B6AA/SHT20" { + temperature.LocationDesc = "广西壮族自治区崇左市天等县天等镇荣华村弄在屯113号" + } + fmt.Println("测温传感器地点:", temperature.LocationDesc) + models.SaveTemperature(temperature) + } + + //uuid := uuid.New() + //models.SaveProduct() + //models.SaveUser(uuid.String()) + //models.SaveOrder() + + //var users []models.User + //var orders []models.Order + //var user models.User + //mydb.DB.Where("name = ?", "wenfei").First(&user) + //fmt.Println(user) + + // 查询多条记录 + //mydb.DB.Find(&users) // 查询所有产品信息 + //mydb.DB.Order("id desc").Limit(2).Offset(0).Find(&users) // 按价格降序排序,取前 10 条记录 + //fmt.Println("users:", users) + + // 查询多条记录 + //mydb.DB.Find(&users) // 查询所有产品信息 + //mydb.DB.Where("id > ? and id < ?", 60,65).Find(&orders) + //fmt.Println("orders:", orders) + + // 原生 SQL 查询 + //var products []models.Product + //mydb.DB.Raw("SELECT * FROM product WHERE price > ?", 1000).Scan(&products) // 查询价格大于 1000 的产品信息 + //fmt.Println("Products:", products) + +} + +var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) { + fmt.Println("Connected") + subTemperature(client) + subAppPush(client) + subAppPushDyw(client) +} + +var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) { + fmt.Printf("Connect lost: %v", err) +} + +func sub(client mqtt.Client) { + topic := "gomqtt01" + token := client.Subscribe(topic, 1, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} + +func subTemperature(client mqtt.Client) { + topic := "WifiSHT/+/SHT20" + token := client.Subscribe(topic, 2, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} + +func subAppPush(client mqtt.Client) { + topic := "app_push" + token := client.Subscribe(topic, 2, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} +func subAppPushDyw(client mqtt.Client) { + topic := "app_push_dyw" + token := client.Subscribe(topic, 2, nil) + token.Wait() + fmt.Printf("Subscribed to topic: %s", topic) +} + +func publish(client mqtt.Client) { + num := 999999000000000000 + for i := 0; i < num; i++ { + text := fmt.Sprintf("Message %d", i) + token := client.Publish("gomqtt01", 0, false, text) + token.Wait() + fmt.Println(i) + time.Sleep(6 * time.Second) + } +} + +func main() { + + uuid := uuid.New() + fmt.Println("Generated UUID:", uuid) + + var broker = "47.242.184.139" + var port = 1883 + opts := mqtt.NewClientOptions() + opts.AddBroker(fmt.Sprintf("tcp://%s:%d", broker, port)) + opts.SetClientID(uuid.String()) + opts.SetUsername("admin") + opts.SetPassword("publish452131wW452131wW$") + opts.SetDefaultPublishHandler(messagePubHandler) + opts.OnConnect = connectHandler + opts.OnConnectionLost = connectLostHandler + client := mqtt.NewClient(opts) + if token := client.Connect(); token.Wait() && token.Error() != nil { + fmt.Println(token.Error()) + } + + //client.IsConnectionOpen() + + go timing(client) + + //sub(client) + subTemperature(client) + subAppPush(client) + subAppPushDyw(client) + //publish(client) + + for true { + time.Sleep(5 * time.Second) + } + + //client.Disconnect(1000) + +} diff --git a/mydb/initialize.go b/mydb/initialize.go index af284f8..445794e 100755 --- a/mydb/initialize.go +++ b/mydb/initialize.go @@ -2,6 +2,8 @@ package mydb import ( "fmt" + //"gorm.io/driver/postgres" + "gorm.io/driver/postgres" "gorm.io/gorm" @@ -10,7 +12,7 @@ import ( ) func init() { - fmt.Println("sqlite init()") + fmt.Println("db init()") initDatabase() } @@ -19,12 +21,12 @@ var DB *gorm.DB func initDatabase() { //mysql - //dsn := "root:Skyinno251,@tcp(192.168.2.18:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local" + //dsn := "root:Skyinno251,@tcp(192.168.2.25:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local" //dsn := "root:Skyinno251,@tcp(47.242.184.139:3306)/appserver?charset=utf8mb4&parseTime=True&loc=Local" //dsn := "root:Skyinno251,@tcp(localhost:3306)/appserver?charset=utf8mb4&parseTime=True&loc=Local" //dsn := "root:Skyinno251,@tcp(192.168.3.9:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local" //dsn := "root:Skyinno251,@tcp(localhost:3306)/go_mqtt?charset=utf8mb4&parseTime=True&loc=Local" - // + //db, err := gorm.Open(mysql.New(mysql.Config{ // DSN: dsn, // DSN data source name // DefaultStringSize: 255, // string 类型字段的默认长度 @@ -40,7 +42,9 @@ func initDatabase() { //db, err := gorm.Open(sqlite.Open("go_mqtt.db"), &gorm.Config{}) //postgres - dsn := "host=192.168.1.92 user=postgres password=452131wW dbname=go_mqtt port=5432 sslmode=disable TimeZone=Asia/Shanghai" + //3.30: 10.19.1.219 3.29:10.19.1.154 localhost + //dsn := "host=localhost user=postgres password=452131wW dbname=postgres port=5432 sslmode=disable" + dsn := "host=192.168.2.25 user=postgres password=452131wW dbname=weather port=5432 sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) //sqlserver