Սկիզբ » Ժեշտ » Android + PC + Arduino: Տնային սարքերի կառավարում անդրոիդ օհ -ով սմարթ ֆոնից/պլանշետից: Մաս 2, սերվեր:

Android + PC + Arduino: Տնային սարքերի կառավարում անդրոիդ օհ -ով սմարթ ֆոնից/պլանշետից: Մաս 2, սերվեր:

| Նոյեմբեր 6, 2012 | Մեկնաբանված չէ |


Բարև ձեզ հայրենի IT հասարակություն :): Ճիշտն ասած որոշել էի երկրորդ մասով ավարտել այս հոդվածաշարը, բայց քանի գրում էս տեսնում էս, որ շատ բաներ կա մանրամասն բացատրելու, իսկ քանի որ այս հոդվածաշարը առաջին հերթին կողմնորոշված է դեպի սկսնակները (ինքս ժամանակին սկսնակ եմ եղել և շատ լավ գիտեմ իսկապես լավ հոդվածների արժեքը) և նաև հաշվի առնելով, որ շատ մեծ հոդվածներ տեսնելիս կարդալդ չի գալիս, հետևաբար որոշեցի, որ կլիենտի մասը, ինչպես նաև Arduino -ի ծրագրավորման մասը նույնպես կլինեն առանձին ու ավելի մանրամասն: Իդեպ Arduino -ի ծրագրավորման համար մեզ անհրաժեշտ է քաշել ևս մեկ ծրագիր, որը կարող եք քաշել այստեղից հենց արտադրողի կայքից:

Լավ սկսեցինք 🙂

 

Առաջին մասում մենք տեղակայեցինք բոլոր անհրաժեշտ ծրագարային ապահովումները: Հիմա կանցնենք անմիջականորեն սերվերի ծրագրավորմանը:

Սերվերի կոդը, ինչպես և ասել էինք կգրենք c++ լեզվով:

