Netkiller Amateur Radio 手札

目录

1. 1. 数字中继

1. 数字中继VPN联网方案

1. VPN服务器

1. 服务器端

2. 中继节点端

3. 测试vpn是否可用

2. 网线网桥数字链路

3. Motorola XiR R8200 固件升级教程

4. Link Establishment(建立IP链路)

1. Master(主站设置)

2. Peer(从站设置)

5. Mototrbo 数字电台短信协议分析

1. IP Address 与 Radio ID 相互转换

2. 检查 Radio 状态

3. TMS 短信协议分析

2. 2. 通过电台建立TCP/IP链路

3. 3. Pi-Star Digital Voice Software

1. 对于初次接触 MMDVM 的人，怎么选择 MMDVM 板

2. 烧录img镜像文件

1. Mac

3. 释放TF卡空间

4. 更新系统

5. 修改权限从 ro 到 rw

6. Yaesu FT-7800 + 中继版解决方案

1. 准备工作

2. Yaesu FT-7800 电台设置

3. MMDVM C4FM 设置

4. MMDVM DMR 设置

5. DMR 不解码

6. 调试误码率

7. 进入 Yaesu FT-7800 的工程模式下微调

8. Yaesu FT-7800 在 VHF 模式下不支持 9600BPs 数据包通信。

9. 给电台加锁

4. 4. MMDVM (Multi-Mode Digital Voice Modem)

1. 创建 MMDVM 用户

2. YSFClients

1. YSFGateway

2. YSFParrot

3. YSFReflector

3. DMRGateway

4. MMDVMHost

1. 编译安装 MMDVMHost

2. systemd

3. 配置 MMDVMHost

4. 通过 USB 接入 MMDVM

5. MMDVMCal

6. Pi-Star Digital Voice Dashboard

7. MMDVM firmware

8. FAQ

1. What is the difference between FCS and YSF?

2. Trying to find non existent YSF reflector with a name of CN China 1

Netkiller Amateur Radio 手札

Mr. Neo Chan, 陈景峯(BG7NYT)

中国广东省深圳市望海路半岛城邦三期

518067

+86 13113668890

<netkiller@msn.com>

MMDVM Hotspot:

YSF80337 - CN China 1 - W24166/TG46001

BM_China_46001 - DMR Radio ID 4600441

版权 © 2013, 2014 Neo Chan

版权声明

转载请与作者联系，转载时请务必标明文章原始出处和作者信息及本声明。

http://www.netkiller.cn

http://netkiller.github.io

http://netkiller.sourceforge.net

