基于爱星物联开源项目的二次开发分享

[复制链接]
查看2519 | 回复16 | 2024-4-18 11:11:50 | 显示全部楼层 |阅读模式

大家好,爱星物联已开源有段时间了,有些小伙伴可能不知道拿到源代码怎么玩转起来,今天将我这边的经验分享下给大家;

爱星物联的源代码开源在Github ubases,你可以通过以下命令克隆代码到本地;

image.png

克隆代码到本地

# 克隆平台服务代码
git clone https://github.com/ubases/ubases_iot_community.git

# 克隆前端云管平台代码
git clone https://github.com/ubases/ubases_iot_platform_web.git

# 克隆前端开放平台代码
git clone https://github.com/ubases/ubases_iot_open_web.git

# 克隆APP设备控制面板
git clone https://github.com/ubases/app-device-panel.git

先打开后端代码,了解项目接口,后端是微服务框架,里面已经提供了15个服务和2个服务脚手架项目

image.png

要运行项目之前你需要安装第三方服务,这里你可以参考,我的上一篇帖子《我用这个配置把云平台搭建起来了》

MySql、Clickhouse、Nats、Etcd、Redis、Zipkin、Vernemq

你也可以使用Docker方式将所有第三方服务都安装了,纤细可以参考代码目录的deploy中

image.png

就当我默认已经将所有服务都已经安装好了,接下来就可以修改配置文件,将服务运行起来了

找到目录bin/conf/open目录

0

配置文件中配置的容器部署的版本,我们先保留open,复制一份修改名称为local,并将.env文件修改为localimage.png

修改 *.yml 文件中的MySql、Clickhouse、Nats、Etcd、Redis、Zipkin、Vernemq、xxlJob的配置,主要大致配置都是一样子的,之前全局替换就好;

MySql

# 修改账号密码
database:
  database: iot_app_build
  driver: mysql
  connstr: root:iLmz8sCXjkTYuh@tcp(mysql:3306)/iot_app_build?charset=utf8mb4&parseTime=True&loc=Local

Clickhouse

# 修改Clickhouse的账号密码
- database: iot_device
  driver: clickhouse
  connstr: clickhouse://default:123456@clickhouseServer:9000/iot_device?read_timeout=10s&write_timeout=20s
- database: iot_log
  driver: clickhouse
  connstr: clickhouse://default:123456@clickhouseServer:9000/iot_log?read_timeout=10s&write_timeout=20s

Nats

# 将nats-sesrver修改为你的IP
NATS:
  addrs: ["nats://iLmz8sCXjkTYuh@nats-server:4222"]

Zipkin

#将zipkin修改你部署的Ip
zipkin:
  url: http://zipkin:9411/api/v2/spans

Etcd

# 将etcd0修改为你部署的Ip
etcd:
  address: ["etcd0:2379"]
  username: ""  password: ""

Redis

# Addrs: ["redis:6379"]修改为Addrs: ["你的IP:6379"]
redis:
  Cluster: false
  Addrs: ["redis:6379"]
  Username:
  Password: "iLmz8sCXjkTYuh"  Database: 0
  MinIdleConns: 5
  IdleTimeout: 600
  PoolSize: 10
  MaxConnAge: 3600

邮件配置

# 根据你选择的邮箱配置
smtp:
  host: smtp.exmail.qq.com
  port: 465
  #############用户名、密码已被删除,请本地用自己的邮箱测试###############  userName: [email]XXXXXX@tech-now.com[/email]
  password: XXXXXXX
  connectTimeout: 10
  sendTimeout: 10
  helo: "XXX"  keepAlive: true
  exchange: false #exchange邮箱服务器要设置  authType: 0 #0:AuthPlain; 1:AuthLogin; 3:AuthCRAMMD5; 4:AuthNone  ssl: 3 #0:NONE;  3:SSLTLS;  4:STARTTLS; 注意:1和2弃用  from: XXXXXXXXXXXXXXX

短信服务

# 根据你的阿里云短信参数配置
SMS:
  provider: Aliyun
  accessId: XXXXXXXXXXXXXXXXXXXXXX
  accessKey: XXXXXXXXXXXXXXXXXXXXXXXXXXX
  sign:
    zh: XXX公司  
  en: "XXXXX"  
    other: []  #阿里国际短信10dlc

