EthTCPclient_05

main.cpp

Committer:
markoc
Date:
2020-02-15
Revision:
1:10e2a0bef1b4
Parent:
0:b01306ccbbe1
Child:
2:4deba4264f65

File content as of revision 1:10e2a0bef1b4:

/* mbed Microcontroller Library
 * Copyright (c) 2019 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"
#include "platform/mbed_thread.h"

#include "EthernetInterface.h"

#include <stdio.h>
#include <string.h>
#include <sstream>
#include <iostream>
#include "TCPSocket.h"


void putOnDispNo(int broj, char boja);
void putOnDisp(char *s, char boja);
void requestMessageThread(struct s_rm *s);
void slanjefun();

#define IP_ADDR   "192.168.2.11"
#define NET_MASK  "255.255.248.0"
#define GATW_ADDR "192.168.1.1"
#define IP_ADDR_R "192.168.1.9"



EthernetInterface eth;
nsapi_error_t err;

char * extract_string( char delimiter, char *ulazni_str, int n_str );
void putOnDisp( char *s, char boja);

int strcount( char *ps)
{
 int i=0;
  for(i=0; ps[i] != 0; i++);
  return i;   
}

void tcpThread_fun( EthernetInterface *e);
void requestMessage( EthernetInterface *e);

 DigitalOut tast(PTB19,0);               
//RawSerial rs485(PTC17,PTC16);           
RawSerial rs485(PTD3,PTD2);

struct s_rm
{
    EthernetInterface *e;
    SocketAddress *sa;
    char *tx_msg;
    void (*fun_rec)(char*);
};

char crm_req[]={'{','1','|','1','}'};//"{1|1}";
char crm_resp[100];
void crm_fun( char *rx)
{
  printf("crm_resp: %s\n\r",rx);
  strcmp(crm_resp, rx);
}

char srm_req[]="{5|1|1}";
void srm_fun( char *rx )
{
   printf("srm_resp: %s\n\r",rx);
   char *strno= extract_string(';',rx, 2);
   char boja = 0;
   if(atoi(strno) == 0) { boja = 1; }
   else if(atoi(strno) >0 && atoi(strno)<5) { boja = 4; }
   else { boja = 2; }
   printf("broj: %d - boja: %d\n\r", atoi(strno),boja);
   putOnDisp((char*)strno, boja);
}




int main(void)
{
   

 
 rs485.format(8, mbed::RawSerial::Even, 1);
 
    Thread t;
 //   t.start( slanjefun );

 
 
     if( (err = eth.set_network(IP_ADDR,NET_MASK,GATW_ADDR))!= NSAPI_ERROR_OK )  { printf(" greska setovanja mreze %d \n\r", err); return 1; }    
     if( (err = eth.connect())  != NSAPI_ERROR_OK )  { printf(" greska konekcije %d \n\r", err); return 1; }
    
    const char *ip = eth.get_ip_address() ;
    
    
   printf( "MAC adresa: %s\n\r", eth.get_mac_address() );
    printf( "IP adresa:  %s\n\r", ip);
    printf( "net mask:   %s\n\r", eth.get_netmask() );
    printf( "GW adresa:  %s\n\r", eth.get_gateway() );
 
    SocketAddress sa("192.168.2.254", 12197);
 
 struct s_rm s_crm ={ &eth, &sa, crm_req, crm_fun }; 
 struct s_rm s_srm ={ &eth, &sa, srm_req, srm_fun }; 
    
//    Thread TCPThread;
//    TCPThread.start( callback( tcpThread_fun, &eth ));
    
    
      Thread CRMThread;
      CRMThread.start( callback( requestMessageThread, &s_crm ));
      CRMThread.join();
    int i=0;
  
    while(true)
    {
      thread_sleep_for(10000);
      Thread SRMThread;
      printf("Thread id= %d\n\r",(int)&SRMThread);
      SRMThread.start( callback( requestMessageThread, &s_srm ));
      SRMThread.join();
      printf("main %d\n\r",i++);
    }
 //   printf("\n\rmain: Kraj, error=%d\n\r",err);    fflush(stdout);
}




    unsigned char sendBuffer[]= "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\nMarko je ovde";                  // HTTP Message Body, length = 11
unsigned char sb[1000]="HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n";



unsigned char txbuf[100]="test konekcije";
unsigned char rxbuf[100];

void tcpThread_fun( EthernetInterface *e)
{

    TCPSocket tcpSocket;  
    nsapi_error_t err=NULL;      
    SocketAddress sa("192.168.1.26", 12197);
    printf("ip= %s, ver= %d, port= %d\n\r", sa.get_ip_address(), sa.get_ip_version(), sa.get_port() ); 
    int i=1;
    
    while(true)
    {
     if((err=tcpSocket.open( e )) ==0 )        
     {
        if((err = tcpSocket.connect(sa)) == 0)
        {
            while( true)
            {
                printf("iteracija %d   \n\r", i);
                    if(strcount((char*)txbuf) )
                    {
                        printf(" za slanje %d bajtova: %s\n\r", strcount((char*)txbuf), txbuf);
                        if( (err = tcpSocket.send(txbuf,strcount((char*)txbuf))<0 ) )   {    printf("send err %d\n\r", err); break; }
                        else(" poslano %d bajtova od: %s\n\r", err, txbuf);
                        memset(txbuf, 0, sizeof(txbuf) );
                    }
                    else
                    {
                        if( (err = tcpSocket.recv(rxbuf,sizeof(rxbuf)) <0 )) {    printf("recv err %d\n\r", err); break;  }
                        else                                                 
                        {
                          
                                printf(" prim tel %d: %s\n\r", err, rxbuf) ; 
                                {
                                  extern  void putOnDisp(char *, char );
                                     putOnDisp((char*)rxbuf, 1);
                                }
                                memcpy(txbuf, rxbuf, sizeof(txbuf) );
                                memset(rxbuf, 0, sizeof(rxbuf)); 
                        } 
                    }
                 printf("kraj iteracije %d   \n\r", i++);
                 fflush(stdout);
            }
        }
        else printf("greska otvaranja konekcije %d\n\r", err);
      }
      else printf("greska otvaranja socketa %d\n\r", err);
      
      printf("zatvaranje konekcije\n\r");
      tcpSocket.close();
      thread_sleep_for(2000);
     }
}

char conf_server_ip[] = "192.168.1.26";
int conf_server_port = 12197;
unsigned char msg_request_message[] = "{5|1|1;2}";
unsigned char msg_catalogue_request_message[] = "{1|1}";




void requestMessage(EthernetInterface *e)
{
    
    while(true)
    {
        
        TCPSocket tcpSocket;  
        nsapi_error_t err=NULL;      
        SocketAddress sa(conf_server_ip, conf_server_port);
        char rxbuf[1024];
        memset(rxbuf, 0, sizeof(rxbuf)); 
        if((err=tcpSocket.open( e )) ==0 )        
        {
            if((err = tcpSocket.connect(sa)) == 0)
            {
                if( (err = tcpSocket.send(msg_request_message,strcount((char*)msg_request_message))<0 ) )   
                {    
                    printf("requestMessage - send err: %d\n\r", err);
                }
                else
                {
                    printf("requestMessage - poslano: %d bajtova od: %s\n\r", err, msg_request_message);
                    if( (err = tcpSocket.recv(rxbuf,sizeof(rxbuf)) <0 )) {    printf("requestMessage - recv err %d\n\r", err); }
                    else                                                 
                    {
                      
                            printf("requestMessage - prim tel %d: %s\n\r", err, rxbuf) ; 
                            
//                            char* parts[100];
//                            int partcount = 0;
//                            
//                            parts[partcount++] = rxbuf;
//                            
//                            char* ptr = rxbuf;
//                            while(*ptr) { //check if the string is over
//                                if(*ptr == ';') {
//                                    *ptr = 0;
//                                    parts[partcount++] = ptr + 1;
//                                }
//                                ptr++;
//                            }
                            
                            extern char * extract_string( char delimiter, char *ulazni_str, int n_str );

                            char *strno= extract_string(';',rxbuf, 2);
                            printf("%s\n\r",strno);
                            int color = 0;
                            int brojMesta = atoi(strno);
                            printf("Broj mesta: %d\n\r",brojMesta);
                            if (brojMesta==0) { color=1; }
                            else if(brojMesta>0&&brojMesta<10){ color=4; }
                            else { color=2; }
                            printf("Color: %d\n\r",color);
                            {
                              extern  void putOnDisp(char *, char );
                                 putOnDisp((char*)strno, color);
                            } 
                    } 
                }
            }
            
            printf("requestMessage - zatvaranje konekcije\n\r");
            tcpSocket.close();
        }
        
      thread_sleep_for(30000);
    }
    
}   

//
//struct s_rm
//{
//    EthernetInterface *e;
//    SocketAddress *sa;
//    char *tx_msg;
//    void (*fun_rec)(char*);
//};


void requestMessageThread(struct s_rm *s)
{
        
        TCPSocket tcpSocket;  
        nsapi_error_t err=NULL;      
        char rxbuf[1024];
        memset(rxbuf, 0, sizeof(rxbuf)); 
        if((err=tcpSocket.open( s->e )) ==0 )        
        {
            if((err = tcpSocket.connect(*(s->sa))) == 0)
            {
                char *ss = s->tx_msg;
                if( (err = tcpSocket.send(s->tx_msg,strcount(ss))<0 ) )   
                {    
                    printf("requestMessage - send err: %d\n\r", err);
                }
                else
                {
                    printf("requestMessage - poslano: %d bajtova od: %s\n\r", err, s->tx_msg);
                    if( (err = tcpSocket.recv(rxbuf,sizeof(rxbuf)) <0 )) {    printf("requestMessage - recv err %d\n\r", err); }
                    else                                                 
                    {
                      
                            printf("requestMessage - prim tel %d: %s\n\r", err, rxbuf) ; 
                            s->fun_rec( rxbuf );                            
                    } 
                }
            }
            
            printf("requestMessage - zatvaranje konekcije\n\r");
            tcpSocket.close();
        }
    
}   

//
//enum nsapi_error {
//    NSAPI_ERROR_OK                  =  0,        /*!< no error */
//    NSAPI_ERROR_WOULD_BLOCK         = -3001,     /*!< no data is not available but call is non-blocking */
//    NSAPI_ERROR_UNSUPPORTED         = -3002,     /*!< unsupported functionality */
//    NSAPI_ERROR_PARAMETER           = -3003,     /*!< invalid configuration */
//    NSAPI_ERROR_NO_CONNECTION       = -3004,     /*!< not connected to a network */
//    NSAPI_ERROR_NO_SOCKET           = -3005,     /*!< socket not available for use */
//    NSAPI_ERROR_NO_ADDRESS          = -3006,     /*!< IP address is not known */
//    NSAPI_ERROR_NO_MEMORY           = -3007,     /*!< memory resource not available */
//    NSAPI_ERROR_NO_SSID             = -3008,     /*!< ssid not found */
//    NSAPI_ERROR_DNS_FAILURE         = -3009,     /*!< DNS failed to complete successfully */
//    NSAPI_ERROR_DHCP_FAILURE        = -3010,     /*!< DHCP failed to complete successfully */
//    NSAPI_ERROR_AUTH_FAILURE        = -3011,     /*!< connection to access point failed */
//    NSAPI_ERROR_DEVICE_ERROR        = -3012,     /*!< failure interfacing with the network processor */
//    NSAPI_ERROR_IN_PROGRESS         = -3013,     /*!< operation (eg connect) in progress */
//    NSAPI_ERROR_ALREADY             = -3014,     /*!< operation (eg connect) already in progress */
//    NSAPI_ERROR_IS_CONNECTED        = -3015,     /*!< socket is already connected */
//    NSAPI_ERROR_CONNECTION_LOST     = -3016,     /*!< connection lost */
//    NSAPI_ERROR_CONNECTION_TIMEOUT  = -3017,     /*!< connection timed out */
//};





