Git Product home page Git Product logo

pando-cloud's Introduction

pando-cloud Build Status Coverage Status

PandoCloud是一个开源的物联网云平台。

English Document

设计理念

Pando的目的是为了提供一套可应用于实际生产环境的的物联网解决方案。它并不是一个简单的用于演示物联网服务的测试demo。下面列举了实现这套方案我们需要关注的一些关键点:

  • 物联网: 应该提供一套物联网应用场景的最佳实践。
  • 可靠性: 应该被充分的测试,并少有缺陷。
  • 分布式: 可以方便的部署在单机和集群环境中。
  • 可用性: 提供容错能力,灾备能力,自我修复机制等。
  • 扩展性: 必须是模块化,可插拔。
  • 易用性: 易于学习的开发和部署方式。
  • 通用性: 通用的设计和深度的业务抽象。
  • 高性能: 在硬件能耗和网络带宽使用上要尽量降低。
  • 安全性: 避免降低入侵和破解的风险。
  • 伸缩性: 轻松管理数千乃至数亿级的物联网设备。

系统架构

architecture

系统采用三层架构。

接入层

接入层提供了使用不同协议的设备的通信连接,包括但不局限于HTTP协议,XMPP协议,MQTT协议,COAP协议。

设备注册,身份验证和设备发现使用HTTP协议。目前,我们支持使用MQTT协议与设备进行通信。

业务层

逻辑业务层用于实现整个物联网面相设备的相关业务,例如设备管理和API等。

  • registry: 负责维护平台级的配置信息和元数据。
  • devicemanger: 设备管理器用于管理设备和处理设备的数据请求,并保持、监视设备状态。
  • apiprovider: 为应用程序扩展提供Restful API,并在设备状态发生变化时通知应用服务器。
  • controller: 管理设备接入服务,并且将设备请求路由到正确的接入服务。

核心服务层

我们的核心服务所选择的开源程序:

  • mongodb: 用mongodb做为设备的数据存储引擎。
  • mysql: 用MySql存储同类型设备的全局配置信息。
  • redis: 使用redis提供缓存服务。
  • nsq: 异步通信消息队列做为消息通知中心。
  • etcd: 高可用的键值存储系统,主要用于共享配置和服务发现。
  • ELK: elk日志分析系统即Logstash+ElasticSearch+Kibana4的组合简称,主要用于日志记录和分析。

技术参考

快速开始

快速开始介绍如何在自己的服务器或者pc机上单机部署pando物联网云。

开发应用

基于pando平台的物联网应用分为设备端应用服务器

  • 设备端负责实现数据流的传输和管理,须符合pando物联网应用协议;我们提供了Pando嵌入式开发框架封装了协议的实现,并支持移植到不同的硬件平台。也可根据设备接入接口文档自行实现设备端移植。
  • 应用服务器负责实现设备管理和交互的业务逻辑,并负责和用户终端(如手机,pc,微信等)进行交互。应用服务区器通过REST API访问Pando云平台的HTTP接口来实现对设备的操作,并通过向云平台注册回调URL接收设备的状态变化的事件通知。具体可参考应用服务器接口文档

贡献项目

pando物联网平台是完全开源免费的物联网解决方案,欢迎大家以各种形式贡献项目。

  • 反馈问题:我们鼓励通过提交Issue的方式反馈您在使用中遇到的疑问或问题。
  • 提出建议:同样,可以通过提交Issue向我们提供改进意见,同时可以通过加入我们的讨论QQ群(488074716)或者参加我们主办的线下物联网技术沙龙一起讨论。
  • 贡献代码:非常欢迎有能力的朋友一起参与Pando物联网平台的开发,一起构建开放、免费、开源的物联网解决方案。请按照贡献流程参与项目开发。

pando-cloud's People

Contributors

itachi0 avatar qiuyangsoft avatar ruizeng avatar tzhxayo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pando-cloud's Issues

提个关于pdcfg的问题

pdcfg配置工具是使用命令行来添加数据的;
现在我做了一个后台,直接表单提交,但是数据之间没有关系,然后使用$GOPATH/bin/device -productkey=。。。。 我的productkey是用sha256(base64)加密的
这里出现这样的问题
[request url]:https://localhost/v1/devices/registration
[request content]:{"product_key":"da52d3b0b2ca6e23267a710d2720f11ed8b5115723caa20b45fd578cfad5f5ee","device_code":"ffe34e","version":"version"}
[request type]:POST
[request head]:map[]
[respons body]:{"code":10001,"message":"record not found"}
问题一: 这是因为我productkey的加密问题 还是pdcfg工具内部数据间有关系;如果是这样的话,那我想写一个后台提交的数据添加工具该怎么办,可以提供一个思路? 谢谢

这里我是怀疑pando中里面有处理的,所以我修改了后台,
详情:建了一个文件夹add,有一个add.go文件,就和pdcfg包里vendor.go文件一样导入包,
建了一个Addvendor(vendor_name ,description string) error函数,调用了server包里的RPCCallByName函数: 代码如下
package add
import (
"fmt"
"github.com/PandoCloud/pando-cloud/pkg/models"
"github.com/PandoCloud/pando-cloud/pkg/server"
"strings"
)
func AddVendor(vendor_name string,description string) error{
args := models.Vendor{}
args.VendorName = strings.Replace(vendor_name, "\n", "", -1)
args.VendorDescription = strings.Replace(description, "\n", "", -1)
reply := &models.Vendor{}
err := server.RPCCallByName("registry","Registry.SaveVendor",&args,reply)
if err != nil{
return err
}
fmt.Println("=======> vendor created successfully:")
return err
}
在我的添加vendor表的页面添加函数里调用了err := add.AddVendor(vendor_name,description) 出现
the request url is /product/add
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] Handler crashed with error runtime error: invalid memory address or nil pointer dereference
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/runtime/asm_amd64.s:509
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/runtime/panic.go:491
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/runtime/panic.go:63
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/runtime/signal_unix.go:367
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /golang/src/github.com/Sirupsen/logrus/entry.go:144
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /golang/src/github.com/PandoCloud/pando-cloud/pkg/server/utils.go:10
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /golang/src/github.com/PandoCloud/pando-cloud/pkg/server/server.go:167
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /golang/src/pandobackstage/models/model.go:527
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /golang/src/pandobackstage/controllers/product.go:50
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/runtime/asm_amd64.s:509
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/reflect/value.go:434
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/reflect/value.go:302
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /golang/src/github.com/astaxie/beego/router.go:847
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/net/http/server.go:2619
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/net/http/server.go:1801
2018/02/06 15:14:27.609 [C] [asm_amd64.s:509] /usr/local/go/src/runtime/asm_amd64.s:2337
问题二: 为什么不行呢,pdcfg包也是这样的

服务启动失败

httpaccess registry 服务启动失败