xxlJob

# 根据部署的xxljob进行配置
xxlJob:
  enable: true
  serverAddr: http://xxl-job-admin:8088/xxl-job-admin
  accessToken: abchd@^&#^&uUU
  executorIp: iot_statistics_service
  executorPort: 9999
  registryKey: jobs-statistics

天气服务

# openweather 平台注册获取apiKey
weather:
  provider: openweathermap
  apikey:
  aqicnToken:
  qps: 60
  interval: 1800  #间隔秒数

IP服务

# appCode而需要修改为你自己阿里云账号购买授权码
ipService:
  queryUrl: "https://ips.market.alicloudapi.com/iplocaltion?ip="  appCode: "APPCODE XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

oss

# 平台支持七牛、阿里云oss、亚马逊s3,根据自己选择修改
oss:
    useOss: "qiniu"   
    imgStyle:
    productImg: ""  
    qiniu:
        Endpoint: "XXXXXX.YYYYYY.com"  
        AccessKeyID: "y11X6zb5rSjGZEJz3itOx7k_mi6-XXXXXXXXXXX"  
        AccessKeySecret: "KGZOrY-xkABwU5GVXJfohgbgEXXXXXXXXXXXXXX"  
        BucketName: "aithings-docs"  
    ali:
        Endpoint: ""  
        AccessKeyID: ""  
        AccessKeySecret: ""  
        BucketName: ""   
     s3:
         Endpoint: ""  
         AccessKeyID: ""  
         AccessKeySecret: ""  
         BucketName: ""  
         Region: "us-east-1"

以上配置文件都配置好了,之后,你可以运行了;

找到bin/build.bat,双击运行即可完成所有服务的编译;

image.png

编译完成之后,即可在当前目录下看到所有编译好的服务,将所有服务双击运行起来就可以了;

0

后端服务已运行起来,接下来将前端运行

image.png

前端需要nodejs就可以了,主要注意一下nodejs的版本时候18+,我这边的版本如下

image.png

先进入到具体前端项目,执行前端编译运行脚本:

npm install

image.png

# 运行之前请检查你的vue.config.js的接口地址
npm run serve

image.png

环境可以了,接下来就需要进行二次开发了;

下面我们进行二次开发,时间关系我们不做太复杂的扩展了, 这次就先给设备面板增加一个相关产品列表的接口吧;

这里涉及的服务有:

  • APP接口服务:iot_app_api_service
  • 产品服务:iot_product_service
  • proto文件夹:iot_proto

产品服务增加数据查询方法:

我们需要定义方法的参数、返回值和rpc的方法

先找到*_model.proto文件, 定义请求和响应数据结构image.png

rpc GetSimilarProductList(SimilarProductRequest) returns (OpmProductResponse)

SimilarProductRequest:上面定义的请求数据结构

OpmProductResponse:使用已有的响应数据结构,如果想要自定义也可以自己创建

image.png

定义好之后,使用平台提供goproto工具生成golang代码

0

image.png

这里有看到这个四个文件,说明已经成功了

image.png

方法已经定义完成,可以去产品服务中编写实现

进入到“iot_product_service/handler/opm_product_handler.go”,增加方法“GetSimilarProductList”,注意这里的方法需要和proto文件定义的方法一致,参数和返回值也需要保持一致,否则无法调用;

// GetSimilarProductList 相似产品列表
func (h *OpmProductHandler) GetSimilarProductList(ctx context.Context, req *proto.SimilarProductRequest, resp *proto.OpmProductResponse) error {
    s := service.OpmProductSvc{Ctx: ctx}
    data, err := s.GetSimilarProductList(req)
    if err != nil {
        resp.Code = service.ERROR  
        resp.Message = err.Error()
    } else {
        resp.Code = service.SUCCESS  
        resp.Message = "success"  
        resp.Data = data
    }
    return nil
}

进入到“iot_product_service/service/opm_product.go”,增加方法“GetSimilarProductList”

