সুচিপত্র:
- ধাপ 1: Wrover দিয়ে AP মাউন্ট করা
- ধাপ 2: টিটিজিও সহ স্টেশনের সমাবেশ
- ধাপ 3: ফলাফল
- ধাপ 4: LOG.CSV আর্কাইভ করুন
- পদক্ষেপ 5: অ্যাডাফ্রুট জিএফএক্স লাইব্রেরি
- ধাপ 6: Adafruit ST7735 লাইব্রেরি
- ধাপ 7: কার্ডগুলি কনফিগার করা
- ধাপ 8: AP.ino
- ধাপ 9: Station.ino
- ধাপ 10: ফাইল
ভিডিও: বহিরাগত দীর্ঘ দূরত্ব অ্যান্টেনা সহ ESP32: 10 টি ধাপ
2024 লেখক: John Day | [email protected]. সর্বশেষ পরিবর্তিত: 2024-01-30 08:01
আজকের বিষয় বহিরাগত অ্যান্টেনার সাথে একটি ESP32 এর সাথে দূরত্ব পরীক্ষা সম্পর্কিত। আসুন আজ দুটি মডিউল ব্যবহার করি: Espressif এবং TTGO থেকে। আসুন তাহলে এই দুটি ESP32 অ্যান্টেনার মধ্যে RSSI চেক করি, ইতিহাস থেকে একটি গ্রাফ তৈরি করি এবং একটি.csv ফাইলে মানগুলির একটি লগ লিখি।
আমাদের তখন এপি হিসাবে ESP32 Wrover, এবং TTGO এর ESP32 স্টেশন হিসাবে আছে। আমি একটি অ্যান্টেনা ব্যবহার করেছি যা আমি একটু বড় TP-Link এবং অন্য একটি রাউটার থেকে নিয়েছি যা 9dbm অ্যান্টেনা নামে পরিচিত। আমি দুটোর মধ্যে কোন পার্থক্য লক্ষ্য করিনি।
অবশেষে, দুটি মাইক্রোকন্ট্রোলার সকেটের মাধ্যমে সংযুক্ত হয় এবং, প্রতিটি ডেটা প্যাকেট পাঠানোর সাথে, আমরা একটি ডিসপ্লেতে বারগুলির সাথে একটি গ্রাফ মুদ্রণ করি যা dbm এর অনুপাত নির্দেশ করে।
ধাপ 1: Wrover দিয়ে AP মাউন্ট করা
ধাপ 2: টিটিজিও সহ স্টেশনের সমাবেশ
ধাপ 3: ফলাফল
2x বাহ্যিক অ্যান্টেনার সাথে সর্বোচ্চ দূরত্ব: 315 মিটার
বাহ্যিক এবং অভ্যন্তরীণ অ্যান্টেনার সাথে সর্বোচ্চ দূরত্ব: 157 মিটার
ধাপ 4: LOG. CSV আর্কাইভ করুন
আমি একটি SD কার্ডে ডেটা রেকর্ড করেছি, মিলিস, ডিবিএম এবং প্যাকেজ স্ট্রিং এর ডেটা সহ।
পদক্ষেপ 5: অ্যাডাফ্রুট জিএফএক্স লাইব্রেরি
Arduino IDE- এ, Sketch-> Include Library-> Manage Library- এ যান …
অ্যাডাফ্রুট জিএফএক্স লাইব্রেরি ইনস্টল করুন
ধাপ 6: Adafruit ST7735 লাইব্রেরি
Arduino IDE- এ, Sketch-> Include Library-> Manage Library- এ যান …
Adafruit ST7735 ইনস্টল করুন
ধাপ 7: কার্ডগুলি কনফিগার করা
পার্থক্যের জন্য আমাদের সাথে থাকুন:
ধাপ 8: AP.ino
আমরা প্রয়োজনীয় লাইব্রেরি অন্তর্ভুক্ত করেছি এবং কিছু পরামিতি সংজ্ঞায়িত করেছি।
#অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত // রিডে কিউ ইএসপি ক্রায়ার। কোন স্টেশন ডেভ সের আইগুয়াল #ডিএসফাইন SSID "RSSI_Test" #ডিফাইন পাসওয়ার্ড "87654321" // টেম্পো ডি টাইমআউট পেরার এ কনসেক্সো পেডিডা #ডিফাইন টাইমআউট 2000 // লার্গুরা ই অল্টুরা ডো ডিসপ্লে #ডিফাইন ডিসপ্লে_উইডথ 160 #ডিফাইন ডিসপ্লে_ 128 ডিসফাইজ ডিসপ্লে cor, margem e tamanho do gráfico #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #define PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define "log/pg"
আমরা অন্যান্য ভেরিয়েবলের মধ্যে পিনগুলি সংজ্ঞায়িত করি
// Pinos do display #define DISPLAY_DC 12 // A0 #define DISPLAY_CS 13 // CS #define DISPLAY_MOSI 14 // SDA #define DISPLAY_CLK 27 // SCK #define DISPLAY_RST 0 // Pino do SDCard। Os pinos mosi, miso e sck são os nativos (23, 19 e 18 respectivamente) #SDCARD_CS 15 সংজ্ঞায়িত করুন // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um server (qualquer porta válida serve contanto que o clientele use a mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client; // স্ট্রিং que recebemos do cliente স্ট্রিং রিসিভ; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
সেটআপ
অকার্যকর সেটআপ () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a rede WiFi, inicializa o server e espera o cliente conectar setupWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
ওয়াইফাই সেটআপ করুন
// Cria um Access Point e configura o IPvoid setupWiFi () {display.println ("softAP তৈরি করা" + স্ট্রিং (SSID)); WiFi.disconnect (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 0)); WiFi.softAP (SSID, PASSWORD); display.println ("softAP" + স্ট্রিং (SSID) + "তৈরি!"); }
সেটআপ ডিসপ্লে
// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Pinta a tela de preto display.fillScreen (ST77XX_BLACK); }
waitForClient
অকার্যকর waitForClient () {display.println ("ক্লায়েন্টের জন্য অপেক্ষা করা"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("।"); বিলম্ব (500); } display.println ("ক্লায়েন্ট সংযুক্ত"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR রিসেট মডিউল এবং সেটআপ ওয়াচডগ
// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // টাইমার, টেম্পো (আমাদের), repetição timerAlarmWrite (টাইমার, 10000000, সত্য); timerAlarmEnable (টাইমার); // habilita a interrupção}
লুপ
অকার্যকর লুপ () {টাইমারওয়াইট (টাইমার, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do clientend sendToClient (); // envia confirmação para o clienteot plot (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}
চেক সংযোগ
void checkConnection () {// Se o cliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("ক্লায়েন্ট সংযোগ বিচ্ছিন্ন"); waitForClient (); }}
ReadFromClient
অকার্যকর readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100); } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do cliente if (client.connected ()) {receive = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou receive.remove (receive.length ()-1); // অপসারণ o / n চূড়ান্ত rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // সরান হে কার্সার ডু টেক্সটো প্যারা ও কামেনো ডো ডিসপ্লে ডিসপ্লে। প্রিন্টলন ("RSSI:" + স্ট্রিং (rssi)); // Mostra o RSSI no display display.println ("প্রাপ্ত:" + প্রাপ্ত); // Mostra a mensagem recebida do ग्राहक.begin ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}
পাঠান ক্লায়েন্ট
void sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {স্ট্রিং পাঠানো = প্রাপ্ত + "ওকে"; client.println (পাঠানো); }}
পটভূমি
void plot () {// Coloca no ponto inicial e limpamos o gráfico currentX = PLOT_MARGIN; display.fillRect (PLOT_MARGIN, 2*PLOT_MARGIN, DISPLAY_WIDTH - 2*PLOT_MARGIN, DISPLAY_HEIGHT - 2*PLOT_MARGIN, ST77XX_BLACK); // Para cada valor do histórico fazemos o cálculo do tamanho da barra do gráfico, desenhamos e avançamos para o próximo for (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - মান, মান, PLOT_COLOR); currentX += 2;}}
clearText এবং log
void clearText () {// Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Failed to open file"); প্রত্যাবর্তন; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + স্ট্রিং (rssi) + ";" + প্রাপ্ত; file.println (ডেটা); file.close (); }
ধাপ 9: Station.ino
আমরা প্রয়োজনীয় লাইব্রেরি অন্তর্ভুক্ত করেছি এবং কিছু পরামিতি সংজ্ঞায়িত করেছি।
#অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #নাম ক্রিয়েডো পেলো AP #SSD "RSSI_Test" #পাসওয়ার্ড নির্ধারণ করুন "87654321" #define HOST "192.168.0.1" // IP que foi configurado no setup do AP #define PORT 80 // Porta do sever। Qualquer Porta válida contanto কী seja igual টি Dois arquivos // টেমপো ডি সময়সীমার পাড়া considerar A Conexao pedida # define কাছে TIMEOUT 2000 // Largura ই Altura না ডিসপ্লে # define DISPLAY_WIDTH 160 # define DISPLAY_HEIGHT 128 // Configurações ডি করি, margem ই tamanho gráfico না #ডিফাইন PLOT_COLOR ST77XX_GREEN #ডিফাইন PLOT_MARGIN 20 #ডিফাইন PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/log.csv"
আমরা ডিসপ্লে এবং এসডি কার্ড যুক্ত সেটিংস সংজ্ঞায়িত করি।
দীর্ঘ গণনা = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI ক্যালকুলেডো স্ট্রিং পেয়েছে; // Mensagem de confirmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // ইউটিলিজাডো প্যারা কনেক্সো কম সার্ভার ওয়াইফাই ক্লায়েন্ট সকেট; #DISPLAY_DC 12 // A0 #DISPLAY_CS 13 // CS #define DISPLAY_MOSI 14 // SDA #Display_CLK 27 // SCK #define DISPLAY_RST 0 // Pino do SDCard Os pinos mosi, miso e sck são os nativos (23, 19 e 18 respectivamente) #define SDCARD_CS 15 // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSPLAY_DOSPLAY_MOSPLAY) hw_timer_t *টাইমার = শূন্য; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
সেটআপ
অকার্যকর সেটআপ () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // সংযোগের কোন অ্যাক্সেস পয়েন্ট নেই connectToServer (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
সেটআপ প্রদর্শন
// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Pinta a tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }
সেটআপ ওয়াইফাই
// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, PASSWORD); display.println ("কানেক্ট করা হচ্ছে" + স্ট্রিং (SSID)); // Enquanto não estiver conectado Wi rede WiFi while (WiFi.status ()! = WL_CONNECTED) {বিলম্ব (500); display.print ("।"); } display.println (""); display.print ("সাথে সংযুক্ত"); display.println (SSID); }
সংযোগ সার্ভার
অকার্যকর connectToServer () {display.println ("সকেট সংযোগ চেষ্টা করে"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("।"); বিলম্ব (500); } display.println (); display.println ("সংযুক্ত!"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }
IRAM_ATTR রিসেট মডিউল এবং সেটআপ ওয়াচডগ
// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // টাইমার, টেম্পো (আমাদের), repetição timerAlarmWrite (টাইমার, 10000000, সত্য); timerAlarmEnable (টাইমার); // habilita a interrupção}
লুপ
অকার্যকর লুপ () {টাইমারওয়াইট (টাইমার, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o সার্ভার checkRSSI (); // verifica o rssi চক্রান্ত (); // mostra o gráfico de histórico de rssi sendToServer (); // envia uma mensagem com um contador para o server readFromServer (); // espera a confirmação do server log (); // salva um log no cartão SD বিলম্ব (1000); // espera um segundo}
চেক সংযোগ
void checkConnection () {// Verifica a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("ওয়াইফাই সংযোগ বিচ্ছিন্ন"); setupWiFi (); বিলম্ব (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("সকেট বিচ্ছিন্ন"); connectToServer (); বিলম্ব (3000); display.fillScreen (ST77XX_BLACK); }}
চেক RSSI
void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + স্ট্রিং (rssi)); // Se a quantidade de barras do gráfico passou do limite apagamos o registro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }
পটভূমি
void plot () {// Coloca no ponto inicial e limpamos o gráfico currentX = PLOT_MARGIN; display.fillRect (PLOT_MARGIN, 2*PLOT_MARGIN, DISPLAY_WIDTH - 2*PLOT_MARGIN, DISPLAY_HEIGHT - 2*PLOT_MARGIN, ST77XX_BLACK); // Para cada valor do histórico fazemos o cálculo do tamanho da barra do gráfico, desenhamos e avançamos para o próximo for (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - মান, মান, PLOT_COLOR); currentX += 2;}}
পাঠান সার্ভার
void sendToServer () {// Se estiver conectado com o server if (socket.connected ()) {// Envia um hello com um contador, mostra no display e incrementa o contador String Send = "Hello" + String (count); display.setCursor (0, 10); display.println ("পাঠানো:" + পাঠানো); socket.println (পাঠানো); socket.print (স্ট্রিং (rssi)); গণনা ++; }}
ReadFromServer
অকার্যকর readFromServer () {// Espera até o server enviar algo ou desconectar while (socket.connected () &&! socket.available ()) {delay (100); } // se tem algo para receber if (socket.available ()) {// Faz a leitura, remove o / n do final e mostra no display receive = socket.readStringUntil ('\ n'); receive.remove (receive.length ()-1); display.println ("প্রাপ্ত:" + প্রাপ্ত); }}
clearText এবং লগ
void clearText () {// Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("ফাইল খুলতে ব্যর্থ"); প্রত্যাবর্তন; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + স্ট্রিং (rssi) + ";" + প্রাপ্ত; file.println (ডেটা); file.close (); }
ধাপ 10: ফাইল
ফাইল ডাউনলোড করুন:
পিডিএফ
আইএনও
প্রস্তাবিত:
দীর্ঘ দূরত্ব ট্রান্সমিশন সিস্টেম সার্কিট: 6 টি ধাপ
লং ডিসটেন্স ট্রান্সমিশন সিস্টেম সার্কিট: আজ এই প্রবন্ধে আমরা কিভাবে একটি মৌলিক লং ডিসটেন্স ট্রান্সমিশন সিস্টেম সার্কিট তৈরি করা যায় সে সম্পর্কে কথা বলব। এই লাইন বরাবর, আমি আপনাকে সার্কিট একটি সংক্ষিপ্ত চিত্রণ দেওয়া যাক। কিভাবে এটি সাধারণভাবে কাজ করে এবং আমি কিভাবে আপনার সাথে কথা বলছি
রাস্পবেরি পাই ব্যবহার করে দীর্ঘ এক্সপোজার এবং অ্যাস্ট্রো-ফটোগ্রাফি: 13 টি ধাপ (ছবি সহ)
রাস্পবেরি পাই ব্যবহার করে দীর্ঘ এক্সপোজার এবং অ্যাস্ট্রো-ফটোগ্রাফি: অ্যাস্ট্রোফোটোগ্রাফি হল জ্যোতির্বিজ্ঞানীয় বস্তু, স্বর্গীয় ঘটনা এবং রাতের আকাশের এলাকাগুলির ফটোগ্রাফি। চাঁদ, সূর্য এবং অন্যান্য গ্রহের বিশদ বিবরণ রেকর্ড করা ছাড়াও, অ্যাস্ট্রোফোটোগ্রাফির মধ্যে অদৃশ্য বস্তুগুলি ধারণ করার ক্ষমতা রয়েছে
অ্যান্টেনা দিয়ে 'ইবে' ফ্ল্যাশ রিমোট ট্রিগার ট্রান্সমিটারে কার্যকর দূরত্ব বাড়ান: 6 টি ধাপ
অ্যান্টেনার সাহায্যে 'ইবে' ফ্ল্যাশ রিমোট ট্রিগার ট্রান্সমিটারে কার্যকর দূরত্ব বাড়ান: ক্যামেরা প্রেমীরা বহিরাগত ফ্ল্যাশ ইউনিটগুলির জন্য দূরবর্তী ট্রিগারগুলির সস্তা সংস্করণ কিনতে পারে, হট-শু বা 'স্টুডিও' টাইপ ফ্ল্যাশ ইউনিটগুলি নিয়ন্ত্রণ করে। এই ট্রিগারগুলি কম ট্রান্সমিটার পাওয়ার এবং এইভাবে ছোট কার্যকরী নিয়ন্ত্রণ দূরত্ব থেকে ভোগে। এই মাস
পুরানো বহিরাগত CD/RW থেকে একটি বহিরাগত HDD করুন: 5 টি ধাপ
পুরাতন বহিরাগত CD/RW থেকে একটি বহিরাগত HDD তৈরি করুন: একটি পুরানো বহিরাগত cd/rw কে আরও কার্যকর বহিরাগত হার্ড ড্রাইভে রূপান্তরিত করা। সরবরাহ 1-বহিরাগত সিডি/আরডব্লিউ (বিশেষত বেশি বক্সি টাইপ) 1-হার্ড ড্রাইভ (অবশ্যই ড্রাইভ কেসের অভ্যন্তরীণ সংযোগকারীকে মেলাতে হবে, ফরম্যাট/সিস করা দরকার) 1-এসএম
একটি বহিরাগত অ্যান্টেনা নিতে একটি রিকোচেট রেডিও মডেম মোড করুন: 8 টি ধাপ
একটি বহিরাগত অ্যান্টেনা নেওয়ার জন্য রিকোচেট রেডিও মডেম মোড করুন: আগের সময়ের ব্যবসায়িক মডেলের পণ্য, রিকোচেট মডেমগুলি একটি বিস্ময়করভাবে কম দামের ট্যাগ সহ দুর্দান্ত প্রযুক্তি। তারা নিয়মিত মডেমের মতো কাজ করে, কিন্তু একটি ফোন লাইনের পরিবর্তে আরএফ স্তর দিয়ে। আপনার নিজস্ব ডায়াল-ইন অ্যাক্সেস সার্ভার তৈরি করুন, একটি নিয়ন্ত্রণ করুন