微信订阅号 netkiller-ebook (微信扫描二维码）

QQ：13721218 请注明“读者”

QQ群：128659835 请注明“读者”

$Date: 2013-07-23 14:41:49 +0800 (Tue, 23 Jul 2013) $

摘要

第 1 章 数字中继

数字中继VPN联网方案

设备列表

天线，馈线，双工器

MOTOTRBO™ DR 3000 Repeater

一台有公网IP的VPN服务器， 配置没有特别要求

两台VPN客户端，需要两个网口。不需要公网IP

网线，水晶头，工具等等

需求描述

一期，迫切解决的问题：

1. 将目前已建成的两部数字中继通过TCP/IP互连

2. 实现手持机在中继网间漫游

3. 实现分组呼叫

同时要考虑到后面的扩容问题：

1. 与其他临近城市的互通问题。

2. APRS

3. YY或Echolink 接入问题

4. 与模拟网的互通问题

5. 与Voip协议SIP或H.323互通

6. 中继录音域mp3流服务器播放

背景

互连 DR-3000中继需要公网IP，无法使用动态IP技术。

通过VPN技术建立虚拟专用网实现两个中继相互通信，同时VPN服务器也可以采用动态IP+域名的方案，定时将IP地址更新到域名服务器，然后VPN客户端通过域名与VPN服务器建立连接。实现两台中继的网络互通。

允许多个VPN客户端与服务器建立连接，这样就解决了扩容问题。

频率与时隙规划

采用异频同播模式

1号中继：439.790 -5 12 1

2号中继：439.200 -5 12 1

IP地址规划

LAN IP: 172.16.0.0/24

VPN IP: 10.8.0.0/24

1号中继：172.16.0.1/24

2号中继：172.16.0.2/24

控制台：172.16.0.254/24

物理网络拓扑图

.-----------------------------> tun0  [ VPN Server ] tun0 <-----------------------.

/                                            |                                      \

/                                          Switch                                     \

|                                             |                                        \

|                                          Router                                       |

V                                             ^                                         V

tun0                                           |                                        tun0

天线 ---> 双工器 ---> 中继台 ---> eth1 [VPN Client] eth0 ---> Switch ---> Router ---> ( WAN ) <--- Router <--- Switch <--- eth0 [VPN Client] eth1 <--- 中继台 <--- 双工器  <--- 天线

client tun0 与 server tun0通过tun0虚拟接口 建立了一条虚拟链路，实际上仍然通过eth0物理链路与服务器连接。通过路由表的走向可以将172.16.0.0/24网络打通。

VPN服务器与客户端

操作系统 CentOS-6.5-x86_64-minimal.iso

分区规划，适合VPN服务器与客户端:

- / 分区 50G

- Swap 分区 内存*2，如果大于16G内存，使用与内存相等即可

- 其他暂时保留

VPN服务器

请参考下面安装

http://netkiller.github.io/linux/network/vpn/index.html#openvpn

http://netkiller.github.io/centos/network/openvpn.html

服务器端

启用IP转发

# vim /etc/sysctl.conf

# Controls IP packet forwarding

net.ipv4.ip_forward = 1

net.ipv4.ip_forward = 1 使IP转发生效

sysctl -w net.ipv4.ip_forward=1

安装openvpn按顺序运行即可

yum install openvpn easy-rsa -y

chkconfig openvpn on

cp /usr/share/doc/openvpn-2.3.2/sample/sample-config-files/server.conf /etc/openvpn/

cd /usr/share/easy-rsa/2.0

cat >> vars <<EOF

# Add by BG7NYT

export KEY_COUNTRY="CN"

export KEY_PROVINCE="GD"

export KEY_CITY="Shenzhen"

export KEY_ORG="Personal Amateur Radiostations of P.R.China"

export KEY_EMAIL="bg7nyt@163.com"

export KEY_CN=http://netkiller.github.io

export KEY_NAME=BG7NYT

export KEY_OU=Mototrbo

EOF

source ./vars

./clean-all

./build-ca

./build-key-server server

./build-dh

./build-key node1

./build-key node2

cp keys/ca.key keys/ca.crt keys/dh1024.pem keys/server.key keys/server.crt /etc/openvpn/

service openvpn start

iptables -A INPUT -p udp --dport 1194 -j ACCEPT

中继节点端

启用IP转发

# vim /etc/sysctl.conf

# Controls IP packet forwarding

net.ipv4.ip_forward = 1

net.ipv4.ip_forward = 1 使IP转发生效

sysctl -w net.ipv4.ip_forward=1

安装openvpn客户端

yum install openvpn -y

chkconfig openvpn on

cp /usr/share/doc/openvpn-2.3.2/sample/sample-config-files/client.conf /etc/openvpn/

将build-key生成的节点证书复制到节点服务器/etc/openvpn/目录中

cp keys/ca.crt keys/node1.key keys/node1.crt /etc/openvpn/

启动openvpn客户端

service openvpn start

测试vpn是否可用

3台linux服务器运行openvpn服务后可以看到一个tun0网络适配器，我们相互ping对方的tun0上的IP地址即可，正常应该全部都通，不通请查看防火墙配置。

服务器tun0状态

# ifconfig tun0

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1

RX packets:4 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:240 (240.0 b)  TX bytes:0 (0.0 b)

节点1的 tun0

# ifconfig tun0

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

inet addr:10.8.0.10  P-t-P:10.8.0.9  Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1

RX packets:22 errors:0 dropped:0 overruns:0 frame:0

TX packets:25 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:2257 (2.2 KiB)  TX bytes:3757 (3.6 KiB)

服务器到节点

# ping 10.8.0.6 -c3

PING 10.8.0.6 (10.8.0.6) 56(84) bytes of data.

64 bytes from 10.8.0.6: icmp_seq=1 ttl=128 time=20.9 ms

64 bytes from 10.8.0.6: icmp_seq=2 ttl=128 time=20.1 ms

64 bytes from 10.8.0.6: icmp_seq=3 ttl=128 time=20.1 ms

--- 10.8.0.6 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2001ms

rtt min/avg/max/mdev = 20.118/20.414/20.939/0.389 ms

# ping 10.8.0.10 -c3

PING 10.8.0.10 (10.8.0.10) 56(84) bytes of data.

64 bytes from 10.8.0.10: icmp_seq=1 ttl=64 time=14.4 ms

64 bytes from 10.8.0.10: icmp_seq=2 ttl=64 time=17.0 ms

64 bytes from 10.8.0.10: icmp_seq=3 ttl=64 time=14.0 ms

--- 10.8.0.10 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2000ms

rtt min/avg/max/mdev = 14.068/15.170/17.005/1.313 ms

节点到服务器

# ping 10.8.0.1 -c3

PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.

64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=14.0 ms

64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=14.0 ms

64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=15.8 ms

--- 10.8.0.1 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2018ms

rtt min/avg/max/mdev = 14.006/14.618/15.831/0.857 ms

节点到节点

# ping 10.8.0.6 -c3

PING 10.8.0.6 (10.8.0.6) 56(84) bytes of data.

64 bytes from 10.8.0.6: icmp_seq=1 ttl=128 time=34.1 ms

64 bytes from 10.8.0.6: icmp_seq=2 ttl=128 time=36.6 ms

64 bytes from 10.8.0.6: icmp_seq=3 ttl=128 time=33.0 ms

--- 10.8.0.6 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2036ms

rtt min/avg/max/mdev = 33.047/34.605/36.654/1.520 ms

网线网桥数字链路

Motorola XiR R8200 固件升级教程

首先安装附件文件，直接运行“MOTOTRBO_R023002_130005_Repeater.exe”即可

进入CPS去读中继配置

进入设备菜单，选择升级

可用的固件列表

选择固件

点击“OK”按钮，漫长的等待

注意：升级固件，不会清空你的配给配置

Link Establishment(建立IP链路)

准备工作

主站点IP地址 192.168.6.1

节点点IP地址 192.168.6.2 一次类推

我们将中继的一时隙用作IP链路连接，二时隙用作本地通话，这样能做到两个时隙互不影响。

Master(主站设置)

首先设置主站点名称与Radio ID, Site ID

设置主站IP地址，注意Master IP为空，我们使用默认的50000端口，注意是UDP协议

设置频道，色吗12, IP Site Connect 选择1时隙，如果你想让两个时隙都工作可以选择 Slot 1 and Slot 2。然后填写RX频率，Offset 是差频-5，然后点击“Copy”按钮

最后将配置写入中继

Peer(从站设置)

设置从站点名称与Radio ID, Site ID 每个ID都不能重复，需要你建站的时候规划好，依次加一即可

从站需要填写Master IP, 然后设置从站的IP地址

从站是可以使用DHCP获取IP地址

设置频道

Mototrbo 数字电台短信协议分析

IP Address 与 Radio ID 相互转换

DMR 网络

Mototrbo DMR 实际上就是 TCP/IP网络的延伸。我们可以理解为就是一个TCP/IP网络。

首先Radio ID （八位数字）就是 IP地址的后三位,色码就是IP地址的第一位。例如 12 色码对应IP地址就是 12.0.0.0

色码加上RadioID通过算法就能实现 Radio ID 与 IP 地址的相互转换,组呼可以理解为通过子网掩码控制广播域，在相同子网下的IP地址可以接收组播信息。

代码如下：

class Protocol():

def __init__(self, buffer = None):

self.buffer = buffer

def header(self):

return(self.message)

def message(self):

return(self.message)

def id2ip(self, cai, id):

return (str(cai)+"."+str((id >> 16) & 0xff) +'.'+ str((id >> 8) & 0xff) + '.' + str(id & 0xff));

def ip2id(self, ipaddr):

a, b, c, d = ipaddr.split('.');

return ((int(b) << 16) + (int(c) << 8 ) + int(d))

id2ip 是Radio ID 转 IP 地址，算法如下

(str(cai)+"."+str((id >> 16) & 0xff) +'.'+ str((id >> 8) & 0xff) + '.' + str(id & 0xff))

ip2id 是 IP 地址 转 Radio ID

a, b, c, d = ipaddr.split('.')

((int(b) << 16) + (int(c) << 8 ) + int(d))

检查 Radio 状态

判断电台是否开机

数字电台使用的多了，就不想喊CQ了，直接进入通信录，找到朋友，检查状态。如果对方在线就会出现一个绿色的"对号",同时对方也会振铃。

其实我们判断电台是否开机很简单。每个电台都是一计算机终端，色码 + Radio ID 就能算出对方的IP 地址，然后直接 ping 对方的IP地址就可以了。

工具程序地址： https://github.com/netkiller/Mototrbo/blob/master/Mototrbo.py

#直接 ping IP 地址

os.system("ping %s" % self.options.ping)

# ping radio id 需要做一次转换

os.system("ping %s" % protocol.id2ip(int(self.options.cai), int(self.options.online)))

TMS 短信协议分析

头部：0x00开始，然后是短信内容的长度，0x0e 0x00 分割，然后是序号,最后是 0x04 结尾 内容：\r回车符,0x00,换行符\n,信息内容，0x00结束,短信的字符集是 utf-16

一条完整短信最终协议包如下：

b'\x00\x14\xe0\x00\x88\x04\r\x00\n\x00B\x00G\x007\x00N\x00Y\x00T\x00'

上面短信的内容就是 BG7NYT

短信发送

class TMS(Protocol):

def __init__(self, buffer = None):

super().__init__(buffer)

self.port = 4007

if buffer :

self.header = self.buffer[:6]

self.message = self.buffer[6:]

def encode(self, msg):

return(msg.encode('utf-16').replace(b'\xff\xfe', b'\x00'))

def decode(self, msg = None):

if msg :

return( msg.replace(b'\x00', b'\xff\xfe', 1).decode('utf-16') )

else:

return( self.message.decode('utf-16') )

def sequence(self):

return(self.header[4:5])

def lenght(self):

return (len(self.message))

def sendtoip(self, ipaddr, sms):

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP

message = self.encode(sms)

length = len(message)+7

#print(hex(length))

protocol = b'\x00'+ bytes([length])+ b'\xe0\x00\x88\x04\r\x00\n' + message

#print(protocol)

sock.sendto(protocol, (ipaddr, self.port))

def sendtoid(self, cai, radioid, sms):

ipaddr = self.id2ip(cai, radioid)

self.sendtoip(ipaddr, sms)

def debug(self):

protocol = b'\x00\x14\xe0\x00\x88\x04\r\x00\n\x00B\x00G\x007\x00N\x00Y\x00T\x00'

tms = TMS(protocol)

#print(tms.id2ip(7558888))

#print(tms.ip2id('12.115.86.232'))

#print(tms.ip2id('12.115.86.12'))

#print(tms.ip2id('12.115.52.56'))

#print(tms.ip2id('192.168.11.1'))

#print(tms.id2ip(11012865))

print(tms.message)

print(tms.lenght())

print(tms.encode('BG7NYT'))

print(tms.decode(tms.encode('BG7NYT')))

tmp = TMS(b'\x00\x16\xe0\x00\x83\x04\r\x00\n\x00B\x00e\x00l\x00i\x00e\x00v\x00e\x00')

print(tmp.decode())

print('= Send')

#.replace(b'\x00', b'')

#header = protocol[:6]

#message = protocol[9:]

#print(tms.decode(message))

编码和解码

因为我们目前计算机通常使用UTF-8字符集，所以短信需要编码为 UTF-16 才能发送，否则在终端上看到的是乱码。 同理计算机收到来自电台的短信也需要解码 UTF-16才能阅读。代码如下

def encode(self, msg):

return(msg.encode('utf-16').replace(b'\xff\xfe', b'\x00'))

def decode(self, msg = None):

if msg :

return( msg.replace(b'\x00', b'\xff\xfe', 1).decode('utf-16') )

else:

return( self.message.decode('utf-16') )

短信的发送

发送短信很简单,通过色码 + Radio ID　计算出对方的IP地址。UDP协议与对方IP地址建立连接，然后发送,代码如下：

def sendtoip(self, ipaddr, sms):

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP

message = self.encode(sms)

length = len(message)+7

#print(hex(length))

protocol = b'\x00'+ bytes([length])+ b'\xe0\x00\x88\x04\r\x00\n' + message

#print(protocol)

sock.sendto(protocol, (ipaddr, self.port))

程序运行后对方的电台就会收到你的短信。

到此为止，我也曾经尝试分析 ARS，LRRP ......等等协议，很想实现ARS将GPS坐标抓出来，放到地图上，实现aprs.is那样的功能。 逆向工程太复杂，放弃了。

相关软件：https://github.com/netkiller/Mototrbo

第 2 章 通过电台建立TCP/IP链路

数字中继联网方案

第 3 章 Pi-Star Digital Voice Software

Web UI 地址 http://pi-star/

用户：pi-star

密码：raspberry

对于初次接触 MMDVM 的人，怎么选择 MMDVM 板

以下是我总结出来的，希望对你有所帮助。

MMDVM 是爱好者们 DIY 出来的，并没有产品化。所以板子也参差不齐，这也很正常。购买的时候要问问买家是否使用进口的温补晶振，RX/TX Offset 和 误码率。

还有固件版本，板子出品时间，尽量购买最近推出的板子，或者询问一下群里Ham购买口碑比较好的。

烧录img镜像文件

下载镜像文件 http://www.pistar.uk/downloads/

树莓派 3B+ 目前还没有release，可以使用 beta 版本 http://www.pistar.uk/beta/

Mac

执行 diskutil list 查看SD卡设备文件名

neo@MacBook-Pro ~/Downloads/Pi-Star_RPiB+_V3 % diskutil list

我的 SD Card 设备文件是 /dev/disk2，卸载 SD Card

diskutil unmountDisk /dev/disk2

将镜像文件写入 SD Card

sudo dd bs=4m if=Pi-Star_RPiB+_V3.4.16_10-Aug-2018.img of=/dev/disk2

释放TF卡空间

首次使用 dd 烧录 TF 启动后，pi-star 不是使用所有的 TF 空间，需要把卡上不用空间全给树莓派

sudo pistar-expand

sudo reboot

更新系统

sudo pistar-update && pistar-upgrade -y

修改权限从 ro 到 rw

rpi-rw

Yaesu FT-7800 + 中继版解决方案

准备工作

设备列表

1. Yaesu FT-7800

2. MMDVM 中继板

3. 树莓派 + 电源不低于2.1A

4. PS2

5. 网线一条

中继板插入树莓派 GPIO

PS2 电缆插FT-7800一端可以需要小小改造，否则无法插到底部

电台后面的 Data 口

PS2 数据线一端连接 Yaesu FT-7800，另一端连接 MMDVM 中继版

网线与WiFi怎么选择，你首先使用手机搜索一下Wifi 列表，如果你所在的位置 WIFI比较多，建议你使用网线连接。WIFI不稳定就是因为信道冲突导致丢包造成的。所以根据你的网络环境来选择使用WIFI还是网线。

Yaesu FT-7800 电台设置

选择一个热点频率，这里使用 435.000

按下 BAND/SET 键，进入 25号菜单 PKT.MIC

设置为 MIC.OFF 意思是在数传过程中关闭麦克风, 设置后退出

进入 26 好菜单，设置传输率

电台默认是1200，这里需要修改为 9600BPs

设置完成屏幕右下角显示 9600

现在树莓派连接网线，USB电源线，并启动树莓派。启动过程 MMDVM 板会自检，所有指示灯会依次亮起，并且会发射一次测试信号，可以看到 FT-7800 处于发射状态。

MMDVM C4FM 设置

我是用的是 Yaesu FT-2DR 这里就不介绍如何设置了。设置一个频率 435.000 DN 模式即可。

网上文章很多，这里不详解。

电台频率这个是热点板的设置，对于中继板可设，可不设。当你使用 X 键的时候必须设置，否则不用设置。

Yaesu System Fusion 配置，选择 FCS00499 - ECHO

FCS00499 回音测试，你说一句话，他会录音，然后回放给你。

MMDVM DMR 设置

首先给 DMR 电台写频，打开 CPS 软件，这里我是使用蓝牙连接。

找到数字通信录，鼠标右键，可以看到菜单

新建单呼 9990，注意：单呼。这是鹦鹉螺回音测试，发射后会录音，然后再回放。

新建组呼 46001 注意：组呼

新建一个信道 Hotspot 9990, 发射接收都是 435.000 联系人姓名选择 鹦鹉螺 9990。这是测试信道。

再新建一个正式使用的信道，435.000 联系人选择 BM China 46001

现在电台部分设置完成，写入保存，电台自动重启，切换到 Hotspot 9990 信道。

MMDVM 设置

DMR 不解码

接收不解码的问题：

从仪表盘可以看到自己可能发射，也能看到 MMDVM过来的信号，但是 DMR 只能看到信号📶闪烁，电台没有语音。

解决方法，使用螺丝刀调节 TX 电位器，直到你的电台发出声音位置。每个中继板都不同，没有一个统一的值，我的中继版，顺时针拧到底 DMR 才解码。

发射不解码：

电台按下PPT发射，COS灯不亮，可以尝试调节 RX 电位器。

调试误码率

调试误码率一定要有耐心，很可能今天你调试出 0.0% , 明天一开机又成了 9%。发射的时候，只按PPT不讲话，和讲话的结果也不同。在鹦鹉螺模式调试 0%，回到TG4601就惨目忍睹。我常常遇到这种情况，多总结，多记录，使用概率方法。

首先你要考虑你的中继版主要使用那种模式，是C4FM 还是 DMR。如果只用一种，比较号调，如果多个模式都使用，就要做出平衡。

由于 C4FM 兼容性比较好，设置也比较简单，对误码率要求也不高，10% 仍能正常通联，如果切换到 VW 模式还能改善误码率。所以我们偏重对DMR的兼容调节。

切记，调试误码率一定要注意，你的设备最好不要冷机调试，必须让他工作一段时间，稳定后在慢慢调试，温补晶振也不是万能的。让电台和MMDVM热机 10分钟以上，在此期间你可以随意使用鹦鹉螺回音发射。

进入 Yaesu FT-7800 的工程模式下微调

提示

注意：进入工程模式一定要先记录下默认值，然后再调试。

注意：恢复出厂设置并不会恢复工程模式下的设置，所以慎重操作。

准备好纸张，相机，进入 FT-7800 工程模式，每次操作建议写在纸上或者相机拍照。我第一次进入没有经验，胡乱调，现在已经不知道初始值了。

第一步：FT-7800 关机，同时按下 Mhz/PRI + BAND/SET + 5(超级频道) 在开机按钮。开机后看到 SETRST 字样。

第二步：按下互联网键（CCTV台标）不放手，依次按下电台下方的 MHz/PRI, TONE/HM/RV, LOW ACC, BAND SET, V/M MW, SCAN SEL, S.SCH ARTS 共7个按键，会发出“滴”的一声，这时便进入了工程模式。

此时屏幕上显示频率，按下互联网键会出现下面菜单，不要松手，使用频道旋钮调参数。

这里可以调节从 MMDVM 过来的误码率。即 MMDVM 发射误码率。小心调试可以调试出 0.0%。

按下 互联网键 不放在按下 BAND键 可以切换到其他菜单。

这里可调电台的发射无码率，但是我没有成功的调整到 0.0%。

剩余的工程菜单有调电压的，亚音频，数字亚音...等等，保持不变。这里我们只调试 REF 和 TUN 即可。

以上结果只是总结出来的，没有关于FT-7800工程模式的文档，不一定科学，大家一起讨论。顺便如果你有 FT-7800的工程模式的默认初始值，请给我一份。

下面是 modom 配置，我没有修改，保持 pi-star 默认配置即可。另外RXOffset，TXOffset的设置对于中继板是无效的。

Yaesu FT-7800 在 VHF 模式下不支持 9600BPs 数据包通信。

我最初非常想使用VHF玩 MMDVM，拿到板子后，设置好 VHF 频率，就开始调试，折腾到凌晨2点没有成功，只能接收，无法发射（发射 COS灯不亮）。一度怀疑MMDVM板子有问题。最后偶然切换到 UHF 一切正常。

经过测试 FT-7800 不能在 VHF 上使用 9600 发射，但是可以接收。

有 FT-8800，FT-8900 的同学帮忙测试一下，在 VHF 上是否可以工作，如果可以请告诉我一声。

有 FT-991A 的同学也可以测试一下是否能在 50Mhz, 29Mhz 上玩 MMDVM。

给电台加锁

有一次我开了电台和MMDVM，就出去散步了，不一会就上不去了。回家一看频道变了，可能是小孩或家人不小心碰到。

进入 21 号菜单，LOCK

选择 LK K+D，表示锁住键盘和频道旋钮。

按下 PPT 退出，然后把手麦从电台上拔下来。

设置完毕

第 4 章 MMDVM (Multi-Mode Digital Voice Modem)

MMDVM != Pi-Star

说起MMDVM大家就会想到Pi-Star，但是 MMDVM 不等于 Pi-Star。MMDVM是一套独立系统，Pi-Star 是一套封装好的MMDVM套件(包含了 MMDVMHost , Dashboard 等软件)。

首先你需要

事实上，我们可以单独部署 MMDVMHost，目前已知 MMDVMHost 可以运行在 Linux，Mac OS，Windows系统上。

创建 MMDVM 用户

创建 mmdvm 用户，添加 mmdvm 用户到 dialout 组

useradd mmdvm -s /sbin/nologin

usermod mmdvm -G dialout

因为 /dev/ttyAMA0 和 /dev/ttyUSB0 设备文件，需要设置成 dialout 组的用户才能访问。

pi-star@netkiller(ro):~$ ls -l /dev/ttyAMA0

crw-rw---- 1 root dialout 204, 64 Nov 16 22:17 /dev/ttyAMA0

neo@netkiller ~ % ll /dev/ttyUSB0

crw-rw---- 1 root dialout 188, 0 Nov 16 21:40 /dev/ttyUSB0

如果你想使用费 dialout 用户访问，可以这样设置

neo@netkiller ~ % sudo chmod o+rw /dev/ttyUSB0

neo@netkiller ~ % ll /dev/ttyUSB0

crw-rw-rw- 1 root dialout 188, 0 Nov 16 21:40 /dev/ttyUSB0

YSFClients

因为 MMDVMHost 需要连接到 YSFGateway 才能工作。所以我们先安装 YSFGateway。

git clone https://github.com/g4klx/YSFClients.git

YSFGateway

编译安装 YSFGateway

cd YSFClients/YSFGateway

make

sudo cp YSFGateway /srv/mmdvm/bin

sudo cp YSFGateway.ini /srv/mmdvm/etc

sudo cp FCSRooms.txt  YSFHosts.txt /srv/mmdvm/etc

sudo cp YSFHostsupdate.sh /srv/mmdvm/bin

sudo chmod +x /srv/mmdvm/bin/YSFHostsupdate.sh

查找中国反射器

neo@netkiller /tmp % cat /srv/mmdvm/etc/YSFHosts.txt | grep China

80337;CN China #1;W24166/TG46001;120.234.41.144;42000;044;http://ysf.sz790.com:8081/

82442;CN China #2;W24269/TG46072;116.6.107.115;42006;000;http://ufozhuzi.tpddns.cn:8081/

86319;CN China #3;C4FM;123.58.6.137;42000;002;http://123.58.6.137:8088/

08408;CN CN-China-4;P25;47.105.33.47;42003;001;http://www.bg3hbr.cn/xiuno

YSFHosts.txt 需要定时更新，使用 YSFHostsupdate.sh 脚本，需要简单配置一下

sudo vim /srv/mmdvm/bin/YSFHostsupdate.sh

# Full path to YSFHosts

YSFHOSTS=/path/to/YSFHosts.txt

改为

YSFHOSTS=/srv/mmdvm/etc/YSFHosts.txt

也可以在 crontab 中更新

# sudo crontab -e

*/5 * * * * wget -O /srv/mmdvm/etc/YSFHosts.txt http://register.ysfreflector.de/export_csv.php

配置 YSFGateway

[General]

Callsign=BG7NYT # 呼号

# Suffix=RPT # 前缀 YSF 设置为 ND

Suffix=ND

Id=1234567 # DMR ID

RptAddress=127.0.0.1

RptPort=3200

LocalAddress=127.0.0.1

LocalPort=4200

Daemon=0 # 0 前台运行， 1 后台运行

[Info]

RXFrequency=430475000 # 热点板接收频率，中继板不用配置

TXFrequency=439475000 # 热点板发射频率，如果是单工与上面配置相同即可

Power=1 # 发射功率

Latitude=0.0 # GPS 经度

Longitude=0.0 # GPS 纬度

Height=0 # GPS 海拔高度

Name=Shenzhen # 城市

Description=China # 国家

[Log]

# Logging levels, 0=No logging

DisplayLevel=1

FileLevel=1

FilePath=. # 配置日志写入位置。

FileRoot=YSFGateway

[aprs.fi]

Enable=1 # 启用APRS

# Server=noam.aprs2.net

Server=asia.aprs2.net # 服务器设置为亚洲

Port=14580

Password=9999

Description=APRS Description

Suffix=Y

[Network]

Startup=CN China #1 # 默认连接到 CN China #1 , 可以在 /srv/mmdvm/etc/YSFGateway.ini 寻找你想连接的反射器

# Startup=FCS00120

# Startup=Alabama-Link

InactivityTimeout=10

Revert=0

Debug=0

[YSF Network]

Enable=1

Port=42000

Hosts=/srv/mmdvm/etc/YSFHosts.txt

ReloadTime=60

ParrotAddress=127.0.0.1

ParrotPort=42012

YSF2DMRAddress=127.0.0.1

YSF2DMRPort=42013

YSF2NXDNAddress=127.0.0.1

YSF2NXDNPort=42014

YSF2P25Address=127.0.0.1

YSF2P25Port=42015

[FCS Network]

Enable=1

Rooms=/srv/mmdvm/etc/FCSRooms.txt

Port=42001

[Mobile GPS]

Enable=0

Address=127.0.0.1

Port=7834

启动 YSFGateway

neo@netkiller /tmp % /srv/mmdvm/bin/YSFGateway /srv/mmdvm/etc/YSFGateway.ini

M: 2018-11-16 14:40:53.953 Opening YSF network connection

I: 2018-11-16 14:40:53.953 Opening UDP port on 4200

M: 2018-11-16 14:40:53.953 Opening YSF network connection

I: 2018-11-16 14:40:53.953 Opening UDP port on 42000

M: 2018-11-16 14:40:53.953 Resolving FCS00x addresses

M: 2018-11-16 14:40:58.969 Opening FCS network connection

I: 2018-11-16 14:40:58.969 Opening UDP port on 42001

I: 2018-11-16 14:40:58.969 The ID of this repeater is 88575

I: 2018-11-16 14:40:58.970 Loaded 229 FCS room descriptions

I: 2018-11-16 14:40:58.971 Loaded 285 YSF reflectors

I: 2018-11-16 14:40:58.971 Loaded YSF parrot

I: 2018-11-16 14:40:58.971 Loaded YSF2DMR

I: 2018-11-16 14:40:58.971 Loaded YSF2NXDN

I: 2018-11-16 14:40:58.971 Loaded YSF2P25

M: 2018-11-16 14:40:58.974 Automatic (re-)connection to 80337 - "CN China #1     "

M: 2018-11-16 14:40:58.974 Starting YSFGateway-20180509

M: 2018-11-16 14:40:58.974 Starting the APRS Writer thread

M: 2018-11-16 14:40:58.974 Link successful to MMDVM

M: 2018-11-16 14:40:59.000 Linked to CN China #1

M: 2018-11-16 14:41:00.001 Received login banner : # javAPRSSrvr 3.15b08

M: 2018-11-16 14:41:00.593 Response from APRS server: # logresp BG7NYT-N unverified, server T2SAPPORO

M: 2018-11-16 14:41:00.594 Connected to the APRS server

YSFParrot

cd YSFClients/YSFParrot

make

sudo cp YSFParrot /srv/mmdvm/bin

YSFReflector

cd ../YSFReflector

make

sudo cp YSFReflector /srv/mmdvm/bin

sudo cp YSFReflector.ini /srv/mmdvm/etc

sudo cp YSFReflector.sh /srv/mmdvm/bin

sudo chmod +x /srv/mmdvm/bin/YSFReflector.sh

DMRGateway

cd /usr/local/src

git clone https://github.com/g4klx/DMRGateway.git

cd DMRGateway

make

sudo cp DMRGateway /srv/mmdvm/bin

sudo cp DMRGateway.ini /srv/mmdvm/etc

sudo cp XLXHostsupdate.sh /srv/mmdvm/bin

sudo chmod +x /srv/mmdvm/bin/XLXHostsupdate.sh

MMDVMHost

编译安装 MMDVMHost

neo@netkiller ~ % cd /usr/local/src

neo@netkiller /usr/local/src %

neo@netkiller /usr/local/src % git clone https://github.com/g4klx/MMDVMHost.git

neo@netkiller /usr/local/src % git clone https://github.com/g4klx/MMDVMCal.git

neo@netkiller /usr/local/src % cd MMDVMHost

neo@netkiller /usr/local/src/MMDVMHost % make

启动 MMDVMHost

neo@netkiller ~ % MMDVMHost /srv/mmdvm/etc/MMDVM.ini

启动前确认 YSFGateway 已经启动, YSFGateway 日志中已经输出 M: 2018-11-16 14:40:58.974 Link successful to MMDVM 表示启动成功，然后再启动MMDVMHost。

neo@netkiller /tmp % sudo /srv/mmdvm/bin/MMDVMHost /srv/mmdvm/etc/MMDVM.ini

I: 2018-11-16 14:49:34.729 This software is for use on amateur radio networks only,

I: 2018-11-16 14:49:34.729 it is to be used for educational purposes only. Its use on

I: 2018-11-16 14:49:34.729 commercial networks is strictly prohibited.

I: 2018-11-16 14:49:34.729 Copyright(C) 2015-2018 by Jonathan Naylor, G4KLX and others

M: 2018-11-16 14:49:34.729 MMDVMHost-20180916 is starting

M: 2018-11-16 14:49:34.729 Built 16:54:14 Nov 14 2018 (GitID #54fbacb)

I: 2018-11-16 14:49:34.729 General Parameters

I: 2018-11-16 14:49:34.729     Callsign: BG7NYT

I: 2018-11-16 14:49:34.729     Id: 123456

I: 2018-11-16 14:49:34.729     Duplex: no

I: 2018-11-16 14:49:34.729     Timeout: 180s

I: 2018-11-16 14:49:34.729     D-Star: disabled

I: 2018-11-16 14:49:34.729     DMR: disabled

I: 2018-11-16 14:49:34.729     YSF: enabled

I: 2018-11-16 14:49:34.729     P25: disabled

I: 2018-11-16 14:49:34.729     NXDN: disabled

I: 2018-11-16 14:49:34.730     POCSAG: disabled

I: 2018-11-16 14:49:34.730 Modem Parameters

I: 2018-11-16 14:49:34.730     Port: /dev/ttyUSB0

I: 2018-11-16 14:49:34.730     Protocol: uart

I: 2018-11-16 14:49:34.730     RX Invert: no

I: 2018-11-16 14:49:34.730     TX Invert: yes

I: 2018-11-16 14:49:34.730     PTT Invert: no

I: 2018-11-16 14:49:34.730     TX Delay: 100ms

I: 2018-11-16 14:49:34.730     RX Offset: 0Hz

I: 2018-11-16 14:49:34.730     TX Offset: 0Hz

I: 2018-11-16 14:49:34.730     RX DC Offset: 0

I: 2018-11-16 14:49:34.730     TX DC Offset: 0

I: 2018-11-16 14:49:34.730     RF Level: 100.0%

I: 2018-11-16 14:49:34.730     DMR Delay: 0 (0.0ms)

I: 2018-11-16 14:49:34.730     RX Level: 50.0%

I: 2018-11-16 14:49:34.730     CW Id TX Level: 50.0%

I: 2018-11-16 14:49:34.730     D-Star TX Level: 50.0%

I: 2018-11-16 14:49:34.730     DMR TX Level: 50.0%

I: 2018-11-16 14:49:34.730     YSF TX Level: 50.0%

I: 2018-11-16 14:49:34.730     P25 TX Level: 50.0%

I: 2018-11-16 14:49:34.730     NXDN TX Level: 50.0%

I: 2018-11-16 14:49:34.730     POCSAG TX Level: 50.0%

I: 2018-11-16 14:49:34.730     RX Frequency: 435000000Hz (435000000Hz)

I: 2018-11-16 14:49:34.730     TX Frequency: 435000000Hz (435000000Hz)

M: 2018-11-16 14:49:34.730 Opening the MMDVM

I: 2018-11-16 14:49:36.750 MMDVM protocol version: 1, description: MMDVM 20180723 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG) 12.2880 MHz (Build: 12:21:05 Aug 27 2018)

I: 2018-11-16 14:49:36.770 Display Parameters

I: 2018-11-16 14:49:36.770     Type: None

W: 2018-11-16 14:49:36.770 No valid display found, disabling

I: 2018-11-16 14:49:36.771 System Fusion Network Parameters

I: 2018-11-16 14:49:36.771     Local Address: 127.0.0.1

I: 2018-11-16 14:49:36.771     Local Port: 3200

I: 2018-11-16 14:49:36.771     Gateway Address: 127.0.0.1

I: 2018-11-16 14:49:36.771     Gateway Port: 4200

I: 2018-11-16 14:49:36.771     Mode Hang: 3s

M: 2018-11-16 14:49:36.771 Opening YSF network connection

I: 2018-11-16 14:49:36.771 RSSI

I: 2018-11-16 14:49:36.771     Mapping File: /srv/mmdvm/etc/RSSI.dat

I: 2018-11-16 14:49:36.771 Loaded 0 RSSI data mapping points from /srv/mmdvm/etc/RSSI.dat

I: 2018-11-16 14:49:36.771 YSF RF Parameters

I: 2018-11-16 14:49:36.771     Low Deviation: no

I: 2018-11-16 14:49:36.771     Remote Gateway: no

I: 2018-11-16 14:49:36.771     TX Hang: 4s

I: 2018-11-16 14:49:36.772     Self Only: no

I: 2018-11-16 14:49:36.772     DSQ: no

I: 2018-11-16 14:49:36.772     Mode Hang: 10s

M: 2018-11-16 14:49:36.772 MMDVMHost-20180916 is running

M: 2018-11-16 14:49:36.860 YSF, received network data from BH3APK     to ALL        at BM4601

systemd

neo@netkiller ~ % sudo vim /lib/systemd/system/mmdvmhost.service

[Unit]

Description=MMDVM Host Service

After=syslog.target network.target

[Service]

User=root

WorkingDirectory=/srv/mmdvm/bin/MMDVMHost

ExecStart=/usr/bin/screen -S MMDVMHost -D -m /srv/mmdvm/bin/MMDVMHost /srv/mmdvm/etc/MMDVM.ini

ExecStop=/usr/bin/screen -S MMDVMHost -X quit

[Install]

WantedBy=multi-user.target

定时器单元配置

neo@netkiller ~ % sudo vim /lib/systemd/system/mmdvmhost.timer

[Timer]

OnStartupSec=60

[Install]

WantedBy=multi-user.target

mmdvmhost.timer 主要的功能是延迟启动，因为MMDVM主板也需要初始化时间

neo@netkiller ~ % sudo systemctl daemon-reload

neo@netkiller ~ % sudo systemctl enable mmdvmhost.timer

neo@netkiller ~ % sudo systemctl enable mmdvmhost

启动和停止

neo@netkiller ~ % systemctl enable mmdvmhost

neo@netkiller ~ % systemctl start mmdvmhost

neo@netkiller ~ % systemctl stop mmdvmhost

neo@netkiller ~ % systemctl restart mmdvmhost

neo@netkiller ~ % systemctl status mmdvmhost

禁用 mmdvmhost 下一次开机时将不会自动启动

neo@netkiller ~ % systemctl disable mmdvmhost

配置 MMDVMHost

通用配置 General

[General]

Callsign=BG7NYT # 你的呼号

Id=123456       # DMR ID

Timeout=180 # 超时设置

Duplex=0 # 0 表示单工，1 表示双工

# ModeHang=10

RFModeHang=10

NetModeHang=3

Display=None # 屏幕 OLED 设置

Daemon=0 # 0 前台运行，1 守护进程（后台运行）

Info 个人信息配置

[Info]

RXFrequency=435000000 # 热点接收频率

TXFrequency=435000000   # 热点发射频率，如果是单工模式与上面设置相同

Power=1 # 发射功率

Latitude=0.0 # GPS 经度

Longitude=0.0 # GPS 纬度

Height=0 # GPS 海拔高度

Location=Shenzhen # 位置

Description=Chain # 通常设置为国家

URL=http://www.netkille.cn # 呼号连接，默认连接到 QRZ.COM

Log 日志配置

[Log]

# Logging levels, 0=No logging

DisplayLevel=1

FileLevel=1

FilePath=. # 日志目录，默认是当前目录

FileRoot=MMDVM

CW Id 这是 DMR 配置

[CW Id]

Enable=0 # 设置为 0 禁用

Time=10

# Callsign=

DMR 呼号映射表

[DMR Id Lookup]

File=/srv/mmdvm/etc/DMRIds.dat

Time=24

NXDN 呼号映射表

[NXDN Id Lookup]

File=/srv/mmdvm/etc/NXDN.csv

Time=24

调制解调器配置

[Modem]

# Port=/dev/ttyACM0

# Port=/dev/ttyAMA0

# Port=\\.\COM3

Port=/dev/ttyUSB0 # 端口配置如果是 GPIO /dev/ttyACM0， 如果是 USB /dev/ttyUSB0

Protocol=uart

# Address=0x22

TXInvert=1 # YSF 设置为 1， DMR 设置为 0

RXInvert=0 # 默认是 0

PTTInvert=0

TXDelay=100

RXOffset=0

TXOffset=0

DMRDelay=0

RXLevel=50

TXLevel=50

RXDCOffset=0

TXDCOffset=0

RFLevel=100

# CWIdTXLevel=50

# D-StarTXLevel=50

# DMRTXLevel=50

# YSFTXLevel=50

# P25TXLevel=50

# NXDNTXLevel=50

# POCSAGTXLevel=50

RSSIMappingFile=RSSI.dat

Trace=0

Debug=0

等我搞明白的

[Transparent Data]

Enable=0

RemoteAddress=127.0.0.1

RemotePort=40094

LocalPort=40095

# SendFrameType=0

不懂

[UMP]

Enable=0

# Port=\\.\COM4

Port=/dev/ttyACM1

D-Star 配置

[D-Star]

Enable=0  # 0 禁用， 1 启用

Module=C

SelfOnly=0

AckReply=1

AckTime=750

AckMessage=0

ErrorReply=1

RemoteGateway=0

# ModeHang=10

DMR 配置

[DMR]

Enable=0 # 0 禁用， 1 启用

Beacons=0 # 信标 0 禁用， 1 启用

BeaconInterval=60 # 延迟

BeaconDuration=3 # 持续时间

ColorCode=1 # 色码

SelfOnly=0 # 自己用，还是开放使用

EmbeddedLCOnly=1

DumpTAData=1

CallHang=3

TXHang=4

ModeHang=20

YSF C4FM

[System Fusion]

Enable=1 # 0 禁用， 1 启用

LowDeviation=0

SelfOnly=0

TXHang=4

#DGID=1

RemoteGateway=0

# ModeHang=10

P25 和 NXDN 比较少用，这里不讲

[P25]

Enable=0

NAC=293

SelfOnly=0

OverrideUIDCheck=0

RemoteGateway=0

# ModeHang=10

[NXDN]

Enable=0

RAN=1

SelfOnly=0

RemoteGateway=0

# ModeHang=10

[POCSAG]

Enable=0

Frequency=439987500

网络配置，需要就开启，不需要旧关闭。

[D-Star Network]

Enable=1 # 0 禁用， 1 启用

GatewayAddress=127.0.0.1

GatewayPort=20010

LocalPort=20011

# ModeHang=3

Debug=0

[DMR Network]

Enable=1

Address=44.131.4.1

Port=62031

Jitter=360

# Local=62032

Password=PASSWORD

# Options=

Slot1=1

Slot2=1

# ModeHang=3

Debug=0

[System Fusion Network]

Enable=1

LocalAddress=127.0.0.1

LocalPort=3200

GatewayAddress=127.0.0.1

GatewayPort=4200

# ModeHang=3

Debug=0

[P25 Network]

Enable=1

GatewayAddress=127.0.0.1

GatewayPort=42020

LocalPort=32010

# ModeHang=3

Debug=0

[NXDN Network]

Enable=1

LocalAddress=127.0.0.1

LocalPort=14021

GatewayAddress=127.0.0.1

GatewayPort=14020

# ModeHang=3

Debug=0

[POCSAG Network]

Enable=1

LocalAddress=127.0.0.1

LocalPort=3800

GatewayAddress=127.0.0.1

GatewayPort=4800

# ModeHang=3

Debug=0

跟屏幕有关的配置

[TFT Serial]

# Port=modem

Port=/dev/ttyAMA0

Brightness=50

[HD44780]

Rows=2

Columns=16

# For basic HD44780 displays (4-bit connection)

# rs, strb, d0, d1, d2, d3

Pins=11,10,0,1,2,3

# Device address for I2C

I2CAddress=0x20

# PWM backlight

PWM=0

PWMPin=21

PWMBright=100

PWMDim=16

DisplayClock=1

UTC=0

[Nextion]

# Port=modem

Port=/dev/ttyAMA0

Brightness=50

DisplayClock=1

UTC=0

#Screen Layout: 0=G4KLX 2=ON7LDS

ScreenLayout=2

IdleBrightness=20

[OLED]

Type=3

Brightness=0

Invert=0

Scroll=1

Rotate=0

Cast=0

[LCDproc]

Address=localhost

Port=13666

#LocalPort=13667

DimOnIdle=0

DisplayClock=1

UTC=0

[Lock File]

Enable=0

File=/tmp/MMDVM_Active.lck

GPS 配置

[Mobile GPS]

Enable=0

Address=127.0.0.1

Port=7834

通过 USB 接入 MMDVM

TTL 下载线定义

红-VCC

黑-GND

白-TXD

绿-RXD

PL2303   树莓派

--------------------

VCC     +5V

GND     Ground

TX      RXD(GPIO14)

RX      TXD(GPIO15)

将TTL USB线插入USB口，查看 USB 设备

neo@netkiller ~ % lsusb

Bus 001 Device 002: ID 0bda:0158 Realtek Semiconductor Corp. USB 2.0 multicard reader

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Bus 003 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port

Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

neo@netkiller ~ % lsmod | egrep "usbserial|pl2303"

pl2303                 20480  0

usbserial              45056  1 pl2303

查找设备

neo@netkiller ~ % dmesg | tail | grep pl2303

[17760.924754] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0

[17760.924803] pl2303 3-1:1.0: device disconnected

[17785.068831] pl2303 3-1:1.0: pl2303 converter detected

[17785.080428] usb 3-1: pl2303 converter now attached to ttyUSB0

修改 MMDVM.ini 配置文件 Port 改为 ttyUSB0 即可，然后重启 MMDVMHost 程序。

[Modem]

# Port=/dev/ttyACM0

# Port=/dev/ttyAMA0

# Port=\\.\COM3

Port=/dev/ttyUSB0

为了观察启动日志输出，关闭 Daemon=0

neo@netkiller /tmp % sudo /srv/mmdvm/bin/MMDVMHost /srv/mmdvm/etc/MMDVM.ini

I: 2018-11-16 14:21:09.281 This software is for use on amateur radio networks only,

I: 2018-11-16 14:21:09.281 it is to be used for educational purposes only. Its use on

I: 2018-11-16 14:21:09.281 commercial networks is strictly prohibited.

I: 2018-11-16 14:21:09.281 Copyright(C) 2015-2018 by Jonathan Naylor, G4KLX and others

M: 2018-11-16 14:21:09.281 MMDVMHost-20180916 is starting

M: 2018-11-16 14:21:09.281 Built 16:54:14 Nov 14 2018 (GitID #54fbacb)

I: 2018-11-16 14:21:09.282 General Parameters

I: 2018-11-16 14:21:09.282     Callsign: BG7NYT

I: 2018-11-16 14:21:09.282     Id: 123456

I: 2018-11-16 14:21:09.282     Duplex: no

I: 2018-11-16 14:21:09.282     Timeout: 180s

I: 2018-11-16 14:21:09.282     D-Star: disabled

I: 2018-11-16 14:21:09.282     DMR: disabled

I: 2018-11-16 14:21:09.282     YSF: enabled

I: 2018-11-16 14:21:09.282     P25: disabled

I: 2018-11-16 14:21:09.282     NXDN: disabled

I: 2018-11-16 14:21:09.282     POCSAG: disabled

I: 2018-11-16 14:21:09.282 Modem Parameters

I: 2018-11-16 14:21:09.282     Port: /dev/ttyUSB0

I: 2018-11-16 14:21:09.282     Protocol: uart

I: 2018-11-16 14:21:09.282     RX Invert: no

I: 2018-11-16 14:21:09.282     TX Invert: yes

I: 2018-11-16 14:21:09.282     PTT Invert: no

I: 2018-11-16 14:21:09.282     TX Delay: 100ms

I: 2018-11-16 14:21:09.282     RX Offset: 0Hz

I: 2018-11-16 14:21:09.282     TX Offset: 0Hz

I: 2018-11-16 14:21:09.282     RX DC Offset: 0

I: 2018-11-16 14:21:09.282     TX DC Offset: 0

I: 2018-11-16 14:21:09.282     RF Level: 100.0%

I: 2018-11-16 14:21:09.283     DMR Delay: 0 (0.0ms)

I: 2018-11-16 14:21:09.283     RX Level: 50.0%

I: 2018-11-16 14:21:09.283     CW Id TX Level: 50.0%

I: 2018-11-16 14:21:09.283     D-Star TX Level: 50.0%

I: 2018-11-16 14:21:09.283     DMR TX Level: 50.0%

I: 2018-11-16 14:21:09.283     YSF TX Level: 50.0%

I: 2018-11-16 14:21:09.283     P25 TX Level: 50.0%

I: 2018-11-16 14:21:09.283     NXDN TX Level: 50.0%

I: 2018-11-16 14:21:09.283     POCSAG TX Level: 50.0%

I: 2018-11-16 14:21:09.283     RX Frequency: 435000000Hz (435000000Hz)

I: 2018-11-16 14:21:09.283     TX Frequency: 435000000Hz (435000000Hz)

M: 2018-11-16 14:21:09.283 Opening the MMDVM

I: 2018-11-16 14:21:11.302 MMDVM protocol version: 1, description: MMDVM 20180723 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG) 12.2880 MHz (Build: 12:21:05 Aug 27 2018)

/dev/ttyUSB0 启动成功，并找到设备 MMDVM protocol version: 1, description: MMDVM 20180723 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG) 12.2880 MHz (Build: 12:21:05 Aug 27 2018)

