у меня следующий вопрос, я пытался подключить Arduino к серверу веб-сокетов, библиотека я использую это:
https://github.com/Links2004/arduinoWebSockets
Arduino получает данные через Modbus, отправляя простой текст на сервер WebSocket, это не сложно, проблема в том, что когда я пытаюсь подключиться к серверу WebSocket, я получаю исключение:
Протокол ошибок: arduino не поддерживается.
Вот код Arduino:
....
Modbus master(0,1,0);
modbus_t telegram;
unsigned long u32wait;
// arreglo de datos para la comunicacion modbus
int16_t au16data[16];
uint8_t u8state;
....
void setup() {
pinMode(pD1, INPUT);
pinMode(pD2, INPUT);
pinMode(pD3, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
Serial.begin(57600);
while(Ethernet.begin(mac) == 0)
Serial.println("Failed to configure Ethernet using DHCP");
webSocket.begin("192.168.1.18", 7500);
webSocket.onEvent(webSocketEvent);
master.begin( 9600 );
master.setTimeOut( 2000 );
u32wait = millis() + 1000;
u8state = 0;
}
void loop() {
// put your main code here, to run repeatedly:
reModbus();
webSocket.loop();
}
.....
void reModbus() {
switch( u8state ) {
case 0:
if (millis() > u32wait){
u8state++; // wait state
Serial.println("[Modbus] modbus request process has been started.");
}
break;
case 1:
telegram.u8id = 21; // slave address
telegram.u8fct = 3; // function code (this one is registers read)
telegram.u16RegAdd = 7000; //3042 3146 start address in slave
telegram.u16CoilsNo = 14; // number of elements (coils or registers) to read
telegram.au16reg = au16data; // pointer to a memory array in the Arduino
master.query( telegram ); // send query (only once)
u8state++;
Serial.println("[Modbus] modbus query has been send.");
break;
case 2:
master.poll(); // check incoming messages
if (master.getState() == COM_IDLE) {
Serial.println("[Modbus] modbus data has been receive.");
u8state = 0;
for (int i=0; i <= 6; i++){
valorsx[i] = convertir(au16data,i*2);
sensorModbus[i] = String(valorsx[i],6);
}
tomadatos1();
TramaE = 'A'+ sValor1
+ 'B' + sValor2
+ 'C' + sD1
+ 'D' + sD2
+ 'E' + sD3
+ 'F' + sensorModbus[0]
+ 'G' + sensorModbus[1]
+ 'H' + sensorModbus[2]
+ 'I' + sensorModbus[3]
+ 'J' + sensorModbus[4]
+ 'K' + sensorModbus[5]
+ 'L' + sensorModbus[6]
+ 'M';
webSocket.sendTXT(TramaE);
u32wait = millis() + 100;
}
break;
}
}
.....
глядя на исходный код библиотеки sgcWebSocket, я использую исключение, бросить в этом месте.
....
{ RequestURL protocol }
private
function DoGetProtocol: string;
{ RequestURL protocol }
....
function TsgcWSConnectionServer.DoGetProtocol: string;
var
i: Integer;
oSProtocols, oCProtocols: TsgcDelimitedStringList;
begin
if FHandshake.Protocols <> '' then
begin
oSProtocols := TsgcDelimitedStringList.Create;
oCProtocols := TsgcDelimitedStringList.Create;
Try
oSProtocols.DelimitedText := Protocol;
oCProtocols.DelimitedText := FHandshake.Protocols;
for i := 0 to oCProtocols.Count - 1 do
begin
if oSProtocols.IndexOf(oCProtocols[i]) > -1 then
begin
Result := oCProtocols[i];
break;
end;
end;
if Result = '' then
raise TsgcWSException.CreateFmt(S_PROTOCOL_UNSUPPORTED,
[oCProtocols.Text]);
Finally
sgcFree(oCProtocols);
sgcFree(oSProtocols);
End;
end;
end;
эта функция является вызовом в момент рукопожатия, я попытался создать суб-протокол, используя пример кода, который есть в документации:
unit ProtocoloArduino;
interface
{$I sgcVer.inc}
{$IFDEF SGC_PROTOCOLS}
uses
sgcWebSocket_Protocol_Base_Server, Classes, sgcWebSocket_Classes;
type
TsgcWSProtocol_Arduino = class(TsgcWSProtocol_Server_Base)
{ from TsgcWSComponent }
protected
procedure DoEventConnect(aConnection: TsgcWSConnection); override;
procedure DoEventMessage(aConnection: TsgcWSConnection; const Text: string); override;
procedure DoEventDisconnect(aConnection: TsgcWSConnection; Code: Integer); override;
{ from TsgcWSComponent }
public
constructor Create(aOwner: TComponent); override;
end;
{$ENDIF}
implementation
{$IFDEF SGC_PROTOCOLS}
constructor TsgcWSProtocol_Arduino.Create(aOwner:TComponent);
begin
inherited;
// ... here add your protocol name
FProtocol := 'arduino';
end;
procedure TsgcWSProtocol_Arduino.DoEventConnect(aConnection:TsgcWSConnection);
begin
inherited;
// ... add your own code when a client connects to server
end;
procedure TsgcWSProtocol_Arduino.DoEventDisconnect(aConnection: TsgcWSConnection; Code: Integer);
begin
// ... add your own code when a client disconnects from server
inherited;
end;
procedure TsgcWSProtocol_Arduino.DoEventMessage(aConnection: TsgcWSConnection; const Text: string);
begin
inherited;
// ... process messages received from clients
// ... you can answer to client using
WriteData(aConnection.Guid, 'your message');
// ... you can send a message to all clients using
BroadCast('your message');
end;
{$ENDIF}
end.
но даже когда я делаю
...
var
PArduino:TsgcWSProtocol_Arduino;
begin
PArduino.Create(self.owner);
ServidorWebSocket.RegisterProtocol(PArduino);
end
...
исключение продолжает появляться …
если кто-то может мне помочь, я был бы благодарен.
Задача ещё не решена.
Других решений пока нет …