以单独启动httpaccess为例
vagrant@vagrant-ubuntu-trusty-64:~/golang/src/github.com/PandoCloud/pando-cloud/build/local/linux$ {"ip":"192.168.33.10","level":"info","msg":"server httpaccess init success.","service":"httpaccess","time":"2015-12-12T04:52:39Z"}
{"ip":"192.168.33.10","level":"info","msg":"HTTP Server Listen on :443, use https: true","service":"httpaccess","time":"2015-12-12T04:52:39Z"}
{"ip":"192.168.33.10","level":"info","msg":"starting http server ... OK","service":"httpaccess","time":"2015-12-12T04:52:39Z"}
{"ip":"192.168.33.10","level":"info","msg":"sever launch successfully!","service":"httpaccess","time":"2015-12-12T04:52:39Z"}
{"ip":"192.168.33.10","level":"fatal","msg":"listen tcp :443: bind: permission denied","service":"httpaccess","time":"2015-12-12T04:52:39Z"}

[1]+ Exit 1 $GOPATH/bin/httpaccess -etcd http://localhost:2379 -httphost :443 -loglevel debug -usehttps -keyfile $GOPATH/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile $GOPATH/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem

tisan-web-ide grpc client 感觉应该缺少了 grpc server 服务

你好!
tisan-web-ide, 试验的时候 grpc client 出现错误:
/home/ubuntu/tisan-web-ide/service/grpc.js:4
var client = new product_grpc.ProductCMDS(config.grpc[0],grpc.Credentials.createInsecure());

TypeError: Cannot read property 'createInsecure' of undefined
at Object. (/home/ubuntu/tisan-web-ide/service/grpc.js:4:74)

感觉应该缺少 grpc server 服务,请问这个grpc server 侧是不是缺少了?
grpc: [ 'localhost:20311' ],


express-session deprecated req.secret; provide secret option app.js:31:9
D0716 14:27:09.722562038 6570 ev_posix.c:101] Using polling engin e: poll
/home/ubuntu/tisan-web-ide/service/grpc.js:4
var client = new product_grpc.ProductCMDS(config.grpc[0],grpc.Credentials.create Insecure());
^

TypeError: Cannot read property 'createInsecure' of undefined
at Object. (/home/ubuntu/tisan-web-ide/service/grpc.js:4:74)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object. (/home/ubuntu/tisan-web-ide/routes/workspace.js:3:12)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object. (/home/ubuntu/tisan-web-ide/app.js:59:23)
at Module._compile (module.js:409:26)

[feature]registry增加缓存

背景

registry服务对数据库中vendor product application device表进行管理。其他服务通过registry对这些表中的记录进行查询和修改等操作。目前都是通过直接操作数据库的方式进行操作,当请求量大的时候会出现性能问题,所以需要增加缓存。

业务场景

vendor,product,application三个表都是典型的_少写多读_场景。平台只有在用户需要对厂商、产品和应用的信息进行修改时,才会写db,其余都是通过id去读取(如校验key等)。并且这三个表的数据量都不会很大(甚至大部分情况只有个位数),所以可以直接进行全量内存缓存

device表数据量比其余三个表大很多,但是读频率小很多,且基本没有静态热点。暂时不考虑进行缓存操作(后续考虑根据动态热点缓存并加入分片逻辑)。

实现方法

需先实现一个通用的基于内存的列表缓存库(放在pkg目录中以便复用和测试),并通过该库缓存全量vendor,product,application三个表数据。

  1. 写入条目时时直接写db;
  2. 读取时先读缓存,如果失败则读db并更新缓存,如果db也不存在则返回失败。

mqtt工具连接,mqtt服务挂掉问题

环境:
mqtt tls 关闭
mqtt工具连接

错误症状:
连接成功后,15-60秒mqtt服务出错挂掉!

详细日志:
{"ip":"10.170.113.18","level":"info","msg":"accepting new connection 116.30.211.113:53088","service":"mqttaccess","time":"2015-12-30T14:55:37+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"recieve new connection from 116.30.211.113:53088","service":"mqttaccess","time":"2015-12-30T14:55:37+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"116.30.211.113:53088, come msg===\n\u0026{{false 0 false} MQTT 4 false false true 0 60 8 true true 8 f336884f1fabc2c724724c50b34dfd66}\n=====","service":"mqttaccess","time":"2015-12-30T14:55:37+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"accepting new connection 127.0.0.1:47314","service":"devicemanager","time":"2015-12-30T14:55:37+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"116.30.211.113:53088, connected to server now","service":"mqttaccess","time":"2015-12-30T14:55:37+08:00"}
{"ip":"10.170.113.18","level":"debug","msg":"send msg to 116.30.211.113:53088=======\n\u0026{{false 0 false} 0}\n=========","service":"mqttaccess","time":"2015-12-30T14:55:37+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer is done. Metadata is \u0026{"set" "{Key: /pando/servers/httpaccess/httphost/120.25.69.164:443, CreatedIndex: 4069, ModifiedIndex: 4069, TTL: 180}" "{Key: /pando/servers/httpaccess/httphost/120.25.69.164:443, CreatedIndex: 4062, ModifiedIndex: 4062, TTL: 120}" '\u0fe5'}\n","service":"httpaccess","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer Success","service":"httpaccess","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts is done: map[httpaccess:map[httphost:[120.25.69.164:443]] mqttaccess:map[rpchost:[localhost:20030] tcphost:[120.25.69.164:1883]] registry:map[rpchost:[localhost:20034]] apiprovidor:map[httphost:[120.25.69.164:8443]] controller:map[rpchost:[localhost:20032]] devicemanager:map[rpchost:[localhost:20033]]]","service":"httpaccess","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts Success","service":"httpaccess","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer is done. Metadata is \u0026{"set" "{Key: /pando/servers/apiprovidor/httphost/120.25.69.164:8443, CreatedIndex: 4070, ModifiedIndex: 4070, TTL: 180}" "{Key: /pando/servers/apiprovidor/httphost/120.25.69.164:8443, CreatedIndex: 4063, ModifiedIndex: 4063, TTL: 120}" '\u0fe6'}\n","service":"apiprovidor","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer Success","service":"apiprovidor","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts is done: map[registry:map[rpchost:[localhost:20034]] apiprovidor:map[httphost:[120.25.69.164:8443]] controller:map[rpchost:[localhost:20032]] devicemanager:map[rpchost:[localhost:20033]] httpaccess:map[httphost:[120.25.69.164:443]] mqttaccess:map[rpchost:[localhost:20030] tcphost:[120.25.69.164:1883]]]","service":"apiprovidor","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts Success","service":"apiprovidor","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer is done. Metadata is \u0026{"set" "{Key: /pando/servers/devicemanager/rpchost/localhost:20033, CreatedIndex: 4071, ModifiedIndex: 4071, TTL: 180}" "{Key: /pando/servers/devicemanager/rpchost/localhost:20033, CreatedIndex: 4064, ModifiedIndex: 4064, TTL: 120}" '\u0fe7'}\n","service":"devicemanager","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer Success","service":"devicemanager","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts is done: map[apiprovidor:map[httphost:[120.25.69.164:8443]] controller:map[rpchost:[localhost:20032]] devicemanager:map[rpchost:[localhost:20033]] httpaccess:map[httphost:[120.25.69.164:443]] mqttaccess:map[rpchost:[localhost:20030] tcphost:[120.25.69.164:1883]] registry:map[rpchost:[localhost:20034]]]","service":"devicemanager","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts Success","service":"devicemanager","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer is done. Metadata is \u0026{"set" "{Key: /pando/servers/registry/rpchost/localhost:20034, CreatedIndex: 4072, ModifiedIndex: 4072, TTL: 180}" "{Key: /pando/servers/registry/rpchost/localhost:20034, CreatedIndex: 4065, ModifiedIndex: 4065, TTL: 120}" '\u0fe8'}\n","service":"registry","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer Success","service":"registry","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts is done: map[registry:map[rpchost:[localhost:20034]] apiprovidor:map[httphost:[120.25.69.164:8443]] controller:map[rpchost:[localhost:20032]] devicemanager:map[rpchost:[localhost:20033]] httpaccess:map[httphost:[120.25.69.164:443]] mqttaccess:map[rpchost:[localhost:20030] tcphost:[120.25.69.164:1883]]]","service":"registry","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts Success","service":"registry","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer is done. Metadata is \u0026{"set" "{Key: /pando/servers/controller/rpchost/localhost:20032, CreatedIndex: 4073, ModifiedIndex: 4073, TTL: 180}" "{Key: /pando/servers/controller/rpchost/localhost:20032, CreatedIndex: 4066, ModifiedIndex: 4066, TTL: 120}" '\u0fe9'}\n","service":"controller","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"RegisterServer Success","service":"controller","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts is done: map[apiprovidor:map[httphost:[120.25.69.164:8443]] controller:map[rpchost:[localhost:20032]] devicemanager:map[rpchost:[localhost:20033]] httpaccess:map[httphost:[120.25.69.164:443]] mqttaccess:map[rpchost:[localhost:20030] tcphost:[120.25.69.164:1883]] registry:map[rpchost:[localhost:20034]]]","service":"controller","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"info","msg":"UpdateServerHosts Success","service":"controller","time":"2015-12-30T14:56:16+08:00"}
{"ip":"10.170.113.18","level":"error","msg":"116.30.211.113:53088 is end now","service":"mqttaccess","time":"2015-12-30T14:56:29+08:00"}
{"ip":"10.170.113.18","level":"debug","msg":"use of closed network connection","service":"mqttaccess","time":"2015-12-30T14:56:29+08:00"}
panic: close of closed channel

