LM005A Lora Module test

Dependents:   LoRaTest OnenetTest

Revision:
1:0cad46274201
diff -r 5b5a1b5f1ae4 -r 0cad46274201 BC95B/BC95B.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BC95B/BC95B.cpp	Tue Jul 31 02:55:28 2018 +0000
@@ -0,0 +1,287 @@
+/* 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;
+        };
+