├── .AirChatLog.json ├── README.md ├── RECEIVE_AIR_BOT.py ├── SEND_AIR_BOT.py ├── ZonkeyNet_GUI.png ├── install-modules-airchat-debian.pl ├── install-modules-airchat-freebsd.pl ├── install-modules-airchat-macosx.pl ├── install-modules-airchat-windows.pl └── zonkey.pl /.AirChatLog.json: -------------------------------------------------------------------------------- 1 | {"2062ed-daad9974":{"txrx":"rx","content":"Hello World Test by Valexxx","cryptc":"00","timestamp":"1499148792.263667106628","resentcount":0,"hash":"daad9974"}} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ZonkeyNet 2 |
  3 | 
  4 |    _  _   __________             __                               __   
  5 | __| || |__\____    /____   ____ |  | __ ____ ___.__. ____   _____/  |_ 
  6 | \   __   /  /     //  _ \ /    \|  |/ // __ <   |  |/    \_/ __ \   __\
  7 |  |  ||  |  /     /(  <_> )   |  \    <\  ___/\___  |   |  \  ___/|  |  
  8 | /_  ~~  _\/_______ \____/|___|  /__|_ \\___  > ____|___|  /\___  >__|  
  9 |   |_||_|          \/          \/     \/    \/\/         \/     \/      
 10 |                                                              ver. 1.0
 11 | 
 12 | 
13 |

Communicate easily without Internet or Mobile phone.

14 |

15 |

Free digital Radiocommunications network service for everyone at low cost

16 | ZonkeyNet Can do its job even in case of media infrastructures failure, e.g. in case of earthquake or flood: ZonkeyNet does not use Radio bridges or Internet Provider infrastructures, so it will work even in the event of natural disaster or war. ZonkeyNet uses cheap, simple and portable infrastructures which everyone can build. The system allready uses a simple Raspberry PI 3 as hardware and works with Solar Power! The system can be built with limited spending and can provide its services in a wide range. 17 |

18 | In other words thanks to ZonkeyNet you can create and manage a long distance wifi communication service for a whole town with a very limited expense. The amplitude of the range of the system can be increased with just a small spending. 19 |

20 |

21 | The coverage of a repeater station depends on your radio equipment: a stronger signal is capable of withstanding successive passages through obstacles, allowing it to travel farther. 22 |

23 |

24 | Nevertheless local conformation of the territory and weather conditions may influence the transmission. For more informations about this aspect follow this link. 25 |

26 |

27 |

What is ZonkeyNet?

28 | ZonkeyNet (based on Airchat coded by LulzSec) is a Free Speech digital communications protocol that doesn’t deal with expensive, highly-surveilled commercial and government controlled infrastructure. 29 | Create a mesh network between other ZonkeyNet users running the same software. 30 | Each node in this mesh network is defined by it’s ability to decrypt messages. 31 | There’s no hardware ID, and no plain text transmitter identification. 32 |

33 |

34 | ZonkeyNet Mesh Network Radio project uses Fldigi software to communicate data it’s the software commonly used to broadcast amateur radio stations from a computer. 35 | The current release focuses on messaging and can be used as a simplistic message board inside a LAN and to rely communications between radio nodes. It has built-in internet gateway capabilities to offer users access to some basics, such as chat on IRC, SMS bridge service, Google directions, bridge messages on Telegram, Tweeting, retrieving Twitter streams, Downloading news, community related articles, transfering images, etc.. 36 |

37 |

38 | The configuration system is fully documented in ZonkeyNet. 39 | Refer to this for the full documentation. 40 |

41 |
42 | 43 | 44 |
45 | 46 |

Commands

47 |

48 | Some useful commands in ZonkeyNet: 49 |

50 |

51 | :local (Send local Messages LAN only) 52 |

53 |

54 | :twitter (Streaming tweet from @ZonkeyNet account) 55 |

56 |

57 | :tweet (Send Tweet with ZonkeyNet) 58 |

59 |

60 | :searchtwitter= (Search term or hashtag on Twitter) 61 |

62 |

63 | :sup? (Streaming Feeds RSS) 64 |

65 |