goroutine 23 [running]:
github.com/PandoCloud/pando-cloud/pkg/mqtt.(_Connection).Close(0xc820112360)
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/mqtt/connection.go:119 +0x79
github.com/PandoCloud/pando-cloud/pkg/mqtt.(_Connection).RcvMsgFromClient(0xc820112360)
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/mqtt/connection.go:139 +0x551
created by github.com/PandoCloud/pando-cloud/pkg/mqtt.NewConnection
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/mqtt/connection.go:48 +0x157

goroutine 1 [sleep]:
time.Sleep(0xdf8475800)
/usr/local/go/src/runtime/time.go:59 +0xf9
github.com/PandoCloud/pando-cloud/pkg/server.Run(0x0, 0x0)
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/server.go:253 +0x880
main.main()
/root/golang/src/github.com/PandoCloud/pando-cloud/services/mqttaccess/main.go:36 +0x456

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1

goroutine 6 [sleep]:
time.Sleep(0xdf8475800)
/usr/local/go/src/runtime/time.go:59 +0xf9
github.com/PandoCloud/pando-cloud/pkg/mqtt.(*Manager).CleanWorker(0xc8200dc660)
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/mqtt/manager.go:96 +0xe2
created by github.com/PandoCloud/pando-cloud/pkg/mqtt.NewManager
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/mqtt/manager.go:21 +0xd2