void ev(int){tast=0;}

unsigned char buf_tel[100] = {0x71,0x00,0x0D,0x71,0x43,0x01,0x1B,0x4A,0x01,0x01,0x1B,0x43,1,0x33,0xD5,0x16};
void putOnDisp( char *s, char boja)
{
    int ubb = 13+strlen(s)+1+1-4-2; // ubb = ukupan broj bajtova
    unsigned char lh, ll;
    ll=ubb;
    lh=ubb>>8;
    printf("Boja: %d\n\r",boja);
    buf_tel[12]=boja;
    memcpy(buf_tel+13, s, strlen(s)+2);
    
    int suma=0;
    for(int i = 4; i < 13+strlen(s); i++) {
        suma +=buf_tel[i]; 
    }
    
    buf_tel[13+strlen(s)] = suma;
    buf_tel[13+strlen(s)+1] = 22;
    buf_tel[1]=lh;
    buf_tel[2]=ll;
   
    fflush(stdout);
    
    tast=1;
    rs485.write(buf_tel, 21,ev);
}
void putOnDispNo(int broj, char boja)
{
     char s[10];
    sprintf( s, "%d", broj);  
    putOnDisp( s, boja); 
}


void slanjefun(){
    
    int j=0;
    

    while (true) {
 //       printf("disp thred %d\n\r",j);
        if(j >10 && j<15 ) putOnDisp("des",1);
        else putOnDispNo(j,1);
        j++;
        thread_sleep_for(1000);
    }
}


char * extract_string( char delimiter, char *ulazni_str, int n_str )
{
  int br_str=0;
  char *ret_str=ulazni_str;
  char* ptr = ulazni_str;
                            
    while(*ptr) 
    { 
        if(*ptr == delimiter) 
        {
           *ptr = 0;
           if( br_str == n_str )   return ret_str;
           else
           {
              br_str++;
              ret_str = ptr + 1;
           }
        }
        ptr++;
    }
    if( br_str == n_str )   return ret_str;
    return NULL;
}