LM005A Lora Module test

Dependents:   LoRaTest OnenetTest

BC95B/BC95B.cpp

Committer:
yao6116601
Date:
2018-07-31
Revision:
1:0cad46274201

File content as of revision 1:0cad46274201:

/* BC95B oneNet Application 
* reference document:Quectel_BC95_OneNET_Application_Note_V1.2.pdf
* By modular-2 team 2018/7/26
*/

#include "BC95B.h"

#define   BC95B_DEFAULT_BAUD_RATE   9600
#define READ 0
#define WRITE 1
#define DISCOVER 2
BC95B::BC95B(PinName tx, PinName rx, bool debug)
    : _serial(tx, rx, BC95B_DEFAULT_BAUD_RATE), 
      _parser(&_serial),
      _fail(false)
{
    _serial.set_baud( BC95B_DEFAULT_BAUD_RATE );
    _parser.debug_on(debug);
    _parser.set_delimiter("\r\n");
     _parser.oob("+MIPLWRITE:", callback(this, &BC95B::_write_handler));
     _parser.oob("+MIPLREAD:", callback(this, &BC95B::_read_handler));
     _parser.oob("+MIPLOBSERVE:", callback(this, &BC95B::_obs_handler));
    _parser.oob("+MIPLDISCOVER:", callback(this, &BC95B::_discover_handler));
}

const char * BC95B::get_firmware_version()
{   
        if (!(_parser.send("AT+MIPLVER?")
        && _parser.recv("+MIPLVER:%s\n",buffer)
        && _parser.recv("OK"))) {
        return NULL;
    }
   return buffer;
    
}
const char * BC95B::get_imei()
{   
        if (!(_parser.send("AT+CGSN=1")
        && _parser.recv("+CGSN:%s\n",buffer)
        && _parser.recv("OK"))) {
        return NULL;
    }
   return buffer;
    
}
const char * BC95B::get_imsi()
{   
        if (!(_parser.send("AT+CIMI")
        && _parser.recv("%s\n",buffer)
        && _parser.recv("OK"))) {
        return NULL;
    }
   return buffer;
    
}
bool BC95B::get_SignalStrength(int* rssi,int* ber)
{   
        if (!(_parser.send("AT+CSQ")
        && _parser.recv("+CSQ:%d,%d\n",rssi,ber)
        && _parser.recv("OK"))) {
        return false;
    }
   return true;
    
}
int BC95B::create_suite()
{   int result;
        if (!(_parser.send("AT+MIPLCREATE")
        && _parser.recv("+MIPLCREATE:%d",&result)
        && _parser.recv("OK"))) {
        return -1;
    }
   return result;
    
}
bool BC95B::create_object(int ch,const int name,int insCount,const char * bitmap,int attrCount,int actCount)
{
   
        if (!(_parser.send("AT+MIPLADDOBJ=%d,%d,%d,\"%s\",%d,%d",ch,name,insCount,bitmap,attrCount,actCount)
        && _parser.recv("OK"))) {
        return false;
    }
   return true; 
   }
bool  BC95B::register_request(int ref,int lifetime,int timeout)
 {
         if (!(_parser.send("AT+MIPLOPEN=%d,%d,%d",ref,lifetime,timeout)
        && _parser.recv("OK") 
        && _parser.recv("+MIPLEVENT: 0,1") 
        && _parser.recv("+MIPLEVENT: 0,2") 
        && _parser.recv("+MIPLEVENT: 0,4") 
        && _parser.recv("+MIPLEVENT: 0,6")))
         {
        return false;
    }
   return true; 
     } 
/*bool BC95B::respond_discover(int ref,int result ,int length,char *valuestring)
{
         if (!(_parser.send("AT+MIPLDISCOVERRSP=%d,%s,%d,%d,%S",ref,msg,result,length,valuestring)
        && _parser.recv("OK"))){
            return false;
            } 
            return true;
    } */
bool BC95B::delete_object(int ref,const char * objid)
{
        if (!(_parser.send("AT+MIPLDELOBJ=%d,%s",ref,objid)
        && _parser.recv("OK"))){
            return false;
            } 
            return true;
    } 
bool BC95B::deregister(int ref)
{
        if (!(_parser.send("AT+MIPLCLOSE=%d",ref)
        && _parser.recv("OK"))){
            return false;
            } 
            return true;
    } 
bool BC95B::notify_resource(int ref,int objid,int ins,int resid,int valueType,int len,const char * value,int index,int flg)
{  
if (!(_parser.send("AT+MIPLNOTIFY=%d,%d,%d,%d,%d,%d,%d,%s,%d,%d", ref,obsmsg,objid,ins,resid,valueType,len,value,index,flg)
        && _parser.recv("OK"))){
            return false;
            } 
            return true;
    }
                 