MMDVMCal

MMDVMCal 是用来调试 DMR 的工具

cd /usr/local/src

git clone https://github.com/g4klx/MMDVMCal.git

cd MMDVMCal

make

sudo cp MMDVMCal /srv/mmdvm/bin

# sudo /srv/mmdvm/bin/MMDVMCal /dev/ttyACM0

neo@netkiller /usr/local/src/MMDVMCal % ./MMDVMCal /dev/ttyUSB0

Version: 1, description: MMDVM 20180723 (D-Star/DMR/System Fusion/P25/NXDN/POCSAG) 12.2880 MHz (Build: 12:21:05 Aug 27 2018)

The commands are:

H/h      Display help

Q/q      Quit

W/w      Enable/disable modem debug messages

I        Toggle transmit inversion

i        Toggle receive inversion

O        Increase TX DC offset level

o        Decrease TX DC offset level

C        Increase RX DC offset level

c        Decrease RX DC offset level

P/p      Toggle PTT inversion

R        Increase receive level

r        Decrease receive level

T        Increase transmit level

t        Decrease transmit level

d        D-Star Mode

D        DMR Deviation Mode (Adjust for 2.75Khz Deviation)

L/l      DMR Low Frequency Mode (80 Hz square wave)

A        DMR Duplex 1031 Hz Test Pattern (TS2 CC1 ID1 TG9)

