Управление через блютуз контроллером TXT

Обсуждаем модели и конструкции, построенные своими руками
Muaed
Сообщения: 38
Зарегистрирован: 19 окт 2021, 12:38

Управление через блютуз контроллером TXT

Сообщение Muaed »

У кого опыт подскажите в какую сторону капать.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление через блютуз контроллером TXT

Сообщение Mr.Kubikus »

Добрый день!

При подключении к контроллеру TXT через беспроводной интерфейс Bluetooth он отображается в Windows как отдельный сетевой интерфейс. Адрес контроллера в этом режиме - 192.168.9.2. С ним можно работать через ROBO Pro или через API из программы, написанной на Python или C/С++.

Можете описать вашу задачу? Как вы планируете использовать Bluetooth?
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 38
Зарегистрирован: 19 окт 2021, 12:38

Re: Управление через блютуз контроллером TXT

Сообщение Muaed »

Я хочу использовать для управление с телефона. Я написал программу который отсылает команды через блютуз.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление через блютуз контроллером TXT

Сообщение Mr.Kubikus »

В контроллере TXT для связи через Bluetooth используется профиль Personal Area Network (PAN). Если в вашем телефоне поддерживается такой профиль, то тогда можно реализовать обмен данными. Подскажите, пожалуйста, какой телефон и какая операционная система у вас?
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 38
Зарегистрирован: 19 окт 2021, 12:38

Re: Управление через блютуз контроллером TXT

Сообщение Muaed »

Redmi Note 6 Pro. Android 8.1.0
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление через блютуз контроллером TXT

Сообщение Mr.Kubikus »

На официальном сайте указано, что ваш телефон поддерживает версию 5.0 стандарта Bluetooth. Это хорошо. Скорее всего ваш тлф поддерживает профили PAN или SPP. Связаться с TXT можно будет по любому из двух:
* PAN - Personal Area Networking Profile
* SPP - Serial Port Profile

Примеры реализации обмена данными через Bluetooth для ОС Android:
* Ведение
* Обмен через профиль PAN
* Обмен через профиль SPP

Вы можете показать ваш исходный код? Тогда будет ясно куда двигаться дальше.
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 38
Зарегистрирован: 19 окт 2021, 12:38

Re: Управление через блютуз контроллером TXT

Сообщение Muaed »

Код: Выделить всё

