Nothing spectacular
either trials via module or the example do not work
what  is the order to initiate GPRS transmition - upload to a server?
This second attempt throws name 'pyb' isn't defined
from m5stack import *
from m5ui import *
from uiflow import *
import module
setScreenColor(0x222222)
Driver for SIM800L module (using AT commands)
MIT License; Copyright (c) 2017 Jeffrey N. Magee
https://github.com/jeffmer/micropython-upyphone
import math
kludge required because "ignore" parameter to decode not implemented
def convert_to_string(buf):
try:
tt =  buf.decode('utf-8').strip()
return tt
except UnicodeError:
tmp = bytearray(buf)
for i in range(len(tmp)):
if tmp[i]>127:
tmp[i] = ord('#')
return bytes(tmp).decode('utf-8').strip()
class SIM800LError(Exception):
pass
def check_result(errmsg,expected,res):
if not res:
res = 'None'
#print(errmsg+res)
if not expected == res and not res == 'None':
raise SIM800LError('SIM800L Error {}  {}'.format(errmsg,res))
class SIM800L:
def __init__(self,uartno):  # pos =1 or 2 depending on skin position
    self._uart = pyb.UART(uartno, 9600, read_buf_len=2048)
    self.incoming_action = None
    self.no_carrier_action = None
    self.clip_action = None
    self._clip = None
    self.msg_action = None
    self._msgid = 0
    self.savbuf = None
    self.credit = ''
    self.credit_action = None
    
def callback_incoming(self,action):
    self.incoming_action = action
def callback_no_carrier(self,action):
    self.no_carrier_action = action
def callback_clip(self,action):
    self.clip_action = action
def callback_credit_action(self,action):
    self.credit_action = action
def get_clip(self):
    return self._clip
    
def callback_msg(self,action):
    self.msg_action = action
def get_msgid(self):
    return self._msgid
def command(self, cmdstr, lines=1, waitfor=500, msgtext=None):
    #flush input
    #print(cmdstr)
    while self._uart.any():
        self._uart.readchar()
    self._uart.write(cmdstr)
    if msgtext:
        self._uart.write(msgtext)
    # if waitfor>1000:
    #    pyb.delay(waitfor-1000)
    buf=self._uart.readline() #discard linefeed etc
    #print(buf)
    buf=self._uart.readline()
    #print(buf)
    if not buf:
        return None
    result = convert_to_string(buf)
    if lines>1:
        self.savbuf = ''
        for i in range(lines-1):
            buf=self._uart.readline()
            if not buf:
                return result
            #print(buf)
            buf = convert_to_string(buf)
            if not buf == '' and not buf == 'OK':
                self.savbuf += buf+'\n'
    return result
def setup(self):
    self.command('ATE0\n')         # command echo off
    self.command('AT+CRSL=99\n')   # ringer level
    self.command('AT+CMIC=0,10\n') # microphone gain
    self.command('AT+CLIP=1\n')    # caller line identification
    self.command('AT+CMGF=1\n')    # plain text SMS
    self.command('AT+CALS=3,0\n')  # set ringtone
    self.command('AT+CLTS=1\n')    # enabke get local timestamp mode
    self.command('AT+CSCLK=0\n')   # disable automatic sleep
    
def wakechars(self):
    self._uart.write('AT\n')        # will be ignored
    # pyb.delay(100)
def sleep(self,n):
    self.command('AT+CSCLK={}\n'.format(n))
        
def sms_alert(self):
    self.command('AT+CALS=1,1\n')  # set ringtone
    # pyb.delay(3000)
    self.command('AT+CALS=3,0\n')  # set ringtone
def call(self,numstr):
    self.command('ATD{};\n'.format(numstr))
    
def hangup(self):
    self.command('ATH\n')     
    
def answer(self):
    self.command('ATA\n')
def set_volume(self,vol):
    if (vol>=0 and vol<=100):
        self.command('AT+CLVL={}\n'.format(vol))
def signal_strength(self):
    result = self.command('AT+CSQ\n',3)
    if result:
        params=result.split(',')
        if not params[0] == '':
            params2 = params[0].split(':')
            if params2[0]=='+CSQ':
                x = int(params2[1])
                if not x == 99:
                    return(math.floor(x/6+0.5))
    return 0
    
def battery_charge(self):   
    result = self.command('AT+CBC\n',3,1500)
    if result:
        params=result.split(',')
        if not params[0] == '':
            params2 = params[0].split(':')
            if params2[0]=='+CBC':
                return int(params[1])
    return 0
    
def network_name(self):   
    result = self.command('AT+COPS?\n',3)
    if result:
        params=result.split(',')
        if not params[0] == '':
            params2 = params[0].split(':')
            if params2[0]=='+COPS':
                if len(params)>2:
                    names = params[2].split('"')
                    if len(names)>1:
                        return names[1]
    return ''
