diff --git a/.gitignore b/.gitignore index ec2c5ae..abb81ba 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ ble-ibeacon *.exe *.bin logs/ -.vscode/ \ No newline at end of file +.vscode/ +*.db \ No newline at end of file diff --git a/go.mod b/go.mod index 177e9aa..261fc3c 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,14 @@ module myschools.me/suguo/ble-ibeacon go 1.17 -require github.com/paypal/gatt v0.0.0-20151011220935-4ae819d591cf +require ( + github.com/paypal/gatt v0.0.0-20151011220935-4ae819d591cf + gorm.io/driver/sqlite v1.2.6 + gorm.io/gorm v1.22.4 +) + +require ( + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.3 // indirect + github.com/mattn/go-sqlite3 v1.14.9 // indirect +) diff --git a/main.go b/main.go index cb6596c..e2ef186 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,8 @@ import ( "github.com/paypal/gatt" "github.com/paypal/gatt/examples/option" + "myschools.me/suguo/ble-ibeacon/model" + "myschools.me/suguo/ble-ibeacon/sqlite" ) type IBeancon struct { @@ -41,7 +43,18 @@ func onPerhipheralDiscovered(p gatt.Peripheral, a *gatt.Advertisement, rssi int) // return // } fmt.Println("NAME:", a.LocalName, "T:", time.Now(), "MAC:", p.ID(), "RSSI:", rssi, "LEN:", len(a.ManufacturerData)) - + db, err := sqlite.New() + if err != nil { + fmt.Println(err.Error()) + } + if err := db.Save(&model.Rssi{ + MAC: p.ID(), + Name: a.LocalName, + Rssi: int32(rssi), + PackageLen: len(a.ManufacturerData), + }).Error; err != nil { + fmt.Println(err.Error()) + } // for _, d := range a.ServiceData { // fmt.Println("uuid:", d.UUID, " data:", d.Data) // } @@ -64,6 +77,14 @@ func onStateChanged(device gatt.Device, s gatt.State) { } func main() { + sqlite.Init(&sqlite.Config{ + DBFile: "./ble.db", + }) + + if err := sqlite.Migrate(&model.Rssi{}); err != nil { + log.Fatalln(err.Error()) + } + dev, err := gatt.NewDevice(option.DefaultClientOptions...) if err != nil { log.Fatalf("Failed to open device, err:%s\n", err) diff --git a/model/rssi-model.go b/model/rssi-model.go new file mode 100644 index 0000000..b48d10a --- /dev/null +++ b/model/rssi-model.go @@ -0,0 +1,11 @@ +package model + +import "gorm.io/gorm" + +type Rssi struct { + gorm.Model + MAC string `gorm:"column:mac;type:varchar(20);not null;index" json:"mac"` + Name string `gorm:"type:varchar(20)" json:"name"` + Rssi int32 `gorm:"size:32;not null;index" json:"rssi"` + PackageLen int `gorm:"size:32"` +} diff --git a/sqlite/config.go b/sqlite/config.go new file mode 100644 index 0000000..115eaa8 --- /dev/null +++ b/sqlite/config.go @@ -0,0 +1,5 @@ +package sqlite + +type Config struct { + DBFile string //DB文件名 +} diff --git a/sqlite/sqlite.go b/sqlite/sqlite.go new file mode 100644 index 0000000..d377640 --- /dev/null +++ b/sqlite/sqlite.go @@ -0,0 +1,63 @@ +package sqlite + +import ( + "errors" + "os" + "path/filepath" + + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +var ( + _conf *Config + _db *gorm.DB +) + +//Init mysql初始化 +func Init(conf *Config) error { + if conf != nil { + _conf = conf + } + return nil +} + +//New 创建实例 +func New() (*gorm.DB, error) { + if _db != nil { + return _db, nil + } + + if _conf == nil { + return nil, errors.New("组件未初始化,请执行Init!") + } + + dir, _ := filepath.Split(_conf.DBFile) + if dir != "" { + _, err := os.Stat(dir) + if os.IsNotExist(err) { + if err := os.MkdirAll(dir, 0755); err != nil { + return nil, err + } + } + } + + var err error + _db, err = gorm.Open(sqlite.Open(_conf.DBFile), &gorm.Config{ + SkipDefaultTransaction: true, + Logger: logger.Default.LogMode(logger.Silent), + }) + if err != nil { + return nil, err + } + return _db, nil +} + +func Migrate(dest ...interface{}) error { + db, err := New() + if err != nil { + return err + } + return db.AutoMigrate(dest...) +}