LM005A Lora Module test

Dependents:   LoRaTest OnenetTest

Committer:
yao6116601
Date:
Tue Jul 31 02:55:28 2018 +0000
Revision:
1:0cad46274201
BC95B -- For China Mobile oneNet IoT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yao6116601 1:0cad46274201 1 /* BC95B oneNet Application
yao6116601 1:0cad46274201 2 * reference document:Quectel_BC95_OneNET_Application_Note_V1.2.pdf
yao6116601 1:0cad46274201 3 * By modular-2 team 2018/7/26
yao6116601 1:0cad46274201 4 */
yao6116601 1:0cad46274201 5
yao6116601 1:0cad46274201 6 #include "BC95B.h"
yao6116601 1:0cad46274201 7
yao6116601 1:0cad46274201 8 #define BC95B_DEFAULT_BAUD_RATE 9600
yao6116601 1:0cad46274201 9 #define READ 0
yao6116601 1:0cad46274201 10 #define WRITE 1
yao6116601 1:0cad46274201 11 #define DISCOVER 2
yao6116601 1:0cad46274201 12 BC95B::BC95B(PinName tx, PinName rx, bool debug)
yao6116601 1:0cad46274201 13 : _serial(tx, rx, BC95B_DEFAULT_BAUD_RATE),
yao6116601 1:0cad46274201 14 _parser(&_serial),
yao6116601 1:0cad46274201 15 _fail(false)
yao6116601 1:0cad46274201 16 {
yao6116601 1:0cad46274201 17 _serial.set_baud( BC95B_DEFAULT_BAUD_RATE );
yao6116601 1:0cad46274201 18 _parser.debug_on(debug);
yao6116601 1:0cad46274201 19 _parser.set_delimiter("\r\n");
yao6116601 1:0cad46274201 20 _parser.oob("+MIPLWRITE:", callback(this, &BC95B::_write_handler));
yao6116601 1:0cad46274201 21 _parser.oob("+MIPLREAD:", callback(this, &BC95B::_read_handler));
yao6116601 1:0cad46274201 22 _parser.oob("+MIPLOBSERVE:", callback(this, &BC95B::_obs_handler));
yao6116601 1:0cad46274201 23 _parser.oob("+MIPLDISCOVER:", callback(this, &BC95B::_discover_handler));
yao6116601 1:0cad46274201 24 }
yao6116601 1:0cad46274201 25
yao6116601 1:0cad46274201 26 const char * BC95B::get_firmware_version()
yao6116601 1:0cad46274201 27 {
yao6116601 1:0cad46274201 28 if (!(_parser.send("AT+MIPLVER?")
yao6116601 1:0cad46274201 29 && _parser.recv("+MIPLVER:%s\n",buffer)
yao6116601 1:0cad46274201 30 && _parser.recv("OK"))) {
yao6116601 1:0cad46274201 31 return NULL;
yao6116601 1:0cad46274201 32 }
yao6116601 1:0cad46274201 33 return buffer;
yao6116601 1:0cad46274201 34
yao6116601 1:0cad46274201 35 }
yao6116601 1:0cad46274201 36 const char * BC95B::get_imei()
yao6116601 1:0cad46274201 37 {
yao6116601 1:0cad46274201 38 if (!(_parser.send("AT+CGSN=1")
yao6116601 1:0cad46274201 39 && _parser.recv("+CGSN:%s\n",buffer)
yao6116601 1:0cad46274201 40 && _parser.recv("OK"))) {
yao6116601 1:0cad46274201 41 return NULL;
yao6116601 1:0cad46274201 42 }
yao6116601 1:0cad46274201 43 return buffer;
yao6116601 1:0cad46274201 44
yao6116601 1:0cad46274201 45 }
yao6116601 1:0cad46274201 46 const char * BC95B::get_imsi()
yao6116601 1:0cad46274201 47 {
yao6116601 1:0cad46274201 48 if (!(_parser.send("AT+CIMI")
yao6116601 1:0cad46274201 49 && _parser.recv("%s\n",buffer)
yao6116601 1:0cad46274201 50 && _parser.recv("OK"))) {
yao6116601 1:0cad46274201 51 return NULL;
yao6116601 1:0cad46274201 52 }
yao6116601 1:0cad46274201 53 return buffer;
yao6116601 1:0cad46274201 54
yao6116601 1:0cad46274201 55 }
yao6116601 1:0cad46274201 56 bool BC95B::get_SignalStrength(int* rssi,int* ber)
yao6116601 1:0cad46274201 57 {
yao6116601 1:0cad46274201 58 if (!(_parser.send("AT+CSQ")
yao6116601 1:0cad46274201 59 && _parser.recv("+CSQ:%d,%d\n",rssi,ber)
yao6116601 1:0cad46274201 60 && _parser.recv("OK"))) {
yao6116601 1:0cad46274201 61 return false;
yao6116601 1:0cad46274201 62 }
yao6116601 1:0cad46274201 63 return true;
yao6116601 1:0cad46274201 64
yao6116601 1:0cad46274201 65 }
yao6116601 1:0cad46274201 66 int BC95B::create_suite()
yao6116601 1:0cad46274201 67 { int result;
yao6116601 1:0cad46274201 68 if (!(_parser.send("AT+MIPLCREATE")
yao6116601 1:0cad46274201 69 && _parser.recv("+MIPLCREATE:%d",&result)
yao6116601 1:0cad46274201 70 && _parser.recv("OK"))) {
yao6116601 1:0cad46274201 71 return -1;
yao6116601 1:0cad46274201 72 }
yao6116601 1:0cad46274201 73 return result;
yao6116601 1:0cad46274201 74
yao6116601 1:0cad46274201 75 }
yao6116601 1:0cad46274201 76 bool BC95B::create_object(int ch,const int name,int insCount,const char * bitmap,int attrCount,int actCount)
yao6116601 1:0cad46274201 77 {
yao6116601 1:0cad46274201 78
yao6116601 1:0cad46274201 79 if (!(_parser.send("AT+MIPLADDOBJ=%d,%d,%d,\"%s\",%d,%d",ch,name,insCount,bitmap,attrCount,actCount)
yao6116601 1:0cad46274201 80 && _parser.recv("OK"))) {
yao6116601 1:0cad46274201 81 return false;
yao6116601 1:0cad46274201 82 }
yao6116601 1:0cad46274201 83 return true;
yao6116601 1:0cad46274201 84 }
yao6116601 1:0cad46274201 85 bool BC95B::register_request(int ref,int lifetime,int timeout)
yao6116601 1:0cad46274201 86 {
yao6116601 1:0cad46274201 87 if (!(_parser.send("AT+MIPLOPEN=%d,%d,%d",ref,lifetime,timeout)
yao6116601 1:0cad46274201 88 && _parser.recv("OK")
yao6116601 1:0cad46274201 89 && _parser.recv("+MIPLEVENT: 0,1")
yao6116601 1:0cad46274201 90 && _parser.recv("+MIPLEVENT: 0,2")
yao6116601 1:0cad46274201 91 && _parser.recv("+MIPLEVENT: 0,4")
yao6116601 1:0cad46274201 92 && _parser.recv("+MIPLEVENT: 0,6")))
yao6116601 1:0cad46274201 93 {
yao6116601 1:0cad46274201 94 return false;
yao6116601 1:0cad46274201 95 }
yao6116601 1:0cad46274201 96 return true;
yao6116601 1:0cad46274201 97 }
yao6116601 1:0cad46274201 98 /*bool BC95B::respond_discover(int ref,int result ,int length,char *valuestring)
yao6116601 1:0cad46274201 99 {
yao6116601 1:0cad46274201 100 if (!(_parser.send("AT+MIPLDISCOVERRSP=%d,%s,%d,%d,%S",ref,msg,result,length,valuestring)
yao6116601 1:0cad46274201 101 && _parser.recv("OK"))){
yao6116601 1:0cad46274201 102 return false;
yao6116601 1:0cad46274201 103 }
yao6116601 1:0cad46274201 104 return true;
yao6116601 1:0cad46274201 105 } */
yao6116601 1:0cad46274201 106 bool BC95B::delete_object(int ref,const char * objid)
yao6116601 1:0cad46274201 107 {
yao6116601 1:0cad46274201 108 if (!(_parser.send("AT+MIPLDELOBJ=%d,%s",ref,objid)
yao6116601 1:0cad46274201 109 && _parser.recv("OK"))){
yao6116601 1:0cad46274201 110 return false;
yao6116601 1:0cad46274201 111 }
yao6116601 1:0cad46274201 112 return true;
yao6116601 1:0cad46274201 113 }
yao6116601 1:0cad46274201 114 bool BC95B::deregister(int ref)
yao6116601 1:0cad46274201 115 {
yao6116601 1:0cad46274201 116 if (!(_parser.send("AT+MIPLCLOSE=%d",ref)
yao6116601 1:0cad46274201 117 && _parser.recv("OK"))){
yao6116601 1:0cad46274201 118 return false;
yao6116601 1:0cad46274201 119 }
yao6116601 1:0cad46274201 120 return true;
yao6116601 1:0cad46274201 121 }
yao6116601 1:0cad46274201 122 bool BC95B::notify_resource(int ref,int objid,int ins,int resid,int valueType,int len,const char * value,int index,int flg)
yao6116601 1:0cad46274201 123 {
yao6116601 1:0cad46274201 124 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)
yao6116601 1:0cad46274201 125 && _parser.recv("OK"))){
yao6116601 1:0cad46274201 126 return false;
yao6116601 1:0cad46274201 127 }
yao6116601 1:0cad46274201 128 return true;
yao6116601 1:0cad46274201 129 }
yao6116601 1:0cad46274201 130
yao6116601 1:0cad46274201 131 bool BC95B::init(void)
yao6116601 1:0cad46274201 132 {
yao6116601 1:0cad46274201 133 if (!_parser.recv("Bootup Completed!!!"))
yao6116601 1:0cad46274201 134 return false;
yao6116601 1:0cad46274201 135 return true;
yao6116601 1:0cad46274201 136 }
yao6116601 1:0cad46274201 137 bool BC95B::reset(void)
yao6116601 1:0cad46274201 138 {
yao6116601 1:0cad46274201 139 if (!(_parser.send("AT+NRB")
yao6116601 1:0cad46274201 140 &&_parser.recv("REBOOTING"))) {
yao6116601 1:0cad46274201 141 return false;
yao6116601 1:0cad46274201 142 }
yao6116601 1:0cad46274201 143 return true;
yao6116601 1:0cad46274201 144 }
yao6116601 1:0cad46274201 145
yao6116601 1:0cad46274201 146
yao6116601 1:0cad46274201 147
yao6116601 1:0cad46274201 148
yao6116601 1:0cad46274201 149 /*
yao6116601 1:0cad46274201 150 +MIPLWRITE--平台下发的写指令
yao6116601 1:0cad46274201 151 +MIPLWRITE: <ref>,<msgId>,<objI d>,<insId>,<resId>,<valueType>,<len>,<value>,<flag>,<index>
yao6116601 1:0cad46274201 152 response:
yao6116601 1:0cad46274201 153 AT+MIPLWRITERSP=<ref>,<msgId>,< result>
yao6116601 1:0cad46274201 154 */
yao6116601 1:0cad46274201 155
yao6116601 1:0cad46274201 156
yao6116601 1:0cad46274201 157 void BC95B::_write_handler()
yao6116601 1:0cad46274201 158 {
yao6116601 1:0cad46274201 159 if (!(_parser.recv("%d,%d,%d,%d,%d,%d,%d,",&ref,&msg,&objId,&insId,&resId,&valueType,&len)
yao6116601 1:0cad46274201 160 && _parser.read(value,len*2)
yao6116601 1:0cad46274201 161 &&_parser.recv(",%d,%d\n",&flag,&index))) {
yao6116601 1:0cad46274201 162 return;
yao6116601 1:0cad46274201 163 }
yao6116601 1:0cad46274201 164
yao6116601 1:0cad46274201 165 // printf("v=%.*s\n",len*2,value);
yao6116601 1:0cad46274201 166 currCode=WRITE;
yao6116601 1:0cad46274201 167 curr_objId=objId;
yao6116601 1:0cad46274201 168 curr_insId=insId;
yao6116601 1:0cad46274201 169 curr_resId=resId;
yao6116601 1:0cad46274201 170 valueLength=len*2;
yao6116601 1:0cad46274201 171 _callback();
yao6116601 1:0cad46274201 172 result=2;
yao6116601 1:0cad46274201 173 if (! _parser.send("AT+MIPLWRITERSP=%d,%d,%d",ref,msg,result))
yao6116601 1:0cad46274201 174 {
yao6116601 1:0cad46274201 175 return;
yao6116601 1:0cad46274201 176 }
yao6116601 1:0cad46274201 177
yao6116601 1:0cad46274201 178 }
yao6116601 1:0cad46274201 179 /*
yao6116601 1:0cad46274201 180 +MIPLREAD--平台下发的读指令
yao6116601 1:0cad46274201 181 +MIPLREAD: <ref>,<msgId>,<objId>,<insId>, <resId>
yao6116601 1:0cad46274201 182 response:
yao6116601 1:0cad46274201 183 AT+MIPLREADRSP=<ref>,<msgId>, <result>[,<objId>,<insId>,<resId>,< valueType>,<len>,<value>,<index>, <flag>]
yao6116601 1:0cad46274201 184 */
yao6116601 1:0cad46274201 185 void BC95B::_read_handler()
yao6116601 1:0cad46274201 186 { int valueType,len,index,flg;
yao6116601 1:0cad46274201 187 if (!_parser.recv("%d,%d,%d,%d,%d\n",&ref,&msg,&objId,&insId,&resId))
yao6116601 1:0cad46274201 188 {
yao6116601 1:0cad46274201 189 return ;
yao6116601 1:0cad46274201 190 }
yao6116601 1:0cad46274201 191 //getValue(objId,insId,resId);
yao6116601 1:0cad46274201 192 //"AT+MIPLREADRSP=%d,%s",ref,msgId,result,objId,insId,resId,valueType,len,value,index,flg)
yao6116601 1:0cad46274201 193 currCode=READ;
yao6116601 1:0cad46274201 194 curr_objId=objId;
yao6116601 1:0cad46274201 195 curr_insId=insId;
yao6116601 1:0cad46274201 196 curr_resId=resId;
yao6116601 1:0cad46274201 197 _callback();
yao6116601 1:0cad46274201 198 len=4;index=0;flg=0;result=1;valueType=currType;
yao6116601 1:0cad46274201 199 // memcpy(value,"3.8",3);
yao6116601 1:0cad46274201 200 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))
yao6116601 1:0cad46274201 201 {
yao6116601 1:0cad46274201 202 return;
yao6116601 1:0cad46274201 203 }
yao6116601 1:0cad46274201 204 }
yao6116601 1:0cad46274201 205 /*
yao6116601 1:0cad46274201 206 +MIPLOBSERVE: <ref>,<msgId>,<flag>,<objI d>,<insId>,<resId>
yao6116601 1:0cad46274201 207 AT+MIPLDISCOVERRSP=<ref>,<msgI d>,<result>[,<length>,<valuestring>]
yao6116601 1:0cad46274201 208 */
yao6116601 1:0cad46274201 209 void BC95B::_obs_handler()
yao6116601 1:0cad46274201 210 {
yao6116601 1:0cad46274201 211 if (!_parser.recv("%d,%d,%d,%d,%d,%d\n",&ref,&obsmsg,&flag,&objId,&insId,&resId)) {
yao6116601 1:0cad46274201 212 return;
yao6116601 1:0cad46274201 213 }
yao6116601 1:0cad46274201 214 result=1;
yao6116601 1:0cad46274201 215 if (! _parser.send("AT+MIPLOBSERVERSP=%d,%d,%d",ref,obsmsg,result))
yao6116601 1:0cad46274201 216 {
yao6116601 1:0cad46274201 217 return;
yao6116601 1:0cad46274201 218 }
yao6116601 1:0cad46274201 219 }
yao6116601 1:0cad46274201 220 void BC95B::_discover_handler()
yao6116601 1:0cad46274201 221 {
yao6116601 1:0cad46274201 222 if (!_parser.recv("%d,%d,%d\n",&ref,&msg,&objId)) {
yao6116601 1:0cad46274201 223 return;
yao6116601 1:0cad46274201 224 }
yao6116601 1:0cad46274201 225 // printf("discover\n");
yao6116601 1:0cad46274201 226 currCode=DISCOVER;
yao6116601 1:0cad46274201 227 curr_objId=objId;
yao6116601 1:0cad46274201 228 _callback();
yao6116601 1:0cad46274201 229 result=1;
yao6116601 1:0cad46274201 230 if (! _parser.send("AT+MIPLDISCOVERRSP=0,%d,%d,%d,\"%s\"",msg,result,resLength,resNames))
yao6116601 1:0cad46274201 231 {
yao6116601 1:0cad46274201 232 return;
yao6116601 1:0cad46274201 233 }
yao6116601 1:0cad46274201 234 }
yao6116601 1:0cad46274201 235 bool BC95B::recv()
yao6116601 1:0cad46274201 236 {
yao6116601 1:0cad46274201 237 if (!_parser.process_oob()) {
yao6116601 1:0cad46274201 238 return false;
yao6116601 1:0cad46274201 239 }
yao6116601 1:0cad46274201 240 return true;
yao6116601 1:0cad46274201 241 }
yao6116601 1:0cad46274201 242
yao6116601 1:0cad46274201 243 void BC95B::setTimeout(uint32_t timeout_ms)
yao6116601 1:0cad46274201 244 {
yao6116601 1:0cad46274201 245 _parser.set_timeout(timeout_ms);
yao6116601 1:0cad46274201 246 }
yao6116601 1:0cad46274201 247
yao6116601 1:0cad46274201 248 void BC95B::attach(void (*func)(void))
yao6116601 1:0cad46274201 249 {
yao6116601 1:0cad46274201 250 _callback=func;
yao6116601 1:0cad46274201 251
yao6116601 1:0cad46274201 252 }
yao6116601 1:0cad46274201 253
yao6116601 1:0cad46274201 254 int BC95B::getEventCode()
yao6116601 1:0cad46274201 255 {
yao6116601 1:0cad46274201 256 return currCode;
yao6116601 1:0cad46274201 257 }
yao6116601 1:0cad46274201 258 ;
yao6116601 1:0cad46274201 259 void BC95B::getCurrentID(long *msgId,int *objId,int *insId,int *resId)
yao6116601 1:0cad46274201 260 {
yao6116601 1:0cad46274201 261 *msgId=curr_msgId;
yao6116601 1:0cad46274201 262 *objId=curr_objId;
yao6116601 1:0cad46274201 263 *insId=curr_insId;
yao6116601 1:0cad46274201 264 *resId=curr_resId;
yao6116601 1:0cad46274201 265 };
yao6116601 1:0cad46274201 266 int BC95B::getCurrentValue(char *buf)
yao6116601 1:0cad46274201 267 {
yao6116601 1:0cad46274201 268 memcpy(buf,value,valueLength);
yao6116601 1:0cad46274201 269 return valueLength;
yao6116601 1:0cad46274201 270 };
yao6116601 1:0cad46274201 271 int BC95B::putCurrentValue(int type,char *buf,int length)
yao6116601 1:0cad46274201 272 {
yao6116601 1:0cad46274201 273 valueLength= length ;
yao6116601 1:0cad46274201 274 currType=type;
yao6116601 1:0cad46274201 275 memcpy(value,buf,valueLength);
yao6116601 1:0cad46274201 276 return valueLength;
yao6116601 1:0cad46274201 277 };
yao6116601 1:0cad46274201 278
yao6116601 1:0cad46274201 279 int BC95B::putCurrentResNames(int type,char *buf,int length)
yao6116601 1:0cad46274201 280 {
yao6116601 1:0cad46274201 281 printf("reslength=%d\n",length);
yao6116601 1:0cad46274201 282 resLength= length ;
yao6116601 1:0cad46274201 283 currType=type;
yao6116601 1:0cad46274201 284 memcpy(resNames,buf,resLength);
yao6116601 1:0cad46274201 285 return resLength;
yao6116601 1:0cad46274201 286 };
yao6116601 1:0cad46274201 287