def read_sms(self,id):
    result = self.command('AT+CMGR={}\n'.format(id),99)
    if result:
        params=result.split(',')
        if not params[0] == '':
            params2 = params[0].split(':')
            if params2[0]=='+CMGR':
                number = params[1].replace('"',' ').strip()
                date   = params[3].replace('"',' ').strip()
                time   = params[4].replace('"',' ').strip()
                return  [number,date,time,self.savbuf]
    return None
def send_sms(self,destno,msgtext):
    result = self.command('AT+CMGS="{}"\n'.format(destno),99,5000,msgtext+'\x1A')
    if result and result=='>' and self.savbuf:
        params = self.savbuf.split(':')
        if params[0]=='+CUSD' or params[0] == '+CMGS':
            return 'OK'
    return 'ERROR'
def check_credit(self):
    self.command('AT+CUSD=1,"*100#"\n')
def get_credit(self):
    return self.credit
def delete_sms(self,id):
    self.command('AT+CMGD={}\n'.format(id),1)
                 
def date_time(self):
    result = self.command('AT+CCLK?\n',3)
    if result:
        if result[0:5] == "+CCLK":
            return result.split('"')[1]
    return ''
    
def check_incoming(self): 
    if self._uart.any():
        buf=self._uart.readline()
        # print(buf)
        buf = convert_to_string(buf)
        params=buf.split(',')
        if params[0] == "RING":
            if self.incoming_action:
                self.incoming_action()
        elif params[0][0:5] == "+CLIP":
            params2 = params[0].split('"')
            self._clip = params2[1]
            if self.clip_action:
                self.clip_action()
        elif params[0][0:5] == "+CMTI":
            self._msgid = int(params[1])
            if self.msg_action:
                self.msg_action()
        elif params[0][0:5] == "+CUSD":
            if len(params)>1:
                st = params[1].find('#')
                en = params[1].find('.',st)
                en = params[1].find('.',en+1)
                if st>0 and en>0:
                    self.credit = '£'+params[1][st+1:en]
                    if self.credit_action:
                        self.credit_action()
        elif params[0] == "NO CARRIER":
                self.no_carrier_action()
# http get command using gprs
def http_get(self,url,apn="giffgaff.com"):
    resp = None
    rstate = 0
    proto, dummy, surl = url.split("/", 2)
    is_ssl = 0
    if  proto == "http:":
        is_ssl = 0
    elif proto == "https:":
        is_ssl == 1
    else:
        raise ValueError("Unsupported protocol: " + proto)
    try:
        # open bearer context
        res = self.command('AT+SAPBR=3,1,"Contype","GPRS"\n')
        check_result("SAPBR 1: ",'OK',res)
        res = self.command('AT+SAPBR=3,1,"APN","{}"\n'.format(apn))
        check_result("SAPBR 2: ",'OK',res)
        res = self.command('AT+SAPBR=1,1\n',1,2000)
        check_result("SAPBR 3: ",'OK',res)
        # now do http request
        res = self.command('AT+HTTPINIT\n',1)
        check_result("HTTPINIT: ",'OK',res)
        res = self.command('AT+HTTPPARA="CID",1\n')
        check_result("HTTPPARA 1: ",'OK',res)
        res = self.command('AT+HTTPPARA="URL","{}"\n'.format(surl))
        check_result("HTTPPARA 2: ",'OK',res)
        res = self.command('AT+HTTPSSL={}\n'.format(is_ssl))
        check_result("HTTPSSL: ",'OK',res)
        res = self.command('AT+HTTPACTION=0\n')
        check_result("HTTPACTION: ",'OK',res)
        for i in range(20):  #limit wait to max 20 x readline timeout
            buf = self._uart.readline()
            if buf and not buf==b'\r\n':
                buf = convert_to_string(buf)
                #print(buf)
                prefix,retcode,bytes = buf.split(',')
                rstate = int(retcode)
                nbytes = int(bytes)
                break
        res = self.command('AT+HTTPREAD\n',1)
        buf = self._uart.read(nbytes)
        check_result("HTTPACTION: ",'+HTTPREAD: {}'.format(nbytes),res)
        if buf[-4:] == b'OK\r\n':  # remove final OK if it was read
            buf = buf[:-4]
        resp = Response(buf)
    except SIM800LError as err:
        print(str(err))
    self.command('AT+HTTPTERM\n',1) # terminate HTTP task
    self.command('AT+SAPBR=0,1\n',1) # close Bearer context
    return resp
def test(self):
    r = self.http_get('http://exploreembedded.com/wiki/images/1/15/Hello.txt')
    print(r.text)
class Response:
def __init__(self, buf, status = 200):
    self.encoding = "utf-8"
    self._cached = buf
    self.status = status
def close(self):
    self._cached = None
@property
def content(self):
    return self._cached
@property
def text(self):
    return str(self.content, self.encoding)
def json(self):
    import ujson
    return ujson.loads(self.content)        
phone = SIM800L(1)
print(phone.signal_strength())