66 | :news? (Streaming News from list of links) 67 |

68 |

69 | !google (Search on Google) 70 |

71 |

72 | !gdir (Google Maps Directions) 73 |

74 |

75 | !weather (Info Meteo) 76 |

77 |

78 | !alpha (Wolfram Alpha engine) 79 |

80 |

81 | !sms (Send FREE SMS Worldwide) 82 |

83 |

84 | !twitter (Search term or hashtag on Twitter) 85 |

86 |

87 | !youtube (Search video or artists on Youtube) 88 |

89 |

90 | !wiki (Search on Wikipedia) 91 |

92 |

93 | !np (LastFM plugin) 94 |

95 |

96 | !send (Send a Note to a IRC user) 97 |

98 |

99 | !equake (Earthquake RSS Info ) 100 |

101 | and much more!!! 102 |

103 |

104 | #Notes ZonkeyNet runs by default on port 8080, connect your browser to http://localhost:8080 105 | (Internet access can be anonymized via Tor and the built in proxy support). 106 |

107 |
108 | 109 |

USER CASES

110 | 136 |

137 |

138 |

139 |

Installation :

140 |

141 | 187 |

188 | ENJOY IT! 189 | 190 | RASPBERRY PI 3 Full Image link: SOON! 32GB 191 |

192 |

193 | RASPBERRY PI 3 light Image link: SOON! 16GB 194 |

195 |

196 | Android Devices 6.0.1 MM Image link: SOON! 197 |

198 |

199 | The binary is called zonkey.pl. ZonkeyNet and Fldigi can be started/stopped with commands "zonkeynet (start:stop:restart)" typed in a terminal shell. 200 | You can also run the script by double clicking on its Desktop icon. 201 |

