0
votes

My setup is complicated and I think I have a clear way ahead, but please let me know if you see a better way to accomplish my end state of using a terminal window over Xbee. My use case is that RPI #1 has internet connectivity, but RPI #2 does not, and I want to fully control and access RPI #2 via RPI #1 over Xbee.

  1. I have x2 Raspberry Pi 3B+ and am using x2 Xbee Pro S3B modules to communicate between the RPIs over Xbee USB Development Shields. The Xbees show on the RPIs as /dev/ttyUSB0. I want to use the Xbees as a transportation layer to the RPIs, much like 802.11/15 or plain old ethernet would be used in a headless situation with bash. The Xbees are running at 115200 baud rate, and are named and setup via the X-CTU tool. I have no illusions of high speed data, but want to "see" RPI #2 terminal on RPI #1, the same as when SSH is accomplished with traditional transport layers.
  2. I am able to use the Xbees in Transparent Mode, and send plain text with Screen, Minicom, "echo "text here" > /dev/ttyUSB0", and "cat < /dev/ttyUSB0". Despite the ability to pass messages, I want to use these plain text messages as bash input. For example, when I pass the command ls via any of the three methods listed from RPI 1, I want to have bash exectue "ls" on RPI 2, not just see it listed on the screen for RPI 2.
  3. I've found several tools for Xbee, but don't want to wire up the GPIO pins and go that method; I want to use the Xbees as simple transport, nothing more. How do I pass text from /dev/ttyUSB0 to bash as a command, and see the results? Short of a more direct route, I'm considering using crontabs and an executable file that is erased and re-written to accomplish this task, but feel that is a last, very ineffective, method.
  4. Is there some tool I am missing that does this already? Can I "screen" over a serial port as command line and serial I/O simultanously? I found pyserial, which could allow for a TCP binding to the /dev/ttyUSB0 port, but am not sure if that is the right way to go or not. As of now, my code is as simple as

RPI #1:

    echo "ls" > /dev/ttyUSB0

RPI #2:

    cat < /dev/ttyUSB0
1
Why don't use the standard usbnet device which is already in kernel?Ipor Sircer
Simplify this to start. Get 2 TTL-level FTDI USB serial cables, cross the TX/RX and RTS/CTS between them, connect ground between them but not Vcc. Now you've got a serial null-modem interface over USB that you can test in minicom. Get that working, and then look into dropping in paired XBee modules to pass that data.tomlogic
Thanks for your prompt replies gentlemen. I spent some time trying your solutions until I realized they put me in the same prediciment I was already in. Appreciate your efforts.james

1 Answers

0
votes

I was able to send and recieve commands from command line of a local (although remoted) XBee host to a remote (secondary, off net) Xbee host. I found the answer when I started looking at how serial devices could open a login terminal, and arrived at the getty tool. Here are my setup instructions for Transparent Mode use, I am still trying to get python-xbee and other tools to work to allow for the same concept, but via API mode. Note that the below instructions are a 95% solution, but should get the common user to a solid way ahead. I am not the original author of the steps below in their format, but found each step and combined them through various other Q&A forums to arrive at a solution:

First, acquire Digi Xbee X-CTU software (does not install on ARM devices such as Raspberry or Odroid): XCTU: Install from the following Digi.com link, but navigate to the corrresponding software FTP link:

https://www.digi.com/support/productdetail?pid=3352&type=drivers

Linux 64 Bit: ftp://ftp1.digi.com/support/utilities/40002881_R.run

Linux 32 Bit: ftp://ftp1.digi.com/support/utilities/40002880_R.run

Windows: ftp://ftp1.digi.com/support/utilities/40003026_T.exe

Mac: ftp://ftp1.digi.com/support/utilities/40003026_T.exe

Install X-CTU Via:

sudo wget ftp://ftp1.digi.com/support/utilities/40002880_R.run
sudo mv 40002881_R.run xctu_64bit.run
sudo chmod +x xctu_64bit.run  
sudo ./xctu_64bit.run

