Forgotten 发表于 2021-4-7 17:58:15

【物联网】通过内网穿透让SIOT可公网访问-搭建私有物联网

## SIoT

SIoT是一个针对学校场景的开源免费的MQTT服务器软件,可一键创建本地物联网服务器,摆脱联网困扰。
与Mind+结合可以让小学生到高中生都可以轻松上手物联网。

(https://mindplus.dfrobot.com.cn/siot)



## 原因

SIoT可以让我们在内网搭建服务器,降低了物联网的使用门槛,但是如果遇到想通过手机远程控制、查看数据,或者多人使用没有局域网环境只有手机的时候还是想要有外网访问功能。

**如何解决这个问题呢?**这个时候一般都会想到内网穿透,内网穿透比较简单易用的工具当然就是**花生壳**了【其他也有一些平台,不过相对来说花生壳使用简单且稳定】

![](data/attachment/album/202104/07/174531nkzaf9kbmr3emfcz.png)

因此测试了一下是否可以通过**花生壳内网穿透**将SIoT的端口映射出去从而实现外网访问,**测试结果是可行,而且整个过程都是免费的**【注意(2021年备注):现在监管严格了,创建http端口需要花6块做一个实名认证】。



## 原理

用一张示意图说明(以下为收集各种信息之后简单说明,仅供参考理解,不一定是真实情况):

![](data/attachment/album/202104/07/174540xswex3wkbz00qhvh.png)

-   因为我们常用的网络都是通过运营商的网络再连接互联网的;

-   而IP地址有限,因此我们一般使用的都是有很多层局域网;
-   要访问一个siot的服务器,就要知道他的IP地址,如果要访问的设备和siot不再一个局域网里面(例如连接的不是同一个路由器)就可能访问不到。

**因此:**图中右侧的microbit或者手机想访问左边网络里面的SIoT服务器就访问不到。



**那么如何进行内网穿透呢?**

-   花生壳的原理大概是有一台服务器在互联网中,这个服务器会把收到的消息转发给设定的内网服务器;

-   然后左边局域网里面安装花生壳的软件,这个软件会连接花生壳的服务器;
-   而这个服务器是可以直接通过互联网访问的;
-   因此其他能联网的设备只需要连接到花生壳的服务器,跟这个服务器交换信息,就相当于跟左边局域网里面的SIoT服务器进行通信了。

**以上就是原理,简单了解即可,实际操作起来因为花生壳提供了一键转发功能,因此非常简单**

## 操作步骤

## SIoT准备

### 运行SIoT

首先电脑上下载SIoT客户端并运行起来。

(https://mindplus.dfrobot.com.cn/siot)

>   SIoT提供了多种平台的版本,还有树莓派的版本,所以你还可以把siot服务放在一个树莓派上运行以便24小时低功耗的使用。

![](data/attachment/album/202104/07/174553gccj7s7mscifqys7.png)

### 测试

浏览器输入siot管理网址,查看是否运行起来了。

```bash
127.0.0.1:8080
```

如下图出现SIoT管理页面说明正常运行。

-   账号:siot

-   密码:dfrobot

![](data/attachment/album/202104/07/174603je5hjaslrn6mjjhc.png)

**这个时候在同一个局域网的设备已经可以通过ip访问了,接下来我们使用花生壳内网穿透实现外网访问。**



## 花生壳内网穿透

## 账号注册

1.打开花生壳官网,下载对应客户端版本。

(https://hsk.oray.com/download/)

>   这里花生壳也提供了多种平台的版本,同样也有树莓派版本。

![](data/attachment/album/202104/07/174614oiiz9tjjr96euuuu.png)

2.下载完成之后安装后打开,使用花生壳手机APP扫码注册登录。

![](data/attachment/album/202104/07/174622k8ja4q56rfli4vn5.png)

3.点击**加号**,添加一个端口映射

    >    登录完成后为免费账户,免费账号有2个映射端口数,每个月1G流量,对于SIoT的使用来说完全够了。         
       【注意(2021年):花生壳升级之后免费账号只有1个端口映射数了,可以将仅有的端口用作1883的端口,这样只能在本地查看网页数据了,或者升级花生壳付费版本开2个端口映射。】

![](data/attachment/album/202104/07/174630mnffn5on4valetbv.png)

4.按下图做两个端口映射,其中外网域名是随机生成的,直接选择即可,如果想更换可以在花生壳购买其他名字的域名(收费服务,自行选择),内网主机填写127.0.0.1表示当前客户端运行的主机。

    >   注意:TCP对应1883端口,HTTP对应8080端口

    >    对于SIoT来说,有两个端口,一个是8080端口,http协议,用来通过网页访问,另外一个是1883端口,tcp协议,用来进行MQTT通信,因此我们映射这两个端口。

【注意(2021年):花生壳升级之后免费账号只有1个端口映射数了,可以将仅有的端口用作1883的端口,这样只能在本地查看网页数据了,或者升级花生壳付费版本开2个端口映射。】
![](data/attachment/album/202104/07/174637f08etzg4t450tv0i.png)

![](data/attachment/album/202104/07/174647ix8mf4g33e39z98e.png)

设置完成后可以看到两个访问地址:

![](data/attachment/album/202104/07/174655yuaqg73d3irad44q.png)

**至此,花生壳这边的设置就完成了,非常的简单。**

## 测试

### 管理页面测试

1.首先我们测试通过外网访问SIoT的页面,将上一步8080端口映射后生成的访问地址复制到浏览器里面即可打开SIoT的页面,另外一台电脑也可以打开。

![](data/attachment/album/202104/07/174702dvdtkbf3ky9awowb.png)

2.通过手机也可以访问,注意此时手机使用的是流量没有连接wifi,说明处于外网状态:

>   注意:这个链接被微信屏蔽了,不能直接在微信打开,需要复制到手机浏览器打开

![](data/attachment/album/202104/07/174712y5i85j7qgkqd7bsm.png)





### Mind+实时模式MQTT测试

Mind+实时模式有MQTT功能,可以用来进行测试:

1.打开Mind+,打开扩展,加载**网络服务**里面的**MQTT**扩展



![](data/attachment/album/202104/07/174722mzzj5otoyht5arlz.png)

2.编写如下程序

![](data/attachment/album/202104/07/174728xp26wjzv82lt8twn.png)

3.其中服务器地址处填写花生壳客户端中1883端口映射过去的tcp网址即可(不包含tcp://)> 也可以使用IP:端口的形式,在cmd中ping这个地址即可获取对应的服务器IP

![](data/attachment/album/202104/07/174735vs7blzsmzbfvp73b.png)

4.点击绿旗,运行程序,提示连接成功说明服务器端口映射成功。

![](data/attachment/album/202104/07/174742p0efqxf9zjqjq6ss.png)

5.通过刚才手机打开的页面发送消息

![](data/attachment/album/202104/07/174751wg9kc9qoqxq95cq5.gif)

7.可以看到Mind+这边能收到,可以远程控制了

![](data/attachment/album/202104/07/174808ll4zl4qtxit48804.png)

### 掌控板

掌控板通过设置服务器地址也可以正常使用,切换到**上传模式**,加载**WiFi**和**MQTT**扩展,编写如下程序:

![](data/attachment/album/202104/07/174818xuju10qmlqqakkuz.png)

其中MQTT服务器填入花生壳1883端口映射出来的网址(不包含tcp://)
> 也可以使用IP:端口的形式,在cmd中ping这个地址即可获取对应的服务器IP
![](data/attachment/album/202104/07/174828nsj8c3itsnnrz6br.png)



上传程序,通过前面手机发送消息控制开关灯:

![](data/attachment/album/202104/07/174837atjmzq08caab8ctu.gif)



### Python库

siot提供了一个python库,因此也可以通过Python代码访问siot。

1.在Mind+中切换到**Python模式**,**库管理**中在**PIP模式**输入**siot**即可安装。

2.输入如下示例代码,其中SERVER和PORT为1883对应地址和端口

![](data/attachment/album/202104/07/174846cxgxjkvkjmgspavk.png)

```py
import siot
import time

SERVER = "2eb1216724.qicp.vip"            #MQTT服务器IP
PORT = 13293         #MQTT服务器端口
CLIENT_ID = ""                  #在SIoT上,CLIENT_ID可以留空
IOT_pubTopic= 'xzr/001'       #“topic”为“项目名称/设备名称”
IOT_UserName ='siot'            #用户名
IOT_PassWord ='dfrobot'         #密码

print("start")
siot.init(CLIENT_ID, SERVER, user=IOT_UserName, password=IOT_PassWord,port=PORT)
siot.connect()
print("connected")
tick = 0
while True:
siot.publish(IOT_pubTopic, str(tick))
print(str(tick))
time.sleep(1)         #隔1秒发送一次
tick = tick+1
```

3.在SIOT后台即可看到数据:

![](data/attachment/album/202104/07/174859pmom7zkp8koc7pc7.png)


---

一个免费的可以内网或者外网随时访问的私有MQTT即搭建完成。
另:SIoT的后台管理html页面在安装目录下,可以通过修改这个页面达到自定义页面效果,实现远程遥控也很方便了。

完。



汤果 发表于 2021-4-7 18:39:53

这个赞~~~~{:6_202:}

rzegkly 发表于 2021-4-8 07:37:29

万物互联的时代越来越近,喜欢

rzyzzxw 发表于 2021-4-8 09:08:41

必须赞赞

hockel 发表于 2021-4-8 12:30:21

Forgotten 发表于 2021-4-7 17:58
# SIoT

SIoT是一个针对学校场景的开源免费的MQTT服务器软件,可一键创建本地物联网服务器,摆脱联网困 ...

老哥,稳

Forgotten 发表于 2021-4-8 17:27:53

hockel 发表于 2021-4-8 12:30
老哥,稳

{:5_125:}

gray6666 发表于 2021-4-9 08:38:34

打通最后一公里,这个厉害了

微笑的rockets 发表于 2021-4-9 11:32:50

测试了一下,这个羊毛可以薅,给siot打call,给花生壳打call

gray6666 发表于 2021-4-21 16:36:40

HTTP需要认证为啥收费?

Forgotten 发表于 2021-5-14 10:23:34

gray6666 发表于 2021-4-21 16:36
HTTP需要认证为啥收费?

网络管理严格了吧,好像要花5块钱实名认证一下

kevinzhang19701 发表于 2021-9-27 10:56:30

这个项目,真不错

安卓机器人 发表于 2022-7-24 21:59:37

1年多前就打通 了,666666
页: [1]
查看完整版本: 【物联网】通过内网穿透让SIOT可公网访问-搭建私有物联网