M/m      DMR Simplex 1031 Hz Test Pattern (CC1 ID1 TG9)

a        P25 1011 Hz Test Pattern (NAC293 ID1 TG1)

N        NXDN 1031 Hz Test Pattern (RAN1 ID1 TG1)

K/k      BER Test Mode (FEC) for D-Star

b        BER Test Mode (FEC) for DMR Simplex (CC1)

B        BER Test Mode (1031 Hz Test Pattern) for DMR Simplex (CC1 ID1 TG9)

J        BER Test Mode (FEC) for YSF

j        BER Test Mode (FEC) for P25

n        BER Test Mode (FEC) for NXDN

S/s      RSSI Mode

V/v      Display version of MMDVMCal

<space>  Toggle transmit

Levels: inverted: no, max: 436, min: -325, diff: 761, centre: 55

设置好后按空格键 MMDVM 板开始发射，使用 SDR 软件观察，反复调试。

Pi-Star Digital Voice Dashboard

Pi-Star_DV_Dash 是 pi-star 的 Dashboard，就是我们通过IP地址进入的界面。

项目地址是： https://github.com/AndyTaylorTweet/Pi-Star_DV_Dash

git clone https://github.com/AndyTaylorTweet/Pi-Star_DV_Dash.git

MMDVM firmware