Ստեղծենք սերվերի ֆունկցիոնալությունը պարունակող փոքր կլասիկ` server.h 🙂

#ifndef SERVER_H
#define SERVER_H

#include "StdAfx.h"
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <string>
#include "SerialClass.h"

#define BUF_SIZE 256
#pragma comment(lib,"wsock32.lib")

class server
{
private:
	struct sockaddr_in m_addr;
	int m_port_num;
	void connect_to_arduino(char*);
public:
	server(int);
	~server(void);	
	void server_loop();
};

#endif

server::server(int p):m_port_num(p)
{
	WSADATA w;		
	if (WSAStartup (0x0202, &w))
	{
		std::cout << "WSAStart error  %d" << WSAGetLastError() << "\n";
        exit(-1);
    }	
	m_addr.sin_family = AF_INET;     
    m_addr.sin_port = htons(m_port_num);	
	m_addr.sin_addr.s_addr = htonl(INADDR_ANY);
}

server::~server(void)
{
}

void server::connect_to_arduino(char* buff)
{
	Serial port(L"\\\\.\\COM15");
	port.WriteData(buff, BUF_SIZE);	
}

void server::server_loop()
{
	SOCKET s;	
	char buffer[100];		
	s = socket(AF_INET, SOCK_STREAM, 0);
	if(s == INVALID_SOCKET)
	{
		std::cout << "invalid socket handle" << "\n";
		exit(-1);
	}
	int b = bind(s,(struct sockaddr*) &m_addr, sizeof(m_addr));
	if(b == -1)
	{
		std::cout << "invalid bind handle" <<"\n";
		exit(-1);
	}
	int l = listen(s, 1);
	int size = sizeof(m_addr);
	int *p_size = &size;

	while(1)
	{
		std::cout << "wait data's ..." << "\n";
		SOCKET a = accept(s, (struct sockaddr*) &m_addr, p_size); 
		memset((void*)buffer, 0, sizeof(buffer));
		int bytesRecv = recv(a, buffer, sizeof(buffer), 0);			
		std::cout<<"Recived data's: "<<buffer+2<<"\n";
		connect_to_arduino(buffer);	
		closesocket(a);
	}
}

և ծրագրի entry pointy -ը նույն ինքը main -ը 🙂
main.cpp

#include "stdafx.h"
#include "server.h"

int _tmain(int argc, _TCHAR* argv[])
{
	server s(11000);
	s.server_loop();
	return 0;
}

Կարծում եմ կոդը բավականին պարզ է:  ՈՒնենք փոքրիկ կլասս, որը պարունակում է երկու ֆունկցիա connect_to_arduino(char*)  և server_loop(): Առաջին ֆուցկցիան փակ ֆուկցիա է, որի  միջոցով միանում ենք պարամետրում նշված համարով com պորտին և գրում է այնտեղ տվյալներ: Երկրորդ ֆունկցիան սերվերի անընդհատ ցիկլն է, որով սերվերը սպասում, ստանում և մշակում է կլիենտից եկող ինֆորմացիան:  ՈՒշադրություն !!!! ես աշխատում եմ 15-րդ համարի com պորտով,  դուք էլ նաղքան կոդերը կոմպիլացնելը պետք է նայեք թե, ձեր Arduino պլատան որ համարի  պորտին է կպած և փոխեք այդ թիվը: Գնում եք connect_to_arduino ֆունկցիա ու ընդամենը COM15 –ի փոխարեն գրում եք ձեր թիվը` ձեռք չտալով դրա կողքի սլեշներին !!!!!!(Serial port(L"\\\\.\\ՁԵՐ ՔՈՄ ՀԱՄԱՐԸ"): Windows -ում com պորտի համարը նայելու համար գնում ենք start -> run ու բացված փոքր պատուհանի տեքստային միակ դաշտում գրում եք devmgmt.msc: Բացված պատունաից փնտրում եք Ports(COM and LPT) և սեղմում վրան: Բացվում են մեր կողմից օգտագործվող պորտերի ցուցակը, որտեղից էլ գտնում ենք մեր պորտի համարը, օրինակ իմը`  Comunications Port(COM 15): Եթե մի քանի հատ տարբեր համարներով Comunications Port -կտեսնեք և չեք կողմնորոշվի, թե դրանցից որ մեկն է ձեր Arduino -ինը կարող եք անջատել Arduino -ն նայել այդ ցանկին և com պորտերի համարներին, իսկ հետո նորից միացնելով տեսնել, թե որ com պորտն է ավելացել և արդեն վերցնել դրա ստույգ համարը:    Arduino պլատայի հետ վաճառվում է նաև դրա driver -ը գրեթե բոլոր օպերացիոն համարգերի համար: Իմ մոտ windows xp է և ես տեղակայել եմ driver -ը winxp պանակից:

       Պետք է նշել`  #pragma comment(lib,”wsock32.lib”) հրամանը,  որով ստիպում ենք Linker -ին միացնել wsock32.lib գրադարանը: Պետք է նաև #include անել com պորտի հետ աշխատելու համար անհրաժեշտ գլխագրային SerialClass.h (.h) ֆայլը. քաշում ենք այստեղից:
Եվ այսպես, բացում եք Visual StudioFile – > new -> Project, ընտրում էք Win32 Console Application, Name դաշտում գրում եք որևէ անուն օրինակ sock_server ու տալիս ok, հետո next: Additional option դաշտից ընտրում էք empty project և տալիս էք finish: Ստեղծվում է դատարկ պորյեկտ, որտեղ մենք պետք է կցենք մեր ֆայլերը: Գնում ենք Solution Explorer (էկրանի ձախ ներքևի անկյունում), Source Files -ի վրա սեղմում ենք մկնիկի աջը Add -> Existing Item… ու ընտրում ենք մեր main.cpp -ն: Հետո Header Files -ի վրա ենք սեղմում մկնիկի աջը Add -> Existing Item… ու ընտրում մեր server.h ֆայլը, հետո նորից նույը ու ընտրում ենք SerialClass.h ֆայլը: Այժմ, երբ բոլոր ֆայլերը կան տալիս ենք Build -> Build Solution կամ պարզապես ctrl + shift + B: Եթե կոմպիլացիան անցել է առանց ինչ-ինչ սխալների, մենք այժմ ունենք պատրաստի սերվերը: Այսպիսով մեր սերվերը ինֆորմացիա է ընդունում 11000 պորտով: Պորտերի թեման երևի թե առանձին թեմա է, քանի որ շատ ինտերնետային պրովայդերներ, անվտանգության նկատառումներից ելնeլով, փակում են կլինետի համակարգչում ազատ պորտերը, իսկ փակ պորտով սերվերը չի կարող աշխատել: Բայց ցանկացած փակ պորտ կարելի է շատ հեշտությամբ բացել utorrent ծրագրով (նայեք այս վիդեոն): Բայց նախ և առաջ հարկավոր է պարզել, թե արդյոք բաց է տվյալ պորտը: Դրա համար գնում ենք հետևյալ կայքը , գրում ենք մեր ցանկացած պորտը (կարելի է ընտրել 1000-ից բարձր ցանկացած պորտի համար, չենք մոռանում նաև փոխել մեր կոդի մեջ main.cppserver s(պորտի համարը) նաղքան կոմպիլացիան)) ու սեղմում ենք “Проверить порт”, որը  պորտը ստուգելուց հետո մեզ կասի, թե արդյոք այն բաց է, թե փակ է:
Շարունակելի…

Android + PC + Arduino: Տնային սարքերի կառավարում անդրոիդ օհ -ով սմարթ ֆոնից/պլանշետից: Մաս 2, սերվեր:, 10.0 out of 10 based on 21 ratings

Նշագրեր: , , , , , ,

Բաժին: Ժեշտ, Խելախոսներ, Ծրագրավորում

Կիսվել , տարածել , պահպանել

VN:F [1.9.20_1166]
Rating: 10.0/10 (21 votes cast)

Մեկնաբանեք

Կհաստատվեն միայն մեսրոպատառ հայերենով գրած մեկնաբանությունները

284