bool BC95B::init(void)
{   
    if (!_parser.recv("Bootup Completed!!!"))
    return false;
    return true;
      }
bool BC95B::reset(void)
{
        if (!(_parser.send("AT+NRB")
        &&_parser.recv("REBOOTING"))) {
        return false;
    }  
  return true;
}
 
   


/*
+MIPLWRITE--平台下发的写指令
+MIPLWRITE: <ref>,<msgId>,<objI d>,<insId>,<resId>,<valueType>,<len>,<value>,<flag>,<index> 
response:
AT+MIPLWRITERSP=<ref>,<msgId>,< result> 
*/


void BC95B::_write_handler()
{   
  if (!(_parser.recv("%d,%d,%d,%d,%d,%d,%d,",&ref,&msg,&objId,&insId,&resId,&valueType,&len)
     && _parser.read(value,len*2)
     &&_parser.recv(",%d,%d\n",&flag,&index))) {       
        return;
    }    
  
 //  printf("v=%.*s\n",len*2,value);
 currCode=WRITE;
 curr_objId=objId;
 curr_insId=insId;
 curr_resId=resId;
 valueLength=len*2;
    _callback();
    result=2;
    if (! _parser.send("AT+MIPLWRITERSP=%d,%d,%d",ref,msg,result))
   { 
   return;
   }
   
 }
 /*
 +MIPLREAD--平台下发的读指令
 +MIPLREAD: <ref>,<msgId>,<objId>,<insId>, <resId> 
 response:
   AT+MIPLREADRSP=<ref>,<msgId>, <result>[,<objId>,<insId>,<resId>,< valueType>,<len>,<value>,<index>, <flag>] 
 */
 void BC95B::_read_handler()
 { int valueType,len,index,flg;
      if (!_parser.recv("%d,%d,%d,%d,%d\n",&ref,&msg,&objId,&insId,&resId))         
         {
        return  ;
        }
  //getValue(objId,insId,resId);
 //"AT+MIPLREADRSP=%d,%s",ref,msgId,result,objId,insId,resId,valueType,len,value,index,flg)
 currCode=READ;
 curr_objId=objId;
 curr_insId=insId;
 curr_resId=resId;
 _callback();
    len=4;index=0;flg=0;result=1;valueType=currType;
  //  memcpy(value,"3.8",3);
     if (! _parser.send("AT+MIPLREADRSP=%d,%d,%d,%d,%d,%d,%d,%d,%s,%d,%d ",ref,msg,result,objId,insId,resId,valueType,len,value,index,flg))
   { 
   return;
   }
     }
/*
+MIPLOBSERVE: <ref>,<msgId>,<flag>,<objI d>,<insId>,<resId> 
AT+MIPLDISCOVERRSP=<ref>,<msgI d>,<result>[,<length>,<valuestring>] 
*/
void BC95B::_obs_handler()
{   
    if (!_parser.recv("%d,%d,%d,%d,%d,%d\n",&ref,&obsmsg,&flag,&objId,&insId,&resId)) {
        return;
    }
    result=1;
   if (! _parser.send("AT+MIPLOBSERVERSP=%d,%d,%d",ref,obsmsg,result))
     {
         return;
         }  
    }
void BC95B::_discover_handler()
{   
    if (!_parser.recv("%d,%d,%d\n",&ref,&msg,&objId)) {
        return;
    }
   // printf("discover\n");
    currCode=DISCOVER;
    curr_objId=objId;
    _callback();
    result=1;
   if (! _parser.send("AT+MIPLDISCOVERRSP=0,%d,%d,%d,\"%s\"",msg,result,resLength,resNames))
     {
         return;
         }  
    }
bool BC95B::recv()
{
     if (!_parser.process_oob()) {
            return false;
        }
    return true;    
        }

void BC95B::setTimeout(uint32_t timeout_ms)
{
    _parser.set_timeout(timeout_ms);
}

void BC95B::attach(void (*func)(void))
{
    _callback=func;

    }

  int BC95B::getEventCode()
  {  
  return currCode;
      }
  ;
    void BC95B::getCurrentID(long *msgId,int *objId,int *insId,int *resId)
    {
        *msgId=curr_msgId;
        *objId=curr_objId;
        *insId=curr_insId;
        *resId=curr_resId;
        };
    int  BC95B::getCurrentValue(char *buf)
    {
        memcpy(buf,value,valueLength);
       return valueLength;
        };
    int  BC95B::putCurrentValue(int type,char *buf,int length)
    {  
        valueLength= length ;
        currType=type;
         memcpy(value,buf,valueLength);
         return valueLength;
        };
  
  int  BC95B::putCurrentResNames(int type,char *buf,int length)
    { 
        printf("reslength=%d\n",length);
        resLength= length ;
        currType=type;
         memcpy(resNames,buf,resLength);
         return resLength;
        };