Find X-Bee Device:

make sure Xbee is not plugged into a hub, power will be too little, recognizable via the below error, YMMV:

dmesg | grep ttyUSB0 

and returning error: [ 228.800021] ftdi_sio ttyUSB0: failed to get modem status: -32

lsusb -v -d 0403:6001

sudo nano /boot/cmdline.txt

change the console tty device from AMA to USB, then for the kgdboc, which allows the remote end to watch the boot process, add/make match as appropriate

console=ttyUSB0,115200 kgdboc=ttyUSB0,115200

sudo nano /etc/inittab

make sure to uncomment (remove #) if present, change tty from AMA to USB

T0:23:respawn:/sbin/agetty -L ttyUSB0 115200 vt100

On Ubuntu x86 system, use X-CTU via

sudo ./XCTU.desktop

update firmware to the latest version currently 8075 for the Pro S3B, then set baud rate to 115200 on each device other xbees on in the vicinity can be updated by using a local xbee via X-CTU, then setting the api mode to “api mode with escapes”. Note that Transparent Mode should be used unless you have an indepth knowlege to make API mode work. I started with Transparent Mode to demonstrate the below works, but have since moved to API mode to gain the enhanced send-recieve control capabilities (pending a working version as of this writing).
do the same steps for all the devices that will be used on the network; once the local device is complete, other remote devices can be updated if visible (close enough).

Close out X-CTU and add the current user to the dialout group via:

sudo usermod -a -G dialout root

reboot then:

Setup Minicom Via:

sudo aptitude install minicom
minicom -s
serial port setup   
a, set to /dev/ttyUSB0, then hit enter
e, set baud rate to 115200, then hit enter
hit enter again to close the window and arrive at the configuration page of minicom
select to save as dfl, followed by enter
then move to exit, and hit return
test connection to a locally connected device via
three plus symbols without hitting return
if it replies “ok” in a few seconds or less, all is well

OR Screen:

screen /dev/ttyUSB0

again, if you see a login prompt, you are connected. Note that screen is probably the best choice for most users; it has the inherent quality of ease of use (when compared to Minicom), handles low bandwidth connections with ease, and stays alive despite a disconnect from remote host. Ctl+a and then k will disconnect.

Install Coreutils to add more options than Minicom (Screen is also advisable):

sudo aptitude install coreutils && screen
stty -F /dev/ttyUSB0 -a

this will check serial port capabilities and settings

Communicate with your devices:

Note you interact with your network on a local machine with an X-Bee plugged in, or on a remote device you SSH over the internet, as long as it has an X-Bee attached. Also, note that the below settings to rc.local weren't keeping my settings after a reboot; this is a work in progress. I was setting them manually until I got automation worked out. Also, I added rc.local to the RPI manually, the how-to for that is out there somewhere:

sudo systemctl stop [email protected]
sudo systemctl disable [email protected]
sudo systemctl enable [email protected]

sudo nano /etc/rc.local
add the below before exit 0

The stty line is twice because it has been noted that the first instance changes the reported baud rate to 9600, the second to 115200. If you are doing this manually, do a “stop” then re-do the start command to receive the prompt. This could be automated; I will update this post with a process monitor.

stty -F /dev/ttyUSB0 speed 115200 cs8 -cstopb -parenb raw
stty -F /dev/ttyUSB0 speed 115200 cs8 -cstopb -parenb raw
sudo systemctl start [email protected]

Then, use Minicom, Screen, or "cat" and "watch" to view messages sent. When using Minicom you will receive a login prompt via the above directions. As previously stated, I am still trying to get this working smoothly for API mode, but at least I know I have connectivity and can do basic command & control via the command line remotely with Transparent Mode, including running command line programs and commands. Transparent Mode does not offer any enhanced RF propagation correction techniques, hence my desire to get API mode working; RSSI values and error correction would be nice.