sudo apt install -y gcc-arm-none-eabi

neo@netkiller /usr/local/src/MMDVM % arm-none-eabi-gcc -v

Using built-in specs.

COLLECT_GCC=arm-none-eabi-gcc

COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-none-eabi/6.3.1/lto-wrapper

Target: arm-none-eabi

Configured with: ../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/lib/include' --mandir='/usr/lib/share/man' --infodir='/usr/lib/share/info' --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libdir='/usr/lib/lib/x86_64-linux-gnu' --libexecdir='/usr/lib/lib/x86_64-linux-gnu' --disable-maintainer-mode --disable-dependency-tracking --mandir=/usr/share/man --enable-languages=c,c++,lto --enable-multilib --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --build=x86_64-linux-gnu --target=arm-none-eabi --with-system-zlib --with-gnu-as --with-gnu-ld --with-pkgversion=15:6.3.1+svn253039-1build1 --without-included-gettext --prefix=/usr/lib --infodir=/usr/share/doc/gcc-arm-none-eabi/info --htmldir=/usr/share/doc/gcc-arm-none-eabi/html --pdfdir=/usr/share/doc/gcc-arm-none-eabi/pdf --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --disable-libstdc++-v3 --host=x86_64-linux-gnu --with-headers=no --without-newlib --with-multilib-list=rmprofile CFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-arm-none-eabi-iopiMw/gcc-arm-none-eabi-6.3.1+svn253039=. -fstack-protector-strong' CPPFLAGS='-Wdate-time -D_FORTIFY_SOURCE=2' CXXFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-arm-none-eabi-iopiMw/gcc-arm-none-eabi-6.3.1+svn253039=. -fstack-protector-strong' FCFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-arm-none-eabi-iopiMw/gcc-arm-none-eabi-6.3.1+svn253039=. -fstack-protector-strong' FFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-arm-none-eabi-iopiMw/gcc-arm-none-eabi-6.3.1+svn253039=. -fstack-protector-strong' GCJFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-arm-none-eabi-iopiMw/gcc-arm-none-eabi-6.3.1+svn253039=. -fstack-protector-strong' LDFLAGS='-Wl,-Bsymbolic-functions -Wl,-z,relro' OBJCFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-arm-none-eabi-iopiMw/gcc-arm-none-eabi-6.3.1+svn253039=. -fstack-protector-strong' OBJCXXFLAGS='-g -O2 -fdebug-prefix-map=/build/gcc-arm-none-eabi-iopiMw/gcc-arm-none-eabi-6.3.1+svn253039=. -fstack-protector-strong' INHIBIT_LIBC_CFLAGS=-DUSE_TM_CLONE_REGISTRY=0 AR_FOR_TARGET=arm-none-eabi-ar AS_FOR_TARGET=arm-none-eabi-as LD_FOR_TARGET=arm-none-eabi-ld NM_FOR_TARGET=arm-none-eabi-nm OBJDUMP_FOR_TARGET=arm-none-eabi-objdump RANLIB_FOR_TARGET=arm-none-eabi-ranlib READELF_FOR_TARGET=arm-none-eabi-readelf STRIP_FOR_TARGET=arm-none-eabi-strip

