3. 设备端开发指南
在设备端,我们提供两种方式供开发者集成 P2P 功能:可执行程序方式和静态库方式。设备端是被动连接端,即 P2P 连接是由客户端发起连接的,设备端被动接收连接,可以理解成 TCP 服务端。
使用可执行程序(T2uSvr)方式时,开发者只需选用合适的嵌入式版本,在嵌入式系统启动后自动执行这个程序即可,设备即具备 P2P 能力。
使用静态库(LibT2uSvr)方式时,开发者需要调用静态库中的接口函数,开启P2P功能。
建议使用“可执行程序方式”,好处有:
- 可以快速集成,无需修改设备端原来的程序;
- 升级方便,当 T2uSvr 升级后,开发者无需重新编译程序,只需替换老版本即可
3.1 可执行程序方式集成
3.1.1. 下载 T2uSvr
从这里下载T2uSvr
3.1.2. 将 T2uSvr 复制到嵌入式设备中
可放在嵌入式设备文件系统的任意文件夹下,请注意,因为是可执行文件,因此需要让文件具备可执行模式,请执行以下命令行:
$ chmod 777 T2uSvr
3.1.3. 编写配置文件
T2uSvr 需要一个配置文件来记录一些执行参数,如设备序列号、P2P 服务器地址等,配置文件为:T2uSvr.conf,格式如下:
[main]
uuid= #设备序列号
passwd= #设备P2P密码(非设备密码,如果设置了这个密码,p2p客户端在与设备建立连接时,需要输入这个参数,并与设备端保持一致)
listen=6677 #UDP监听端口
svraddr=nat.vveye.net #服务器地址或域名
svrport=8000 #服务器端口
svrkey= #服务器密钥
status=/tmp/T2uSvr.status #状态输出文件 0: 离线 1:在线 -2:无效密钥 -3:无效UUID
maxconn=100 #允许建立最大P2P通道数 1-100
minport=1024 #P2P端口范围,最小端口
maxport=2000 #P2P端口范围,最大端口
output=/tmp/T2uSvr.list #输出当前TCP连接的文件路径
destport=0 #目标端口 0:不限定 >0:限定目标端口
配置文件通常不需要修改。其中设备序列号(uuid)可以在这个配置文件中指定,也可以单独使用一个文件来指定。通常采用后者,以方便生产时写入。单独使用序列号文件时,可以通过 T2uSvr 的命令行参数来指定这个文件位置。
设备密码和服务器密钥参见新手指南中的常见问题,通常不需要填写。
status
及output
为状态文件,通常使用默认值即可,如果要修改目标文件夹,请保证目标文件夹是可写的。
其中status
中的值表示P2P在线状态。output
中的文本列出所有当前的P2P连接。
3.1.4. 加入到自启动脚本中
T2uSvr 采用命令行方式启动,将其加入到启动脚本中,以便设备启动后自动执行。
命令行参数如下:
T2uSvr -c [config file] -u [uuid file]
- config file:T2uSvr 配置文件
- uuid file:设备序列号文件,文本文件格式,uuid 作为一个文件字符串保存存在文件中,如果没有 P2P 密码,其格式即为 uuid 本身,如果有 P2P 密码,其格式为:uuid@password。如果 uuid 在配置文件中已指定,可以不使用 -u 参数。
完成后,重启设备,使 T2uSvr 运行。
3.1.5. 使用 T2u 测试工具在PC端测试
下载 P2P 客户端测试工具:P2PCli.exe。
在 Windows 下执行该程序:
在 Dest UUID 中填入设备的序列号,点击"Create P2P tunnel"按钮:
连接成功后,状态栏中会显示如下内容
其中 P2P Addr 表示设备端的公网映射地址,version 为设备端的版本流水号,proxy 表示是否通过中继代理,0 表示没有,1 表示有。
在本例中,我们将设备端的80端口映射到 PC 端的 8080 端口上,我们的测试设备在80端口上开了一个 web 服务,此时我们在 PC 的 IE 浏览器中,打开:
http://127.0.0.1:8080
就可以打开设备端的 web 服务了,即我们已经将设备端的 80 端口映射到本机的 8080 端口上了。
如果 P2PCli 无法与设备创建 P2P 连接,请检查以下几项内容:
- 设备端是否正确连接互联网
可通过在设备端执行命令行:
$ ping nat.vveye.net
来验证,如果可以 ping
通,表示已正确连接互联网。如果不行,可能有两种情况:
1. 设备所在网络无法连接互联网。
2. 设备端的 DNS 服务器设置得不对,通常国内的 DNS 服务器选用:114.114.114.114
,国外选用:8.8.8.8
,可试着修改一下。
- 设备端的 T2uSvr 进程是否已执行
如果是 linux 系统,可以用 ps
命令查看系统中是否已有T2uSvr进程在运行。
3.2 静态库方式集成
静态库的工作原理与 T2uSvr 可执行程序一样,所不同的是,静态库需要开发者调用接口,将库链接至开发者的应用中。
采用静态库集成 P2P 功能只需按流程调用以下几个接口:
- t2u_svr_init
- t2u_svr_set_passwd(如果有P2P密码的话)
- t2u_svr_status(重复调用直至返回1)
- t2u_svr_conn_stats
- t2u_svr_exit
注:如果是WIndows系统,需要在调用 t2u_svr_init 前先调用 WSAStartup
接口函数详细说明,请参见libt2usvr api接口说明
参考实例
#include <stdio.h>
#include "libt2usvr.h"
int main(int argc, char* argv[])
{
int ret;
char buff[10240];
//初始化
ret = t2u_svr_init("nat.vveye.net”, 8000, NULL, "TEST-123456", 10);
printf("t2u_svr_init:%d\n", ret);
while(1)
{
sleep(2);
ret = t2u_svr_status();
printf("t2u_svr_status:%d\n", ret);
if (ret != 1)//如果没有注册到服务器,则继续等待
{
continue;
}
//查询当前p2p连接状态
ret = t2u_svr_conn_stats(buff, sizeof(buff));
if (ret > 0)
{
printf("%s\n", buff);
}
}
return 0;
}