//Called when application is started.
var sum = "";
function OnStart()
{
   
   app.SetOrientation( "Portrait" );
    //Create the main layout
    layHeader=app.CreateLayout("Absolute","Vertical");
    text1=app.CreateText("Пульт",1,0.1,"Center");
    text2=app.CreateText("блютуз - ардуино",1,0.1,"Center");
    text1.SetPadding(0,0.0,0,0);
    text1.SetTextSize(20);
    text2.SetPadding(0,0.05,0,0);
    text2.SetTextSize(20);
    text1.SetBackground("/Sys/Img/BlueBack.jpg");
    layHeader.AddChild(text1);
    layHeader.AddChild(text2);
    
    
    lst = app.CreateList( "Список обнаруженных bluetuuth", 0.9, 0.4 );
    lst.SetPosition(0.06,0.1,0.9,0.25);
    lst.SetBackColor( "black" );
    lst.SetOnTouch( lst_OnTouch );
    layHeader.AddChild( lst );
    
    //Get a list of paired devices into listview.
    var devices = app.GetPairedBtDevices();
	for( d in devices) 
	    lst.AddItem( devices[d].name, devices[d].address );
	bt = app.CreateBluetoothSerial();
	bt.SetOnConnect( bt_OnConnect )
	bt.SetOnReceive( bt_OnReceive );
	bt.SetSplitMode( "End", "\n" );
    
    
    
    
    
    
    
    
    
    
    
   btn1=app.CreateButton("[fa-bars]",-1,-1,"FontAwesome");
   btn1.SetPosition(0,0,0.18,0.1);
   btn1.SetOnTouch(btn1_OnTouch);
   btn1.SetTextSize(30);
   layHeader.AddChild(btn1);
    
   btn2=app.CreateButton("[fa-close]",-1,-1,"FontAwesome");
   btn2.SetOnTouch(btn2_OnTouch);
   btn2.SetTextSize(30);
   btn2.SetPosition(0.82,0,0.18,0.10);
   layHeader.AddChild(btn2);
    
  


//============

 lay1th = app.CreateLayout( "linear", "Horizontal" );
    lay1th.SetPosition(0.05,0.46,0.9,0.4);
	AddButton( lay1th, "c" );
	layHeader.AddChild( lay1th );
	





//Создаём изображение стрелки вперёд шириной 0.15 ширины экрана
    imgFwd = app.CreateImage( "/Sys/Img/Forward.png", 0.15 );    
     imgFwd.SetPosition( 0.43,0.68 );
   imgFwd.SetOnTouch( imgFwd_OnTouch );     
    layHeader.AddChild( imgFwd ); 
    
	
    
	//Создаём изображение стрелки влево
    imgLeft = app.CreateImage( "/Sys/Img/Left.png", 0.15 );    
    imgLeft.SetPosition( 0.23,0.77 );
    imgLeft.SetOnTouch( imgLeft_OnTouch );     
    layHeader.AddChild( imgLeft ); 
    
	//Создаём изображение стрелки вправо
    imgRight = app.CreateImage( "/Sys/Img/Right.png", 0.15 ); 
    imgRight.SetPosition( 0.64,0.77 );
    imgRight.SetOnTouch( imgRight_OnTouch );     
    layHeader.AddChild( imgRight );
    
	//Создаём изображение кнопки назад
    imgRev = app.CreateImage( "/Sys/Img/Reverse.png", 0.15 ); 
    imgRev.SetPosition( 0.43,0.87 );
    imgRev.SetOnTouch( imgRev_OnTouch );     
    layHeader.AddChild( imgRev ); 
    
    //Добавляем слой к программе
   
   //Создаём изображение стрелки вперёд шириной 0.15 ширины экрана
    imgFwd1 = app.CreateImage( "/Sys/Img/Forward.png", 0.15 );    
     imgFwd1.SetPosition( 0.2,0.42 );
   imgFwd1.SetOnTouch( imgFwd1_OnTouch );     
    layHeader.AddChild( imgFwd1 ); 
    
   	//Создаём изображение кнопки назад
    imgRev1 = app.CreateImage( "/Sys/Img/Reverse.png", 0.15 ); 
    imgRev1.SetPosition( 0.2,0.55 );
    imgRev1.SetOnTouch( imgRev1_OnTouch );     
    layHeader.AddChild( imgRev1 ); 
   
   
    //Создаём изображение стрелки вперёд шириной 0.15 ширины экрана
    imgFwd2 = app.CreateImage( "/Sys/Img/Forward.png", 0.15 );    
     imgFwd2.SetPosition( 0.65,0.42 );
   imgFwd2.SetOnTouch( imgFwd2_OnTouch );     
    layHeader.AddChild( imgFwd2 ); 
    
   	//Создаём изображение кнопки назад
    imgRev2 = app.CreateImage( "/Sys/Img/Reverse.png", 0.15 ); 
    imgRev2.SetPosition( 0.65,0.55 );
    imgRev2.SetOnTouch( imgRev2_OnTouch );     
    layHeader.AddChild( imgRev2 ); 
   
   
    //Создаём слайдер
    skb = app.CreateSeekBar( 0.8 );
    skb.SetOnTouch( skb_OnTouch );
    skb.SetPosition( 0.05,0.35 );
    skb.SetRange( 1.25 );
    skb.SetValue( 0.5 );
    layHeader.AddChild( skb );
    
   
   
   
   
   
   CreateDrawer();
   
   
   
   
   
   
    
    app.AddDrawer( drawerScroll, "Left", drawerWidth );
    
    app.AddLayout( layHeader );
}

function btn1_OnTouch()
{
var c=confirm("Exit app?");
if(c)
{
    app.Exit();
    
}}   

function btn2_OnTouch()
{
var c=confirm("Закрыть");
if(c)
{
    app.Exit();
    
}}   
    
function lst_OnTouch( title, body, type, index )
{
    app.ShowProgress( "Connecting..." );
    bt.Connect( body );
    lst.SelectItemByIndex( index );
}

function bt_OnConnect( ok )
{
    app.HideProgress();
    
    if( ok ) { 
        app.ShowPopup( "Connected!" ); 
    }
    else { 
        app.ShowPopup( "Failed to connect!" );
        lst.SelectItemByIndex( -1 );
    }
}


function bt_OnReceive( data )
{
    app.ShowPopup( data );
}

 function AddButton( lay, name )
{
    
	btn = app.CreateButton( name, 0.17, 0.08, "Alum" );
	btn.SetTextSize(20);
	
	btn.SetOnTouch( btns_OnTouch );
	lay.AddChild( btn );
}
   