// GetSimilarProductList 获取相似产品列表
func (s *OpmProductSvc) GetSimilarProductList(req *proto.SimilarProductRequest) ([]*proto.OpmProduct, error) {
    //检查并获取租户Id    tenantId, err := CheckTenantId(s.Ctx)
    if err != nil {
       logger.Errorf("GetSimilarProductList : %s", err.Error())
       return nil, err    }
    t := orm.Use(iotmodel.GetDB()).TOpmProduct    do := t.WithContext(context.Background())
    do = do.Where(t.TenantId.Eq(tenantId))
    if req.ProductKey != "" {
       do = do.Where(t.ProductKey.Eq(req.ProductKey))
    }
    if req.ProductId != 0 {
       do = do.Where(t.Id.Eq(req.ProductId))
    }
    do = do.Where(t.TenantId.Eq(tenantId))

    var list []*model.TOpmProduct    list, err = do.Select(t.ALL).Find()
    if err != nil {
       logger.Errorf("GetSimilarProductList error : %s", err.Error())
       return nil, err    }
    result := make([]*proto.OpmProduct, len(list))
    for i, v := range list {
       result[i] = convert.OpmProduct_db2pb(v)
    }
    return result, nil
 }

服务已经编写完成,接下来进入到产品iot_app_api_service中创建接口;

进入到controls/product/apis/product_controller.go,编写gin接口方法

记得养成好习惯将接口描述编写清楚,方便后面的接口文档生成;

// GetSimilarProductList 获取相似产品列表
// @Summary 获取相似产品列表
// @Description
// @Tags 产品接口
// @Accept application/json
// @Param productKey query string true "产品Key"
// @Success 200 {object} iotgin.ResponseModel 成功返回值
// @Router /v1/platform/app/product/similarList [get]
func (ProductController) GetSimilarProductList(c *gin.Context) {
    productKey := c.Query("productKey")
    if productKey == "" {
       iotgin.ResBadRequest(c, "productKey")
       return    }
    ctx := controls.WithUserContext(c)
    proList, err := rpc.ClientOpmProductService.GetSimilarProductList(ctx, &protosService.SimilarProductRequest{
       ProductKey: productKey,
    })
    if err != nil {
       iotgin.ResErrCli(c, err)
       return    }
    //将proList.Data转换成前端需要的数据格式,我这里就偷个懒,直接原样返回了  
    //建议:根据自己的需求将返回值转换后返回给前端,这个可以避免不必要的数据返回
    iotgin.ResSuccess(c, proList.Data)
}

进入到controls/router/router.go

admin.GET("/product/similarList", apis.Productcontroller.GetSimilarProductList)

至此,基于当前框架完成了一次二开,依葫芦画瓢你可以修改和新增任何功能;

如果你需要自己创建单独服务,可以将框架里面的脚手架复制一份,修改下名称和引用路径;

脚手架如下:

  • iot_demo_service 普通服务项目脚手架
  • iot_demo_api_service 接口服务项目脚手架

下面补充几点

回复

使用道具 举报

1084504793 | 2024-4-18 13:43:37 | 显示全部楼层
回复

使用道具 举报

timo | 2024-4-19 12:27:06 | 显示全部楼层
爱星物联 这个有API吗,比如我要远程读取某些传感器数值
回复 支持 反对

使用道具 举报

sansui | 2024-4-19 13:47:23 | 显示全部楼层
感谢分享
回复

使用道具 举报

wurong | 2024-4-19 14:39:14 | 显示全部楼层
收藏了,万一以后用得着呢
回复 支持 反对

使用道具 举报

7788 | 2024-4-19 20:07:33 | 显示全部楼层
学习了
回复

使用道具 举报

知行合一 | 2024-4-19 21:18:43 | 显示全部楼层
这个比MQTT优势在哪
回复 支持 反对

使用道具 举报

物联网 | 2024-4-19 22:06:16 | 显示全部楼层
劝退新手
回复

使用道具 举报

楚华 | 2024-4-19 22:28:39 | 显示全部楼层
哈哈,收藏吃灰
回复 支持 反对

使用道具 举报

jennifer | 2024-4-23 13:58:55 | 显示全部楼层

从哪一步开始劝退的呢?说出来,让工程师给你解答一哈
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则