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 的命令行参数来指定这个文件位置。

  设备密码和服务器密钥参见新手指南中的常见问题,通常不需要填写。

  statusoutput为状态文件,通常使用默认值即可,如果要修改目标文件夹,请保证目标文件夹是可写的。

  其中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 功能只需按流程调用以下几个接口:

  1. t2u_svr_init
  2. t2u_svr_set_passwd(如果有P2P密码的话)
  3. t2u_svr_status(重复调用直至返回1)
  4. t2u_svr_conn_stats
  5. 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;
}