function btns_OnTouch()
{
	app.Vibrate( "0,100" );
	
	//Get button text.
	btn = this;
	var txt = btn.GetText(); 
   bt.Write( txt + "\n" );
	//Handle equals button.
	//if( txt=="=" ) CalcResult();
}

//*******************************
function btn1_OnTouch()
{
app.OpenDrawer();
} 
//Создаёт содержимое выдвижного меню
function CreateDrawer()
{
	//Создаём слой для выдвижного меню
    //(Помещаем слой внутрь скроллера, чтобы большие меню помещались полностью)
	drawerWidth = 0.75;
    drawerScroll = app.CreateScroller( drawerWidth, 1 );
    drawerScroll.SetBackColor( "White" );
	layDrawer = app.CreateLayout( "Linear", "Left" );
	drawerScroll.AddChild( layDrawer );
	
	//Создаём слой сверху выдвижного меню
	layDrawerTop = app.CreateLayout( "Absolute" );
	layDrawerTop.SetBackground( "/Sys/Img/GreenBack1.png" );
	layDrawerTop.SetSize( drawerWidth, 0.23 );
	layDrawer.AddChild( layDrawerTop );
	
	//Добавляем иконку на верхний слой
	var img = app.CreateImage( "/Sys/Img/Icon.png", 0.15 );
	img.SetPosition( drawerWidth*0.06, 0.04 );
	layDrawerTop.AddChild( img );
	
	//Добавляем имя пользователя на верхний слой
	var txtUser = app.CreateText( "Dave Smart",-1,-1,"Bold");
	txtUser.SetPosition( drawerWidth*0.07, 0.155 );
	txtUser.SetTextColor( "White" );
	txtUser.SetTextSize( 13.7, "dip" );
	layDrawerTop.AddChild( txtUser );
	
	//Добавляем электронный адрес на верхний слой
	txtEmail = app.CreateText( "david@droidscript.org");
	txtEmail.SetPosition( drawerWidth*0.07, 0.185 );
	txtEmail.SetTextColor( "#bbffffff" );
	txtEmail.SetTextSize( 14, "dip" );
	layDrawerTop.AddChild( txtEmail );
	
	//Создаём слой для меню
	var layMenu = app.CreateLayout( "Linear", "Left" );
	layDrawer.AddChild( layMenu );
	
	//Добавляем список на слой меню (с опцией "Menu")
    var listItems = "Главное::[fa-home],Пользователи::[fa-users],Акции::[fa-tag]";
    lstMenu1 = app.CreateList( listItems, drawerWidth, -1, "Menu,Expand" );
    lstMenu1.SetColumnWidths( -1, 0.35, 0.18 );
    lstMenu1.SelectItemByIndex( 0, true );
    lstMenu1.SetItemByIndex( 0, "Главное");
    lstMenu1.SetOnTouch( lstMenu_OnTouch );
    layMenu.AddChild( lstMenu1 );
    
	//Добавляем разделитель на слой меню
    var sep = app.CreateImage( null, drawerWidth,0.001,"fix", 2,2 );
    sep.SetSize( -1, 1, "px" );
    sep.SetColor( "#cccccc" );
    layMenu.AddChild( sep );
    
	//Добавляем заголовок между списками
	txtTitle = app.CreateText( "Все ярлыки",-1,-1,"Left");
	txtTitle.SetTextColor( "#666666" );
	txtTitle.SetMargins( 16,12,0,0, "dip" );
	txtTitle.SetTextSize( 14, "dip" );
	layMenu.AddChild( txtTitle );
	
	//Добавляем второй список на слой меню
    var listItems = "Избранное::[fa-star],Важное::[fa-flag],Настройки::[fa-cog]";
    lstMenu2 = app.CreateList( listItems, drawerWidth, -1, "Menu,Expand" );
    lstMenu2.SetColumnWidths( -1, 0.35, 0.18 );
    lstMenu2.SetOnTouch( lstMenu_OnTouch );
    layMenu.AddChild( lstMenu2 );
}


//Вызывается при выборе элемента меню
function lstMenu_OnTouch( title, body, type, index )
{
	//Закрываем выдвижное меню
    app.CloseDrawer( "Left" );
    
	//Подсвечиваем выбранный элемент меню
    if( this==lstMenu1 ) lstMenu2.SelectItemByIndex(-1);
    else lstMenu1.SelectItemByIndex(-1);
    this.SelectItemByIndex( index, true );
    
    app.ShowPopup( title );
}


//Вызывается при открытии или закрытии выдвижного меню
function OnDrawer( side, state )
{
    console.log( side + " : " + state );
}