Thread model: single

gcc version 6.3.1 20170620 (15:6.3.1+svn253039-1build1)

cd /usr/local/src

git clone https://github.com/g4klx/MMDVM.git

cd MMDVM

./mmdvmmenu.sh

FAQ

What is the difference between FCS and YSF?

https://forum.sharkrf.com/viewtopic.php?t=1750

Trying to find non existent YSF reflector with a name of CN China 1

连接 CN China 1 失败，日志如下：

neo@netkiller /tmp % /srv/mmdvm/bin/YSFGateway /srv/mmdvm/etc/YSFGateway.ini

M: 2018-11-16 14:19:55.563 Opening YSF network connection

I: 2018-11-16 14:19:55.564 Opening UDP port on 4200

M: 2018-11-16 14:19:55.564 Opening YSF network connection

I: 2018-11-16 14:19:55.564 Opening UDP port on 42000

M: 2018-11-16 14:19:55.564 Resolving FCS00x addresses

M: 2018-11-16 14:20:00.582 Opening FCS network connection

I: 2018-11-16 14:20:00.582 Opening UDP port on 42001

I: 2018-11-16 14:20:00.582 The ID of this repeater is 88575

I: 2018-11-16 14:20:00.583 Loaded 229 FCS room descriptions

I: 2018-11-16 14:20:00.584 Loaded 285 YSF reflectors