202 | -------------------------------------------------------------------------------- /RECEIVE_AIR_BOT.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | ################################################################### 3 | # Code from project: ZonkeyNet Mesh Radio Network 4 | ################################################################### 5 | 6 | import irc.client 7 | import json 8 | import logging 9 | import time 10 | from jaraco.stream import buffer 11 | import collections 12 | import thread 13 | import os 14 | import fcntl 15 | 16 | LOCKFILE = "airbot_rx.lock" 17 | 18 | lfnam = os.path.abspath(LOCKFILE) 19 | lf = open(lfnam, 'w') 20 | try: 21 | fcntl.lockf(lf, fcntl.LOCK_EX | fcntl.LOCK_NB) 22 | except BlockingIOError: 23 | exit() 24 | 25 | NEW_MSGS_ONLY = True 26 | # don't set it too low - may result with server ban! 27 | # (in seconds) 28 | WAIT_TO_RECONNECT = 30 29 | 30 | channel_name = "#ZonkeyNet" 31 | log_file_path = "/home/pi/ZonkeyNet/.AirChatLog.json" # Your Log file Location 32 | IRC_server_address = "chat.freenode.net" 33 | IRC_nickname = "airBOT_RX" 34 | IRC_passwd = "password" # Change This! 35 | 36 | old_msgs = {} 37 | f2 = open(log_file_path) 38 | if NEW_MSGS_ONLY == True: 39 | log2 = json.load(f2) 40 | for key2 in log2: 41 | old_msgs[key2] = True 42 | 43 | def endofmotd(con1,event1): 44 | server1.join(channel_name) 45 | thread.start_new_thread(send_all_logged_msgs,()) 46 | #send_all_logged_msgs() 47 | 48 | def disco(con1, event1): 49 | time.sleep(WAIT_TO_RECONNECT) 50 | server1.reconnect() 51 | 52 | def send_all_logged_msgs(): 53 | global old_msgs 54 | sent = {} 55 | while True: 56 | time.sleep(1) # increase this number to make it less CPU intensive 57 | f1 = open(log_file_path) 58 | try: 59 | log1 = json.load(f1) 60 | log1_sorted = collections.OrderedDict(sorted(log1.items(), key=lambda t: t[1]["timestamp"])) 61 | #i=1 62 | for key1 in log1_sorted: 63 | #print log1[key1]["content"] 64 | if log1_sorted[key1]["txrx"] == "rx": 65 | msg_to_send_noR = log1_sorted[key1]["content"].replace("\r","") 66 | msg_to_send_noRN = msg_to_send_noR.replace("\n","") 67 | msg_to_send_noRN = msg_to_send_noRN[:480] 68 | #if i not in sent: 69 | if key1 not in sent and key1 not in old_msgs: 70 | server1.privmsg(channel_name,msg_to_send_noRN) 71 | log1.pop(key1) 72 | #print log1[key1]["content"] 73 | #sent[i] = True 74 | sent[key1]=True 75 | time.sleep(10) 76 | #i += 1 77 | except Exception, e: 78 | print e 79 | continue 80 | 81 | 82 | 83 | irc.client.ServerConnection.buffer_class = buffer.LenientDecodingLineBuffer 84 | 85 | #logging.basicConfig(level=logging.DEBUG) # commented out for debug 86 | irc_client1 = irc.client.Reactor() 87 | server1 = irc_client1.server() 88 | server1.connect(IRC_server_address, 6667, IRC_nickname, IRC_passwd) 89 | 90 | irc_client1.add_global_handler("endofmotd", endofmotd) 91 | irc_client1.add_global_handler("disconnect", disco) 92 | 93 | irc_client1.process_forever() 94 | -------------------------------------------------------------------------------- /SEND_AIR_BOT.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | ################################################################### 3 | # Code from project: ZonkeyNet (Mesh Radio Networks) 4 | ################################################################### 5 | 6 | import socket 7 | import requests 8 | import time 9 | import random 10 | 11 | BOT_NICK = "airbotTX" 12 | BOT_FULLNAME = "another crazy bot" 13 | 14 | BOT_SERVER = "chat.freenode.net" 15 | BOT_PORT = 6667 16 | 17 | BOT_CHANNEL = "#ZonkeyNet" 18 | 19 | irc = socket.socket() 20 | handle = irc.makefile(mode = "rw", buffering = 1, encoding = "utf-8", newline = "\r\n") 21 | 22 | irc.connect((BOT_SERVER, BOT_PORT)) 23 | 24 | print("PASS *", file = handle) 25 | print("NICK " + BOT_NICK, file = handle) 26 | print("USER AirBot_TX 0 * :" + BOT_FULLNAME, file = handle) 27 | 28 | flag1 = True 29 | 30 | def split_line(data): 31 | sender = None 32 | cmd = None 33 | args = [] 34 | if (data.startswith(":")): 35 | d = data[1:].split(" ", 15) 36 | sender = d[0] 37 | cmd = d[1] 38 | for n in range(2, len(d)): 39 | if d[n].startswith(":"): 40 | args.append(d[n][1:] + " " + " ".join(d[n+1:])) 41 | break 42 | else: 43 | args.append(d[n]) 44 | else: 45 | d = data.split(" ", 15) 46 | cmd = d[0] 47 | for n in range(1, len(d)): 48 | if d[n].startswith(":"): 49 | args.append(d[n][1:] + " " + " ".join(d[n+1:])) 50 | break 51 | else: 52 | args.append(d[n]) 53 | return (sender, cmd, args) 54 | 55 | RPL_END_OF_MOTD = "376" 56 | ERR_NOMOTD = "422" 57 | ERR_NICKNAMEINUSE = "433" 58 | 59 | for line in handle: 60 | line = line.strip() 61 | # print(line.encode("utf-8", "replace")) 62 | 63 | sender, cmd, args = split_line(line) 64 | 65 | if cmd == RPL_END_OF_MOTD or cmd == ERR_NOMOTD: 66 | if flag1 == True: 67 | print("JOIN " + BOT_CHANNEL, file = handle) 68 | flag1 = False 69 | elif cmd == ERR_NICKNAMEINUSE: 70 | print("NICK " + BOT_NICK + str(random.randrange(1,1000)), file = handle) 71 | elif cmd == "PING": 72 | print("PONG :" + " ".join(args), file = handle) 73 | elif cmd == "PRIVMSG": 74 | msg = " ".join(args) 75 | #if msg.startswith("!radio"): # send only with !radio msgs 76 | if msg.startswith("!"): # use ! in front of msgs in order to remove the receive confirmation loop of msgs 77 | continue 78 | # sender = line.split("!")[0].replace(":", "") 79 | from_nick = sender.partition("!")[0] 80 | #Send to Radio via local WebServer 81 | r = requests.post('http://localhost:8080', data={"postfield": from_nick + ": " + msg}) 82 | time.sleep(10) # Wait 10 seconds to send via radio mode PSK500R - 4 for mode PSK1000R 83 | -------------------------------------------------------------------------------- /ZonkeyNet_GUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zonkeynet/ZonkeyNet/c158472466a6740efe3e559b453037dc81fec0a4/ZonkeyNet_GUI.png -------------------------------------------------------------------------------- /install-modules-airchat-debian.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl -w 2 | 3 | use CPANPLUS; 4 | use strict; 5 | # use warnings; 6 | 7 | CPANPLUS::Backend->new( conf => { prereqs => 1 } )->install( 8 | modules => [ qw( 9 | Net::Twitter::Lite::WithAPIv1_1 10 | HTTP::Server::Simple::CGI::PreFork 11 | Crypt::Camellia 12 | Crypt::Camellia_PP 13 | ) ] 14 | ); 15 | 16 | -------------------------------------------------------------------------------- /install-modules-airchat-freebsd.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl -w 2 | 3 | use CPANPLUS; 4 | use strict; 5 | # use warnings; 6 | 7 | CPANPLUS::Backend->new( conf => { prereqs => 1 } )->install( 8 | modules => [ qw( 9 | Digest::SHA 10 | MIME::Base64 11 | Crypt::CBC 12 | Crypt::Rijndael 13 | Crypt::Camellia 14 | Crypt::Camellia_PP 15 | Compress::Zlib 16 | Crypt::OpenSSL::RSA 17 | RPC::XML 18 | RPC::XML::Client 19 | Data::Dumper 20 | Encode 21 | Net::SSLGlue::LWP 22 | LWP::UserAgent 23 | LWP::Protocol::https 24 | LWP::Protocol::socks 25 | JSON 26 | Net::Twitter::Lite::WithAPIv1_1 27 | XML::FeedPP 28 | HTTP::Server::Simple::CGI 29 | HTML::Entities 30 | base 31 | Time::HiRes 32 | ) ] 33 | ); 34 | 35 | -------------------------------------------------------------------------------- /install-modules-airchat-macosx.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl -w 2 | 3 | use CPANPLUS; 4 | use strict; 5 | # use warnings; 6 | 7 | CPANPLUS::Backend->new( conf => { prereqs => 1 } )->install( 8 | modules => [ qw( 9 | Digest::SHA 10 | MIME::Base64 11 | Crypt::CBC 12 | Crypt::Rijndael 13 | Crypt::Camellia 14 | Crypt::Camellia_PP 15 | Compress::Zlib 16 | Crypt::OpenSSL::RSA 17 | RPC::XML 18 | RPC::XML::Client 19 | Data::Dumper 20 | Encode 21 | Net::SSLGlue::LWP 22 | LWP::UserAgent 23 | LWP::Protocol::https 24 | LWP::Protocol::socks 25 | JSON 26 | Net::Twitter::Lite::WithAPIv1_1 27 | XML::FeedPP 28 | HTTP::Server::Simple::CGI 29 | HTML::Entities 30 | base 31 | Time::HiRes 32 | ) ] 33 | ); 34 | 35 | -------------------------------------------------------------------------------- /install-modules-airchat-windows.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl -w 2 | 3 | use CPANPLUS; 4 | use strict; 5 | # use warnings; 6 | 7 | CPANPLUS::Backend->new( conf => { prereqs => 1 } )->install( 8 | modules => [ qw( 9 | Crypt::Camellia 10 | Crypt::Camellia_PP 11 | RPC::XML 12 | RPC::XML::Client 13 | LWP::Protocol::https 14 | LWP::Protocol::socks 15 | XML::FeedPP 16 | Net::Twitter::Lite::WithAPIv1_1 17 | ) ] 18 | ); 19 | 20 | --------------------------------------------------------------------------------