这个是本人的课程小设计,题目要求设计一个基于openwrt的智能网关,实现串口、蓝牙、web的互相转发。
也许会有bug,欢迎拍砖!
特点
- 支持三网转发:蓝牙、串口、ip端口相互发送
- 使用select模型进行多路复用
- 基于TCP协议,不需要考虑发包顺序
- 使用autoconf配置,可移植到openwrt
- 对某些高大上的“物联网”项目有一定的参考意义
串口库libserialport(已经集成为共享库)
蓝牙库bluez
默认打开/dev/ttyUSB0作为串口设备。根据实际情况修改main.c中的串口设备名 注意修改bluetooth.c中的蓝牙MAC设备地址
编译(for linux desktop)
这个不是移植到op系统的,是供桌面环境测试用的
sh autogen.sh
# 若不想编译模块其中之一,不写它就ok
./configure --enable-serial=yes --enable-bluetooth=yes
make
主程序(负责包转发)
# 监听4000端口
sudo src/main 4000
运行phone_recv即可收到数据
# 监听4567端口
src/phone_recv 127.0.0.1 4567
使用类似HTerm的串口软件测试:
# 从串口发送数据给ip
# 数据包格式
127.0.0.1:4567:hello\r\n
运行phone_send即可发送数据给串口
src/phone_send 127.0.0.1 4000
# 从局域网ip发送给串口
/dev/ttyUSB0:hello\n
发送指令数据包格式
# 发给串口::设备+消息
/dev/ttyUSB1:hellomessage!
# 发给ip端口:ip+port+消息
192.168.5.1:4445:helloworld!
# 发给蓝牙:对方蓝牙地址+消息
[00:11:22:33:44:55]:hellofrombluetooth!
使用bluez-tools(在openwrt下叫bluez-utils)开启蓝牙
# 打开设备
hciconfig hci0 up
# 让其可见(实际上只允许通过MAC连接)
hciconfig hci0 pscan
测试
src/blue_recv
src/blue_send
src/serial_recv
src/serial_send
编译(for openwrt)
先下载这个文件夹openwrt下所有文件放入到openwrt/package/relay-serial-com目录下,如果需要定制组件,编辑Makefile的CONFIGURE_ARGS变量。
# 首先准备好SDK,自行downloads.openwrt.org下载
cd openwrt
make menuconfig
# 选择Network->relay-serial-com
make package/relay-serial-com/compile V=99
本项目参考了shadowsocks-libev的tunnel.c作为tcp转发核心原理,还有@silv3rm00n的select服务器例程。其中openwrt的编译脚本参考了openwrt-shadowsocks的共享库创建方法。