goroutine 7 [IO wait]:
net.runtime_pollWait(0x7f4733a57bd0, 0x72, 0xc820010180)
/usr/local/go/src/runtime/netpoll.go:157 +0x60
net.(_pollDesc).Wait(0xc82004e5a0, 0x72, 0x0, 0x0)
/usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(_pollDesc).WaitRead(0xc82004e5a0, 0x0, 0x0)
/usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(_netFD).accept(0xc82004e540, 0x0, 0x7f4733a57d30, 0xc820114040)
/usr/local/go/src/net/fd_unix.go:408 +0x27c
net.(_TCPListener).AcceptTCP(0xc82002a110, 0xc82003bed8, 0x0, 0x0)
/usr/local/go/src/net/tcpsock_posix.go:254 +0x4d
net.(_TCPListener).Accept(0xc82002a110, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/net/tcpsock_posix.go:264 +0x3d
github.com/PandoCloud/pando-cloud/pkg/server.(_TCPServer).Start.func1(0x7f4733a56c28, 0xc82002a110, 0xc8200dc6f0)
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/tcp_server.go:66 +0x45
created by github.com/PandoCloud/pando-cloud/pkg/server.(*TCPServer).Start
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/tcp_server.go:74 +0x9e4

goroutine 8 [IO wait]:
net.runtime_pollWait(0x7f4733a57b10, 0x72, 0xc820010180)
/usr/local/go/src/runtime/netpoll.go:157 +0x60
net.(_pollDesc).Wait(0xc82004e840, 0x72, 0x0, 0x0)
/usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(_pollDesc).WaitRead(0xc82004e840, 0x0, 0x0)
/usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(_netFD).accept(0xc82004e7e0, 0x0, 0x7f4733a57d30, 0xc8200fa180)
/usr/local/go/src/net/fd_unix.go:408 +0x27c
net.(_TCPListener).AcceptTCP(0xc82002a1a0, 0x0, 0x0, 0x0)
/usr/local/go/src/net/tcpsock_posix.go:254 +0x4d
net.(_TCPListener).Accept(0xc82002a1a0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/net/tcpsock_posix.go:264 +0x3d
github.com/PandoCloud/pando-cloud/pkg/server.(_TCPServer).Start.func1(0x7f4733a56c28, 0xc82002a1a0, 0xc8200dc6c0)
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/tcp_server.go:66 +0x45
created by github.com/PandoCloud/pando-cloud/pkg/server.(*TCPServer).Start
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/tcp_server.go:74 +0x9e4

goroutine 24 [IO wait]:
net.runtime_pollWait(0x7f4733a578d0, 0x72, 0xc820010180)
/usr/local/go/src/runtime/netpoll.go:157 +0x60
net.(_pollDesc).Wait(0xc82004fb10, 0x72, 0x0, 0x0)
/usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(_pollDesc).WaitRead(0xc82004fb10, 0x0, 0x0)
/usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(_netFD).Read(0xc82004fab0, 0xc820119000, 0x1000, 0x1000, 0x0, 0x7f4733a52050, 0xc820010180)
/usr/local/go/src/net/fd_unix.go:232 +0x23a
net.(_conn).Read(0xc82002a450, 0xc820119000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/net/net.go:172 +0xe4
bufio.(_Reader).fill(0xc8201124e0)
/usr/local/go/src/bufio/bufio.go:97 +0x1e9
bufio.(_Reader).Read(0xc8201124e0, 0xc8201160f0, 0x1, 0x9, 0x0, 0x0, 0x0)
/usr/local/go/src/bufio/bufio.go:207 +0x260
io.ReadAtLeast(0x7f4733a582d0, 0xc8201124e0, 0xc8201160f0, 0x1, 0x9, 0x1, 0x0, 0x0, 0x0)
/usr/local/go/src/io/io.go:298 +0xe6
io.ReadFull(0x7f4733a582d0, 0xc8201124e0, 0xc8201160f0, 0x1, 0x9, 0xc820079af0, 0x0, 0x0)
/usr/local/go/src/io/io.go:316 +0x62
encoding/gob.decodeUintReader(0x7f4733a582d0, 0xc8201124e0, 0xc8201160f0, 0x9, 0x9, 0x0, 0x1, 0x0, 0x0)
/usr/local/go/src/encoding/gob/decode.go:121 +0x92
encoding/gob.(_Decoder).recvMessage(0xc820079a80, 0xc820123bc0)
/usr/local/go/src/encoding/gob/decoder.go:76 +0x5e
encoding/gob.(_Decoder).decodeTypeSequence(0xc820079a80, 0xc5f100, 0xc820079a80)
/usr/local/go/src/encoding/gob/decoder.go:140 +0x47
encoding/gob.(_Decoder).DecodeValue(0xc820079a80, 0x8d0140, 0xc82011a390, 0x16, 0x0, 0x0)
/usr/local/go/src/encoding/gob/decoder.go:208 +0x15d
encoding/gob.(_Decoder).Decode(0xc820079a80, 0x8d0140, 0xc82011a390, 0x0, 0x0)
/usr/local/go/src/encoding/gob/decoder.go:185 +0x289
net/rpc.(_gobClientCodec).ReadResponseHeader(0xc8200ddfb0, 0xc82011a390, 0x0, 0x0)
/usr/local/go/src/net/rpc/client.go:223 +0x51
net/rpc.(_Client).input(0xc8201125a0)
/usr/local/go/src/net/rpc/client.go:109 +0xbf
created by net/rpc.NewClientWithCodec
/usr/local/go/src/net/rpc/client.go:201 +0xd2

goroutine 13 [IO wait]:
net.runtime_pollWait(0x7f4733a57a50, 0x72, 0xc820010180)
/usr/local/go/src/runtime/netpoll.go:157 +0x60
net.(_pollDesc).Wait(0xc82004ed10, 0x72, 0x0, 0x0)
/usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(_pollDesc).WaitRead(0xc82004ed10, 0x0, 0x0)
/usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(_netFD).Read(0xc82004ecb0, 0xc8200f3000, 0x1000, 0x1000, 0x0, 0x7f4733a52050, 0xc820010180)
/usr/local/go/src/net/fd_unix.go:232 +0x23a
net.(_conn).Read(0xc82002a258, 0xc8200f3000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/net/net.go:172 +0xe4
net/http.noteEOFReader.Read(0x7f4733a58090, 0xc82002a258, 0xc8200ee478, 0xc8200f3000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/go/src/net/http/transport.go:1370 +0x67
net/http.(_noteEOFReader).Read(0xc8200fa200, 0xc8200f3000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
:126 +0xd0
bufio.(_Reader).fill(0xc82001cba0)
/usr/local/go/src/bufio/bufio.go:97 +0x1e9
bufio.(_Reader).Peek(0xc82001cba0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/bufio/bufio.go:132 +0xcc
net/http.(_persistConn).readLoop(0xc8200ee420)
/usr/local/go/src/net/http/transport.go:876 +0xf7
created by net/http.(*Transport).dialConn
/usr/local/go/src/net/http/transport.go:685 +0xc78

goroutine 14 [select]:
net/http.(_persistConn).writeLoop(0xc8200ee420)
/usr/local/go/src/net/http/transport.go:1009 +0x40c
created by net/http.(_Transport).dialConn
/usr/local/go/src/net/http/transport.go:686 +0xc9d

httpaccess: 没有进程被杀死 mqttaccess: 没有进程被杀死的原因是?

[root@localhost pando-cloud]# {"ip":"","level":"info","msg":"server controller init success.","service":"controller","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"server devicemanager init success.","service":"devicemanager","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"server mqttaccess init success.","service":"mqttaccess","time":"2018-01-26T18:41:10+08:00"}
出错
{"ip":"","level":"error","msg":"wrong address : %!s(*string=0xc42004bb90)","service":"mqttaccess","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"error","msg":"Register TCP service Error: wrong address : %!s(*string=0xc42004bb90)","service":"mqttaccess","time":"2018-01-26T18:41:10+08:00"}

{"ip":"","level":"info","msg":"TCP Server Listen on localhost:20033, use tls: false","service":"devicemanager","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"starting rpc server ... OK","service":"devicemanager","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"sever launch successfully!","service":"devicemanager","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"server httpaccess init success.","service":"httpaccess","time":"2018-01-26T18:41:10+08:00"}
出错
{"ip":"","level":"error","msg":"wrong address : httphost","service":"httpaccess","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"error","msg":"RegisterHTTPHandler Error: wrong address : httphost","service":"httpaccess","time":"2018-01-26T18:41:10+08:00"}

{"ip":"","level":"info","msg":"server apiprovidor init success.","service":"apiprovidor","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"RegisterServer is done. Metadata is \u0026{"set" "{Key: /pando/servers/devicemanager/rpchost/localhost:20033, CreatedIndex: 2226, ModifiedIndex: 2226, TTL: 90}" "{Key: /pando/servers/devicemanager/rpchost/localhost:20033, CreatedIndex: 2222, ModifiedIndex: 2222, TTL: 70}" 'ࢲ'}\n","service":"devicemanager","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"RegisterServer Success","service":"devicemanager","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"server registry init success.","service":"registry","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"UpdateServerHosts is done: map[apiprovidor:map[httphost:[:8888]] controller:map[rpchost:[localhost:20032]] devicemanager:map[rpchost:[localhost:20033]] registry:map[rpchost:[localhost:20034]]]","service":"devicemanager","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"UpdateServerHosts Success","service":"devicemanager","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"HTTP Server Listen on :8888, use https: false","service":"apiprovidor","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"starting http server ... OK","service":"apiprovidor","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"sever launch successfully!","service":"apiprovidor","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"TCP Server Listen on localhost:20032, use tls: false","service":"controller","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"starting rpc server ... OK","service":"controller","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"sever launch successfully!","service":"controller","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"UpdateServerHosts is done: map[controller:map[rpchost:[localhost:20032]] devicemanager:map[rpchost:[localhost:20033]] registry:map[rpchost:[localhost:20034]] apiprovidor:map[httphost:[:8888]]]","service":"apiprovidor","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"info","msg":"UpdateServerHosts is done: map[registry:map[rpchost:[localhost:20034]] apiprovidor:map[httphost:[:8888]] controller:map[rpchost:[localhost:20032]] devicemanager:map[rpchost:[localhost:20033]]]","service":"controller","time":"2018-01-26T18:41:10+08:00"}

出错
{"ip":"","level":"warning","msg":"RPC dial error : dial tcp [::1]:20034: getsockopt: connection refused","service":"apiprovidor","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"error","msg":"dial tcp [::1]:20034: getsockopt: connection refused","service":"apiprovidor","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"error","msg":"get applications error : dial tcp [::1]:20034: getsockopt: connection refused","service":"apiprovidor","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"warning","msg":"RPC dial error : dial tcp [::1]:20034: getsockopt: connection refused","service":"controller","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"error","msg":"dial tcp [::1]:20034: getsockopt: connection refused","service":"controller","time":"2018-01-26T18:41:10+08:00"}
{"ip":"","level":"warning","msg":"refresh timer rules error : dial tcp [::1]:20034: getsockopt: connection refused","service":"controller","time":"2018-01-26T18:41:10+08:00"}

请解疑惑,谢谢

use pdcfg execute vendor add occur error:no server for registry,but six services are normal!

use pdcfg execute vendor add occur error:no server for registry,but six services are normal!Why?

root@pando:# ps aux | grep $GOPATH/bin
root 2065 0.0 0.2 120468 11736 ? Sl 11:38 0:00 /root/golang/bin/httpaccess -etcd http://localhost:2379 -httphost internal:443 -loglevel debug -usehttps -keyfile /root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile /root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
root 2066 0.0 0.3 124516 13060 ? Sl 11:38 0:00 /root/golang/bin/registry -etcd http://localhost:2379 -rpchost localhost:20034 -aeskey ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP -dbhost localhost -dbname PandoCloud -dbport 3306 -dbuser root -loglevel debug
root 2067 0.0 0.3 47332 12148 ? Sl 11:38 0:00 /root/golang/bin/apiprovider -etcd http://localhost:2379 -loglevel debug -httphost :8888
root 2068 0.0 0.2 53344 10748 ? Sl 11:38 0:00 /root/golang/bin/devicemanager -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20033
root 2069 0.0 0.3 121012 12944 ? Sl 11:38 0:00 /root/golang/bin/controller -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20032
root 2070 0.0 0.2 46364 11096 ? Sl 11:38 0:00 /root/golang/bin/mqttaccess -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20030 -tcphost internal:1883 -usetls -keyfile /root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile /root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
root 2385 0.0 0.0 11748 2172 pts/1 S+ 11:55 0:00 grep --color=auto /root/golang/bin
root@pando:
# $GOPATH/bin/pdcfg -etcd http://localhost:2379
{"ip":"192.168.1.100","level":"info","msg":"server pdcfg init success.","service":"pdcfg","time":"2016-03-30T12:08:42+08:00"}

vendor add
vendor name: testvendor
vendor description: testvendor desc
{"ip":"192.168.1.100","level":"error","msg":"no server for registry","service":"pdcfg","time":"2016-03-30T12:09:31+08:00"}
no server for registry

无法接收到请求到手机app请求问题

我的温湿度的板子长时间放着,就会出现一直保持心跳连接(心跳包打印正常),但用手机却查不到当前状态,但显示设备还是在线的,只是板子无法接收到请求。

docker部署后,设备注册和登录可运行,但是应用api不通

docker部署后,设备注册和登录可运行,但是应用api不通

1、vendor add 可以添加,也会出现vendor id,但是在下一步添加product的时候,输入此处vendor add 获得的vendor id,product add成功得到的vendor id是0,而不是我输入的vendor id

2、按照 设备接入API 说明,完全可以实现设备注册和登录:
用的是 firefox下的restclient插件,虚拟机里添加了443端口映射,rest连接的时候,用的是 https://ip/v1/devices/registration的形式,然后在Body里面添加 json数据

3、按 应用服务器API接口 说明,却总是不成功,尝试了以下方法也不行:
进行了app add操作,获得了appkey,AppDomain设置的是 “*”
在虚拟机添加了 8888 端口映射
使用 firefox下的restclient插件
尝试了使用
https://ip:8888/application/v1/device/info
http://ip:8888/application/v1/device/info
以及在启动apiprovider时将端口设置为80后使用http://ip/application/v1/device/info的形式
都不行,现象是,返回404 没有找到 错误

疑惑::
在docker里使用 docker ps -a看见
controller和 apiprovider
处于停止运行状态

设备接入流程

  • 能不能提供一个设备接入 pando 物联网平台详细方案,接入流程和接入协议具体案例。
  • 设备代理(网关)的实现是在硬件自己本身去实现吗?如,现很热门共享自行车的解决方案,如果用 pando 物联网平台来实现, 设备代理(网关) 的实现 在那个部分呢?

望解惑,在此谢过了!

run.sh error panic: runtime error: invalid memory address or nil pointer dereference

Hello!
When I setup pandocloud on ubuntu14.04,some errors occurred.the following error:
root@pando:/golang# cd bin
root@pando:
/golang/bin# ls
apiprovider controller devicemanager httpaccess mqttaccess registry
root@pando:/golang/bin# cd $GOPATH/src/github.com/PandoCloud/pando-cloud
root@pando:
/golang/src/github.com/PandoCloud/pando-cloud# ls
build docs LICENSE pkg services tools
Dockerfile Godeps make_deps.sh README.md tests unit_test.sh
root@pando:~/golang/src/github.com/PandoCloud/pando-cloud# sudo sh -x .ild/localnux/run.sh

  • killall -9 httpaccess registry apiprovider devicemanager controller mqttaccess
    httpaccess: no process found
    registry: no process found
    apiprovider: no process found
    devicemanager: no process found
    controller: no process found
    mqttaccess: no process found
  • exit 0
    root@pando:~/golang/src/github.com/PandoCloud/pando-cloud# + + /bin/mqttaccess -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20030 -tcphost internal:1883 -usetls -keyfile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile/bin/controller /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
    -etcd.ild/localnux/run.sh: 11: .ild/localnux/run.sh: http://localhost:2379+ -loglevel debug -rpchost localhost:20032/bin/mqttaccess: not found

.ild/localnux/run.sh: 10: .ild/localnux/run.sh: /bin/controller: not found
/bin/devicemanager -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20033
.ild/localnux/run.sh: 9: .ild/localnux/run.sh: /bin/devicemanager: not found

  • /bin/apiprovider -etcd http://localhost:2379 -loglevel debug -httphost :8888
    .ild/localnux/run.sh: 8: .ild/localnux/run.sh: /bin/apiprovider: not found
  • /bin/registry -etcd http://localhost:2379 -rpchost localhost:20034 -aeskey ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP -dbhost localhost -dbname PandoCloud -dbport 3306 -dbuser root -loglevel debug
    .ild/localnux/run.sh: 7: .ild/localnux/run.sh: /bin/registry: not found
  • /bintpaccess -etcd http://localhost:2379 -httphost internal:443 -loglevel debug -usehttps -keyfile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
    .ild/localnux/run.sh: 6: .ild/localnux/run.sh: /bintpaccess: not found

When I execute command each row in run.sh,four commands sucessed,but apiprovider and controller commands run error below:

*$GOPATH/bin/apiprovider -etcd http://localhost:2379 -loglevel debug -httphost :8888 *&
[1] 1537
root@pando:/home/pando# {"ip":"192.168.1.168","level":"info","msg":"server apiprovidor init success.","service":"apiprovidor","time":"2016-03-02T16:06:43+08:00"}
{"ip":"192.168.1.168","level":"error","msg":"dial tcp [::1]:5672: getsockopt: connection refused","service":"apiprovidor","time":"2016-03-02T16:06:43+08:00"}
{"ip":"192.168.1.168","level":"info","msg":"HTTP Server Listen on :8888, use https: false","service":"apiprovidor","time":"2016-03-02T16:06:43+08:00"}
{"ip":"192.168.1.168","level":"info","msg":"starting http server ... OK","service":"apiprovidor","time":"2016-03-02T16:06:43+08:00"}
{"ip":"192.168.1.168","level":"info","msg":"sever launch successfully!","service":"apiprovidor","time":"2016-03-02T16:06:43+08:00"}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x405b8c]

goroutine 9 [running]:
panic(0xb2a1e0, 0xc82000e0e0)
/usr/local/go/src/runtime/panic.go:464 +0x3e6
main.(_Notifier).updateApplications(0x0, 0x0, 0x0)
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/notifier.go:67 +0x20c
created by main.(_Notifier).Run
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/notifier.go:154 +0x45

[1]+ Exit 2


*$GOPATH/bin/controller -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20032 *&
[1] 1542
root@pando:/home/pando# {"ip":"192.168.1.168","level":"info","msg":"server controller init success.","service":"controller","time":"2016-03-02T16:07:38+08:00"}

{"ip":"192.168.1.168","level":"error","msg":"NewController Error: dial tcp [::1]:5672: getsockopt: connection refused","service":"controller","time":"2016-03-02T16:07:38+08:00"}

net port info below:
root@pando:/home/pando# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 1326/etcd
tcp 0 0 127.0.0.1:28017 0.0.0.0:* LISTEN 859/mongod
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 848/sshd
tcp 0 0 127.0.0.1:7001 0.0.0.0:* LISTEN 1326/etcd
tcp 0 0 192.168.1.168:1883 0.0.0.0:* LISTEN 1384/mqttaccess
tcp 0 0 192.168.1.168:443 0.0.0.0:* LISTEN 1354tpaccess
tcp 0 0 127.0.0.1:20030 0.0.0.0:* LISTEN 1384/mqttaccess
tcp 0 0 127.0.0.1:20033 0.0.0.0:* LISTEN 1372/devicemanager
tcp 0 0 127.0.0.1:4001 0.0.0.0:* LISTEN 1326/etcd
tcp 0 0 127.0.0.1:20034 0.0.0.0:* LISTEN 1364/registry
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 859/mongod
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1001/mysqld
tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 1326/etcd
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 885/redis-server 12
tcp6 0 0 :::8080 :::* LISTEN 1024/java
tcp6 0 0 :::22 :::* LISTEN 848/sshd
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1024/java
udp 0 0 0.0.0.0:68 0.0.0.0:* 667/dhclient
udp 0 0 0.0.0.0:64283 0.0.0.0:* 667/dhclient
udp6 0 0 :::9553 :::* 667/dhclient

question

在执行$GOPATH/bin/controller -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20032 &
之后报错:
{"ip":"10.0.2.15","level":"info","msg":"server controller init success.","service":"controller","time":"2016-04-21T15:53:44+08:00"}
{"ip":"10.0.2.15","level":"error","msg":"NewController Error: no reachable servers","service":"controller","time":"2016-04-21T15:53:56+08:00"}
想请问哪里出错了呢?其他五个服务都能正常运行,就是controller无法启动。怀疑是端口被占用了,修改了20032为20038,也是不行。

docker里启动mqttaccess httpaccess时设置-tcphost的问题

以下是私聊群主的问题, 他让发布到issue,惠顾大家

问:
群主你好,攀多云启动mqttaccess的时候,设置参数 -tcphost 外网IP:1883 时,就不能成功启动,如果把外网IP换成localhost,或者干脆不写,或者换成179.1.0.9(容器分配得到的私有ip地址),就可以启动,请问我这是什么地方错了呢,谢谢
我用的docker,其中179.1.0.9是mqttaccess容器的ip地址

答:
那肯定啊,你容器里面是看不到外网ip的
你好好看下docker

问:
容器里看不到外网ip,这样的话,以-tcphost外网ip:1883参数启动matt,就会出现错误导致不能启动是吗,也就是还需要在容器和宿主机之间做一次ip映射

答:
恩,建议不要用容器装,ip这块比较麻烦的

问:
我使用分配给容器自己的ip(179.1.0.9)可以启动容器,不设置ip也可以启动mqttaccess,在8266固件里把设备登录后获得的accss_addr改成我的外网(公网)ip加1883的形式,这样设备端反向是能连接到pandocloud的,我研究容器下安装花了好多精力了,你能不能指导下容器中如何映射到外网

答:
你说的方法就是办法了,当然这样需要改固件,如果不改固件的话,我mqttaccess是支持一个环境变量的,可以让固件拉取到的mqttaccess ip是真实ip,把这个环境变量设置成最后固件需要得到的真实地址就行了
EnvTCPProxy = "TCP_PROXY_ADDR"
EnvHTTPProxy = "HTTP_PROXY_ADDR"

问:
以上EnvTCPProxy ="TCP_PROXY_ADDR"直接加在 docker run 里面启动mqtt吗

答:
docker run的时候有参数可以指定环境变量的,你查下
docker的文档有加环境变量的用法的
不是这样加的,是加 “TCP_PROXY_ADDR=真实ip:真实端口”

[feature]新增webui工具管理及配置平台

背景

  • 目前平台通过pdcfg小工具进行基本的信息配置,不太方便且学习门槛较高
  • 平台目前都是通过系统工具和脚本对系统进行监控,使用门槛高且不直观

需要开发一个基于web的管理平台,除了上述功能,后续陆续加入统计、日志分析、数据分析等常用功能。

需求

webui分为首页、配置、监控、统计、日志、分析等子模块:

  • 首页:展示系统关键信息,如当前激活设备数,在线设备数,系统运行情况。
  • 配置:主要通过registry对平台进行配置,如配置产品等。
  • 监控:监控当前系统运行状态,及各个服务的状态,以及当前的负载情况。
  • 统计:统计报表如总设备数,设备数增长趋势等。
  • 日志:查看和搜索日志
  • 分析:后续会对接数据平台,读设备的数据进行分析挖掘等。
  • 帮助:使用说明、版本说明、项目介绍等。

技术方案

  • web框架:beego
  • 前端:bootstrap+jquery

参考原型

pando-webui.zip

页面模板

AdminLTE-2.3.0.zip

部署

请问这个云平台可以部署在windows下吗?应该怎么做?

ubuntu部署问题

我这边完全按照说明一步步部署,但到后面提示有问题,还请指导。
当执行到sudo sh -x ./build/local/linux/run.sh提示出错,前面都没问题,试了好几遍。错误如下
root@ubuntu:~/golang/src/github.com/PandoCloud/pando-cloud# sudo sh -x ./build/local/linux/run.sh

  • killall -9 httpaccess registry apiprovider devicemanager controller mqttaccess
    httpaccess: no process found
    registry: no process found
    apiprovider: no process found
    devicemanager: no process found
    controller: no process found
    mqttaccess: no process found
  • exit 0
    root@ubuntu:~/golang/src/github.com/PandoCloud/pando-cloud# + /bin/mqttaccess -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20030 -tcphost+ internal:1883 -usetls -keyfile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
    ./build/local/linux/run.sh: 11: ./build/local/linux/run.sh: /bin/mqttaccess: not found
    /bin/controller -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20032
    ./build/local/linux/run.sh: 10: ./build/local/linux/run.sh: /bin/controller: not found
  • /bin/devicemanager -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20033
    ./build/local/linux/run.sh: 9: ./build/local/linux/run.sh: /bin/devicemanager: not found
  • /bin/apiprovider -etcd http://localhost:2379 -loglevel debug -httphost :8888
    ./build/local/linux/run.sh: 8: ./build/local/linux/run.sh: /bin/apiprovider: not found
  • /bin/registry -etcd http://localhost:2379 -rpchost localhost:20034 -aeskey ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP -dbhost localhost -dbname PandoCloud -dbport 3306 -dbuser root -loglevel debug
    ./build/local/linux/run.sh: 7: ./build/local/linux/run.sh: /bin/registry: not found
  • /bin/httpaccess -etcd http://localhost:2379 -httphost internal:443 -loglevel debug -usehttps -keyfile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
    ./build/local/linux/run.sh: 6: ./build/local/linux/run.sh: /bin/httpaccess: not found
    2016-05-11 23:03:16.201141 I | etcdserver: start to snapshot (applied: 10001, lastsnap: 0)
    2016-05-11 23:03:16.219505 I | etcdserver: saved snapshot at index 10001
    2016-05-11 23:03:16.222697 I | etcdserver: compacted raft log at 5001

root@ubuntu:~/golang/src/github.com/PandoCloud/pando-cloud# sudo sh -x ./build/local/linux/run.sh

  • killall -9 httpaccess registry apiprovider devicemanager controller mqttaccess
    httpaccess: no process found
    registry: no process found
    apiprovider: no process found
    devicemanager: no process found
    controller: no process found
    mqttaccess: no process found
  • exit 0
    root@ubuntu:~/golang/src/github.com/PandoCloud/pando-cloud# + /bin/mqttaccess -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20030 -tcphost internal:1883 -usetls -keyfile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem+ -cafile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
    ./build/local/linux/run.sh: 11: ./build/local/linux/run.sh: /bin/mqttaccess: not found
    /bin/controller -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20032
    ./build/local/linux/run.sh: 10: ./build/local/linux/run.sh: /bin/controller: not found
  • /bin/devicemanager -etcd http://localhost:2379 -loglevel debug -rpchost localhost:20033
    ./build/local/linux/run.sh: 9: ./build/local/linux/run.sh: /bin/devicemanager: not found
  • /bin/apiprovider -etcd http://localhost:2379 -loglevel debug -httphost :8888
    ./build/local/linux/run.sh: 8: ./build/local/linux/run.sh: /bin/apiprovider: not found
  • /bin/registry -etcd http://localhost:2379 -rpchost localhost:20034 -aeskey ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP -dbhost localhost -dbname PandoCloud -dbport 3306 -dbuser root -loglevel debug
    ./build/local/linux/run.sh: 7: ./build/local/linux/run.sh: /bin/registry: not found
  • /bin/httpaccess -etcd http://localhost:2379 -httphost internal:443 -loglevel debug -usehttps -keyfile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile /src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
    ./build/local/linux/run.sh: 6: ./build/local/linux/run.sh: /bin/httpaccess: not found
    然后我查了一下bin目录下的文件如下
    root@ubuntu:~/golang/bin# ls
    apiprovider controller devicemanager httpaccess mqttaccess registry
    还请指导,谢谢。

mqttaccess keyfile cafile问题

按照git上的说明,启动mqttaccess的时候,设置
-usetls -keyfile /go/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem -cafile /go/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/cert.pem
我用的是docker

问题1、这个/go/src/github.com/PandoCloud/pando-cloud/pkg/server/testdata/key.pem我在虚拟机上怎么也找不到
问题2、tisan提供的8266sdk里的rgb led demo里没有看见设置tls的选项
问题3、看见mqtt交互过程中8266串口输出的debug,mqttaccess容器输出 “the first byte is not like handshake”字样,然后就断开了mqtt连接

apiprovider服务启动出错

`$GOPATH/bin/apiprovider -etcd http://localhost:2379 -rpchost localhost:20031 -httphost 120.25.212.111:8443 -loglevel debug -usehttps -keyfile /iotcloud/pandocloud/privkey.pem -cafile /iotcloud/pandocloud/cacert.pem &
[1] 1537
root@iZ94m8aipu7Z:~# {"ip":"10.116.119.223","level":"info","msg":"server apiprovidor init success.","service":"apiprovidor","time":"2016-02-24T10:35:16+08:00"}
{"ip":"10.116.119.223","level":"error","msg":"dial tcp 127.0.0.1:5672: getsockopt: connection refused","service":"apiprovidor","time":"2016-02-24T10:35:16+08:00"}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x405ac3]

goroutine 21 [running]:
main.(_Notifier).updateApplications(0x0, 0x0, 0x0)
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/notifier.go:66 +0x213
created by main.(_Notifier).Run
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/notifier.go:153 +0x45

goroutine 1 [runnable]:
bytes.makeSlice(0xba, 0x0, 0xdb6db6db6db6db, 0xe)
/usr/local/go/src/bytes/buffer.go:188
bytes.(_Buffer).grow(0xc820148160, 0x3a, 0x4)
/usr/local/go/src/bytes/buffer.go:103 +0x282
bytes.(_Buffer).WriteString(0xc820148160, 0xc8200eb880, 0x3a, 0x0, 0x0, 0x0)
/usr/local/go/src/bytes/buffer.go:140 +0x4b
encoding/json.(_encodeState).string(0xc820148160, 0xc8200eb880, 0x3a, 0xc8200eb880, 0x0, 0x0)
/usr/local/go/src/encoding/json/encode.go:852 +0x14e
encoding/json.stringEncoder(0xc820148160, 0x96f5c0, 0xc8200e7400, 0x58, 0x0)
/usr/local/go/src/encoding/json/encode.go:546 +0x2c4
encoding/json.(_encodeState).reflectValue(0xc820148160, 0x96f5c0, 0xc8200e7400, 0x58)
/usr/local/go/src/encoding/json/encode.go:297 +0x6b
encoding/json.interfaceEncoder(0xc820148160, 0x962a00, 0xc8200e7490, 0x54, 0xc8200e7400)
/usr/local/go/src/encoding/json/encode.go:555 +0xd8
encoding/json.(_mapEncoder).encode(0xc8200e8070, 0xc820148160, 0xa1aca0, 0xc8200e3a10, 0x15, 0x0)
/usr/local/go/src/encoding/json/encode.go:617 +0x344
encoding/json.(_mapEncoder).(encoding/json.encode)-fm(0xc820148160, 0xa1aca0, 0xc8200e3a10, 0x15, 0xc8200e3a00)
/usr/local/go/src/encoding/json/encode.go:627 +0x51
encoding/json.(_encodeState).reflectValue(0xc820148160, 0xa1aca0, 0xc8200e3a10, 0x15)
/usr/local/go/src/encoding/json/encode.go:297 +0x6b
encoding/json.(_encodeState).marshal(0xc820148160, 0xa1aca0, 0xc8200e3a10, 0x0, 0x0)
/usr/local/go/src/encoding/json/encode.go:270 +0xa9
encoding/json.Marshal(0xa1aca0, 0xc8200e3a10, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/encoding/json/encode.go:135 +0x83
github.com/Sirupsen/logrus.(_JSONFormatter).Format(0xc8200e67f0, 0xc8200eb8c0, 0x0, 0x0, 0x0, 0x0, 0x0)
/root/golang/src/github.com/Sirupsen/logrus/json_formatter.go:36 +0x864
github.com/Sirupsen/logrus.(_Entry).Reader(0xc8200eb8c0, 0xc808359204, 0x0, 0x0)
/root/golang/src/github.com/Sirupsen/logrus/entry.go:44 +0x67
github.com/Sirupsen/logrus.Entry.log(0xc82001b3c0, 0xc8200e2d80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x414404, 0xc8200eb880, ...)
/root/golang/src/github.com/Sirupsen/logrus/entry.go:94 +0x282
github.com/Sirupsen/logrus.(_Entry).Info(0xc8200ea940, 0xc8200f3c40, 0x1, 0x1)
/root/golang/src/github.com/Sirupsen/logrus/entry.go:129 +0x8c
github.com/Sirupsen/logrus.(_Entry).Infof(0xc8200ea940, 0xc78de0, 0x27, 0xc8200f3d00, 0x2, 0x2)
/root/golang/src/github.com/Sirupsen/logrus/entry.go:173 +0x139
github.com/PandoCloud/pando-cloud/pkg/server.(*HTTPServer).Start(0xc8200e3320, 0x0, 0x0)
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/http_server.go:30 +0x422
github.com/PandoCloud/pando-cloud/pkg/server.Run(0x0, 0x0)
/root/golang/src/github.com/PandoCloud/pando-cloud/pkg/server/server.go:215 +0x235
main.main()
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/main.go:37 +0x3f8

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1

goroutine 22 [runnable]:
main.(_Notifier).processEvents(0x0, 0xc8200eb7c0, 0x37)
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/notifier.go:138
created by main.(_Notifier).Run
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/notifier.go:154 +0x67

goroutine 23 [runnable]:
main.(_Notifier).processStatus(0x0, 0xc8200eb7c0, 0x37)
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/notifier.go:59
created by main.(_Notifier).Run
/root/golang/src/github.com/PandoCloud/pando-cloud/services/apiprovider/notifier.go:155 +0x89
`

已经修复!
问题:没有安装RabbitMQ,
解决:sudo apt-get install rabbitmq-server-y

postman调用api配置设备状态

通过 postman 进行 put 操作,本地云配置产品时添加的 json 如下:

{
    "objects": [{
        "no": 1,
        "label": "led",
        "part": 1,
        "status": [{
            "value_type": 8,
            "name": "red"
        } ,{
            "value_type": 8,
            "name": "green"
        }, {
            "value_type": 8,
            "name": "blue"
        }]
    }],
    "commands": [],
    "events": []
}

tisan工程里led结构体如下(main函数只有led):

struct led {
    uint8 red;
    uint8 green;
    uint8 blue;
};

发送的 json 如下:

{
  "led":[255,0,0]
}

发送后信息返回信息如下:

{
  "code": 0,
  "message": ""
}

同时,串口监视器显示:

TCP: data received 50 bytes
Package length: 50
content is: 
32 30 00 01 73 00 16 00 00 00 00 00 56 94 c7 d7 91 c5 18 d5 fd 18 50 83 d2 a3 6b 31 96 8c 3c 6f 00 01 00 01 00 03 00 08 00 ff 00 08 00 ff 00 08 00 ff 
client->connstate:15, type:3, Qos:1, id:22
mqtt actual length:50
MQTT: Queue response QoS: 1
mqtt_data_cb
mqtt topic length: 1
mqtt data length: 43
the topic is: s
PUBLISH MESSAGE,receive length:50, actual length:50
MQTT TASK
MQTT TASK DATA
MQTT: Sending, type: 4, id: 0016
enter into temp2_function...TCP: Sent
MQTT TASK
MQTT TASK DATA

但是设备没反应 ...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.