I: 2018-11-16 14:20:00.584 Loaded YSF parrot

I: 2018-11-16 14:20:00.584 Loaded YSF2DMR

I: 2018-11-16 14:20:00.584 Loaded YSF2NXDN

I: 2018-11-16 14:20:00.584 Loaded YSF2P25

M: 2018-11-16 14:20:00.587 Trying to find non existent YSF reflector with a name of CN China 1

M: 2018-11-16 14:20:00.587 Starting YSFGateway-20180509

M: 2018-11-16 14:20:00.587 Starting the APRS Writer thread

M: 2018-11-16 14:20:01.246 Received login banner : # aprsc 2.1.4-g408ed49

M: 2018-11-16 14:20:01.733 Response from APRS server: # logresp BG7NYT-N unverified, server T2JKTP

M: 2018-11-16 14:20:01.733 Connected to the APRS server

M: 2018-11-16 14:21:16.342 Link successful to MMDVM

在 YSFHosts.txt 查找中国反射器

neo@netkiller /tmp % cat /srv/mmdvm/etc/YSFHosts.txt | grep China

80337;CN China #1;W24166/TG46001;120.234.41.144;42000;044;http://ysf.sz790.com:8081/

82442;CN China #2;W24269/TG46072;116.6.107.115;42006;000;http://ufozhuzi.tpddns.cn:8081/

86319;CN China #3;C4FM;123.58.6.137;42000;002;http://123.58.6.137:8088/

08408;CN CN-China-4;P25;47.105.33.47;42003;001;http://www.bg3hbr.cn/xiuno

发现名字已经改为 CN China #1，使用这个名字重连即可。