//Вызывается при нажатии аппаратной кнопки меню
function OnMenu( name )
{  
   app.OpenDrawer();
}
    
function imgFwd_OnTouch( e )
{
	//Если палец опустился на стрелку
	if ( e.action=="Down" ) 
	{
	 bt.Write("Forward" );		      
	} 
	else if ( e.action=="Up" ) 
	{
	bt.Write("Stop" );
	}
}

function imgRev_OnTouch( e )
{ 
	if ( e.action=="Down" ) 
	{
	 bt.Write("Backward" );		      
	} 
	else if ( e.action=="Up" ) 
	{
	bt.Write("Stop" );
	}   
 }
//Вызывается по нажатию кнопки влево
function imgLeft_OnTouch( e )
{   
    if ( e.action=="Down" ) 
    {
       bt.Write("Left" );  
    } 
    else if ( e.action=="Up" ) 
    {
       bt.Write("Stop" );
    }
}

//Вызывается по нажатию кнопки вправо
function imgRight_OnTouch( e )
{ 
    if( e.action=="Down" ) 
    {
       bt.Write("Right" );    
    } 
    else if ( e.action=="Up" ) 
    {
       bt.Write("Stop" );
    }
}

function imgFwd1_OnTouch( e )
{
    	if ( e.action=="Down" ) 
	{
	 bt.Write("u");		      
	} 
	else if ( e.action=="Up" ) 
	{
	bt.Write("o");
	}   
	
}

function imgRev1_OnTouch( e )
{ 
	if ( e.action=="Down" ) 
	{
	 bt.Write("p");		      
	} 
	else if ( e.action=="Up" ) 
	{
	bt.Write("o");
	}   
 }
 
 function imgFwd2_OnTouch( e )
{
	//Если палец опустился на стрелк
	
	if ( e.action=="Down" ) 
	{
	 bt.Write("+");		      
	} 
	else if ( e.action=="Up" ) 
	{
	bt.Write("k");
	}   
	
}

function imgRev2_OnTouch( e )
{ 
    
  	if ( e.action=="Down" ) 
	{
	 bt.Write("-");		      
	} 
	else if ( e.action=="Up" ) 
	{
	bt.Write("k");
	}   
  } 
    
    
  function skb_OnTouch( value )
{
    app.ShowPopup( "Значение = " + value );
    value=value*200;
    	bt.Write("Speed" + value);
    
}
  
    

 
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление через блютуз контроллером TXT

Сообщение Mr.Kubikus »

Ok. Вижу, что это JavaScript. Верно? Поясните, как вы запускаете ваше приложение, написанное на JavaScript, на телефоне? Наверное вы используете какую-то специальную среду исполнения, которая выполняет ваш код?
С уважением, Григорий
GitHub FB ВК
Muaed
Сообщения: 38
Зарегистрирован: 19 окт 2021, 12:38

Re: Управление через блютуз контроллером TXT

Сообщение Muaed »

С помощью программы DroidScript перевожу в apk файл и устанавливаю на андроид.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление через блютуз контроллером TXT

Сообщение Mr.Kubikus »

Ясно. Предлагаю реализовать управление с использованием технологии Bluetooth PAN. Для этого нам понадобятся две программы - сервер и клиент. Сервер будет работать на контроллере, а клиент, выполняющийся на телефоне, будет подключаться к этому серверу через радиолинию Bluettoh.

Заготовка для клиента у вас уже есть. Надо будет её немного изменить. Сервер для контроллера придется написать на питоне или C/С++.

Прежде чем мы перейдем к разработке ПО надо убедиться, что ваш телефон может подключаться к TXT через Bluettoth с использованием профиля Bluetooth PAN чтобы использовать контроллер как точку доступа к сети. Для проверки предлагаю выполнить следующие шаги:

На контроллере TXT:
1.1 Включить интерфейс Bluetooth
1.2 Включить встроенный HTTP-сервер согласно инструкции.

На телефоне:
2.1 Отключить обмен данными через мобильную сеть
2.2 Включить интерфейс Bluetooth
2.3 Выполнить поиск устройств в сети Bluettoh и подключиться к контроллеру TXT
2.4 В настройках подключения к TXT включить режим "Доступ к интернету". У вас этот пункт может называться по другому.
2.5 Запустить браузер в телефоне и отрыть страницу с адресом http://192.168.9.2
2.6 Вы должны увидеть страницу файлового менеджера контроллера TXT.

Если вы дошли до пункта 2.6 значит можно двигаться дальше.
С уважением, Григорий
GitHub FB ВК
Ответить